{"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":" In this notebook only inference and submission task will be performed.","metadata":{"execution":{"iopub.status.busy":"2021-07-02T06:13:39.03302Z","iopub.execute_input":"2021-07-02T06:13:39.033339Z","iopub.status.idle":"2021-07-02T06:13:39.040014Z","shell.execute_reply.started":"2021-07-02T06:13:39.03331Z","shell.execute_reply":"2021-07-02T06:13:39.03856Z"}}},{"cell_type":"code","source":"import gc\nimport sys\nimport warnings\nfrom pathlib import Path\n\nimport os\n\nimport ipywidgets as widgets\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport seaborn as sns\nfrom tqdm import tqdm\n#warnings.simplefilter(\"ignore\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-07-07T17:43:50.741162Z","iopub.execute_input":"2021-07-07T17:43:50.741728Z","iopub.status.idle":"2021-07-07T17:43:50.748502Z","shell.execute_reply.started":"2021-07-07T17:43:50.741684Z","shell.execute_reply":"2021-07-07T17:43:50.747086Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Helper function to unpack json found in daily data\ndef unpack_json(json_str):\n    return np.nan if pd.isna(json_str) else pd.read_json(json_str)\n\n# helper function to add is_played column\ndef is_played_games(row):\n    if pd.isnull(row['gameDate']):\n        is_played = 0\n    else:\n        is_played = 1\n    return is_played\n\n# helper function to add bmi column\ndef BMI(row):\n    '''\n    Calculate BMI for players.csv\n    '''\n    height_in = row['heightInches']\n    mass_lb = row['weight']\n    bmi = (mass_lb/height_in**2)*703\n    \n    return bmi","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:50.753177Z","iopub.execute_input":"2021-07-07T17:43:50.753704Z","iopub.status.idle":"2021-07-07T17:43:50.769024Z","shell.execute_reply.started":"2021-07-07T17:43:50.753651Z","shell.execute_reply":"2021-07-07T17:43:50.767483Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Helper function to unpack json found in daily data\ndef unpack_json(json_str):\n    return np.nan if pd.isna(json_str) else pd.read_json(json_str)\n\n# helper function to add is_played column\ndef is_played_games(row):\n    if pd.isnull(row['gameDate']):\n        is_played = 0\n    else:\n        is_played = 1\n    return is_played","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:50.771412Z","iopub.execute_input":"2021-07-07T17:43:50.771764Z","iopub.status.idle":"2021-07-07T17:43:50.782823Z","shell.execute_reply.started":"2021-07-07T17:43:50.771713Z","shell.execute_reply":"2021-07-07T17:43:50.781387Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# def age_now(row):\n#     '''\n#     Calculate Age (in years) at Given Day\n#     [modified]\n#     '''\n#     date = row['gameDate']\n#     given_day = pd.to_datetime(date)\n#     dob = row[\"DOB\"] #should be datetime formated already\n#     age = (given_day - dob).days/365\n    \n#     return age\n\ndef age_now(row):\n    '''\n    Calculate Age (in days) at Given Day\n    '''\n    date = row['date']\n    given_day = pd.to_datetime(date,format='%Y%m%d')\n    dob = row[\"DOB\"] #should be datetime formated already\n    age = (given_day - dob).days/365\n    \n    return age\n\ndef age_now_d(row):\n    '''\n    Calculate Age (in days) from date_playerId\n    '''\n    date = row['date_playerId'].split('_')[0]\n    given_day = pd.to_datetime(date,format='%Y%m%d')\n    dob = row[\"DOB\"] #should be datetime formated already\n    age = (given_day - dob).days/365\n    \n    return age\n\ndef mlbDebutDays_now(row):\n    '''\n    Calculate mlbDebutDays at Given Day\n    '''\n    date = row['date']\n    given_day = pd.to_datetime(date,format='%Y%m%d')\n    dob = pd.to_datetime(row[\"mlbDebutDate\"])\n    mlbDebutDays = (given_day - dob).days\n    \n    return mlbDebutDays","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:50.784781Z","iopub.execute_input":"2021-07-07T17:43:50.785319Z","iopub.status.idle":"2021-07-07T17:43:50.797717Z","shell.execute_reply.started":"2021-07-07T17:43:50.785215Z","shell.execute_reply":"2021-07-07T17:43:50.796196Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def evalYear(row):\n    year = pd.to_datetime(row.date, format='%Y%m%d').year\n    return year","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:50.799778Z","iopub.execute_input":"2021-07-07T17:43:50.800313Z","iopub.status.idle":"2021-07-07T17:43:50.813204Z","shell.execute_reply.started":"2021-07-07T17:43:50.800221Z","shell.execute_reply":"2021-07-07T17:43:50.812030Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def player_data_process(dataset):\n    '''\n    This fucntion process the players.csv\n    New Columns : age, bmi\n    '''\n    temp = dataset.copy()\n    temp[\"DOB\"] = pd.to_datetime(temp[\"DOB\"]) # death of birth\n    temp['bmi'] = temp.apply(BMI,axis=1)\n    \n    return temp","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:50.816204Z","iopub.execute_input":"2021-07-07T17:43:50.816582Z","iopub.status.idle":"2021-07-07T17:43:50.825878Z","shell.execute_reply.started":"2021-07-07T17:43:50.816545Z","shell.execute_reply":"2021-07-07T17:43:50.824578Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Loading Data","metadata":{}},{"cell_type":"code","source":"test = pd.read_csv(\"../input/mlb-player-digital-engagement-forecasting/example_test.csv\")\nplayers = pd.read_csv(\"../input/mlb-player-digital-engagement-forecasting/players.csv\")\nmean_target_by_player = pd.read_csv(\"../input/derived-data/mean_target_by_player.csv\")\nrosters = pd.read_pickle('../input/mlb-pdef-train-dataset/rosters_train.pkl')","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:50.827719Z","iopub.execute_input":"2021-07-07T17:43:50.828083Z","iopub.status.idle":"2021-07-07T17:43:51.632374Z","shell.execute_reply.started":"2021-07-07T17:43:50.828047Z","shell.execute_reply":"2021-07-07T17:43:51.630981Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"rosters","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:51.634003Z","iopub.execute_input":"2021-07-07T17:43:51.634357Z","iopub.status.idle":"2021-07-07T17:43:51.658269Z","shell.execute_reply.started":"2021-07-07T17:43:51.634323Z","shell.execute_reply":"2021-07-07T17:43:51.656756Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Loading Model","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\nimport tensorflow.keras.layers as L\nimport tensorflow.keras.models as M\nfrom tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, EarlyStopping\nfrom keras import optimizers","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:51.659846Z","iopub.execute_input":"2021-07-07T17:43:51.660190Z","iopub.status.idle":"2021-07-07T17:43:57.872804Z","shell.execute_reply.started":"2021-07-07T17:43:51.660153Z","shell.execute_reply":"2021-07-07T17:43:57.871417Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_model(n_in):\n    inp = L.Input(name=\"inputs\", shape=(n_in,))\n    x = L.Dense(50, activation=\"relu\", name=\"d3\")(inp)\n#     x = L.Dropout(0.2)(x)\n    x = L.Dense(50, activation=\"relu\", name=\"d4\")(x)\n#     x = L.Dropout(0.2)(x)\n    preds = L.Dense(4, activation=\"linear\", name=\"preds\")(x)\n    \n    model = M.Model(inp, preds, name=\"ANN\")\n    model.compile(loss=\"mean_absolute_error\", optimizer=optimizers.Adamax(lr=0.001, decay=1e-3))\n    return model","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:57.876459Z","iopub.execute_input":"2021-07-07T17:43:57.876863Z","iopub.status.idle":"2021-07-07T17:43:57.884844Z","shell.execute_reply.started":"2021-07-07T17:43:57.876826Z","shell.execute_reply":"2021-07-07T17:43:57.883482Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = make_model(7)","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:57.887511Z","iopub.execute_input":"2021-07-07T17:43:57.887911Z","iopub.status.idle":"2021-07-07T17:43:58.018774Z","shell.execute_reply.started":"2021-07-07T17:43:57.887871Z","shell.execute_reply":"2021-07-07T17:43:58.017625Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Loads the weights\nmodel.load_weights(\"../input/weights/model_ANN2.cpkt\")","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:58.020534Z","iopub.execute_input":"2021-07-07T17:43:58.020966Z","iopub.status.idle":"2021-07-07T17:43:58.100344Z","shell.execute_reply.started":"2021-07-07T17:43:58.020919Z","shell.execute_reply":"2021-07-07T17:43:58.099054Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(model.summary())","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:58.102114Z","iopub.execute_input":"2021-07-07T17:43:58.102498Z","iopub.status.idle":"2021-07-07T17:43:58.111668Z","shell.execute_reply.started":"2021-07-07T17:43:58.102462Z","shell.execute_reply":"2021-07-07T17:43:58.110543Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Prediction Task","metadata":{}},{"cell_type":"code","source":"FECOLS = ['t1_m','t2_m','t3_m','t4_m','is_played','age','bmi'] #feature columns \nTGTCOLS = ['target1', 'target2', 'target3', 'target4']  #target columns","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:58.114431Z","iopub.execute_input":"2021-07-07T17:43:58.114871Z","iopub.status.idle":"2021-07-07T17:43:58.123752Z","shell.execute_reply.started":"2021-07-07T17:43:58.114829Z","shell.execute_reply":"2021-07-07T17:43:58.122657Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def add_date_playerid(row):\n\n    given_day = pd.to_datetime(row['date'],format='%Y%m%d') #taking timestamp of the given day\n    next_day = given_day + pd.DateOffset(1) # next date\n                                   \n    next_day = str(next_day).split(\" \")[0].replace(\"-\",\"\")\n    playerId = row['playerId']\n    date_playerId = next_day+\"_\"+str(playerId)\n\n    return date_playerId","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:58.125025Z","iopub.execute_input":"2021-07-07T17:43:58.125359Z","iopub.status.idle":"2021-07-07T17:43:58.138496Z","shell.execute_reply.started":"2021-07-07T17:43:58.125327Z","shell.execute_reply":"2021-07-07T17:43:58.137130Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#not used here, might be removed \ndef process_prediction(test_df,sub_mode=True):\n    append = False #flag for append to new_df\n    \n    for i in range(test_df.shape[0]):\n        #test dataframe that is provided for submission has no formal date column\n        if sub_mode:\n            date = test_df.index[i]\n        else:\n            date = test_df.date.iloc[i] #taking the date where we are expanding json\n        \n        roster = unpack_json(test_df.rosters.iloc[i])\n        roster.insert(0,'date',date) #inserting the given date\n        \n        if append==False:\n            append= True\n            new_df = roster\n        else:\n            new_df = new_df.append(roster,ignore_index=True)\n            \n    \n    new_df['date_playerId'] = new_df.apply(add_date_playerid,axis=1)\n    return new_df","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:58.140880Z","iopub.execute_input":"2021-07-07T17:43:58.141382Z","iopub.status.idle":"2021-07-07T17:43:58.153859Z","shell.execute_reply.started":"2021-07-07T17:43:58.141339Z","shell.execute_reply":"2021-07-07T17:43:58.152519Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#processing players data\nplayers_processed = player_data_process(players)","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:58.155886Z","iopub.execute_input":"2021-07-07T17:43:58.156420Z","iopub.status.idle":"2021-07-07T17:43:58.234244Z","shell.execute_reply.started":"2021-07-07T17:43:58.156378Z","shell.execute_reply":"2021-07-07T17:43:58.232901Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# tempx = process_prediction(test,sub_mode=False)\n# tempx","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:58.235868Z","iopub.execute_input":"2021-07-07T17:43:58.236182Z","iopub.status.idle":"2021-07-07T17:43:58.242227Z","shell.execute_reply.started":"2021-07-07T17:43:58.236153Z","shell.execute_reply":"2021-07-07T17:43:58.240751Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# tempx[tempx.is_played==0]\n# tempx[tempx.playerId==596049]","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:58.244027Z","iopub.execute_input":"2021-07-07T17:43:58.244503Z","iopub.status.idle":"2021-07-07T17:43:58.255282Z","shell.execute_reply.started":"2021-07-07T17:43:58.244454Z","shell.execute_reply":"2021-07-07T17:43:58.253756Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# X = tempx[FECOLS].values\n# preds = model.predict(X)","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:58.257282Z","iopub.execute_input":"2021-07-07T17:43:58.257869Z","iopub.status.idle":"2021-07-07T17:43:58.268686Z","shell.execute_reply.started":"2021-07-07T17:43:58.257826Z","shell.execute_reply":"2021-07-07T17:43:58.267406Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# tempx[TGTCOLS] = np.clip(preds,0,100)\n# tempx","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:58.270470Z","iopub.execute_input":"2021-07-07T17:43:58.270858Z","iopub.status.idle":"2021-07-07T17:43:58.283266Z","shell.execute_reply.started":"2021-07-07T17:43:58.270823Z","shell.execute_reply":"2021-07-07T17:43:58.281928Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# gc.collect()","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:58.284951Z","iopub.execute_input":"2021-07-07T17:43:58.285489Z","iopub.status.idle":"2021-07-07T17:43:58.297736Z","shell.execute_reply.started":"2021-07-07T17:43:58.285430Z","shell.execute_reply":"2021-07-07T17:43:58.296458Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# #to debug submission process\n# sample_pred_temp = pd.DataFrame(columns=['date_playerId', 'target1', 'target2', 'target3', 'target4'])\n# test_temp = pd.DataFrame(columns=['date_playerId', 'playerId', 'gameDate', 'teamId', 'statusCode',\n#        'status', 'bmi', 'DOB', 'age', 'is_played', 'Unnamed: 0', 't1_m',\n#        't2_m', 't3_m', 't4_m'])","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:58.299373Z","iopub.execute_input":"2021-07-07T17:43:58.299846Z","iopub.status.idle":"2021-07-07T17:43:58.310516Z","shell.execute_reply.started":"2021-07-07T17:43:58.299794Z","shell.execute_reply":"2021-07-07T17:43:58.309171Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Submission","metadata":{}},{"cell_type":"code","source":"import mlb\nenv = mlb.make_env() # initialize the environment\niter_test = env.iter_test() # iterator which loops over each date in test set","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:58.312095Z","iopub.execute_input":"2021-07-07T17:43:58.312481Z","iopub.status.idle":"2021-07-07T17:43:58.347268Z","shell.execute_reply.started":"2021-07-07T17:43:58.312434Z","shell.execute_reply":"2021-07-07T17:43:58.346198Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for (test_df, sample_prediction_df) in iter_test:\n    \n    sample_prediction_df = sample_prediction_df.reset_index(drop=True)\n    sample_prediction_df.drop(TGTCOLS,axis=1,inplace=True)\n    sample_prediction_df['playerId'] = sample_prediction_df['date_playerId']\\\n                                        .map(lambda x: int(x.split('_')[1]))\n    \n    \n    # Dealing with missing values\n    if test_df['rosters'].iloc[0] == test_df['rosters'].iloc[0]:\n        test_rosters = pd.DataFrame(eval(test_df['rosters'].iloc[0]))\n    else:\n        test_rosters = pd.DataFrame({'playerId': sample_prediction_df['playerId']})\n        for col in rosters.columns:\n            if col == 'playerId': continue\n            test_rosters[col] = np.nan\n    \n    #test_df extention here (added from rosters)\n    test = sample_prediction_df.copy()\n    test = test.merge(players_processed[['playerId','bmi','DOB']],on='playerId',how='left')\n    test = test.merge(test_rosters, on='playerId', how='left')\n    test['is_played'] = test.apply(is_played_games,axis=1)\n    test['age'] = test.apply(age_now_d,axis=1)\n    test = test.merge(mean_target_by_player,how='inner', left_on=[\"playerId\"],right_on=[\"playerId\"]) #or (how='left')\n     \n    \n    #making predictions : preds\n    X = test[FECOLS].fillna(0.).values #extracting all features\n    preds = model.predict(X) #model prediction\n    \n#     #to debug\n#     sample_pred_temp = sample_pred_temp.append(sample_prediction_df)#,ignore_index=True)\n#     test_temp = test_temp.append(test) #ignore_index=True)\n#     #\n    \n    #merging prediction to submission dataframe\n    sample_prediction_df[TGTCOLS] = np.clip(preds,0,100)\n    sample_prediction_df = sample_prediction_df.fillna(0.)\n    \n    del sample_prediction_df['playerId']\n   \n    env.predict(sample_prediction_df)\n    ","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:43:58.348580Z","iopub.execute_input":"2021-07-07T17:43:58.349050Z","iopub.status.idle":"2021-07-07T17:44:02.139838Z","shell.execute_reply.started":"2021-07-07T17:43:58.349003Z","shell.execute_reply":"2021-07-07T17:44:02.138639Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_prediction_df","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:44:02.141508Z","iopub.execute_input":"2021-07-07T17:44:02.141892Z","iopub.status.idle":"2021-07-07T17:44:02.162409Z","shell.execute_reply.started":"2021-07-07T17:44:02.141856Z","shell.execute_reply":"2021-07-07T17:44:02.161326Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# sample_pred_temp","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:44:02.163803Z","iopub.execute_input":"2021-07-07T17:44:02.164179Z","iopub.status.idle":"2021-07-07T17:44:02.173614Z","shell.execute_reply.started":"2021-07-07T17:44:02.164142Z","shell.execute_reply":"2021-07-07T17:44:02.172592Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# test_temp","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:44:02.175139Z","iopub.execute_input":"2021-07-07T17:44:02.175892Z","iopub.status.idle":"2021-07-07T17:44:02.185625Z","shell.execute_reply.started":"2021-07-07T17:44:02.175837Z","shell.execute_reply":"2021-07-07T17:44:02.184633Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # to check if any date_playerId is missing in submission\n# list(test_temp.date_playerId)==list(sample_pred_temp.date_playerId)","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:44:02.187099Z","iopub.execute_input":"2021-07-07T17:44:02.187834Z","iopub.status.idle":"2021-07-07T17:44:02.197971Z","shell.execute_reply.started":"2021-07-07T17:44:02.187782Z","shell.execute_reply":"2021-07-07T17:44:02.196977Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # to reset env.predict() to work\n# example_sample_submission = pd.read_csv(\"../input/mlb-player-digital-engagement-forecasting/example_sample_submission.csv\")\n# example_sample_submission\n# env.predict(example_sample_submission) ","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:44:02.199405Z","iopub.execute_input":"2021-07-07T17:44:02.200112Z","iopub.status.idle":"2021-07-07T17:44:02.212178Z","shell.execute_reply.started":"2021-07-07T17:44:02.200060Z","shell.execute_reply":"2021-07-07T17:44:02.210462Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # to check if any date_playerId is missing in submission\n# list(example_sample_submission.date_playerId)==list(sample_pred_temp.date_playerId)","metadata":{"execution":{"iopub.status.busy":"2021-07-07T17:44:02.216892Z","iopub.execute_input":"2021-07-07T17:44:02.217391Z","iopub.status.idle":"2021-07-07T17:44:02.229226Z","shell.execute_reply.started":"2021-07-07T17:44:02.217351Z","shell.execute_reply":"2021-07-07T17:44:02.227531Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}