{"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":"# Analytics: Returns For Loss ","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport seaborn as sns\nimport json\nimport ipywidgets as widgets\n\nfrom matplotlib import pyplot as plt\nfrom typing import Dict, List, Any, Callable, Optional\nfrom tqdm.notebook import tqdm","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:08.471716Z","iopub.execute_input":"2022-01-06T22:37:08.472264Z","iopub.status.idle":"2022-01-06T22:37:08.478494Z","shell.execute_reply.started":"2022-01-06T22:37:08.472219Z","shell.execute_reply":"2022-01-06T22:37:08.477542Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"SIDE = 5\nENDZONE = 10\nFIELD_L = 120\nFIELD_W = 53.3\nFIELD_MID = 60\nFIELD_X = (0 - SIDE, FIELD_L + SIDE)\nFIELD_Y = (0 - SIDE, FIELD_W + SIDE)\nFIELD_XD = (FIELD_X[1] - FIELD_X[0]) / 10\nFIELD_YD = (FIELD_Y[1] - FIELD_Y[0]) / 10\nFIELD_RATIO = 1.25\nFIELD_DIM = (FIELD_RATIO * FIELD_XD, FIELD_RATIO * FIELD_YD)\n\n\ndef plot_field(plt):\n    style = {\n        \"c\": \"black\",\n        \"alpha\": 0.5,\n    }\n    plt.xlim(*FIELD_X)\n    plt.ylim(*FIELD_Y)\n    plt.plot([0, FIELD_L], [0, 0], **style)\n    plt.plot([0, FIELD_L], [FIELD_W, FIELD_W], **style)\n    plt.plot([0, 0], [0, FIELD_W], **style)\n    plt.plot([FIELD_L, FIELD_L], [0, FIELD_W], **style)\n    for x in range(ENDZONE, FIELD_L, 10):\n        yard = 50 - abs(x - 10 - 50)\n        no_dash = (x == FIELD_MID) or (x == ENDZONE) or (x == (FIELD_L - ENDZONE))\n        style = {\n            \"c\": \"black\",\n            \"alpha\": 0.5,\n            \"dashes\": [] if no_dash else [2, 2],\n        }\n        plt.plot([x, x], [0, FIELD_W], **style)\n        plt.text(s=yard, x=x, y=-2, ha=\"center\")\n    fig = plt.gcf()\n    fig.set_size_inches(*FIELD_DIM)\n    \n","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:08.481016Z","iopub.execute_input":"2022-01-06T22:37:08.481421Z","iopub.status.idle":"2022-01-06T22:37:08.498997Z","shell.execute_reply.started":"2022-01-06T22:37:08.481374Z","shell.execute_reply":"2022-01-06T22:37:08.498073Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load Data","metadata":{}},{"cell_type":"code","source":"DIR = \"../input/nfl-big-data-bowl-2022\"\nDIR_VT = \"../input/process-punt-return-decision-data\"\nDIR_PRED = \"../input/model-training-returns-for-loss\"\ndf_preds = pd.read_csv(f\"{DIR_PRED}/predictions.csv\")\ndf_preds[\"players\"] = df_preds[\"players\"].apply(lambda j: json.loads(j))\nprint(f\"Loaded {df_preds.shape[0]:,d} plays with predictions.\")\ndf_games = pd.read_csv(f\"{DIR}/games.csv\")\ndf_players = pd.read_csv(f\"{DIR}/players.csv\")\n# Get patched versions from our custom output\ndf_plays = pd.read_csv(f\"{DIR_VT}/plays_patched.csv\")\ndf_pff = pd.read_csv(f\"{DIR_VT}/pff_patched.csv\")","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:08.500403Z","iopub.execute_input":"2022-01-06T22:37:08.501520Z","iopub.status.idle":"2022-01-06T22:37:09.388282Z","shell.execute_reply.started":"2022-01-06T22:37:08.501453Z","shell.execute_reply":"2022-01-06T22:37:09.387347Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_preds.columns","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:09.389396Z","iopub.execute_input":"2022-01-06T22:37:09.389609Z","iopub.status.idle":"2022-01-06T22:37:09.396182Z","shell.execute_reply.started":"2022-01-06T22:37:09.389582Z","shell.execute_reply":"2022-01-06T22:37:09.395214Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_preds.head()","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:09.399166Z","iopub.execute_input":"2022-01-06T22:37:09.399489Z","iopub.status.idle":"2022-01-06T22:37:09.434360Z","shell.execute_reply.started":"2022-01-06T22:37:09.399449Z","shell.execute_reply":"2022-01-06T22:37:09.433362Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Heat Map","metadata":{}},{"cell_type":"code","source":"PLAY_KEYS = [\"gameId\", \"playId\"]","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:09.435778Z","iopub.execute_input":"2022-01-06T22:37:09.436432Z","iopub.status.idle":"2022-01-06T22:37:09.440195Z","shell.execute_reply.started":"2022-01-06T22:37:09.436383Z","shell.execute_reply":"2022-01-06T22:37:09.439462Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#ballLanding is ball is returnable\ndf_preds[PLAY_KEYS + ['returnerNflId', 'ballLandingYardline','penaltyResultYardline', 'specialTeamsResult']].head()","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:09.441383Z","iopub.execute_input":"2022-01-06T22:37:09.442000Z","iopub.status.idle":"2022-01-06T22:37:09.464964Z","shell.execute_reply.started":"2022-01-06T22:37:09.441949Z","shell.execute_reply":"2022-01-06T22:37:09.464084Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_preds['specialTeamsResult'].unique()","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:09.466192Z","iopub.execute_input":"2022-01-06T22:37:09.466931Z","iopub.status.idle":"2022-01-06T22:37:09.474945Z","shell.execute_reply.started":"2022-01-06T22:37:09.466854Z","shell.execute_reply":"2022-01-06T22:37:09.473912Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Helper Functions\ndef result_classifier(x):\n    if x == 'Fair Catch':\n        return 'Fair Catch'\n    elif x == 'Return' or x == 'Muffed':\n        return 'Return'\n    else:\n        return 'Bail'","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:09.476497Z","iopub.execute_input":"2022-01-06T22:37:09.477105Z","iopub.status.idle":"2022-01-06T22:37:09.486962Z","shell.execute_reply.started":"2022-01-06T22:37:09.477059Z","shell.execute_reply":"2022-01-06T22:37:09.485970Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DISPLAY_KEYS = PLAY_KEYS + ['returnerNflId', 'ballLandingYardline', 'specialTeamsResult', 'penaltyResultYardline']\ndf_ball_lands = df_preds.copy()\ndf_ball_lands['ballLandingYardline'] = df_preds['ballLandingYardline']\ndf_ball_lands[DISPLAY_KEYS].head()","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:09.488539Z","iopub.execute_input":"2022-01-06T22:37:09.488855Z","iopub.status.idle":"2022-01-06T22:37:09.511558Z","shell.execute_reply.started":"2022-01-06T22:37:09.488813Z","shell.execute_reply":"2022-01-06T22:37:09.510944Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_ball_lands['classifiedResult'] = df_ball_lands['specialTeamsResult'].apply(result_classifier)\ndf_ball_lands[DISPLAY_KEYS + ['classifiedResult']]","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:09.512601Z","iopub.execute_input":"2022-01-06T22:37:09.513517Z","iopub.status.idle":"2022-01-06T22:37:09.545295Z","shell.execute_reply.started":"2022-01-06T22:37:09.513474Z","shell.execute_reply":"2022-01-06T22:37:09.544323Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DISPLAY_KEYS = DISPLAY_KEYS + ['classifiedResult']\n#making a new column result yardage from when the punt lands to where the offense starts \nprint(df_ball_lands[DISPLAY_KEYS].reset_index())\ndf_ball_lands['netDecisionYards'] = df_ball_lands['penaltyResultYardline'] - df_ball_lands['ballLandingYardline']","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:09.546783Z","iopub.execute_input":"2022-01-06T22:37:09.547206Z","iopub.status.idle":"2022-01-06T22:37:09.562610Z","shell.execute_reply.started":"2022-01-06T22:37:09.547170Z","shell.execute_reply":"2022-01-06T22:37:09.561748Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_ball_lands[DISPLAY_KEYS + ['netDecisionYards']]","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:09.564346Z","iopub.execute_input":"2022-01-06T22:37:09.565259Z","iopub.status.idle":"2022-01-06T22:37:09.588858Z","shell.execute_reply.started":"2022-01-06T22:37:09.565208Z","shell.execute_reply":"2022-01-06T22:37:09.587909Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_ball_lands['landX'] = df_ball_lands['ballLandingX'].apply(np.round)\ndf_ball_lands['landY'] = df_ball_lands['ballLandingY'].apply(np.round)\ndf_bl_x_y = df_ball_lands.groupby(['landX', 'landY', 'classifiedResult'])['playId'].count().reset_index()\ndf_bl_x_y['fraction'] = df_bl_x_y['playId'] / len(df_ball_lands)\ndf_bl_x_y_mc = df_bl_x_y.groupby(['landX', 'landY', 'classifiedResult'])['playId'].max().reset_index()\ndf_bl_x_y_j = df_bl_x_y_mc.join(df_bl_x_y.set_index(['landX', 'landY', 'playId', 'classifiedResult'])\\\n                                , on = ['landX', 'landY', 'playId', 'classifiedResult'], )\\\n                                .rename(columns = {'classifiedResult' : 'result'})\nassert df_bl_x_y_j['result'].isna().sum() == 0, \"some yards don't have a classified result\"\n","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:09.592030Z","iopub.execute_input":"2022-01-06T22:37:09.592272Z","iopub.status.idle":"2022-01-06T22:37:09.700827Z","shell.execute_reply.started":"2022-01-06T22:37:09.592245Z","shell.execute_reply":"2022-01-06T22:37:09.700089Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.palplot(sns.color_palette('hls',3))","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:09.701879Z","iopub.execute_input":"2022-01-06T22:37:09.702347Z","iopub.status.idle":"2022-01-06T22:37:09.774003Z","shell.execute_reply.started":"2022-01-06T22:37:09.702312Z","shell.execute_reply":"2022-01-06T22:37:09.773063Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_field(plt)\nsns.scatterplot(\n    data = df_ball_lands,\n    x = 'ballLandingX',\n    y = 'ballLandingY',\n    hue = 'classifiedResult',\n    palette = {'Fair Catch' : 'blue', 'Return' : 'yellow', 'Bail' : 'black'},\n    alpha = 0.5)\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:09.776259Z","iopub.execute_input":"2022-01-06T22:37:09.776749Z","iopub.status.idle":"2022-01-06T22:37:10.553057Z","shell.execute_reply.started":"2022-01-06T22:37:09.776705Z","shell.execute_reply":"2022-01-06T22:37:10.552154Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_ball_lands.head()","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:10.554821Z","iopub.execute_input":"2022-01-06T22:37:10.555386Z","iopub.status.idle":"2022-01-06T22:37:10.587131Z","shell.execute_reply.started":"2022-01-06T22:37:10.555344Z","shell.execute_reply":"2022-01-06T22:37:10.586176Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ndef df_to_heatmap_gp(df):\n    df_hm = df.copy()\n    df_hm['ballLandingXFloor'] = df_hm['ballLandingX'].apply(np.floor).astype(int)\n    df_hm['ballLandingYFloor'] = df_hm['ballLandingY'].apply(np.floor).astype(int)\n    gp_hm = (\n        df_hm\n            .groupby(['ballLandingXFloor', 'ballLandingYFloor', 'classifiedResult'])\n            ['playId'].count()\n            .reset_index()\n            .rename(columns = {'playId': 'playCount'})\n    )\n    return gp_hm","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:10.588237Z","iopub.execute_input":"2022-01-06T22:37:10.588854Z","iopub.status.idle":"2022-01-06T22:37:10.594914Z","shell.execute_reply.started":"2022-01-06T22:37:10.588822Z","shell.execute_reply":"2022-01-06T22:37:10.593988Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# plot_field(plt)\n# sns.scatterplot(data = gp_hm, x = 'ballLandingXFloor', y = 'ballLandingYFloor', opacity = 5)","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:10.596050Z","iopub.execute_input":"2022-01-06T22:37:10.596252Z","iopub.status.idle":"2022-01-06T22:37:10.606718Z","shell.execute_reply.started":"2022-01-06T22:37:10.596228Z","shell.execute_reply":"2022-01-06T22:37:10.605740Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def join_to_matrix(gp, xSize, ySize, xCol, yCol, valCol):\n    rows, columns = np.indices((ySize, xSize))\n    rows = rows.flatten()\n    columns = columns.flatten()\n    df_mat = pd.DataFrame({'rows' : rows, 'columns' : columns}, index = range(len(rows)))\n    df_mat_w_hm = df_mat.join(gp.set_index([yCol, xCol]), on = ['rows', 'columns'])\n    mat = df_mat_w_hm[valCol].fillna(0).values.reshape(ySize,xSize)\n    return mat","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:10.608121Z","iopub.execute_input":"2022-01-06T22:37:10.608842Z","iopub.status.idle":"2022-01-06T22:37:10.618958Z","shell.execute_reply.started":"2022-01-06T22:37:10.608793Z","shell.execute_reply":"2022-01-06T22:37:10.618330Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mat_fc = join_to_matrix(\n    df_bl_x_y[df_bl_x_y['classifiedResult'] == 'Fair Catch'],\n    80,\n    54,\n    'landX',\n    'landY',\n    'fraction'\n)\nmat_ret = join_to_matrix(\n    df_bl_x_y[df_bl_x_y['classifiedResult'] == 'Return'],\n    80,\n    54,\n    'landX',\n    'landY',\n    'fraction'\n)\nmat_bail = join_to_matrix(\n    df_bl_x_y[df_bl_x_y['classifiedResult'] == 'Bail'],\n    80,\n    54,\n    'landX',\n    'landY',\n    'fraction'\n)","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:10.620283Z","iopub.execute_input":"2022-01-06T22:37:10.621137Z","iopub.status.idle":"2022-01-06T22:37:10.654168Z","shell.execute_reply.started":"2022-01-06T22:37:10.621091Z","shell.execute_reply":"2022-01-06T22:37:10.653254Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_field(plt)\nplt.imshow(mat_fc, cmap = 'Greens')\nplt.colorbar()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:10.655673Z","iopub.execute_input":"2022-01-06T22:37:10.656028Z","iopub.status.idle":"2022-01-06T22:37:11.000673Z","shell.execute_reply.started":"2022-01-06T22:37:10.655967Z","shell.execute_reply":"2022-01-06T22:37:10.999737Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_field(plt)\nplt.imshow(mat_ret, cmap = 'Blues')\nplt.colorbar()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:11.001842Z","iopub.execute_input":"2022-01-06T22:37:11.002138Z","iopub.status.idle":"2022-01-06T22:37:11.347850Z","shell.execute_reply.started":"2022-01-06T22:37:11.002106Z","shell.execute_reply":"2022-01-06T22:37:11.346957Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plot_field(plt)\nplt.imshow(mat_bail, cmap = 'Reds')\nplt.colorbar()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:11.349065Z","iopub.execute_input":"2022-01-06T22:37:11.349280Z","iopub.status.idle":"2022-01-06T22:37:11.680544Z","shell.execute_reply.started":"2022-01-06T22:37:11.349254Z","shell.execute_reply":"2022-01-06T22:37:11.679670Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#create a groupby using a dataframe\n#build analysis on this model\n#think about applications in when this could be useful","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:11.681863Z","iopub.execute_input":"2022-01-06T22:37:11.682085Z","iopub.status.idle":"2022-01-06T22:37:11.685972Z","shell.execute_reply.started":"2022-01-06T22:37:11.682059Z","shell.execute_reply":"2022-01-06T22:37:11.684964Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def plot_kicks_from_yardline(y, r):\n    colors = {'Return' : 'Greens', 'Bail' : 'Reds', 'Fair Catch' : 'Blues'}\n    df_query = df_ball_lands.query(f\"kickingYardline <= {y} and kickingYardline > {y-10}\")\n    df_gp = df_to_heatmap_gp(df_query)\n    mat = join_to_matrix(\n        df_gp[df_gp['classifiedResult'] == r],\n        120,\n        54,\n        'ballLandingXFloor',\n        'ballLandingYFloor',\n        'playCount'\n    )\n    plot_field(plt)\n    plt.axvline(120 - y)\n    plt.axvline(120 - y - 10 )\n    if len(df_gp) >= 1:\n        plt.imshow(mat, cmap = colors.get(r))\n        plt.colorbar()\n    plt.title(f\"n = {len(df_query)} returnable punts ending in {r}, punts from {y-10} to {y}\")\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:11.687676Z","iopub.execute_input":"2022-01-06T22:37:11.687963Z","iopub.status.idle":"2022-01-06T22:37:11.702945Z","shell.execute_reply.started":"2022-01-06T22:37:11.687932Z","shell.execute_reply":"2022-01-06T22:37:11.702263Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"_ = widgets.interact(plot_kicks_from_yardline, y = (10,80,10), r = ['Return', 'Fair Catch', 'Bail'])","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:11.703784Z","iopub.execute_input":"2022-01-06T22:37:11.704017Z","iopub.status.idle":"2022-01-06T22:37:12.172631Z","shell.execute_reply.started":"2022-01-06T22:37:11.703963Z","shell.execute_reply":"2022-01-06T22:37:12.171722Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Rounding landing yardline\ndf_ball_lands['ballLandingYardline'] = df_ball_lands['ballLandingYardline'].apply(np.floor)\n#Querying for punts landed futher than opponent 35\ndf_ball_lands = df_ball_lands.query('ballLandingYardline <= 65')","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:12.173973Z","iopub.execute_input":"2022-01-06T22:37:12.174261Z","iopub.status.idle":"2022-01-06T22:37:12.191096Z","shell.execute_reply.started":"2022-01-06T22:37:12.174231Z","shell.execute_reply":"2022-01-06T22:37:12.189723Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def netDecisionYards_based_on_kickingYardline(y) :\n    df_query = df_ball_lands.copy()\n    df_heats = df_query.query(f\"kickingYardline > {y-10} and kickingYardline <= {y}\")\n    \n    df_heat_zones = df_heats\\\n    .groupby(['ballLandingYardline', 'classifiedResult'])['netDecisionYards']\\\n    .mean().reset_index()\\\n    .rename(columns = {'netDecisionYards': 'yardsPlusMinus'})\n\n    df_bl_copy = df_heats.copy()\n\n    df_bl_copy = df_bl_copy.groupby(['ballLandingYardline', 'classifiedResult'])['playId']\\\n            .count()\\\n            .reset_index()\\\n            .rename(columns = {'playId' : 'playCount'})\n\n    df_heat_zones_ud = df_heats.join(df_bl_copy.set_index(['ballLandingYardline', 'classifiedResult'])\n                                          , on = ['ballLandingYardline', 'classifiedResult'])\\\n                                         .rename(columns = {'netDecisionYards': 'yardsPlusMinus'})\n\n        \n    df_heat_zones_ud = df_heat_zones_ud.query('playCount >= 4')\n        \n    print(f\"Decision plus/minus yardage when punted between {y - 10} and {y} of kicking team\")\n    \n    sns.lineplot(\n        data = df_heat_zones_ud,\n        x = 'ballLandingYardline',\n        y = 'yardsPlusMinus',\n        hue = 'classifiedResult',\n        palette = {'Fair Catch' : 'blue', 'Return' : 'green', 'Bail' : 'red'}\n    )\n    plt.gcf().set_size_inches(12,6)\n    plt.legend()\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:12.192400Z","iopub.execute_input":"2022-01-06T22:37:12.192709Z","iopub.status.idle":"2022-01-06T22:37:12.203572Z","shell.execute_reply.started":"2022-01-06T22:37:12.192678Z","shell.execute_reply":"2022-01-06T22:37:12.202600Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"_ = widgets.interact(netDecisionYards_based_on_kickingYardline, y = (10,80,10))","metadata":{"execution":{"iopub.status.busy":"2022-01-06T22:37:12.204814Z","iopub.execute_input":"2022-01-06T22:37:12.205148Z","iopub.status.idle":"2022-01-06T22:37:15.062708Z","shell.execute_reply.started":"2022-01-06T22:37:12.205118Z","shell.execute_reply":"2022-01-06T22:37:15.061741Z"},"trusted":true},"execution_count":null,"outputs":[]}]}