{"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-06T15:33:12.179336Z","iopub.execute_input":"2021-07-06T15:33:12.179877Z","iopub.status.idle":"2021-07-06T15:33:13.054161Z","shell.execute_reply.started":"2021-07-06T15:33:12.179788Z","shell.execute_reply":"2021-07-06T15:33:13.053183Z"},"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-06T15:33:13.056431Z","iopub.execute_input":"2021-07-06T15:33:13.056749Z","iopub.status.idle":"2021-07-06T15:33:13.063377Z","shell.execute_reply.started":"2021-07-06T15:33:13.056721Z","shell.execute_reply":"2021-07-06T15:33:13.062588Z"},"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-06T15:33:13.536556Z","iopub.execute_input":"2021-07-06T15:33:13.536950Z","iopub.status.idle":"2021-07-06T15:33:13.542658Z","shell.execute_reply.started":"2021-07-06T15:33:13.536900Z","shell.execute_reply":"2021-07-06T15:33:13.541523Z"},"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-06T15:33:14.561315Z","iopub.execute_input":"2021-07-06T15:33:14.561648Z","iopub.status.idle":"2021-07-06T15:33:14.570599Z","shell.execute_reply.started":"2021-07-06T15:33:14.561611Z","shell.execute_reply":"2021-07-06T15:33:14.568814Z"},"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-06T15:33:15.717027Z","iopub.execute_input":"2021-07-06T15:33:15.717367Z","iopub.status.idle":"2021-07-06T15:33:15.721582Z","shell.execute_reply.started":"2021-07-06T15:33:15.717339Z","shell.execute_reply":"2021-07-06T15:33:15.720879Z"},"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-06T15:33:16.103200Z","iopub.execute_input":"2021-07-06T15:33:16.103720Z","iopub.status.idle":"2021-07-06T15:33:16.109603Z","shell.execute_reply.started":"2021-07-06T15:33:16.103670Z","shell.execute_reply":"2021-07-06T15:33:16.108743Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Loading Data","metadata":{}},{"cell_type":"code","source":"import os\nos.getcwd()\nos.listdir('../input/')","metadata":{"execution":{"iopub.status.busy":"2021-07-06T15:33:17.391386Z","iopub.execute_input":"2021-07-06T15:33:17.391722Z","iopub.status.idle":"2021-07-06T15:33:17.398637Z","shell.execute_reply.started":"2021-07-06T15:33:17.391695Z","shell.execute_reply":"2021-07-06T15:33:17.397979Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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\")","metadata":{"execution":{"iopub.status.busy":"2021-07-06T15:33:19.875454Z","iopub.execute_input":"2021-07-06T15:33:19.875964Z","iopub.status.idle":"2021-07-06T15:33:20.612818Z","shell.execute_reply.started":"2021-07-06T15:33:19.875916Z","shell.execute_reply":"2021-07-06T15:33:20.611887Z"},"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-06T15:33:23.832208Z","iopub.execute_input":"2021-07-06T15:33:23.832546Z","iopub.status.idle":"2021-07-06T15:33:29.174003Z","shell.execute_reply.started":"2021-07-06T15:33:23.832519Z","shell.execute_reply":"2021-07-06T15:33:29.173065Z"},"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-06T15:33:32.394631Z","iopub.execute_input":"2021-07-06T15:33:32.394969Z","iopub.status.idle":"2021-07-06T15:33:32.401047Z","shell.execute_reply.started":"2021-07-06T15:33:32.394927Z","shell.execute_reply":"2021-07-06T15:33:32.400062Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = make_model(7)","metadata":{"execution":{"iopub.status.busy":"2021-07-06T15:33:33.569511Z","iopub.execute_input":"2021-07-06T15:33:33.569848Z","iopub.status.idle":"2021-07-06T15:33:33.665389Z","shell.execute_reply.started":"2021-07-06T15:33:33.569821Z","shell.execute_reply":"2021-07-06T15:33:33.664302Z"},"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-06T15:33:35.390983Z","iopub.execute_input":"2021-07-06T15:33:35.391316Z","iopub.status.idle":"2021-07-06T15:33:35.468377Z","shell.execute_reply.started":"2021-07-06T15:33:35.391289Z","shell.execute_reply":"2021-07-06T15:33:35.467230Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(model.summary())","metadata":{"execution":{"iopub.status.busy":"2021-07-06T15:33:36.546583Z","iopub.execute_input":"2021-07-06T15:33:36.547079Z","iopub.status.idle":"2021-07-06T15:33:36.556384Z","shell.execute_reply.started":"2021-07-06T15:33:36.547048Z","shell.execute_reply":"2021-07-06T15:33:36.555363Z"},"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-06T15:33:41.833108Z","iopub.execute_input":"2021-07-06T15:33:41.833425Z","iopub.status.idle":"2021-07-06T15:33:41.838309Z","shell.execute_reply.started":"2021-07-06T15:33:41.833399Z","shell.execute_reply":"2021-07-06T15:33:41.837082Z"},"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-06T15:33:43.422071Z","iopub.execute_input":"2021-07-06T15:33:43.422425Z","iopub.status.idle":"2021-07-06T15:33:43.428357Z","shell.execute_reply.started":"2021-07-06T15:33:43.422391Z","shell.execute_reply":"2021-07-06T15:33:43.427451Z"},"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-06T15:33:43.749909Z","iopub.execute_input":"2021-07-06T15:33:43.750418Z","iopub.status.idle":"2021-07-06T15:33:43.758640Z","shell.execute_reply.started":"2021-07-06T15:33:43.750385Z","shell.execute_reply":"2021-07-06T15:33:43.757656Z"},"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-06T15:33:46.142576Z","iopub.execute_input":"2021-07-06T15:33:46.142923Z","iopub.status.idle":"2021-07-06T15:33:46.210968Z","shell.execute_reply.started":"2021-07-06T15:33:46.142895Z","shell.execute_reply":"2021-07-06T15:33:46.209966Z"},"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-06T15:06:13.665524Z","iopub.execute_input":"2021-07-06T15:06:13.665886Z","iopub.status.idle":"2021-07-06T15:06:13.669708Z","shell.execute_reply.started":"2021-07-06T15:06:13.665857Z","shell.execute_reply":"2021-07-06T15:06:13.668415Z"},"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-06T15:06:14.26664Z","iopub.execute_input":"2021-07-06T15:06:14.267001Z","iopub.status.idle":"2021-07-06T15:06:14.271275Z","shell.execute_reply.started":"2021-07-06T15:06:14.266972Z","shell.execute_reply":"2021-07-06T15:06:14.270132Z"},"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-06T15:06:15.193257Z","iopub.execute_input":"2021-07-06T15:06:15.193637Z","iopub.status.idle":"2021-07-06T15:06:15.197854Z","shell.execute_reply.started":"2021-07-06T15:06:15.193602Z","shell.execute_reply":"2021-07-06T15:06:15.196815Z"},"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-06T15:06:15.588023Z","iopub.execute_input":"2021-07-06T15:06:15.588372Z","iopub.status.idle":"2021-07-06T15:06:15.59229Z","shell.execute_reply.started":"2021-07-06T15:06:15.588342Z","shell.execute_reply":"2021-07-06T15:06:15.591417Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# gc.collect()","metadata":{"execution":{"iopub.status.busy":"2021-07-06T15:06:16.557258Z","iopub.execute_input":"2021-07-06T15:06:16.55761Z","iopub.status.idle":"2021-07-06T15:06:16.561471Z","shell.execute_reply.started":"2021-07-06T15:06:16.557579Z","shell.execute_reply":"2021-07-06T15:06:16.560559Z"},"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-06T15:06:18.503094Z","iopub.execute_input":"2021-07-06T15:06:18.503794Z","iopub.status.idle":"2021-07-06T15:06:18.508434Z","shell.execute_reply.started":"2021-07-06T15:06:18.503756Z","shell.execute_reply":"2021-07-06T15:06:18.506942Z"},"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-06T15:33:54.086921Z","iopub.execute_input":"2021-07-06T15:33:54.087421Z","iopub.status.idle":"2021-07-06T15:33:54.114767Z","shell.execute_reply.started":"2021-07-06T15:33:54.087390Z","shell.execute_reply":"2021-07-06T15:33:54.113775Z"},"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    #add new columns: age, is_played\n    test['age'] = test.apply(age_now_d,axis=1)\n    test = test.merge(test_rosters, on='playerId', how='left')\n    test = test.merge(mean_target_by_player,how='inner', left_on=[\"playerId\"],right_on=[\"playerId\"])\n    test['is_played'] = test.apply(is_played_games,axis=1)\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-06T15:34:00.614653Z","iopub.execute_input":"2021-07-06T15:34:00.615012Z","iopub.status.idle":"2021-07-06T15:34:04.126379Z","shell.execute_reply.started":"2021-07-06T15:34:00.614982Z","shell.execute_reply":"2021-07-06T15:34:04.125519Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_prediction_df","metadata":{"execution":{"iopub.status.busy":"2021-07-06T15:34:19.292485Z","iopub.execute_input":"2021-07-06T15:34:19.292997Z","iopub.status.idle":"2021-07-06T15:34:19.316004Z","shell.execute_reply.started":"2021-07-06T15:34:19.292964Z","shell.execute_reply":"2021-07-06T15:34:19.314998Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# sample_pred_temp","metadata":{"execution":{"iopub.status.busy":"2021-07-05T19:26:35.663919Z","iopub.execute_input":"2021-07-05T19:26:35.664198Z","iopub.status.idle":"2021-07-05T19:26:35.667658Z","shell.execute_reply.started":"2021-07-05T19:26:35.664172Z","shell.execute_reply":"2021-07-05T19:26:35.666829Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# test_temp","metadata":{"execution":{"iopub.status.busy":"2021-07-05T19:26:35.669031Z","iopub.execute_input":"2021-07-05T19:26:35.669353Z","iopub.status.idle":"2021-07-05T19:26:35.678294Z","shell.execute_reply.started":"2021-07-05T19:26:35.669326Z","shell.execute_reply":"2021-07-05T19:26:35.677251Z"},"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-05T19:26:35.679667Z","iopub.execute_input":"2021-07-05T19:26:35.67998Z","iopub.status.idle":"2021-07-05T19:26:35.68873Z","shell.execute_reply.started":"2021-07-05T19:26:35.679953Z","shell.execute_reply":"2021-07-05T19:26:35.687648Z"},"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-05T19:26:35.690254Z","iopub.execute_input":"2021-07-05T19:26:35.690737Z","iopub.status.idle":"2021-07-05T19:26:35.69982Z","shell.execute_reply.started":"2021-07-05T19:26:35.69069Z","shell.execute_reply":"2021-07-05T19:26:35.698906Z"},"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-05T19:26:35.701394Z","iopub.execute_input":"2021-07-05T19:26:35.701891Z","iopub.status.idle":"2021-07-05T19:26:35.713233Z","shell.execute_reply.started":"2021-07-05T19:26:35.701859Z","shell.execute_reply":"2021-07-05T19:26:35.712165Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}