{"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":"import numpy as np \nimport pandas as pd\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.preprocessing import StandardScaler\nimport dask.dataframe as dd\nfrom sklearn.base import BaseEstimator, TransformerMixin\nfrom sklearn.model_selection import StratifiedShuffleSplit\nimport lightgbm as lgb\nfrom sklearn.metrics import log_loss\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.model_selection import GridSearchCV","metadata":{"execution":{"iopub.status.busy":"2022-10-26T07:20:53.655288Z","iopub.execute_input":"2022-10-26T07:20:53.655957Z","iopub.status.idle":"2022-10-26T07:20:56.487440Z","shell.execute_reply.started":"2022-10-26T07:20:53.655914Z","shell.execute_reply":"2022-10-26T07:20:56.486516Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Reading in data","metadata":{}},{"cell_type":"code","source":"dtypes_train_df = pd.read_csv('/kaggle/input/tabular-playground-series-oct-2022/train_dtypes.csv')\ndtypes_test_df = pd.read_csv('/kaggle/input/tabular-playground-series-oct-2022/test_dtypes.csv')\nprint('Train df dtypes: \\n', dtypes_train_df)\nprint('Train df shape: ', dtypes_train_df.shape, '\\n\\n')\nprint('Test df dtypes: \\n', dtypes_test_df)\nprint('Test df shape: ', dtypes_test_df.shape)\n\ndtypes_train = {col: dt for (col, dt) in zip(dtypes_train_df.column, dtypes_train_df.dtype)}\ndtypes_test = {col: dt for (col, dt) in zip(dtypes_test_df.column, dtypes_test_df.dtype)}","metadata":{"execution":{"iopub.status.busy":"2022-10-26T07:20:56.489483Z","iopub.execute_input":"2022-10-26T07:20:56.490458Z","iopub.status.idle":"2022-10-26T07:20:56.533647Z","shell.execute_reply.started":"2022-10-26T07:20:56.490420Z","shell.execute_reply":"2022-10-26T07:20:56.532522Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# reading in training data: reading random sample from each train file\ndirectory = '/kaggle/input/tabular-playground-series-oct-2022/'\ndf = pd.DataFrame({}, columns=dtypes_train.keys())\nfor i in range(10):\n    path = directory + f'/train_{i}.csv'\n    df_tmp = dd.read_csv(path, dtype=dtypes_train)\n    df_tmp = df_tmp.sample(frac=0.1, random_state=123) \n    df = dd.concat([df, df_tmp])\n    del df_tmp","metadata":{"execution":{"iopub.status.busy":"2022-10-26T07:20:56.535080Z","iopub.execute_input":"2022-10-26T07:20:56.535763Z","iopub.status.idle":"2022-10-26T07:21:05.052464Z","shell.execute_reply.started":"2022-10-26T07:20:56.535727Z","shell.execute_reply":"2022-10-26T07:21:05.051613Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = df.compute() # convert dd back to df","metadata":{"execution":{"iopub.status.busy":"2022-10-26T07:21:05.054618Z","iopub.execute_input":"2022-10-26T07:21:05.055234Z","iopub.status.idle":"2022-10-26T07:25:09.326148Z","shell.execute_reply.started":"2022-10-26T07:21:05.055200Z","shell.execute_reply":"2022-10-26T07:25:09.325033Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# reading in testing data\ntest_df = pd.read_csv('/kaggle/input/tabular-playground-series-oct-2022/test.csv', dtype = dtypes_test)","metadata":{"execution":{"iopub.status.busy":"2022-10-26T07:25:09.327825Z","iopub.execute_input":"2022-10-26T07:25:09.328196Z","iopub.status.idle":"2022-10-26T07:25:18.774555Z","shell.execute_reply.started":"2022-10-26T07:25:09.328163Z","shell.execute_reply":"2022-10-26T07:25:18.773052Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_y = df[['team_A_scoring_within_10sec','team_B_scoring_within_10sec']]\ntrain_df = df.drop(['team_A_scoring_within_10sec','team_B_scoring_within_10sec'], axis = 1)","metadata":{"execution":{"iopub.status.busy":"2022-10-26T07:25:18.776088Z","iopub.execute_input":"2022-10-26T07:25:18.776436Z","iopub.status.idle":"2022-10-26T07:25:25.908847Z","shell.execute_reply.started":"2022-10-26T07:25:18.776404Z","shell.execute_reply":"2022-10-26T07:25:25.907592Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Feature engineering","metadata":{}},{"cell_type":"markdown","source":"Inspired by https://www.kaggle.com/code/shoooono/tpsoct2022-fe-lightbgm/notebook#Test-data","metadata":{}},{"cell_type":"markdown","source":"## Dropping unnecessary columns","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"cols_to_drop = [\n    'game_num', 'event_id', 'event_time', 'player_scoring_next', 'team_scoring_next'\n]\ntrain_df = train_df.drop(columns=cols_to_drop)","metadata":{"execution":{"iopub.status.busy":"2022-10-26T07:25:25.910551Z","iopub.execute_input":"2022-10-26T07:25:25.911083Z","iopub.status.idle":"2022-10-26T07:25:27.888117Z","shell.execute_reply.started":"2022-10-26T07:25:25.911037Z","shell.execute_reply":"2022-10-26T07:25:27.886886Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Missing values","metadata":{}},{"cell_type":"code","source":"# columns which contain missing values (value is missing if player is respawned)\nmissing_values_count = train_df[train_df.columns].isnull().sum() \nmissing_values_columns = missing_values_count[missing_values_count > 0].index\nprint(missing_values_columns)","metadata":{"execution":{"iopub.status.busy":"2022-10-26T07:25:27.889467Z","iopub.execute_input":"2022-10-26T07:25:27.890537Z","iopub.status.idle":"2022-10-26T07:25:33.722948Z","shell.execute_reply.started":"2022-10-26T07:25:27.890489Z","shell.execute_reply":"2022-10-26T07:25:33.721726Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def euclidian_norm(x):\n    return np.linalg.norm(x, axis=1)","metadata":{"execution":{"iopub.status.busy":"2022-10-26T07:25:33.724315Z","iopub.execute_input":"2022-10-26T07:25:33.724649Z","iopub.status.idle":"2022-10-26T07:25:33.730294Z","shell.execute_reply.started":"2022-10-26T07:25:33.724619Z","shell.execute_reply":"2022-10-26T07:25:33.729033Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"vel_groups = {\n    f\"{el}_vel\": [f'{el}_vel_x', f'{el}_vel_y', f'{el}_vel_z']\n    for el in ['ball'] + [f'p{i}' for i in range(6)]\n}\npos_groups = {\n    f\"{el}_pos\": [f'{el}_pos_x', f'{el}_pos_y', f'{el}_pos_z']\n    for el in ['ball'] + [f'p{i}' for i in range(6)]\n}","metadata":{"execution":{"iopub.status.busy":"2022-10-26T07:25:33.733619Z","iopub.execute_input":"2022-10-26T07:25:33.733939Z","iopub.status.idle":"2022-10-26T07:25:33.747879Z","shell.execute_reply.started":"2022-10-26T07:25:33.733910Z","shell.execute_reply":"2022-10-26T07:25:33.746589Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Calculate new columns","metadata":{}},{"cell_type":"code","source":"class CombinedAttributesAdder(BaseEstimator, TransformerMixin):\n    def __init__(self, add_velocity_magnitude = True, add_distance_from_ball = True, \n                 add_distance_from_goal = True, add_respawn_dummy = True): \n        self.add_velocity_magnitude = add_velocity_magnitude\n        self.add_distance_from_ball = add_distance_from_ball\n        self.add_distance_from_goal = add_distance_from_goal\n        self.add_respawn_dummy = add_respawn_dummy\n    def fit(self, X, y=None):\n        if self.add_velocity_magnitude:\n            cols = X.columns.tolist()\n        if self.add_distance_from_ball:\n            cols.extend([col for col, vec in vel_groups.items()])\n        if self.add_distance_from_goal:\n            cols.extend([col + \"_ball_dist\" for col, vec in pos_groups.items()])\n            cols.extend([col + \"_goal_a_dist\" for col, vec in pos_groups.items()])\n        if self.add_respawn_dummy:\n            cols.extend([col + \"_goal_b_dist\" for col, vec in pos_groups.items()])\n        cols.extend(['p' + str(i) + '_respawning' for i in range(6)])\n        self.columns = cols\n        self.initialized = True\n        return self \n    def get_feature_names(self): \n        return self.columns\n    def transform(self, X):\n        if self.add_velocity_magnitude: \n            # add columns to df: velocity magnitude for ball and players\n            for col, vec in vel_groups.items(): \n                X[col] = euclidian_norm(X[vec].values.astype(float))\n        if self.add_distance_from_ball: \n            # calculate distance of each player from the ball\n            for col, vec in pos_groups.items():\n                if col != 'ball_pos':\n                    X[col + \"_ball_dist\"] = euclidian_norm(X[vec].values.astype(float) - X[pos_groups[\"ball_pos\"]].values.astype(float))\n        if self.add_distance_from_goal: \n            # calculate distance of ball and each player from the goal\n            goal_a = np.array( [0, -120, 1.2], dtype='float16')\n            goal_b = np.array( [0,  120, 1.2], dtype='float16')\n            for col, vec in pos_groups.items():\n                X[col + \"_goal_a_dist\"] = euclidian_norm(X[vec].values.astype(float) - goal_a)\n                X[col + \"_goal_b_dist\"] = euclidian_norm(X[vec].values.astype(float) - goal_b)\n        if self.add_respawn_dummy: \n            X['p0_respawning'] = np.where(X['p0_pos_x'] == np.nan, 1, 0)\n            X['p1_respawning'] = np.where(X['p1_pos_x'] == np.nan, 1, 0)\n            X['p2_respawning'] = np.where(X['p2_pos_x'] == np.nan, 1, 0)\n            X['p3_respawning'] = np.where(X['p3_pos_x'] == np.nan, 1, 0)\n            X['p4_respawning'] = np.where(X['p4_pos_x'] == np.nan, 1, 0)\n            X['p5_respawning'] = np.where(X['p5_pos_x'] == np.nan, 1, 0)   \n        return X\n\n# attr_adder = CombinedAttributesAdder()\n# train_df = attr_adder.transform(train_df)","metadata":{"execution":{"iopub.status.busy":"2022-10-26T07:25:33.749830Z","iopub.execute_input":"2022-10-26T07:25:33.750348Z","iopub.status.idle":"2022-10-26T07:25:33.767394Z","shell.execute_reply.started":"2022-10-26T07:25:33.750312Z","shell.execute_reply":"2022-10-26T07:25:33.766514Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# the same but in function\ndef calculate_new_cols(df):\n    \n    # VELOCITY MAGNITUDE\n    # add volumns to df: velocity magnitude for ball and players\n    for col, vec in vel_groups.items(): \n        df[col] = euclidian_norm(df[vec].values.astype(float))\n        \n    # DISTANCE FROM BALL\n    # calculate distance of each player from the ball\n    for col, vec in pos_groups.items():\n        if col != 'ball_pos':\n            df[col + \"_ball_dist\"] = euclidian_norm(df[vec].values.astype(float) - df[pos_groups[\"ball_pos\"]].values.astype(float))\n            \n    # DISTANCE FROM GOAL\n    # calculate distance of ball and each player from the goal\n    goal_a = np.array( [0, -120, 1.2], dtype='float16')\n    goal_b = np.array( [0,  120, 1.2], dtype='float16')\n\n    for col, vec in pos_groups.items():\n        df[col + \"_goal_a_dist\"] = euclidian_norm(df[vec].values.astype(float) - goal_a)\n        df[col + \"_goal_b_dist\"] = euclidian_norm(df[vec].values.astype(float) - goal_b)\n        \n    # create new column for each player indicating he is being respawned\n    df['p0_respawning'] = np.where(df['p0_pos_x'] == np.nan, 1, 0)\n    df['p1_respawning'] = np.where(df['p1_pos_x'] == np.nan, 1, 0)\n    df['p2_respawning'] = np.where(df['p2_pos_x'] == np.nan, 1, 0)\n    df['p3_respawning'] = np.where(df['p3_pos_x'] == np.nan, 1, 0)\n    df['p4_respawning'] = np.where(df['p4_pos_x'] == np.nan, 1, 0)\n    df['p5_respawning'] = np.where(df['p5_pos_x'] == np.nan, 1, 0)\n        \n    return df","metadata":{"execution":{"iopub.status.busy":"2022-10-26T07:25:33.768844Z","iopub.execute_input":"2022-10-26T07:25:33.769225Z","iopub.status.idle":"2022-10-26T07:25:33.789437Z","shell.execute_reply.started":"2022-10-26T07:25:33.769192Z","shell.execute_reply":"2022-10-26T07:25:33.788207Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# calculating new columns\nattr_adder = CombinedAttributesAdder()\ntrain_df = attr_adder.fit_transform(train_df)\n\n# imputing missing values\nimputer = SimpleImputer(strategy=\"mean\")\ntrain_df[train_df.columns] = imputer.fit_transform(train_df)\n\n# scaling\nscaler = StandardScaler()\ntrain_df[train_df.columns] = scaler.fit_transform(train_df)\n  ","metadata":{"execution":{"iopub.status.busy":"2022-10-26T07:25:33.790748Z","iopub.execute_input":"2022-10-26T07:25:33.791533Z","iopub.status.idle":"2022-10-26T07:27:57.417589Z","shell.execute_reply.started":"2022-10-26T07:25:33.791488Z","shell.execute_reply":"2022-10-26T07:27:57.415922Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# no more missing values left\ntrain_df.isna().sum()","metadata":{"execution":{"iopub.status.busy":"2022-10-26T07:27:57.419550Z","iopub.execute_input":"2022-10-26T07:27:57.419987Z","iopub.status.idle":"2022-10-26T07:27:57.834500Z","shell.execute_reply.started":"2022-10-26T07:27:57.419932Z","shell.execute_reply":"2022-10-26T07:27:57.833541Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Modeling","metadata":{}},{"cell_type":"markdown","source":"## Stratified train-validation split","metadata":{}},{"cell_type":"code","source":"train_X = train_df\ntrain_y = train_y.astype(int)","metadata":{"execution":{"iopub.status.busy":"2022-10-26T07:27:57.835816Z","iopub.execute_input":"2022-10-26T07:27:57.836181Z","iopub.status.idle":"2022-10-26T07:27:58.027434Z","shell.execute_reply.started":"2022-10-26T07:27:57.836148Z","shell.execute_reply":"2022-10-26T07:27:58.026506Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"split = StratifiedShuffleSplit(n_splits = 1, test_size=0.2, random_state=42)\nfor train_index, valid_index in split.split(train_X, train_y):\n        strat_train_X = train_X.iloc[train_index]\n        strat_train_y = train_y.iloc[train_index]\n        strat_valid_X = train_X.iloc[valid_index]\n        strat_valid_y = train_y.iloc[valid_index]","metadata":{"execution":{"iopub.status.busy":"2022-10-26T07:27:58.028949Z","iopub.execute_input":"2022-10-26T07:27:58.030114Z","iopub.status.idle":"2022-10-26T07:28:11.458864Z","shell.execute_reply.started":"2022-10-26T07:27:58.030065Z","shell.execute_reply":"2022-10-26T07:28:11.457538Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"strat_train_y_A = strat_train_y.iloc[:,0]\nstrat_train_y_B = strat_train_y.iloc[:,1]\nstrat_valid_y_A = strat_valid_y.iloc[:,0]\nstrat_valid_y_B = strat_valid_y.iloc[:,1]","metadata":{"execution":{"iopub.status.busy":"2022-10-26T07:28:11.460428Z","iopub.execute_input":"2022-10-26T07:28:11.460780Z","iopub.status.idle":"2022-10-26T07:28:11.468509Z","shell.execute_reply.started":"2022-10-26T07:28:11.460748Z","shell.execute_reply":"2022-10-26T07:28:11.467045Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"strat_train_X.shape","metadata":{"execution":{"iopub.status.busy":"2022-10-25T19:18:25.308705Z","iopub.execute_input":"2022-10-25T19:18:25.309282Z","iopub.status.idle":"2022-10-25T19:18:25.324993Z","shell.execute_reply.started":"2022-10-25T19:18:25.309233Z","shell.execute_reply":"2022-10-25T19:18:25.323821Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Models: using binary classification for each target","metadata":{}},{"cell_type":"code","source":"# modelA = XGBClassifier()\n# modelB = XGBClassifier()\n\nmodelA = LogisticRegression()\nmodelB = LogisticRegression()\n\nmodelA.fit(strat_train_X, strat_train_y_A)\npredictionsA = modelA.predict_proba(strat_valid_X)[:,1]\nloss_A = log_loss(strat_valid_y_A ,predictionsA)\n\nmodelB.fit(strat_train_X, strat_train_y_B)\npredictionsB = modelB.predict_proba(strat_valid_X)[:,1]\nloss_B = log_loss(strat_valid_y_B ,predictionsB)\n\n# other models...\n\n# log-loss: the lower the better","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Training the best model with optimal parameters on the whole training set","metadata":{}},{"cell_type":"markdown","source":"## Test data preprocessing","metadata":{}},{"cell_type":"code","source":"test_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-10-25T20:37:09.547380Z","iopub.execute_input":"2022-10-25T20:37:09.547808Z","iopub.status.idle":"2022-10-25T20:37:09.584295Z","shell.execute_reply.started":"2022-10-25T20:37:09.547774Z","shell.execute_reply":"2022-10-25T20:37:09.583027Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ids = test_df['id']\ntest_X = test_df.drop(['id'], axis = 1)","metadata":{"execution":{"iopub.status.busy":"2022-10-25T21:24:16.338768Z","iopub.execute_input":"2022-10-25T21:24:16.340072Z","iopub.status.idle":"2022-10-25T21:24:16.394433Z","shell.execute_reply.started":"2022-10-25T21:24:16.339999Z","shell.execute_reply":"2022-10-25T21:24:16.393126Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_X = attr_adder.transform(test_X)\ntest_X[test_X.columns] = imputer.transform(test_X)\ntest_X[test_X.columns] = scaler.transform(test_X)","metadata":{"execution":{"iopub.status.busy":"2022-10-25T21:24:16.396243Z","iopub.execute_input":"2022-10-25T21:24:16.396739Z","iopub.status.idle":"2022-10-25T21:24:20.569577Z","shell.execute_reply.started":"2022-10-25T21:24:16.396688Z","shell.execute_reply":"2022-10-25T21:24:20.567829Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# logistic regression for team A scoring within next 10 seconds\nmodelA = LogisticRegression(max_iter = 500)\npenalty = ['l2']\nc_values = [100, 10, 1.0] \n\n# define grid search\ngrid = dict(penalty=penalty,C=c_values)\ncv = StratifiedKFold(n_splits = 2)\ngrid_search_A = GridSearchCV(estimator=modelA, param_grid=grid, n_jobs=-1, cv=cv, scoring='accuracy',error_score=0, verbose=1)\ngrid_result_A = grid_search_A.fit(train_X, train_y.iloc[:,0])","metadata":{"execution":{"iopub.status.busy":"2022-10-25T21:27:08.703471Z","iopub.execute_input":"2022-10-25T21:27:08.704279Z","iopub.status.idle":"2022-10-25T21:30:43.941592Z","shell.execute_reply.started":"2022-10-25T21:27:08.704210Z","shell.execute_reply":"2022-10-25T21:30:43.939141Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# logistic regression for team B scoring within next 10 seconds\nmodelB = LogisticRegression(max_iter = 500)\npenalty = ['l2']\nc_values = [100, 10, 1.0]\n\n# define grid search\ngrid = dict(penalty=penalty,C=c_values)\ncv = StratifiedKFold(n_splits = 2)\ngrid_search_B = GridSearchCV(estimator=modelB, param_grid=grid, n_jobs=-1, cv=cv, scoring='accuracy',error_score=0, verbose=1)\ngrid_result_B = grid_search_B.fit(train_X, train_y.iloc[:,1])","metadata":{"execution":{"iopub.status.busy":"2022-10-25T21:30:43.946217Z","iopub.execute_input":"2022-10-25T21:30:43.947337Z","iopub.status.idle":"2022-10-25T21:34:29.562492Z","shell.execute_reply.started":"2022-10-25T21:30:43.947259Z","shell.execute_reply":"2022-10-25T21:34:29.560500Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Best parameters for modelA: \\n')\nprint(grid_search_A.best_params_)\n\nprint('\\n\\nBest parameters for modelB: \\n')\nprint(grid_search_B.best_params_)","metadata":{"execution":{"iopub.status.busy":"2022-10-25T21:34:29.566264Z","iopub.execute_input":"2022-10-25T21:34:29.567681Z","iopub.status.idle":"2022-10-25T21:34:29.581369Z","shell.execute_reply.started":"2022-10-25T21:34:29.567597Z","shell.execute_reply":"2022-10-25T21:34:29.578959Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Prediction on test data","metadata":{}},{"cell_type":"code","source":"pred_A = grid_search_A.predict_proba(test_X)[:,1] \npred_B = grid_search_B.predict_proba(test_X)[:,1]","metadata":{"execution":{"iopub.status.busy":"2022-10-25T21:34:39.636310Z","iopub.execute_input":"2022-10-25T21:34:39.636762Z","iopub.status.idle":"2022-10-25T21:34:39.921746Z","shell.execute_reply.started":"2022-10-25T21:34:39.636723Z","shell.execute_reply":"2022-10-25T21:34:39.920452Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"code","source":"df_submission = pd.DataFrame(\n    {\n        \"id\": ids,\n        \"team_A_scoring_within_10sec\": pred_A,\n        \"team_B_scoring_within_10sec\": pred_B\n    }\n)\ndf_submission","metadata":{"execution":{"iopub.status.busy":"2022-10-25T21:34:44.611202Z","iopub.execute_input":"2022-10-25T21:34:44.611688Z","iopub.status.idle":"2022-10-25T21:34:44.639824Z","shell.execute_reply.started":"2022-10-25T21:34:44.611647Z","shell.execute_reply":"2022-10-25T21:34:44.638216Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_submission.to_csv('submission3.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-10-25T21:34:55.438046Z","iopub.execute_input":"2022-10-25T21:34:55.438531Z","iopub.status.idle":"2022-10-25T21:34:58.135900Z","shell.execute_reply.started":"2022-10-25T21:34:55.438494Z","shell.execute_reply":"2022-10-25T21:34:58.134541Z"},"trusted":true},"execution_count":null,"outputs":[]}]}