{"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":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\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-05-06T20:11:37.909467Z","iopub.execute_input":"2022-05-06T20:11:37.910422Z","iopub.status.idle":"2022-05-06T20:11:37.940338Z","shell.execute_reply.started":"2022-05-06T20:11:37.910305Z","shell.execute_reply":"2022-05-06T20:11:37.939638Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#import modules\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport plotly.express as px\n\n%matplotlib inline\n\n#loading the data\ntrain = pd.read_csv('/kaggle/input/football-match-probability-prediction/train.csv')\ntest = pd.read_csv('/kaggle/input/football-match-probability-prediction/test.csv')","metadata":{"execution":{"iopub.status.busy":"2022-05-06T20:11:37.941646Z","iopub.execute_input":"2022-05-06T20:11:37.942560Z","iopub.status.idle":"2022-05-06T20:11:49.302375Z","shell.execute_reply.started":"2022-05-06T20:11:37.942519Z","shell.execute_reply":"2022-05-06T20:11:49.301083Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def is_cup_conversion(df):\n    '''convert is_cup column from boolean to 0/1'''\n    df.is_cup = df.is_cup.apply(lambda x: np.multiply(x, 1) )\n    df['is_cup'].fillna(0, inplace=True) # missing value filled with 0, ie non-cup game\n    return df","metadata":{"execution":{"iopub.status.busy":"2022-05-06T20:11:49.304416Z","iopub.execute_input":"2022-05-06T20:11:49.304779Z","iopub.status.idle":"2022-05-06T20:11:49.310414Z","shell.execute_reply.started":"2022-05-06T20:11:49.304740Z","shell.execute_reply":"2022-05-06T20:11:49.309412Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def has_coach_change(df):\n    '''add features indicating whether home and away teams have changed coach'''\n    \n    df['home_has_coach_change'] = df.apply(lambda r: any([(r['home_team_coach_id']!=r[f'home_team_history_coach_{i}']) \n                                                    & (np.isnan(r[f'home_team_history_coach_{i}'])==False) for i in range(1,11) ]) , axis=1)\n    df['home_has_coach_change'] = df['home_has_coach_change'].apply(lambda x: np.multiply(x, 1) )\n    df['home_has_coach_change'].fillna(0, inplace=True)\n    df['away_has_coach_change'] = df.apply(lambda r: any([(r['away_team_coach_id']!=r[f'away_team_history_coach_{i}']) \n                                                    & (np.isnan(r[f'away_team_history_coach_{i}'])==False) for i in range(1,11) ]) , axis=1)\n    df['away_has_coach_change'] = df['away_has_coach_change'].apply(lambda x: np.multiply(x, 1) ).fillna(0, inplace=True)\n    df['away_has_coach_change'].fillna(0, inplace=True)\n    return df","metadata":{"execution":{"iopub.status.busy":"2022-05-06T20:11:49.313008Z","iopub.execute_input":"2022-05-06T20:11:49.313359Z","iopub.status.idle":"2022-05-06T20:11:49.323702Z","shell.execute_reply.started":"2022-05-06T20:11:49.313314Z","shell.execute_reply":"2022-05-06T20:11:49.322669Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"feature_columns = ['id', 'match_date','league_id','is_cup','home_team_coach_id','away_team_coach_id','home_has_coach_change','away_has_coach_change']\nhistory_columns = [col for col in train.columns if col[-1].isdigit()]","metadata":{"execution":{"iopub.status.busy":"2022-05-06T20:11:49.324797Z","iopub.execute_input":"2022-05-06T20:11:49.325662Z","iopub.status.idle":"2022-05-06T20:11:49.341176Z","shell.execute_reply.started":"2022-05-06T20:11:49.325613Z","shell.execute_reply":"2022-05-06T20:11:49.340086Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def convert_to_long_form(df, feature_columns, history_columns):\n    '''coverting the history columns into long form, for convenience and better speed of manipulation'''\n    stubname=['home_team_history_match_date',\n           'home_team_history_is_play_home',\n           'home_team_history_is_cup',\n           'home_team_history_goal',\n           'home_team_history_opponent_goal',\n           'home_team_history_rating',\n           'home_team_history_opponent_rating',\n           'home_team_history_coach',\n           'home_team_history_league_id',\n           'away_team_history_match_date',\n           'away_team_history_is_play_home',\n           'away_team_history_is_cup',\n           'away_team_history_goal',\n           'away_team_history_opponent_goal',\n           'away_team_history_rating',\n           'away_team_history_opponent_rating',\n           'away_team_history_coach',\n           'away_team_history_league_id']\n    df_long=pd.wide_to_long(df[feature_columns+history_columns], stubnames=stubname, i='id', j='match', sep='_')\n    df_long=df_long.reset_index().sort_values(by=['id','match'])\n    return df_long","metadata":{"execution":{"iopub.status.busy":"2022-05-06T20:11:49.342529Z","iopub.execute_input":"2022-05-06T20:11:49.343026Z","iopub.status.idle":"2022-05-06T20:11:49.353557Z","shell.execute_reply.started":"2022-05-06T20:11:49.342983Z","shell.execute_reply":"2022-05-06T20:11:49.352795Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def add_match_interval(df):\n    '''add features indicating the time gaps between the match days of previous matches for the home and away teams, \n    and how long they played 3 matches and 6 matches,as an reflection of fatique factor'''\n    for i in [1,2,5]:\n        home_team_history_match_interval = (df.groupby('id').match_date.first().apply(pd.Timestamp) \\\n             - df.query('match ==1').groupby('id').home_team_history_match_date.first().apply(pd.Timestamp) ) /np.timedelta64(1, \"D\")\n        df=df.join(home_team_history_match_interval.to_frame(name=f'home_team_history_match_interval_{i}'), on='id')\n        \n        away_team_history_match_interval = (df.groupby('id').match_date.first().apply(pd.Timestamp) \\\n             - df.query('match ==1').groupby('id').away_team_history_match_date.first().apply(pd.Timestamp) ) /np.timedelta64(1, \"D\")\n        df=df.join(away_team_history_match_interval.to_frame(name=f'away_team_history_match_interval_{i}'), on='id')\n        \n    return df","metadata":{"execution":{"iopub.status.busy":"2022-05-06T20:11:49.354989Z","iopub.execute_input":"2022-05-06T20:11:49.355462Z","iopub.status.idle":"2022-05-06T20:11:49.371823Z","shell.execute_reply.started":"2022-05-06T20:11:49.355426Z","shell.execute_reply":"2022-05-06T20:11:49.370413Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def result_point(goal_difference):\n    if goal_difference > 0:\n        return 3\n    elif goal_difference==0:\n        return 1\n    elif goal_difference < 0:\n        return 0\n    else:\n        return np.NaN","metadata":{"execution":{"iopub.status.busy":"2022-05-06T20:11:49.373979Z","iopub.execute_input":"2022-05-06T20:11:49.375723Z","iopub.status.idle":"2022-05-06T20:11:49.389906Z","shell.execute_reply.started":"2022-05-06T20:11:49.375670Z","shell.execute_reply":"2022-05-06T20:11:49.388813Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def add_form_features(df):\n    '''adding form features for home and away teams, including rating difference and goal difference for each previous match,\n    and the average points got, average goal scored, average goal conceded and average goal difference up to that match as previous n-match form'''\n    \n    df['home_team_history_goal_difference']=df['home_team_history_goal']-df['home_team_history_opponent_goal']\n    df['away_team_history_goal_difference']=df['away_team_history_goal']-df['away_team_history_opponent_goal']\n    df['home_team_history_point']=df.home_team_history_goal_difference.apply(result_point)\n    df['away_team_history_point']=df.away_team_history_goal_difference.apply(result_point)\n    df['home_team_history_rating_difference']=df['home_team_history_rating']-df['home_team_history_opponent_rating']\n    df['away_team_history_rating_difference']=df['away_team_history_rating']-df['away_team_history_opponent_rating']\n    \n    home_team_history_goal_info_available=df.groupby('id').home_team_history_goal_difference.count()\n    df=df.join(home_team_history_goal_info_available.to_frame(name='home_team_history_goal_info_available'), on='id')\n    away_team_history_goal_info_available=df.groupby('id').away_team_history_goal_difference.count()\n    df=df.join(away_team_history_goal_info_available.to_frame(name='away_team_history_goal_info_available'), on='id')\n    home_team_history_rating_info_available=df.groupby('id').home_team_history_rating_difference.count()\n    df=df.join(home_team_history_rating_info_available.to_frame(name='home_team_history_rating_info_available'), on='id')\n    away_team_history_rating_info_available=df.groupby('id').away_team_history_rating_difference.count()\n    df=df.join(away_team_history_rating_info_available.to_frame(name='away_team_history_rating_info_available'), on='id')\n    \n        \n    for i in [5,10]:\n        home_team_history_average_goal_scored=df.query(f'match <= {i}').groupby('id').home_team_history_goal.mean()\n        df=df.join(home_team_history_average_goal_scored.to_frame(name=f'home_team_history_average_goal_scored_{i}'), on='id')\n        home_team_history_average_goal_conceded=df.query(f'match <= {i}').groupby('id').home_team_history_opponent_goal.mean()\n        df=df.join(home_team_history_average_goal_conceded.to_frame(name=f'home_team_history_average_goal_conceded_{i}'), on='id')\n        \n        away_team_history_average_goal_scored=df.query(f'match <= {i}').groupby('id').away_team_history_goal.mean()\n        df=df.join(away_team_history_average_goal_scored.to_frame(name=f'away_team_history_average_goal_scored_{i}'), on='id')\n        away_team_history_average_goal_conceded=df.query(f'match <= {i}').groupby('id').away_team_history_opponent_goal.mean()\n        df=df.join(away_team_history_average_goal_conceded.to_frame(name=f'away_team_history_average_goal_conceded_{i}'), on='id')\n        \n        df[f'home_team_history_average_goal_difference_{i}']=df[f'home_team_history_average_goal_scored_{i}']-df[f'home_team_history_average_goal_conceded_{i}']\n        df[f'away_team_history_average_goal_difference_{i}']=df[f'away_team_history_average_goal_scored_{i}']-df[f'away_team_history_average_goal_conceded_{i}']\n        \n        home_team_history_average_point=df.query(f'match <= {i}').groupby('id').home_team_history_point.mean()\n        df=df.join(home_team_history_average_point.to_frame(name=f'home_team_history_average_point_{i}'), on='id')\n        away_team_history_average_point=df.query(f'match <= {i}').groupby('id').away_team_history_point.mean()\n        df=df.join(away_team_history_average_point.to_frame(name=f'away_team_history_average_point_{i}'), on='id')\n        home_team_history_average_point_std=df.query(f'match <= {i}').groupby('id').home_team_history_point.std()\n        df=df.join(home_team_history_average_point_std.to_frame(name=f'home_team_history_average_point_std_{i}'), on='id')\n        away_team_history_average_point_std=df.query(f'match <= {i}').groupby('id').away_team_history_point.std()\n        df=df.join(away_team_history_average_point_std.to_frame(name=f'away_team_history_average_point_std_{i}'), on='id')\n        \n        home_team_history_median_rating_difference=df.query(f'match <= {i}').groupby('id').home_team_history_rating_difference.median()\n        df=df.join(home_team_history_median_rating_difference.to_frame(name=f'home_team_history_median_rating_difference_{i}'), on='id')\n        away_team_history_median_rating_difference=df.query(f'match <= {i}').groupby('id').away_team_history_rating_difference.median()\n        df=df.join(away_team_history_median_rating_difference.to_frame(name=f'away_team_history_median_rating_difference_{i}'), on='id')\n        home_team_history_rating_difference_std=df.query(f'match <= {i}').groupby('id').home_team_history_rating_difference.std()\n        df=df.join(home_team_history_rating_difference_std.to_frame(name=f'home_team_history_rating_difference_std_{i}'), on='id')\n        away_team_history_rating_difference_std=df.query(f'match <= {i}').groupby('id').away_team_history_rating_difference.std()\n        df=df.join(away_team_history_rating_difference_std.to_frame(name=f'away_team_history_rating_difference_std_{i}'), on='id')\n    \n    home_team_home_form_average_goal_scored=df.query('home_team_history_is_play_home==1').groupby('id').home_team_history_goal.mean()\n    df=df.join(home_team_home_form_average_goal_scored.to_frame(name='home_team_home_form_average_goal_scored'), on='id')\n    home_team_home_form_average_goal_conceded=df.query('home_team_history_is_play_home==1').groupby('id').home_team_history_opponent_goal.mean()\n    df=df.join(home_team_home_form_average_goal_conceded.to_frame(name='home_team_home_form_average_goal_conceded'), on='id')\n    home_team_home_form_average_goal_difference=df.query('home_team_history_is_play_home==1').groupby('id').home_team_history_goal_difference.mean()\n    df=df.join(home_team_home_form_average_goal_difference.to_frame(name='home_team_home_form_average_goal_difference'), on='id')\n    home_team_home_form_goal_difference_std=df.query('home_team_history_is_play_home==1').groupby('id').home_team_history_goal_difference.std()\n    df=df.join(home_team_home_form_goal_difference_std.to_frame(name='home_team_home_form_goal_difference_std'), on='id')\n    home_team_home_form_win_rate=df.query('(home_team_history_is_play_home==1) & (home_team_history_point==3)').groupby('id').home_team_history_point.count()/df.query('home_team_history_is_play_home==1').groupby('id').home_team_history_is_play_home.count()\n    df=df.join(home_team_home_form_win_rate.to_frame(name='home_team_home_form_win_rate'), on='id')\n    home_team_home_form_draw_rate=df.query('(home_team_history_is_play_home==1) & (home_team_history_point==1)').groupby('id').home_team_history_point.count()/df.query('home_team_history_is_play_home==1').groupby('id').home_team_history_is_play_home.count()\n    df=df.join(home_team_home_form_draw_rate.to_frame(name='home_team_home_form_draw_rate'), on='id')\n    home_team_home_form_lose_rate=df.query('(home_team_history_is_play_home==1) & (home_team_history_point==0)').groupby('id').home_team_history_point.count()/df.query('home_team_history_is_play_home==1').groupby('id').home_team_history_is_play_home.count()\n    df=df.join(home_team_home_form_lose_rate.to_frame(name='home_team_home_form_lose_rate'), on='id')\n    home_team_home_form_average_point=df.query('home_team_history_is_play_home==1').groupby('id').home_team_history_point.mean()\n    df=df.join(home_team_home_form_average_point.to_frame(name='home_team_home_form_average_point'), on='id')\n    home_team_home_form_median_rating_difference=df.query('home_team_history_is_play_home==1').groupby('id').home_team_history_rating_difference.median()\n    df=df.join(home_team_home_form_median_rating_difference.to_frame(name='home_team_home_form_median_rating_difference'), on='id')\n    home_team_home_form_goal_info_available=df.query('home_team_history_is_play_home==1').groupby('id').home_team_history_goal_difference.count()\n    df=df.join(home_team_home_form_goal_info_available.to_frame(name='home_team_home_form_goal_info_available'), on='id')\n    home_team_home_form_rating_info_available=df.query('home_team_history_is_play_home==1').groupby('id').home_team_history_rating_difference.count()\n    df=df.join(home_team_home_form_rating_info_available.to_frame(name='home_team_home_form_rating_info_available'), on='id')\n    \n    away_team_away_form_average_goal_scored=df.query('away_team_history_is_play_home==0').groupby('id').away_team_history_goal.mean()\n    df=df.join(away_team_away_form_average_goal_scored.to_frame(name='away_team_away_form_average_goal_scored'), on='id')\n    away_team_away_form_average_goal_conceded=df.query('away_team_history_is_play_home==0').groupby('id').away_team_history_opponent_goal.mean()\n    df=df.join(away_team_away_form_average_goal_conceded.to_frame(name='away_team_away_form_average_goal_conceded'), on='id')\n    away_team_away_form_average_goal_difference=df.query('away_team_history_is_play_home==0').groupby('id').away_team_history_goal_difference.mean()\n    df=df.join(away_team_away_form_average_goal_difference.to_frame(name='away_team_away_form_average_goal_difference'), on='id')\n    away_team_away_form_goal_difference_std=df.query('away_team_history_is_play_home==0').groupby('id').away_team_history_goal_difference.std()\n    df=df.join(away_team_away_form_goal_difference_std.to_frame(name='away_team_away_form_goal_difference_std'), on='id')\n    away_team_away_form_win_rate=df.query('(away_team_history_is_play_home==0) & (away_team_history_point==3)').groupby('id').away_team_history_point.count()/df.query('away_team_history_is_play_home==0').groupby('id').away_team_history_is_play_home.count()\n    df=df.join(away_team_away_form_win_rate.to_frame(name='away_team_away_form_win_rate'), on='id')\n    away_team_away_form_draw_rate=df.query('(away_team_history_is_play_home==0) & (away_team_history_point==1)').groupby('id').away_team_history_point.count()/df.query('away_team_history_is_play_home==0').groupby('id').away_team_history_is_play_home.count()\n    df=df.join(away_team_away_form_draw_rate.to_frame(name='away_team_away_form_draw_rate'), on='id')\n    away_team_away_form_lose_rate=df.query('(away_team_history_is_play_home==0) & (away_team_history_point==0)').groupby('id').away_team_history_point.count()/df.query('away_team_history_is_play_home==0').groupby('id').away_team_history_is_play_home.count()\n    df=df.join(away_team_away_form_lose_rate.to_frame(name='away_team_away_form_lose_rate'), on='id')\n    away_team_away_form_average_point=df.query('away_team_history_is_play_home==0').groupby('id').away_team_history_point.mean()\n    df=df.join(away_team_away_form_average_point.to_frame(name='away_team_away_form_average_point'), on='id')\n    away_team_away_form_median_rating_difference=df.query('away_team_history_is_play_home==0').groupby('id').away_team_history_rating_difference.median()\n    df=df.join(away_team_away_form_median_rating_difference.to_frame(name='away_team_away_form_median_rating_difference'), on='id')\n    away_team_away_form_goal_info_available=df.query('away_team_history_is_play_home==0').groupby('id').away_team_history_goal_difference.count()\n    df=df.join(away_team_away_form_goal_info_available.to_frame(name='away_team_away_form_goal_info_available'), on='id')\n    away_team_away_form_rating_info_available=df.query('away_team_history_is_play_home==0').groupby('id').away_team_history_rating_difference.count()\n    df=df.join(away_team_away_form_rating_info_available.to_frame(name='away_team_away_form_rating_info_available'), on='id')\n    \n    return df","metadata":{"execution":{"iopub.status.busy":"2022-05-06T20:11:49.394685Z","iopub.execute_input":"2022-05-06T20:11:49.394992Z","iopub.status.idle":"2022-05-06T20:11:49.434333Z","shell.execute_reply.started":"2022-05-06T20:11:49.394958Z","shell.execute_reply":"2022-05-06T20:11:49.433634Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def add_attack_defense_strength_features(df):\n    '''getting goal rates of the league/competition, and calculate the attack and defense strength of a team relative to the league/competition,\n    and the expected goals based on this'''\n    \n    home_history_columns=['home_team_history_match_date',\n           'home_team_history_is_play_home',\n           'home_team_history_is_cup',\n           'home_team_history_goal',\n           'home_team_history_opponent_goal',\n           'home_team_history_rating',\n           'home_team_history_opponent_rating',\n           'home_team_history_coach',\n           'home_team_history_league_id']\n    home_history=df[home_history_columns]\n    home_history=home_history.drop_duplicates()\n    \n    away_history_columns=['away_team_history_match_date',\n           'away_team_history_is_play_home',\n           'away_team_history_is_cup',\n           'away_team_history_goal',\n           'away_team_history_opponent_goal',\n           'away_team_history_rating',\n           'away_team_history_opponent_rating',\n           'away_team_history_coach',\n           'away_team_history_league_id']\n    away_history=df[away_history_columns]\n    away_history=away_history.drop_duplicates()\n    \n    league_total_goal = home_history.groupby('home_team_history_league_id').home_team_history_goal.sum() \\\n                    + home_history.groupby('home_team_history_league_id').home_team_history_opponent_goal.sum() \\\n                    + away_history.groupby('away_team_history_league_id').away_team_history_goal.sum() \\\n                    + away_history.groupby('away_team_history_league_id').away_team_history_opponent_goal.sum()\n    league_total_game = home_history.groupby('home_team_history_league_id').home_team_history_goal.count() \\\n                    + home_history.groupby('home_team_history_league_id').home_team_history_opponent_goal.count() \\\n                    + away_history.groupby('away_team_history_league_id').away_team_history_goal.count() \\\n                    + away_history.groupby('away_team_history_league_id').away_team_history_opponent_goal.count() \n    league_average_goal = league_total_goal/league_total_game\n    df=df.join(league_average_goal.to_frame(name='league_average_goal'), on='league_id')\n    df.league_average_goal=df.league_average_goal.fillna(df.league_average_goal.mean())\n    \n    league_total_home_goal = home_history.query('home_team_history_is_play_home==1').groupby('home_team_history_league_id').home_team_history_goal.sum() \\\n                    + home_history.query('home_team_history_is_play_home==0').groupby('home_team_history_league_id').home_team_history_opponent_goal.sum() \\\n                    + away_history.query('away_team_history_is_play_home==1').groupby('away_team_history_league_id').away_team_history_goal.sum() \\\n                    + away_history.query('away_team_history_is_play_home==0').groupby('away_team_history_league_id').away_team_history_opponent_goal.sum()\n    league_total_home_goal_game = home_history.query('home_team_history_is_play_home==1').groupby('home_team_history_league_id').home_team_history_goal.count() \\\n                    + home_history.query('home_team_history_is_play_home==0').groupby('home_team_history_league_id').home_team_history_opponent_goal.count() \\\n                    + away_history.query('away_team_history_is_play_home==1').groupby('away_team_history_league_id').away_team_history_goal.count() \\\n                    + away_history.query('away_team_history_is_play_home==0').groupby('away_team_history_league_id').away_team_history_opponent_goal.count()\n    league_average_home_goal = league_total_home_goal/league_total_home_goal_game\n    df=df.join(league_average_home_goal.to_frame(name='league_average_home_goal'), on='league_id')\n    df.league_average_home_goal=df.league_average_home_goal.fillna(df.league_average_home_goal.mean())\n    \n    league_total_away_goal = home_history.query('home_team_history_is_play_home==0').groupby('home_team_history_league_id').home_team_history_goal.sum() \\\n                    + home_history.query('home_team_history_is_play_home==1').groupby('home_team_history_league_id').home_team_history_opponent_goal.sum() \\\n                    + away_history.query('away_team_history_is_play_home==0').groupby('away_team_history_league_id').away_team_history_goal.sum() \\\n                    + away_history.query('away_team_history_is_play_home==1').groupby('away_team_history_league_id').away_team_history_opponent_goal.sum()\n    league_total_away_goal_game = home_history.query('home_team_history_is_play_home==0').groupby('home_team_history_league_id').home_team_history_goal.count() \\\n                    + home_history.query('home_team_history_is_play_home==1').groupby('home_team_history_league_id').home_team_history_opponent_goal.count() \\\n                    + away_history.query('away_team_history_is_play_home==0').groupby('away_team_history_league_id').away_team_history_goal.count() \\\n                    + away_history.query('away_team_history_is_play_home==1').groupby('away_team_history_league_id').away_team_history_opponent_goal.count()\n    league_average_away_goal = league_total_away_goal/league_total_away_goal_game\n    df=df.join(league_average_away_goal.to_frame(name='league_average_away_goal'), on='league_id')\n    df.league_average_away_goal=df.league_average_away_goal.fillna(df.league_average_away_goal.mean())\n    \n    df['home_team_attack_strength'] = df.home_team_history_average_goal_scored_10/df.league_average_goal\n    df['home_team_defense_strength'] = df.home_team_history_average_goal_conceded_10/df.league_average_goal\n    df['away_team_attack_strength'] = df.away_team_history_average_goal_scored_10/df.league_average_goal\n    df['away_team_defense_strength'] = df.away_team_history_average_goal_conceded_10/df.league_average_goal\n    df['home_team_expected_goal'] = df.league_average_home_goal*df.home_team_attack_strength*df.away_team_defense_strength\n    df['away_team_expected_goal'] = df.league_average_away_goal*df.away_team_attack_strength*df.home_team_defense_strength\n    \n    \n    #getting teams' record of goal scored and conceded in each league\n    home_team_league_average_goal_scored=df.groupby(['id','home_team_history_league_id']).home_team_history_goal.agg(['mean']).reset_index()\n    home_team_league_average_goal_scored.columns=['id','league_id','home_team_league_average_goal_scored']\n    df=pd.merge(df, home_team_league_average_goal_scored, how='left')\n    \n    home_team_league_average_goal_conceded=df.groupby(['id','home_team_history_league_id']).home_team_history_opponent_goal.agg(['mean']).reset_index()\n    home_team_league_average_goal_conceded.columns=['id','league_id','home_team_league_average_goal_conceded']\n    df=pd.merge(df, home_team_league_average_goal_conceded, how='left')\n    \n    away_team_league_average_goal_scored=df.groupby(['id','away_team_history_league_id']).away_team_history_goal.agg(['mean']).reset_index()\n    away_team_league_average_goal_scored.columns=['id','league_id','away_team_league_average_goal_scored']\n    df=pd.merge(df, away_team_league_average_goal_scored, how='left')\n    \n    away_team_league_average_goal_conceded=df.groupby(['id','away_team_history_league_id']).away_team_history_opponent_goal.agg(['mean']).reset_index()\n    away_team_league_average_goal_conceded.columns=['id','league_id','away_team_league_average_goal_conceded']\n    df=pd.merge(df, away_team_league_average_goal_conceded, how='left')\n    \n    #setting another set of attack, defense and expected goal data based on team's record\n    df['home_team_league_attack_strength'] = df.home_team_league_average_goal_scored/df.league_average_goal\n    df['home_team_league_defense_strength'] = df.home_team_league_average_goal_conceded/df.league_average_goal\n    df['away_team_league_attack_strength'] = df.away_team_league_average_goal_scored/df.league_average_goal\n    df['away_team_league_defense_strength'] = df.away_team_league_average_goal_conceded/df.league_average_goal\n    df['home_team_league_expected_goal'] = df.league_average_home_goal*df.home_team_league_attack_strength*df.away_team_league_defense_strength\n    df['away_team_league_expected_goal'] = df.league_average_away_goal*df.away_team_league_attack_strength*df.home_team_league_defense_strength\n    \n    #getting coach's record of goal scored and conceded in each league\n    home_coach_goal=df.drop_duplicates(subset=home_history_columns)[['home_team_history_coach','home_team_history_league_id', \\\n                                                             'home_team_history_match_date','home_team_history_goal']].dropna()\n    home_coach_goal=home_coach_goal.sort_values(by=['home_team_history_coach','home_team_history_league_id','home_team_history_match_date'],\\\n                                                ascending=[True,True,True])\n    home_coach_goal2=home_coach_goal.set_index(['home_team_history_coach','home_team_history_league_id','home_team_history_match_date']\\\n                                             ).groupby(level=1, as_index=False).home_team_history_goal.agg(['cumsum','cumcount']).reset_index()\n    home_coach_goal2['home_team_coach_league_average_goal_scored']=(home_coach_goal2['cumsum'])/(home_coach_goal2['cumcount']+1)\n    home_coach_goal3=home_coach_goal2[['home_team_history_coach','home_team_history_league_id',\\\n                                       'home_team_history_match_date','home_team_coach_league_average_goal_scored']]\n    home_coach_goal3.columns=['home_team_coach_id','league_id','home_team_history_match_date','home_team_coach_league_average_goal_scored']\n    home_coach_goal3=home_coach_goal3.drop_duplicates(subset=['home_team_coach_id','league_id','home_team_history_match_date'])\n    df=df.merge(home_coach_goal3, how='left')\n    \n    home_coach_conceded=df.drop_duplicates(subset=home_history_columns)[['home_team_history_coach','home_team_history_league_id', \\\n                                                             'home_team_history_match_date','home_team_history_opponent_goal']].dropna()\n    home_coach_conceded=home_coach_conceded.sort_values(by=['home_team_history_coach','home_team_history_league_id','home_team_history_match_date'],\\\n                                                ascending=[True,True,True])\n    home_coach_conceded2=home_coach_conceded.set_index(['home_team_history_coach','home_team_history_league_id','home_team_history_match_date']\\\n                                             ).groupby(level=1, as_index=False).home_team_history_opponent_goal.agg(['cumsum','cumcount']).reset_index()\n    home_coach_conceded2['home_team_coach_league_average_goal_conceded']=(home_coach_conceded2['cumsum'])/(home_coach_conceded2['cumcount']+1)\n    home_coach_conceded3=home_coach_conceded2[['home_team_history_coach','home_team_history_league_id',\\\n                                       'home_team_history_match_date','home_team_coach_league_average_goal_conceded']]\n    home_coach_conceded3.columns=['home_team_coach_id','league_id','home_team_history_match_date','home_team_coach_league_average_goal_conceded']\n    home_coach_conceded3=home_coach_conceded3.drop_duplicates(subset=['home_team_coach_id','league_id','home_team_history_match_date'])\n    df=df.merge(home_coach_conceded3, how='left')\n    \n    away_coach_goal=df.drop_duplicates(subset=away_history_columns)[['away_team_history_coach','away_team_history_league_id', \\\n                                                             'away_team_history_match_date','away_team_history_goal']].dropna()\n    away_coach_goal=away_coach_goal.sort_values(by=['away_team_history_coach','away_team_history_league_id','away_team_history_match_date'],\\\n                                                ascending=[True,True,True])\n    away_coach_goal2=away_coach_goal.set_index(['away_team_history_coach','away_team_history_league_id','away_team_history_match_date']\\\n                                             ).groupby(level=1, as_index=False).away_team_history_goal.agg(['cumsum','cumcount']).reset_index()\n    away_coach_goal2['away_team_coach_league_average_goal_scored']=(away_coach_goal2['cumsum'])/(away_coach_goal2['cumcount']+1)\n    away_coach_goal3=away_coach_goal2[['away_team_history_coach','away_team_history_league_id',\\\n                                       'away_team_history_match_date','away_team_coach_league_average_goal_scored']]\n    away_coach_goal3.columns=['away_team_coach_id','league_id','away_team_history_match_date','away_team_coach_league_average_goal_scored']\n    away_coach_goal3=away_coach_goal3.drop_duplicates(subset=['away_team_coach_id','league_id','away_team_history_match_date'])\n    df=df.merge(away_coach_goal3, how='left')\n    \n    away_coach_conceded=df.drop_duplicates(subset=away_history_columns)[['away_team_history_coach','away_team_history_league_id', \\\n                                                             'away_team_history_match_date','away_team_history_opponent_goal']].dropna()\n    away_coach_conceded=away_coach_conceded.sort_values(by=['away_team_history_coach','away_team_history_league_id','away_team_history_match_date'],\\\n                                                ascending=[True,True,True])\n    away_coach_conceded2=away_coach_conceded.set_index(['away_team_history_coach','away_team_history_league_id','away_team_history_match_date']\\\n                                             ).groupby(level=1, as_index=False).away_team_history_opponent_goal.agg(['cumsum','cumcount']).reset_index()\n    away_coach_conceded2['away_team_coach_league_average_goal_conceded']=(away_coach_conceded2['cumsum'])/(away_coach_conceded2['cumcount']+1)\n    away_coach_conceded3=away_coach_conceded2[['away_team_history_coach','away_team_history_league_id',\\\n                                       'away_team_history_match_date','away_team_coach_league_average_goal_conceded']]\n    away_coach_conceded3.columns=['away_team_coach_id','league_id','away_team_history_match_date','away_team_coach_league_average_goal_conceded']\n    away_coach_conceded3=away_coach_conceded3.drop_duplicates(subset=['away_team_coach_id','league_id','away_team_history_match_date'])\n    df=df.merge(away_coach_conceded3, how='left')\n    \n    #setting another set of attack, defense and expected goal data based on coach's record\n    df['home_team_coach_attack_strength'] = df.home_team_coach_league_average_goal_scored/df.league_average_goal\n    df['home_team_coach_defense_strength'] = df.home_team_coach_league_average_goal_conceded/df.league_average_goal\n    df['away_team_coach_attack_strength'] = df.away_team_coach_league_average_goal_scored/df.league_average_goal\n    df['away_team_coach_defense_strength'] = df.away_team_coach_league_average_goal_conceded/df.league_average_goal\n    df['home_team_coach_expected_goal'] = df.league_average_home_goal*df.home_team_coach_attack_strength*df.away_team_coach_defense_strength\n    df['away_team_coach_expected_goal'] = df.league_average_away_goal*df.away_team_coach_attack_strength*df.home_team_coach_defense_strength\n    \n    return df","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:00:51.617936Z","iopub.execute_input":"2022-05-06T22:00:51.620933Z","iopub.status.idle":"2022-05-06T22:00:51.697480Z","shell.execute_reply.started":"2022-05-06T22:00:51.620754Z","shell.execute_reply":"2022-05-06T22:00:51.696169Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def reshape(df):\n    '''reshape the dataframe back to wide form'''\n    history_columns=['home_team_history_is_play_home',\n              'home_team_history_is_cup',\n              'home_team_history_goal',\n              'home_team_history_opponent_goal',\n              'home_team_history_rating',\n              'home_team_history_opponent_rating',\n              'home_team_history_coach',\n              'home_team_history_league_id',\n              'home_team_history_goal_difference',\n              'home_team_history_point',\n              'home_team_history_rating_difference',\n              'away_team_history_is_play_home',\n              'away_team_history_is_cup',\n              'away_team_history_goal',\n              'away_team_history_opponent_goal',\n              'away_team_history_rating',\n              'away_team_history_opponent_rating',\n              'away_team_history_coach',\n              'away_team_history_league_id',\n              'away_team_history_goal_difference',\n              'away_team_history_point',\n              'away_team_history_rating_difference']\n    drop_columns=['match','match_date','home_team_history_match_date','away_team_history_match_date']\n    df_history=df[history_columns+['id','match']].set_index(['id','match']).unstack(level=1)\n    df_history.columns = df_history.columns.map('{0[0]}_{0[1]}'.format) \n    df_history=df_history.reset_index()\n    df_new=df.groupby('id').first().reset_index().drop(history_columns+drop_columns, axis=1)\n    df_new=df_new.merge(df_history, how='left')\n    \n    return df_new\n    ","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:01:45.149541Z","iopub.execute_input":"2022-05-06T22:01:45.150306Z","iopub.status.idle":"2022-05-06T22:01:45.159326Z","shell.execute_reply.started":"2022-05-06T22:01:45.150261Z","shell.execute_reply":"2022-05-06T22:01:45.158198Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def preprocession(df):\n    df=is_cup_conversion(df)\n    df=has_coach_change(df)\n    df=convert_to_long_form(df, feature_columns, history_columns)\n    df=add_match_interval(df)\n    df=add_form_features(df)\n    df=add_attack_defense_strength_features(df)\n    df.replace([np.inf, -np.inf], np.nan, inplace=True)\n    df=reshape(df)\n\n    return df","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:01:48.659819Z","iopub.execute_input":"2022-05-06T22:01:48.660385Z","iopub.status.idle":"2022-05-06T22:01:48.667168Z","shell.execute_reply.started":"2022-05-06T22:01:48.660346Z","shell.execute_reply":"2022-05-06T22:01:48.665928Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_p=preprocession(train)","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:02:12.611844Z","iopub.execute_input":"2022-05-06T22:02:12.612235Z","iopub.status.idle":"2022-05-06T22:04:42.950705Z","shell.execute_reply.started":"2022-05-06T22:02:12.612193Z","shell.execute_reply":"2022-05-06T22:04:42.949640Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in train_p.columns:\n    print(i, train_p.loc[467,i])","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:06:14.522771Z","iopub.execute_input":"2022-05-06T22:06:14.523135Z","iopub.status.idle":"2022-05-06T22:06:14.622570Z","shell.execute_reply.started":"2022-05-06T22:06:14.523100Z","shell.execute_reply":"2022-05-06T22:06:14.621606Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_p","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:06:37.495447Z","iopub.execute_input":"2022-05-06T22:06:37.495796Z","iopub.status.idle":"2022-05-06T22:06:37.544994Z","shell.execute_reply.started":"2022-05-06T22:06:37.495756Z","shell.execute_reply":"2022-05-06T22:06:37.544113Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X=train_p.drop('id', axis=1)\ny=train.sort_values(by='id')['target']","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:06:41.071426Z","iopub.execute_input":"2022-05-06T22:06:41.072271Z","iopub.status.idle":"2022-05-06T22:06:41.623544Z","shell.execute_reply.started":"2022-05-06T22:06:41.072225Z","shell.execute_reply":"2022-05-06T22:06:41.622528Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:06:43.178107Z","iopub.execute_input":"2022-05-06T22:06:43.178792Z","iopub.status.idle":"2022-05-06T22:06:43.226088Z","shell.execute_reply.started":"2022-05-06T22:06:43.178734Z","shell.execute_reply":"2022-05-06T22:06:43.225371Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\nlabel_encoder = LabelEncoder()\nlabel_encoder = label_encoder.fit(y)\nlabel_encoded_y = label_encoder.transform(y)","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:06:46.637449Z","iopub.execute_input":"2022-05-06T22:06:46.638069Z","iopub.status.idle":"2022-05-06T22:06:46.839705Z","shell.execute_reply.started":"2022-05-06T22:06:46.638028Z","shell.execute_reply":"2022-05-06T22:06:46.838686Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn import model_selection\nX_train, X_valid, y_train, y_valid = model_selection.train_test_split(X, label_encoded_y, train_size=0.8, random_state=42)","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:06:48.292398Z","iopub.execute_input":"2022-05-06T22:06:48.292748Z","iopub.status.idle":"2022-05-06T22:06:48.621427Z","shell.execute_reply.started":"2022-05-06T22:06:48.292709Z","shell.execute_reply":"2022-05-06T22:06:48.620549Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import xgboost as xgb\nd_train = xgb.DMatrix(X_train, y_train)\nd_test = xgb.DMatrix(X_valid, y_valid)","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:06:50.710324Z","iopub.execute_input":"2022-05-06T22:06:50.710677Z","iopub.status.idle":"2022-05-06T22:06:51.515368Z","shell.execute_reply.started":"2022-05-06T22:06:50.710640Z","shell.execute_reply":"2022-05-06T22:06:51.514451Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"params_1 = {\n    'booster': 'gbtree',\n    'max_depth': 5, \n    'learning_rate': 0.025,\n    'min_split_loss': 0.01,\n    'min_child_weight': 5,\n    'subsample': 0.8,\n    'colsample_bytree': 0.25,\n    'alpha': 2,\n    'lambda': 3,\n    'objective': 'multi:softprob',\n    'num_class': 3,\n    'eval_metric':'mlogloss'\n    }\n\nnum_round = 1000\nevallist = [(d_train, 'train'), (d_test, 'eval')]","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:06:53.542334Z","iopub.execute_input":"2022-05-06T22:06:53.542684Z","iopub.status.idle":"2022-05-06T22:06:53.547699Z","shell.execute_reply.started":"2022-05-06T22:06:53.542637Z","shell.execute_reply":"2022-05-06T22:06:53.546878Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"bst = xgb.train(params_1, d_train, num_round, evallist, early_stopping_rounds=20)","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:06:55.921972Z","iopub.execute_input":"2022-05-06T22:06:55.922445Z","iopub.status.idle":"2022-05-06T22:20:49.918407Z","shell.execute_reply.started":"2022-05-06T22:06:55.922403Z","shell.execute_reply":"2022-05-06T22:20:49.917415Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"xgb.plot_importance(bst, max_num_features=200)\nfig = plt.gcf()\nfig.set_size_inches(18.5, 30.5)","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:20:53.512976Z","iopub.execute_input":"2022-05-06T22:20:53.513281Z","iopub.status.idle":"2022-05-06T22:20:59.402848Z","shell.execute_reply.started":"2022-05-06T22:20:53.513249Z","shell.execute_reply":"2022-05-06T22:20:59.401864Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"xgb.plot_tree(bst, num_trees=1)\nfig = plt.gcf()\nfig.set_size_inches(160, 100)","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:20:59.404745Z","iopub.execute_input":"2022-05-06T22:20:59.405306Z","iopub.status.idle":"2022-05-06T22:21:05.177182Z","shell.execute_reply.started":"2022-05-06T22:20:59.405261Z","shell.execute_reply":"2022-05-06T22:21:05.175966Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"bst.best_iteration","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:21:05.178770Z","iopub.execute_input":"2022-05-06T22:21:05.179079Z","iopub.status.idle":"2022-05-06T22:21:05.185513Z","shell.execute_reply.started":"2022-05-06T22:21:05.179041Z","shell.execute_reply":"2022-05-06T22:21:05.184807Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"bst.best_score","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:21:05.187131Z","iopub.execute_input":"2022-05-06T22:21:05.187524Z","iopub.status.idle":"2022-05-06T22:21:05.199065Z","shell.execute_reply.started":"2022-05-06T22:21:05.187491Z","shell.execute_reply":"2022-05-06T22:21:05.198318Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_p=preprocession(test)","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:22:31.496091Z","iopub.execute_input":"2022-05-06T22:22:31.496568Z","iopub.status.idle":"2022-05-06T22:24:13.107496Z","shell.execute_reply.started":"2022-05-06T22:22:31.496530Z","shell.execute_reply":"2022-05-06T22:24:13.106385Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_p","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:24:13.109514Z","iopub.execute_input":"2022-05-06T22:24:13.109922Z","iopub.status.idle":"2022-05-06T22:24:13.153181Z","shell.execute_reply.started":"2022-05-06T22:24:13.109874Z","shell.execute_reply":"2022-05-06T22:24:13.152308Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test=test_p.drop('id', axis=1)\nX_test_d = xgb.DMatrix(X_test)","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:24:32.876762Z","iopub.execute_input":"2022-05-06T22:24:32.877065Z","iopub.status.idle":"2022-05-06T22:24:33.498290Z","shell.execute_reply.started":"2022-05-06T22:24:32.877028Z","shell.execute_reply":"2022-05-06T22:24:33.497288Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:24:34.885118Z","iopub.execute_input":"2022-05-06T22:24:34.886045Z","iopub.status.idle":"2022-05-06T22:24:34.929140Z","shell.execute_reply.started":"2022-05-06T22:24:34.885996Z","shell.execute_reply":"2022-05-06T22:24:34.928289Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = bst.predict(X_test_d, iteration_range=(0, bst.best_iteration))","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:24:37.917086Z","iopub.execute_input":"2022-05-06T22:24:37.917388Z","iopub.status.idle":"2022-05-06T22:24:39.406572Z","shell.execute_reply.started":"2022-05-06T22:24:37.917357Z","shell.execute_reply":"2022-05-06T22:24:39.405818Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:24:41.025817Z","iopub.execute_input":"2022-05-06T22:24:41.026163Z","iopub.status.idle":"2022-05-06T22:24:41.033854Z","shell.execute_reply.started":"2022-05-06T22:24:41.026115Z","shell.execute_reply":"2022-05-06T22:24:41.032683Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.DataFrame(predictions ,columns=label_encoder.inverse_transform([0,1,2]))\nsubmission['id'] = test.sort_values(by='id').reset_index()['id']\ncols=['id','home','away','draw']\nsubmission=submission[cols]\ndisplay(submission)","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:24:43.445031Z","iopub.execute_input":"2022-05-06T22:24:43.445922Z","iopub.status.idle":"2022-05-06T22:24:43.681500Z","shell.execute_reply.started":"2022-05-06T22:24:43.445878Z","shell.execute_reply":"2022-05-06T22:24:43.680636Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-05-06T22:24:52.861306Z","iopub.execute_input":"2022-05-06T22:24:52.861673Z","iopub.status.idle":"2022-05-06T22:24:53.118490Z","shell.execute_reply.started":"2022-05-06T22:24:52.861632Z","shell.execute_reply":"2022-05-06T22:24:53.117551Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}