{"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":"markdown","source":"# ⚽ Introduction 🏎️","metadata":{}},{"cell_type":"markdown","source":"![Rocket League](https://cdn2.unrealengine.com/rocketleague-1920x1080-1632847730717-1920x1080-bfa1fa3c1e94.jpg?resize=1&w=580)","metadata":{}},{"cell_type":"markdown","source":"The Rocket League is the soccer game by cars, and it's fun, now let's make a fun submission! In this competition, we need to predict will any team score in ten seconds?","metadata":{}},{"cell_type":"markdown","source":"In this notebook we will do:\n* Choose an option of importing data\n* Process target to suportable format for model\n* Make predictions\n* Unpack predictions\n* Put predictions into a submission file\n\neverything is simple!","metadata":{}},{"cell_type":"markdown","source":"# 🚀 Setup","metadata":{}},{"cell_type":"markdown","source":"### Import Libraries","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\n%matplotlib inline\nimport matplotlib\nimport seaborn as sns\nfrom IPython.display import display\nimport math\n\npd.set_option('display.max_columns', 100) # to make dataframe display more wider","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:25:35.148507Z","iopub.execute_input":"2022-10-17T08:25:35.149063Z","iopub.status.idle":"2022-10-17T08:25:36.179137Z","shell.execute_reply.started":"2022-10-17T08:25:35.148973Z","shell.execute_reply":"2022-10-17T08:25:36.177945Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Constant variables","metadata":{}},{"cell_type":"code","source":"SAMPLES = 0.1\nSEED = 48\nIMPORT_OPT = 0","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:25:36.185233Z","iopub.execute_input":"2022-10-17T08:25:36.185716Z","iopub.status.idle":"2022-10-17T08:25:36.196081Z","shell.execute_reply.started":"2022-10-17T08:25:36.185677Z","shell.execute_reply":"2022-10-17T08:25:36.194932Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Functions","metadata":{}},{"cell_type":"code","source":"def split_by_game_num(df_tmp, samples, seed):\n    game_num_sampled = pd.Series(df_tmp.game_num.unique()).sample(frac=samples, random_state=seed).to_numpy()\n\n    indexes = []\n\n    for j in range(df_tmp.game_num.max()):\n        if j in game_num_sampled:\n            index = df_tmp[df_tmp.game_num == j].index.to_list()\n            indexes += index\n    \n    df_tmp = df_tmp.iloc[indexes].copy()\n    \n    del (indexes)\n    del (index)\n    del (game_num_sampled)\n    \n    return df_tmp\n\ndef split_by_samples(df_tmp, samples_num):\n    for i in range(0, len(df_tmp.index)+1, samples_num):\n        ind.append(i)\n    \n    df_tmp = df_tmp.loc[ind]\n    del (ind)\n    return df_tmp\n\ndef process_target(df):\n    #df = pd.read_parquet('../input/tps-22-oct-parquent-compressed-dataset/train_0.parquet')\n    df['target'] = 0\n    ind_A = df[df.team_A_scoring_within_10sec == 1].index\n    ind_B = df[df.team_B_scoring_within_10sec == 1].index\n\n    df.loc[ind_A, 'target'] = 1\n    df.loc[ind_B, 'target'] = 2\n    del (ind_A)\n    del (ind_B)\n    \n    return df.target\n\ndef convert_to_df_back(df1, df2):\n    df = pd.concat([df1, df2])\n    del(df1)\n    del(df2)\n    return df\n\ndef plot_game(ind):\n\n    for i in range(6):\n        plt.scatter(df[f'p{i}_pos_x'], df[f'p{i}_pos_y'], c='green')\n\n    for i in range(3):\n        plt.scatter(ind[f'p{i}_pos_x'], ind[f'p{i}_pos_y'], c='blue')\n    for i in range(3, 6):\n        plt.scatter(ind[f'p{i}_pos_x'], ind[f'p{i}_pos_y'], c='red')\n\n    plt.scatter(ind[f'ball_pos_x'], ind[f'ball_pos_y'], c='white')","metadata":{"jupyter":{"source_hidden":true},"execution":{"iopub.status.busy":"2022-10-17T08:25:36.197959Z","iopub.execute_input":"2022-10-17T08:25:36.198698Z","iopub.status.idle":"2022-10-17T08:25:36.215730Z","shell.execute_reply.started":"2022-10-17T08:25:36.198663Z","shell.execute_reply":"2022-10-17T08:25:36.214624Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Nice, we did all to setup our notebook, now let's import our data!","metadata":{}},{"cell_type":"markdown","source":"# 📤 Import data","metadata":{}},{"cell_type":"markdown","source":"### Import the train dataset","metadata":{}},{"cell_type":"markdown","source":"Let's validate our LGBM model on different train sets except train_9 set(since it's a validate set), and choose an option of import!","metadata":{}},{"cell_type":"code","source":"from lightgbm import LGBMClassifier\n\nfor i in range(9):\n    df = pd.read_parquet(f'../input/tps-22-oct-parquent-compressed-dataset/train_{i}.parquet')\n    df_valid = pd.read_parquet(f'../input/tps-22-oct-parquent-compressed-dataset/train_{9}.parquet')\n    \n    df['target'] = process_target(df)\n    df_valid['target'] = process_target(df_valid)\n    \n    X = df.copy()\n    y = X.pop(\"target\")\n    X_valid = df_valid.copy()\n    y_valid = X_valid.pop(\"target\")\n    \n    X = X.drop(['game_num', 'event_id', 'event_time', 'player_scoring_next', 'team_scoring_next', 'team_A_scoring_within_10sec', 'team_B_scoring_within_10sec'], axis=1)\n    X_valid = X_valid.drop(['game_num', 'event_id', 'event_time', 'player_scoring_next', 'team_scoring_next', 'team_A_scoring_within_10sec', 'team_B_scoring_within_10sec'], axis=1)\n    \n    model = LGBMClassifier(n_estimators=10, device='gpu', random_state=SEED)\n    model.fit(X, y)\n    \n    print(f\"Train {i}: {model.score(X_valid, y_valid)}\")\n    \n    del (X_valid)\n    del (y_valid)\n    del (model)\n    del (df)\n    del (df_valid)\n    del (X)\n    del (y)","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:26:33.316145Z","iopub.execute_input":"2022-10-17T08:26:33.316619Z","iopub.status.idle":"2022-10-17T08:27:43.034241Z","shell.execute_reply.started":"2022-10-17T08:26:33.316577Z","shell.execute_reply":"2022-10-17T08:27:43.032421Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"As we see, the datasets are similar, so we should choose 'Import only one train dataset from all' option","metadata":{}},{"cell_type":"code","source":"IMPORT_OPT = 1","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:28:09.250321Z","iopub.execute_input":"2022-10-17T08:28:09.250681Z","iopub.status.idle":"2022-10-17T08:28:09.255347Z","shell.execute_reply.started":"2022-10-17T08:28:09.250650Z","shell.execute_reply":"2022-10-17T08:28:09.254395Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 1 option - Import only one train dataset from all","metadata":{}},{"cell_type":"code","source":"if IMPORT_OPT == 1:\n    df = pd.read_parquet('../input/tps-22-oct-parquent-compressed-dataset/train_0.parquet')\n\n    print(df.shape)\n    display(df.head())","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:28:09.885816Z","iopub.execute_input":"2022-10-17T08:28:09.886703Z","iopub.status.idle":"2022-10-17T08:28:13.135912Z","shell.execute_reply.started":"2022-10-17T08:28:09.886664Z","shell.execute_reply":"2022-10-17T08:28:13.134989Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 2 option - Import a dataset containing all datasets with special algorithm","metadata":{}},{"cell_type":"code","source":"if IMPORT_OPT == 2:\n    df = pd.DataFrame()\n\n    for tr in range(10):\n        df_tmp = pd.read_parquet(f\"../input/tps-22-oct-parquent-compressed-dataset/train_{tr}.parquet\")\n\n        df_tmp = split_by_game_num(df_tmp, SAMPLES, SEED)\n        #split_by_samples(df_tmp, 10) #by one second\n        df_tmp['train_num'] = tr\n\n        if tr == 0:\n            df = df_tmp\n        else:\n            df = pd.concat([df, df_tmp], axis=0)\n\n        print(tr, \"have done! With shape\", df_tmp.shape)\n        del (df_tmp)\n\n\n    print(\"Shape:\", df.shape)\n    print(\"The num of nan values in dataset\", df.isna().sum().sum())\n    print(\"The percent of nan values in dataset\", df.isna().sum().sum() / df.shape[0])\n    df.head()","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:28:13.140392Z","iopub.execute_input":"2022-10-17T08:28:13.141050Z","iopub.status.idle":"2022-10-17T08:28:13.153897Z","shell.execute_reply.started":"2022-10-17T08:28:13.141003Z","shell.execute_reply":"2022-10-17T08:28:13.151804Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Import the test dataset","metadata":{}},{"cell_type":"code","source":"df_test = pd.read_parquet('../input/tps-22-oct-parquent-compressed-dataset/test.parquet').drop('id', axis=1)\nprint(df_test.shape)\ndf_test.head()","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:28:13.155548Z","iopub.execute_input":"2022-10-17T08:28:13.156252Z","iopub.status.idle":"2022-10-17T08:28:17.437200Z","shell.execute_reply.started":"2022-10-17T08:28:13.156219Z","shell.execute_reply":"2022-10-17T08:28:17.436065Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# ✨Feature Engineering","metadata":{}},{"cell_type":"markdown","source":"### Ball distance","metadata":{}},{"cell_type":"markdown","source":"In the cell below, we will use some **trigonometry** techniques to measure the distance between ball and goal!\n\nFot measure it, we need:\n* Find a horizontal catet - **cat_x** (A distance between center and ball in x axis)\n* Find a vertical catet - **cat_y** (A distance between ball and goal, but only in y axis)\n* And, using the **Pythagorean Theorem** we can find a hypotenuse, which will be the **distance between ball and goal**","metadata":{}},{"cell_type":"code","source":"cat_x = abs(df[\"ball_pos_x\"]-0)\ncat_y = df[\"ball_pos_y\"]-df.ball_pos_y.min()\n\ndistance = np.sqrt((cat_x)**2 + (cat_y)**2)\ndf['ball_distance'] = distance\n#df['player_nan_count'] = df[p_cols].isna().sum(axis=1)\n\ncat_x_test = abs(df_test[\"ball_pos_x\"]-0)\ncat_y_test = df_test[\"ball_pos_y\"]-df_test.ball_pos_y.min()\n\ndistance_test = np.sqrt((cat_x_test)**2 + (cat_y_test)**2)\ndf_test['ball_distance'] = distance_test\n#df_test['player_nan_count'] = df_test[p_cols].isna().sum(axis=1)","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:28:34.648541Z","iopub.execute_input":"2022-10-17T08:28:34.648905Z","iopub.status.idle":"2022-10-17T08:28:34.759906Z","shell.execute_reply.started":"2022-10-17T08:28:34.648876Z","shell.execute_reply":"2022-10-17T08:28:34.758922Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Note**: I didn't include z axis in Pythagorean Theorem like in other notebooks, just because: it has very little effect on predictions and in the next step of Feature Engineering we will find sin, cos and etc.","metadata":{}},{"cell_type":"markdown","source":"### Ratios","metadata":{}},{"cell_type":"markdown","source":"Ratios can be useful for predictions, since the tree-based model and others can't count ratios\n\nSo, from the pervious cell we got a right triangle, and we can indicate ball an angle in which it needs to move to reach the goal, I think it will be usefull for model to know in which direction ball should move to score a goal. And to find out an angle from a right triangle we need - **sin**, **cos**, **tg**, **ctg**. And to find out them, we need have some ratios between sides of right triangle and as it was said in the beginning ratios can be useful for model","metadata":{}},{"cell_type":"code","source":"df['ball_sin'] = cat_y/distance\ndf['ball_сos'] = cat_x/distance\ndf['ball_ctg'] = cat_x/cat_y\n\ndf_test['ball_sin'] = cat_y_test/distance_test\ndf_test['ball_сos'] = cat_x_test/distance_test\ndf_test['ball_ctg'] = cat_x_test/cat_y_test","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:29:07.422422Z","iopub.execute_input":"2022-10-17T08:29:07.422806Z","iopub.status.idle":"2022-10-17T08:29:07.464660Z","shell.execute_reply.started":"2022-10-17T08:29:07.422775Z","shell.execute_reply":"2022-10-17T08:29:07.463666Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Note**: we weren't using a tg, because its formula is: cat_y/cat_x and since we can't divide something on 0 and cat_x can be 0 - for example, in the beggining of a match, ball_pos_x is 0 and cat_x is 0 in accordance","metadata":{}},{"cell_type":"code","source":"df.tail()","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:30:16.189984Z","iopub.execute_input":"2022-10-17T08:30:16.190586Z","iopub.status.idle":"2022-10-17T08:30:16.274504Z","shell.execute_reply.started":"2022-10-17T08:30:16.190543Z","shell.execute_reply":"2022-10-17T08:30:16.273584Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 🔧 Data Preprocessing","metadata":{}},{"cell_type":"markdown","source":"### Ploting a start of game","metadata":{}},{"cell_type":"code","source":"plot_game(df.iloc[1888983])","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:29:22.663742Z","iopub.execute_input":"2022-10-17T08:29:22.664097Z","iopub.status.idle":"2022-10-17T08:30:01.059998Z","shell.execute_reply.started":"2022-10-17T08:29:22.664067Z","shell.execute_reply":"2022-10-17T08:30:01.058832Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Preprocess target","metadata":{}},{"cell_type":"code","source":"df.head()","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:30:01.062178Z","iopub.execute_input":"2022-10-17T08:30:01.062840Z","iopub.status.idle":"2022-10-17T08:30:01.123043Z","shell.execute_reply.started":"2022-10-17T08:30:01.062801Z","shell.execute_reply":"2022-10-17T08:30:01.122170Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df['target'] = process_target(df)\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:30:01.124366Z","iopub.execute_input":"2022-10-17T08:30:01.124942Z","iopub.status.idle":"2022-10-17T08:30:02.118572Z","shell.execute_reply.started":"2022-10-17T08:30:01.124905Z","shell.execute_reply":"2022-10-17T08:30:02.117343Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Delete cols which test set hasn't in train set (but with exception columns)","metadata":{}},{"cell_type":"code","source":"except_cols = ['target']\n\ndf = df[df_test.columns.to_list() + except_cols]\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:30:02.121478Z","iopub.execute_input":"2022-10-17T08:30:02.122109Z","iopub.status.idle":"2022-10-17T08:30:02.558765Z","shell.execute_reply.started":"2022-10-17T08:30:02.122068Z","shell.execute_reply":"2022-10-17T08:30:02.557714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 🔨 Split dataset into train and validate set","metadata":{}},{"cell_type":"markdown","source":"Let's split our train dataset into train and validate set. For this we need to split data so that relationship of test set to **full** train set is similar to relationship of validate set to train set","metadata":{}},{"cell_type":"code","source":"df_test.shape[0] / df.shape[0]","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:30:02.560418Z","iopub.execute_input":"2022-10-17T08:30:02.561050Z","iopub.status.idle":"2022-10-17T08:30:02.568335Z","shell.execute_reply.started":"2022-10-17T08:30:02.561013Z","shell.execute_reply":"2022-10-17T08:30:02.567156Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"It's the relationship of df_test to df, and base on it, we need select the value of **percentage** variable so that to make the relationship of df_validate to df_train similar to relationship of df_test to df","metadata":{}},{"cell_type":"code","source":"percentage = 0.246\nthreshold = int(df.shape[0]*percentage)\n\ndf_train = df.iloc[threshold:]\ndf_valid = df.iloc[:threshold]\ndf_valid.shape[0] / df_train.shape[0]","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:30:02.569784Z","iopub.execute_input":"2022-10-17T08:30:02.570655Z","iopub.status.idle":"2022-10-17T08:30:02.581995Z","shell.execute_reply.started":"2022-10-17T08:30:02.570602Z","shell.execute_reply":"2022-10-17T08:30:02.580347Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Alright, we have selected the suitable value for **percentage** variable and the relationship of validate set to train set is really similar to relationship of test set to **full** train","metadata":{}},{"cell_type":"code","source":"print(df_train.shape)\nprint(df_valid.shape)\ndf_train.head()","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:30:02.583681Z","iopub.execute_input":"2022-10-17T08:30:02.584101Z","iopub.status.idle":"2022-10-17T08:30:02.641706Z","shell.execute_reply.started":"2022-10-17T08:30:02.584065Z","shell.execute_reply":"2022-10-17T08:30:02.640514Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Now, when we have splited the dataset, we can do a model for prediction!","metadata":{}},{"cell_type":"markdown","source":"# 🤖 Modeling","metadata":{}},{"cell_type":"code","source":"X_train, X_valid = df_train.copy(), df_valid.copy()\ny_train, y_valid = X_train.pop('target'), X_valid.pop('target')","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:30:02.643089Z","iopub.execute_input":"2022-10-17T08:30:02.643557Z","iopub.status.idle":"2022-10-17T08:30:02.937501Z","shell.execute_reply.started":"2022-10-17T08:30:02.643521Z","shell.execute_reply":"2022-10-17T08:30:02.936537Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.dropna()","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:30:02.938877Z","iopub.execute_input":"2022-10-17T08:30:02.939344Z","iopub.status.idle":"2022-10-17T08:30:03.878049Z","shell.execute_reply.started":"2022-10-17T08:30:02.939308Z","shell.execute_reply":"2022-10-17T08:30:03.876955Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.iloc[701143]","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:30:03.881739Z","iopub.execute_input":"2022-10-17T08:30:03.882127Z","iopub.status.idle":"2022-10-17T08:30:03.891203Z","shell.execute_reply.started":"2022-10-17T08:30:03.882088Z","shell.execute_reply":"2022-10-17T08:30:03.890273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from lightgbm import LGBMClassifier\n\nclf = LGBMClassifier(n_estimators=100, learning_rate=0.1, random_state=SEED, device='gpu')\nclf.fit(X_train, y_train)\nprint(\"Score:\", clf.score(X_valid, y_valid))","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:30:36.312766Z","iopub.execute_input":"2022-10-17T08:30:36.313177Z","iopub.status.idle":"2022-10-17T08:31:13.295071Z","shell.execute_reply.started":"2022-10-17T08:30:36.313144Z","shell.execute_reply":"2022-10-17T08:31:13.294040Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"0.8890433420898842","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:32:42.334662Z","iopub.execute_input":"2022-10-17T08:32:42.335011Z","iopub.status.idle":"2022-10-17T08:32:42.341430Z","shell.execute_reply.started":"2022-10-17T08:32:42.334981Z","shell.execute_reply":"2022-10-17T08:32:42.340331Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"We have a good score! Now let's see on permutation importance!","metadata":{}},{"cell_type":"code","source":"import eli5\nfrom eli5.sklearn import PermutationImportance\n\nperm = PermutationImportance(clf, random_state=1).fit(X_valid, y_valid)\neli5.show_weights(perm, feature_names = X_valid.columns.tolist())","metadata":{"execution":{"iopub.status.busy":"2022-10-15T15:06:02.065402Z","iopub.execute_input":"2022-10-15T15:06:02.065786Z","iopub.status.idle":"2022-10-15T15:07:09.974076Z","shell.execute_reply.started":"2022-10-15T15:06:02.065746Z","shell.execute_reply":"2022-10-15T15:07:09.972011Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"And make submission!","metadata":{}},{"cell_type":"markdown","source":"# 🥅 Submission ⚽","metadata":{}},{"cell_type":"markdown","source":"## Make a prediction","metadata":{}},{"cell_type":"code","source":"preds_proba = clf.predict_proba(df_test)\npreds_proba","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:32:47.354010Z","iopub.execute_input":"2022-10-17T08:32:47.354449Z","iopub.status.idle":"2022-10-17T08:33:01.671628Z","shell.execute_reply.started":"2022-10-17T08:32:47.354412Z","shell.execute_reply":"2022-10-17T08:33:01.670702Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Putting predictions into the submission file, processing them into the supported format","metadata":{}},{"cell_type":"code","source":"ss = pd.read_csv('../input/tabular-playground-series-oct-2022/sample_submission.csv')\n\nss['team_A_scoring_within_10sec'] = preds_proba[:, 1]\nss['team_B_scoring_within_10sec'] = preds_proba[:, 2]\n\nss","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:33:01.687857Z","iopub.execute_input":"2022-10-17T08:33:01.688409Z","iopub.status.idle":"2022-10-17T08:33:01.918348Z","shell.execute_reply.started":"2022-10-17T08:33:01.688319Z","shell.execute_reply":"2022-10-17T08:33:01.917334Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ss","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:33:01.923633Z","iopub.execute_input":"2022-10-17T08:33:01.926666Z","iopub.status.idle":"2022-10-17T08:33:01.946178Z","shell.execute_reply.started":"2022-10-17T08:33:01.926625Z","shell.execute_reply":"2022-10-17T08:33:01.944964Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ss.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-10-17T08:33:01.947802Z","iopub.execute_input":"2022-10-17T08:33:01.948141Z","iopub.status.idle":"2022-10-17T08:33:04.464341Z","shell.execute_reply.started":"2022-10-17T08:33:01.948106Z","shell.execute_reply":"2022-10-17T08:33:04.463066Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"*Comming soon...*","metadata":{}}]}