{"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\nThanks for looking.  \nThis competition will predict the outcome of future soccer matches based on historical data!  \nIn this notebook, we will show a simple implementation of the lightgbm method for beginners in machine learning.","metadata":{}},{"cell_type":"markdown","source":"# Module Load\nFirst, import required modules.","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport warnings\nimport time\nwarnings.simplefilter('ignore')\nimport math\nfrom statistics import mean\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom datetime import timedelta\nfrom sklearn.preprocessing import StandardScaler, MinMaxScaler\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import log_loss","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:20:44.588738Z","iopub.execute_input":"2022-04-18T14:20:44.589190Z","iopub.status.idle":"2022-04-18T14:20:45.145055Z","shell.execute_reply.started":"2022-04-18T14:20:44.589109Z","shell.execute_reply":"2022-04-18T14:20:45.144102Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Loading Data\nLoading data by using read_csv in pandas.\n","metadata":{}},{"cell_type":"code","source":"train_df = pd.read_csv('../input/football-match-probability-prediction/train.csv')\ntest_df = pd.read_csv('../input/football-match-probability-prediction/test.csv')\ntrain_target_score_df = pd.read_csv('../input/football-match-probability-prediction/train_target_and_scores.csv')","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:20:45.273604Z","iopub.execute_input":"2022-04-18T14:20:45.273924Z","iopub.status.idle":"2022-04-18T14:20:51.649273Z","shell.execute_reply.started":"2022-04-18T14:20:45.273890Z","shell.execute_reply":"2022-04-18T14:20:51.648160Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Explanatory Data Analysis","metadata":{}},{"cell_type":"markdown","source":"Check the contents and shape","metadata":{}},{"cell_type":"code","source":"print(train_df.shape)\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:20:51.651232Z","iopub.execute_input":"2022-04-18T14:20:51.651569Z","iopub.status.idle":"2022-04-18T14:20:51.688984Z","shell.execute_reply.started":"2022-04-18T14:20:51.651534Z","shell.execute_reply":"2022-04-18T14:20:51.688131Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train_target_score_df.shape)\ntrain_target_score_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:20:51.690352Z","iopub.execute_input":"2022-04-18T14:20:51.691301Z","iopub.status.idle":"2022-04-18T14:20:51.701782Z","shell.execute_reply.started":"2022-04-18T14:20:51.691261Z","shell.execute_reply":"2022-04-18T14:20:51.701139Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(test_df.shape)\ntest_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:20:51.703215Z","iopub.execute_input":"2022-04-18T14:20:51.703566Z","iopub.status.idle":"2022-04-18T14:20:51.737963Z","shell.execute_reply.started":"2022-04-18T14:20:51.703537Z","shell.execute_reply":"2022-04-18T14:20:51.737087Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Data Summary\n***\n**train.csv**...the training set. It contains data from 110938 matches from December 1, 2019 to May 1, 2021.  \n**test.csv**...the test set. No away and home team names.  \n**train_target_and_scores.csv** - contains each match's final score Home - Away in addition to the target which is also in the training set.\n\n*  target - The team that won that match\n*  home_team_name - The name of the Home the team. Hidden in test set, see this discussion\n*  away_team_name - The name of the Away the team. Hidden in test set, see this discussion\n*  match_date - The match date (UTC).\n*  league_name - The league name.\n*  league_id - The league id. Note that league names can be identical for two differents id.\n*  is_cup - If the value is 1 the match is played for a cup compettion.\n*  home_team_coach_id - The id of the Home team coach.\n*  away_team_coach_id - The id of the Away team coach.\n*  home_team_history_match_date_{i} - The date of the last i-th match played by Home team.\n*  home_team_history_is_play_home_{i} - If 1, the Home team played home.\n*  home_team_history_is_cup_{i} - If 1, the match was a cup competition.\n*  home_team_history_goal_{i} - The number of goals scored by the Home team on its last i-th match.\n*  home_team_history_opponent_goal_{i} - The number of goals conceded by the Home team on its last i-th match.\n*  home_team_history_rating_{i} - The rating of the Home team on its last i-th match (pre match rating).\n*  home_team_history_opponent_rating_{i} - The rating of the opponent team on Home team last i-th match (pre match rating).\n*  home_team_history_coach_{i} - The coach id of the Home team on its last i-th match.\n*  home_team_history_league_id_{i} - The league name id by the Home team on its last i-th match.\n*  away_team_history_match_date_{i} - The date of the last i-th match played by Away team.\n*  away_team_history_is_play_home_{i} - If 1, the Away team played home.\n*  away_team_history_is_cup_{i} - If 1, the match was a cup competition.\n*  away_team_history_goal_{i} - The number of goals scored by the Away team on its last i-th match.\n*  away_team_history_opponent_goal_{i} - The number of goals conceded by the Away team on its last i-th match.\n*  away_team_history_rating_{i} - The rating of the Away team on its last i-th match (pre match rating).\n*  away_team_history_opponent_rating_{i} - The rating of the opponent team on Away team last i-th match (pre match rating).\n*  away_team_history_coach_{i} - The coach id of the Away team on its last i-th match.\n*  away_team_history_league_id_{i} - The league name id played by the Away on its last i-th match.","metadata":{}},{"cell_type":"markdown","source":"Specify id as line name","metadata":{}},{"cell_type":"code","source":"train_df.set_index(keys='id', inplace=True)\ntest_df.set_index(keys='id', inplace=True)\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:20:51.739597Z","iopub.execute_input":"2022-04-18T14:20:51.740134Z","iopub.status.idle":"2022-04-18T14:20:51.772895Z","shell.execute_reply.started":"2022-04-18T14:20:51.740085Z","shell.execute_reply":"2022-04-18T14:20:51.772163Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"For `train_target_score_df`, do the same with the line name as id and label encoding for `'target'`","metadata":{}},{"cell_type":"code","source":"train_target_score_df.set_index(keys='id', inplace=True)\ntrain_target_score_df = train_target_score_df['target'].map({'home': 0, 'draw': 1, 'away': 2})\ntrain_target_score_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:20:56.562863Z","iopub.execute_input":"2022-04-18T14:20:56.563281Z","iopub.status.idle":"2022-04-18T14:20:56.583084Z","shell.execute_reply.started":"2022-04-18T14:20:56.563242Z","shell.execute_reply":"2022-04-18T14:20:56.582135Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Here, visualize the relationship between target and other features using *`seaborn`*  \n*  Target and league_id do not correlate\n*  Targets and rating are slightly correlate\n  .\n  .","metadata":{}},{"cell_type":"code","source":"### Please change to the column that interests you. (ex)'home_team_history_rating' \ntarget_columns = 'home_team_history_coach'\n###\ncols = []\nfor col in train_df.filter(regex=target_columns, axis=1).columns:\n    cols.append(col)\nprint(cols)\ncorr = pd.concat([train_df[cols],train_target_score_df], axis=1).corr()\nsns.heatmap(corr)","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:20:59.532999Z","iopub.execute_input":"2022-04-18T14:20:59.533307Z","iopub.status.idle":"2022-04-18T14:21:00.173804Z","shell.execute_reply.started":"2022-04-18T14:20:59.533277Z","shell.execute_reply":"2022-04-18T14:21:00.172829Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Featured Engineering\nNext, engineering the features","metadata":{}},{"cell_type":"markdown","source":"First, except for the correct labels in `train_df`, combine with `test_df` for simultaneous processing","metadata":{}},{"cell_type":"code","source":"# Only correct labels should be separated.\ntrain_df_y = train_df['target']\ntrain_df.drop(['target'], axis=1, inplace=True)\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:21:04.443333Z","iopub.execute_input":"2022-04-18T14:21:04.443631Z","iopub.status.idle":"2022-04-18T14:21:04.551741Z","shell.execute_reply.started":"2022-04-18T14:21:04.443601Z","shell.execute_reply":"2022-04-18T14:21:04.550826Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Combine train_df and test_df\nntrain = train_df.shape[0]\nall_data = pd.concat((train_df, test_df))\nprint(all_data.shape)\nall_data.head()","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:21:06.193516Z","iopub.execute_input":"2022-04-18T14:21:06.193841Z","iopub.status.idle":"2022-04-18T14:21:06.459632Z","shell.execute_reply.started":"2022-04-18T14:21:06.193807Z","shell.execute_reply":"2022-04-18T14:21:06.458595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Remove date, team_name and coach as they are not used.","metadata":{}},{"cell_type":"code","source":"all_data.drop(['home_team_name', 'away_team_name', 'league_name'], axis=1, inplace=True)\nall_data.drop(all_data.filter(regex='date').columns, axis=1, inplace = True)\nall_data.drop(all_data.filter(regex='coach').columns, axis=1, inplace = True)\nall_data.head()","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:21:07.882723Z","iopub.execute_input":"2022-04-18T14:21:07.883013Z","iopub.status.idle":"2022-04-18T14:21:08.625267Z","shell.execute_reply.started":"2022-04-18T14:21:07.882985Z","shell.execute_reply":"2022-04-18T14:21:08.624316Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Convert is_cup to numeric information since is_cup is character information.","metadata":{}},{"cell_type":"code","source":"all_data['is_cup'] = all_data['is_cup'].map({False: 0, True: 1})\nall_data.head()","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:21:10.642806Z","iopub.execute_input":"2022-04-18T14:21:10.643139Z","iopub.status.idle":"2022-04-18T14:21:10.689376Z","shell.execute_reply.started":"2022-04-18T14:21:10.643101Z","shell.execute_reply":"2022-04-18T14:21:10.688753Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Check missing information","metadata":{}},{"cell_type":"code","source":"all_data_na = (all_data.isnull().sum() / len(all_data)) * 100\nall_data_na = all_data_na.drop(all_data_na[all_data_na == 0].index).sort_values(ascending=False)[:30]\nmissing_data = pd.DataFrame({'Missing Ratio' :all_data_na})\nprint(len(all_data_na))\nmissing_data.head(30)","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:21:12.793330Z","iopub.execute_input":"2022-04-18T14:21:12.794889Z","iopub.status.idle":"2022-04-18T14:21:12.874987Z","shell.execute_reply.started":"2022-04-18T14:21:12.794819Z","shell.execute_reply":"2022-04-18T14:21:12.874280Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"The missing information is as follows.\n*  ~ is_cup ~ ... fill with zero.\n*  ~ rating ~ ... fill with mean value.\n*  ~ is_play_home ~ ... fill with 0.5.\n*  ~ goal ~ ... fill with mean value.","metadata":{}},{"cell_type":"code","source":"# is_cup\nfor col in all_data.filter(regex='is_cup', axis=1).columns:\n    all_data[col] = all_data[col].fillna(0)\n# rating\nfor col in all_data.filter(regex='rating', axis=1).columns:\n    all_data[col] = all_data[col].fillna(all_data[col].mean())\n# is play home\nfor col in all_data.filter(regex='is_play_home', axis=1).columns:\n    all_data[col] = all_data[col].fillna(0.5)\n# league\nfor col in all_data.filter(regex='league', axis=1).columns:\n    all_data[col] = all_data[col].fillna(0)\n# goal\nfor col in all_data.filter(regex='goal', axis=1).columns:\n    all_data[col] = all_data[col].fillna(all_data[col].mean())","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:21:15.583744Z","iopub.execute_input":"2022-04-18T14:21:15.584766Z","iopub.status.idle":"2022-04-18T14:21:16.098868Z","shell.execute_reply.started":"2022-04-18T14:21:15.584699Z","shell.execute_reply":"2022-04-18T14:21:16.097890Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Reconfirm missing values","metadata":{}},{"cell_type":"code","source":"all_data_na = (all_data.isnull().sum() / len(all_data)) * 100\nall_data_na = all_data_na.drop(all_data_na[all_data_na == 0].index).sort_values(ascending=False)[:30]\nmissing_data = pd.DataFrame({'Missing Ratio' :all_data_na})\nprint(len(all_data_na))\nmissing_data.head()","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:21:17.982372Z","iopub.execute_input":"2022-04-18T14:21:17.983300Z","iopub.status.idle":"2022-04-18T14:21:18.059656Z","shell.execute_reply.started":"2022-04-18T14:21:17.983256Z","shell.execute_reply":"2022-04-18T14:21:18.058147Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Undo `test_df` and `train_df`","metadata":{}},{"cell_type":"code","source":"train_df = all_data[:ntrain]\ntest_df = all_data[ntrain:]\nprint(train_df.shape, test_df.shape)\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:21:19.929775Z","iopub.execute_input":"2022-04-18T14:21:19.930180Z","iopub.status.idle":"2022-04-18T14:21:19.974593Z","shell.execute_reply.started":"2022-04-18T14:21:19.930135Z","shell.execute_reply":"2022-04-18T14:21:19.973496Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Trainig\nNow that feature engineering is done, create and train the model","metadata":{}},{"cell_type":"markdown","source":"## Model Partitioning\nSplit `train_df` into **training data** (used to train the model) and **test data** (used to verify generalization performance of the model)","metadata":{}},{"cell_type":"code","source":"# pandas -> numpy\nX = train_df.values\ny = train_target_score_df.values\nprint(X.shape, y.shape)\n# split training data and test data(20%)\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=1, stratify=y)\nprint(X_train.shape, X_test.shape)\nprint(y_train.shape, y_test.shape)","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:21:22.843407Z","iopub.execute_input":"2022-04-18T14:21:22.843689Z","iopub.status.idle":"2022-04-18T14:21:23.133325Z","shell.execute_reply.started":"2022-04-18T14:21:22.843660Z","shell.execute_reply":"2022-04-18T14:21:23.132332Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Hyperparameter tuning\nFurthermore, the training data is split into training data and validation data, and hyperparameter tuning is performed using the validation data.  \nThis process is time consuming, so skip this cell when implementing without tuning.","metadata":{}},{"cell_type":"code","source":"# import optuna.integration.lightgbm as lgb   #Models with tuning\n\n# X_train, X_valid, y_train, y_valid = train_test_split(X_train, y_train, test_size=0.30, random_state=1998, stratify=y_train)\n# # Create dataset for LightGBM\n# lgb_train = lgb.Dataset(X_train, y_train)\n# lgb_valid = lgb.Dataset(X_valid, y_valid)\n# # setting parameter\n# params = {'objective': 'multiclass', \n#           'num_class': 3,\n#           'metric': 'multi_logloss', \n#           'verbosity': -1, \n#           'num_leaves': 45, \n#           'learning_rate': 0.05, \n#           'feature_fraction': 1.0, \n#           'bagging_fraction': 0.7, \n#           'bagging_freq': 2, \n#           'feature_pre_filter': False, \n#           'lambda_l1': 0.005, \n#           'lambda_l2': 1.0e-08, \n#           'min_child_samples': 25}\n\n# # Model creation from training data\n# gbm = lgb.train(params, lgb_train, valid_sets=lgb_valid,\n#                 verbose_eval=50, # Learning result output every 50 iter\n#                 num_boost_round=10000, # max iteration\n#                 early_stopping_rounds=100\n#                )\n# best_params = gbm.params\n# print(best_params)\n# # Check forecast accuracy\n# y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration)\n# print(y_pred)","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:21:27.296384Z","iopub.execute_input":"2022-04-18T14:21:27.296921Z","iopub.status.idle":"2022-04-18T14:56:41.897454Z","shell.execute_reply.started":"2022-04-18T14:21:27.296782Z","shell.execute_reply":"2022-04-18T14:56:41.896362Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Learning without Tuning.  \nHere, **k-fold cross validation** is performed to create a model with better generalization performance","metadata":{}},{"cell_type":"code","source":"import lightgbm as lgb   # No hyper-parameter tuning\n# training parameter\nparams = {'objective': 'multiclass', \n          'num_class': 3, \n          'metric': 'multi_logloss', \n          'verbosity': -1, \n          'num_leaves': 6, \n          'learning_rate': 0.05, \n          'feature_fraction': 0.4, \n          'bagging_fraction': 0.6780922358381494, \n          'bagging_freq': 4, \n          'feature_pre_filter': False, \n          'lambda_l1': 1.0136734007272632, \n          'lambda_l2': 5.110989943250052, \n          'min_data_in_leaf': 25, \n          'min_child_samples': 20, \n          'num_iterations': 10000, \n          'early_stopping_round': 100}\n\nkfold = StratifiedKFold(n_splits=10,\n                        random_state=1, shuffle=True).split(X_train, y_train)     \nscores = []   \nmodels = []   \nfor k, (train, test) in enumerate(kfold):\n    X_trainset_lgb = lgb.Dataset(X_train[train], y_train[train])\n    X_validset_lgb = lgb.Dataset(X_train[test], y_train[test])\n\n    gbm = lgb.train(params, X_trainset_lgb, valid_sets=X_validset_lgb,\n                verbose_eval=100, \n                num_boost_round=10000, \n                early_stopping_rounds=100)\n    pred_t = gbm.predict(X_train[test], num_iteration=gbm.best_iteration)\n    score = log_loss(y_train[test], pred_t) # Calculation of correct response rate for test data\n    scores.append(score)  # append score\n    print('Fold: %2d, loss: %.3f' % (k+1, score))\n    models.append(gbm)\nprint('\\nCV loss: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))","metadata":{"execution":{"iopub.status.busy":"2022-04-18T14:58:57.354863Z","iopub.execute_input":"2022-04-18T14:58:57.355259Z","iopub.status.idle":"2022-04-18T15:03:58.661563Z","shell.execute_reply.started":"2022-04-18T14:58:57.355218Z","shell.execute_reply":"2022-04-18T15:03:58.660790Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Create a function for predict, make predictions with k models, and average the predictions.","metadata":{}},{"cell_type":"code","source":"def predict(models, X_test):\n#　Create array for storing test data\n    y_pred = np.zeros((len(X_test), len(models), 3))\n    for fold_, model in enumerate(models):\n        # predict test\n        pred_ = model.predict(X_test, num_iteration=model.best_iteration)\n        # save predict\n        y_pred[:, fold_] = pred_ \n    y_pred = y_pred.mean(axis=1)\n    return y_pred\ny_pred = predict(models, X_test)\ny_pred_train = predict(models, X_train)\nprint('test loss = ', log_loss(y_test, y_pred))\nprint('train loss = ', log_loss(y_train, y_pred_train))","metadata":{"execution":{"iopub.status.busy":"2022-04-18T15:04:06.062646Z","iopub.execute_input":"2022-04-18T15:04:06.063499Z","iopub.status.idle":"2022-04-18T15:04:29.297390Z","shell.execute_reply.started":"2022-04-18T15:04:06.063456Z","shell.execute_reply":"2022-04-18T15:04:29.295425Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submit prediction","metadata":{}},{"cell_type":"markdown","source":"Create data for submission.","metadata":{}},{"cell_type":"code","source":"X_submit = test_df.values\ny_submit = predict(models, X_submit)\nprint(y_submit.shape)","metadata":{"execution":{"iopub.status.busy":"2022-04-18T15:04:45.203514Z","iopub.execute_input":"2022-04-18T15:04:45.203815Z","iopub.status.idle":"2022-04-18T15:05:05.156751Z","shell.execute_reply.started":"2022-04-18T15:04:45.203782Z","shell.execute_reply":"2022-04-18T15:05:05.155692Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df = pd.read_csv('../input/football-match-probability-prediction/sample_submission.csv')\nsubmission_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-04-18T15:05:38.964819Z","iopub.execute_input":"2022-04-18T15:05:38.965120Z","iopub.status.idle":"2022-04-18T15:05:39.027787Z","shell.execute_reply.started":"2022-04-18T15:05:38.965089Z","shell.execute_reply":"2022-04-18T15:05:39.027123Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df['home'] = pd.DataFrame(y_submit[:, 0])\nsubmission_df['draw'] = pd.DataFrame(y_submit[:, 1])\nsubmission_df['away'] = pd.DataFrame(y_submit[:, 2])\nsubmission_df.head()","metadata":{"execution":{"iopub.status.busy":"2022-04-18T15:05:41.243600Z","iopub.execute_input":"2022-04-18T15:05:41.244061Z","iopub.status.idle":"2022-04-18T15:05:41.258855Z","shell.execute_reply.started":"2022-04-18T15:05:41.244014Z","shell.execute_reply":"2022-04-18T15:05:41.258151Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df.to_csv(\"submission.csv\", index=False, header=True)","metadata":{"execution":{"iopub.status.busy":"2022-04-18T15:05:43.833722Z","iopub.execute_input":"2022-04-18T15:05:43.834486Z","iopub.status.idle":"2022-04-18T15:05:44.234282Z","shell.execute_reply.started":"2022-04-18T15:05:43.834433Z","shell.execute_reply":"2022-04-18T15:05:44.233260Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}