{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install feature_engine 2>/dev/null 1>&2\n!pip install fastparquet 2>/dev/null 1>&2\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport random\n\nfrom sklearn.preprocessing import StandardScaler\nfrom feature_engine.wrappers import SklearnTransformerWrapper as SKWrapper\nfrom sklearn.model_selection import train_test_split\n\n\nfrom matplotlib import pyplot as plt\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-10-12T04:41:32.753645Z","iopub.execute_input":"2022-10-12T04:41:32.754173Z","iopub.status.idle":"2022-10-12T04:41:51.476160Z","shell.execute_reply.started":"2022-10-12T04:41:32.754124Z","shell.execute_reply":"2022-10-12T04:41:51.474383Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Downloading data**","metadata":{}},{"cell_type":"code","source":"INPUT = '../input/tabular-playground-series-oct-2022/'\n\ndf_train_dtypes = pd.read_csv(INPUT + 'train_dtypes.csv')\ndf_test_dtypes = pd.read_csv(INPUT + 'test_dtypes.csv')\ntrain_dtypes = {k: v for (k, v) in zip(df_train_dtypes.column, df_train_dtypes.dtype)}\ntest_dtypes = {k: v for (k, v) in zip(df_test_dtypes.column, df_test_dtypes.dtype)}\n\ntrain_list = []\nnum = 1\nfor i in range(num):\n#     df = pd.read_csv(INPUT + f'train_{i}.csv', dtype = train_dtypes)\n    df = pd.read_csv(INPUT + f'train_{i}.csv')\n    df.to_parquet(f'train_{i}.parquet.gzip', compression='gzip')\n    print('Done with File', i)\n    train_list.append(pd.read_parquet(f'train_{i}.parquet.gzip'))\n\n# dft = pd.read_csv(INPUT + 'test.csv', dtype = test_dtypes)\ndft = pd.read_csv(INPUT + 'test.csv')\ndft.to_parquet('test.parquet.gzip', compression='gzip')\nprint('Done with File test')\ndf_test = pd.read_parquet('test.parquet.gzip')\ndf_sample = pd.read_csv(INPUT + 'sample_submission.csv')","metadata":{"execution":{"iopub.status.busy":"2022-10-12T04:41:51.479689Z","iopub.execute_input":"2022-10-12T04:41:51.480217Z","iopub.status.idle":"2022-10-12T04:43:10.777671Z","shell.execute_reply.started":"2022-10-12T04:41:51.480157Z","shell.execute_reply":"2022-10-12T04:43:10.776307Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Preprocessing data**\n\nThanks to @Jose Cáliz for feature engineering ideas!","metadata":{}},{"cell_type":"code","source":"# for i in range(num):\n#     print(train_list[i].shape)\n#     games = random.sample(list(train_list[i].game_num.unique()), 150)\n#     train_list[i] = train_list[i][train_list[i].game_num.isin(games)]\n#     print(train_list[i].shape)","metadata":{"execution":{"iopub.status.busy":"2022-10-12T04:43:10.779647Z","iopub.execute_input":"2022-10-12T04:43:10.780051Z","iopub.status.idle":"2022-10-12T04:43:10.984469Z","shell.execute_reply.started":"2022-10-12T04:43:10.780012Z","shell.execute_reply":"2022-10-12T04:43:10.983243Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in range(num):\n    train_list[i]['label'] = train_list[i].team_A_scoring_within_10sec + train_list[i].team_B_scoring_within_10sec.replace(1, 2)\n    train_list[i].label.value_counts(True).to_frame(name='label proportion')","metadata":{"execution":{"iopub.status.busy":"2022-10-12T04:43:10.987620Z","iopub.execute_input":"2022-10-12T04:43:10.988044Z","iopub.status.idle":"2022-10-12T04:43:11.006428Z","shell.execute_reply.started":"2022-10-12T04:43:10.988005Z","shell.execute_reply":"2022-10-12T04:43:11.004722Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in range(num):\n    train_list[i]['ball_distance_to_goal_A'] = np.sqrt(\n        (train_list[i].ball_pos_x)**2 + (train_list[i].ball_pos_y + 100)**2\n    )\n    train_list[i]['ball_distance_to_goal_B'] = np.sqrt(\n        (train_list[i].ball_pos_x)**2 + (train_list[i].ball_pos_y - 100)**2\n    )\n    \ndf_test['ball_distance_to_goal_A'] = np.sqrt(\n        (df_test.ball_pos_x)**2 + (df_test.ball_pos_y + 100)**2\n    )\ndf_test['ball_distance_to_goal_B'] = np.sqrt(\n        (df_test.ball_pos_x)**2 + (df_test.ball_pos_y - 100)**2\n    )","metadata":{"execution":{"iopub.status.busy":"2022-10-12T04:43:11.008607Z","iopub.execute_input":"2022-10-12T04:43:11.009021Z","iopub.status.idle":"2022-10-12T04:43:11.047696Z","shell.execute_reply.started":"2022-10-12T04:43:11.008987Z","shell.execute_reply":"2022-10-12T04:43:11.046173Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"columns_to_keep = [\n    'ball_pos_y', 'ball_pos_x', 'ball_vel_y',\n    'p0_pos_y', 'p1_pos_y', 'p2_pos_y',\n    'p3_pos_y', 'p4_pos_y', 'p5_pos_y', \n    'ball_distance_to_goal_A', 'ball_distance_to_goal_B'\n]\ntarget = []\ntrain = []\nfor i in range(num):\n    target.append(pd.get_dummies(train_list[i]['label']))\n#     target.append(train_list[i][['team_A_scoring_within_10sec','team_B_scoring_within_10sec']])\n    train.append(train_list[i].drop(['game_num', 'event_id', 'event_time', 'player_scoring_next', 'team_scoring_next', 'team_A_scoring_within_10sec', 'team_B_scoring_within_10sec', 'label'], axis = 1))\n#     train.append(train_list[i][columns_to_keep])\n\nfor i in range(num):\n    target[i].columns = ['nobody_scores', 'team_A_scores', 'team_b_scores']\n    \ntest = df_test.drop(['id'], axis = 1)\n# test = df_test[columns_to_keep]","metadata":{"execution":{"iopub.status.busy":"2022-10-12T04:43:11.049968Z","iopub.execute_input":"2022-10-12T04:43:11.050650Z","iopub.status.idle":"2022-10-12T04:43:11.255509Z","shell.execute_reply.started":"2022-10-12T04:43:11.050610Z","shell.execute_reply":"2022-10-12T04:43:11.254009Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in range(num):\n    train[i] = train[i].fillna(train[i].median())\n#     train[i] = train[i].fillna(0)\n    \ntest = test.fillna(test.median())\n# test = test.fillna(0)","metadata":{"execution":{"iopub.status.busy":"2022-10-12T04:43:11.257887Z","iopub.execute_input":"2022-10-12T04:43:11.258367Z","iopub.status.idle":"2022-10-12T04:43:11.455943Z","shell.execute_reply.started":"2022-10-12T04:43:11.258324Z","shell.execute_reply":"2022-10-12T04:43:11.454291Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# scaler = StandardScaler()\nscaler = SKWrapper(StandardScaler(), variables=train[0].columns.tolist())\nscaler.fit(train[0])\nfor i in range(num):\n    train[i] = scaler.transform(train[i])\ntest = scaler.transform(test)","metadata":{"execution":{"iopub.status.busy":"2022-10-12T04:43:11.457592Z","iopub.execute_input":"2022-10-12T04:43:11.457978Z","iopub.status.idle":"2022-10-12T04:43:12.176264Z","shell.execute_reply.started":"2022-10-12T04:43:11.457945Z","shell.execute_reply":"2022-10-12T04:43:12.174665Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# X_train, X_valid, y_train, y_valid = train_test_split(train[0], target[0], test_size = 0.2, shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2022-10-12T04:43:12.178658Z","iopub.execute_input":"2022-10-12T04:43:12.179592Z","iopub.status.idle":"2022-10-12T04:43:12.186041Z","shell.execute_reply.started":"2022-10-12T04:43:12.179533Z","shell.execute_reply":"2022-10-12T04:43:12.184317Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Model evaluation**","metadata":{}},{"cell_type":"code","source":"import lightgbm as lgb\n\ntrain_data_A = []\ntrain_data_B = []\nfor i in range(num):\n    train_data_A.append(lgb.Dataset(train[i], label=target[i]['team_A_scores'], free_raw_data=False))\n    train_data_B.append(lgb.Dataset(train[i], label=target[i]['team_b_scores'], free_raw_data=False))\n\nparams = {}\n\ngbm_A = []\ngbm_A.append(lgb.train(params, train_data_A[0], num_boost_round = 50))\nfor i in range(1, num):\n    gbm_A.append(lgb.train(params, train_data_A[i], num_boost_round = 50, init_model = gbm_A[i-1]))\n\npredictionA = gbm_A[num-1].predict(test)\n\ngbm_B = []\ngbm_B.append(lgb.train(params, train_data_B[0], num_boost_round = 50))\nfor i in range(1, num):\n    gbm_B.append(lgb.train(params, train_data_B[i], num_boost_round = 50, init_model = gbm_B[i-1]))\n\npredictionB = gbm_B[num-1].predict(test)\n\n\n# gbm_initA = lgb.train(params, train_data_A0, num_boost_round = 50)\n# print(\"Initial iter# %d\" %gbm_initA.current_iteration())\n# gbm_2A = lgb.train(params, train_data_A1, num_boost_round = 50,\n#                 init_model = gbm_initA)\n# print(\"Option 2 current iter# %d\" %gbm_2A.current_iteration())\n# predictionA = gbm_2A.predict(test)\n\n\n# gbm_initB = lgb.train(params, train_data_B0, num_boost_round = 50)\n# print(\"Initial iter# %d\" %gbm_initB.current_iteration())\n# gbm_2B = lgb.train(params, train_data_B1, num_boost_round = 50,\n#                 init_model = gbm_initB)\n# print(\"Option 2 current iter# %d\" %gbm_2B.current_iteration())\n# predictionB = gbm_2B.predict(test)\n\n\n\n# gbmA = lgb.LGBMRegressor(boosting_type='gbdt',\n#                         num_leaves=50,\n#                         learning_rate=0.01,\n#                         max_depth=-1,\n#                         n_estimators=1000)\n\n# gbmA.fit(train[0], target[0]['team_A_scores'],\n#         eval_set=[(train[1], target[1]['team_A_scores'])],\n#         eval_metric='l1',\n#         callbacks=[lgb.early_stopping(5)])\n\n# predictionA = gbmA.predict(test, num_iteration=gbmA.best_iteration_)\n\n# gbmB = lgb.LGBMRegressor(boosting_type='gbdt',\n#                         num_leaves=50,\n#                         learning_rate=0.01,\n#                         max_depth=-1,\n#                         n_estimators=1000)\n\n# gbmB.fit(train[0], target[0]['team_b_scores'],\n#         eval_set=[(train[1], target[1]['team_b_scores'])],\n#         eval_metric='l1',\n#         callbacks=[lgb.early_stopping(5)])\n\n# predictionB = gbmB.predict(test, num_iteration=gbmB.best_iteration_)","metadata":{"execution":{"iopub.status.busy":"2022-10-12T04:43:12.189518Z","iopub.execute_input":"2022-10-12T04:43:12.189888Z","iopub.status.idle":"2022-10-12T04:43:23.403039Z","shell.execute_reply.started":"2022-10-12T04:43:12.189857Z","shell.execute_reply":"2022-10-12T04:43:23.402247Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# gbmA.feature_importances_","metadata":{"execution":{"iopub.status.busy":"2022-10-12T04:43:23.407277Z","iopub.execute_input":"2022-10-12T04:43:23.408286Z","iopub.status.idle":"2022-10-12T04:43:23.413445Z","shell.execute_reply.started":"2022-10-12T04:43:23.408242Z","shell.execute_reply":"2022-10-12T04:43:23.411721Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictionA","metadata":{"execution":{"iopub.status.busy":"2022-10-12T04:43:23.416118Z","iopub.execute_input":"2022-10-12T04:43:23.416800Z","iopub.status.idle":"2022-10-12T04:43:23.431961Z","shell.execute_reply.started":"2022-10-12T04:43:23.416753Z","shell.execute_reply":"2022-10-12T04:43:23.430514Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Making prediction**","metadata":{}},{"cell_type":"code","source":"preds = pd.DataFrame([predictionA, predictionB], \n#                     columns=['team_A_scoring_within_10sec', 'team_B_scoring_within_10sec'],\n#                     index=test.index\n                    )\n# preds = np.round(preds).astype(int)","metadata":{"execution":{"iopub.status.busy":"2022-10-12T04:43:23.434010Z","iopub.execute_input":"2022-10-12T04:43:23.434516Z","iopub.status.idle":"2022-10-12T04:43:41.889588Z","shell.execute_reply.started":"2022-10-12T04:43:23.434372Z","shell.execute_reply":"2022-10-12T04:43:41.888035Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds = preds.T\npreds.columns = ['team_A_scoring_within_10sec', 'team_B_scoring_within_10sec']\npreds","metadata":{"execution":{"iopub.status.busy":"2022-10-12T04:43:41.891356Z","iopub.execute_input":"2022-10-12T04:43:41.892185Z","iopub.status.idle":"2022-10-12T04:43:41.975475Z","shell.execute_reply.started":"2022-10-12T04:43:41.892148Z","shell.execute_reply":"2022-10-12T04:43:41.973966Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_sample[['team_A_scoring_within_10sec', 'team_B_scoring_within_10sec']] = preds[['team_A_scoring_within_10sec', 'team_B_scoring_within_10sec']]","metadata":{"execution":{"iopub.status.busy":"2022-10-12T04:43:41.976972Z","iopub.execute_input":"2022-10-12T04:43:41.977333Z","iopub.status.idle":"2022-10-12T04:43:41.995410Z","shell.execute_reply.started":"2022-10-12T04:43:41.977304Z","shell.execute_reply":"2022-10-12T04:43:41.993794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_sample.to_csv('submission.csv', index = False)","metadata":{"execution":{"iopub.status.busy":"2022-10-12T04:43:41.996899Z","iopub.execute_input":"2022-10-12T04:43:41.997291Z","iopub.status.idle":"2022-10-12T04:43:43.875167Z","shell.execute_reply.started":"2022-10-12T04:43:41.997234Z","shell.execute_reply":"2022-10-12T04:43:43.873985Z"},"trusted":true},"execution_count":null,"outputs":[]}]}