Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -59,10 +59,15 @@ def init_baselines():
|
|
| 59 |
raw_display.replace('', np.nan, inplace=True)
|
| 60 |
raw_display.replace('#DIV/0!', np.nan, inplace=True)
|
| 61 |
prop_frame = raw_display.dropna()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 62 |
|
| 63 |
-
return game_model, overall_stats, timestamp, prop_frame, prop_trends
|
| 64 |
|
| 65 |
-
game_model, overall_stats, timestamp, prop_frame, prop_trends = init_baselines()
|
| 66 |
qb_stats = overall_stats.loc[overall_stats['Position'] == 'QB']
|
| 67 |
non_qb_stats = overall_stats.loc[overall_stats['Position'] != 'QB']
|
| 68 |
team_dict = dict(zip(prop_frame['Player'], prop_frame['Team']))
|
|
@@ -83,7 +88,7 @@ with tab1:
|
|
| 83 |
st.info(t_stamp)
|
| 84 |
if st.button("Reset Data", key='reset1'):
|
| 85 |
st.cache_data.clear()
|
| 86 |
-
game_model, overall_stats, timestamp, prop_frame, prop_trends = init_baselines()
|
| 87 |
qb_stats = overall_stats.loc[overall_stats['Position'] == 'QB']
|
| 88 |
non_qb_stats = overall_stats.loc[overall_stats['Position'] != 'QB']
|
| 89 |
team_dict = dict(zip(prop_frame['Player'], prop_frame['Team']))
|
|
@@ -111,7 +116,7 @@ with tab2:
|
|
| 111 |
st.info(t_stamp)
|
| 112 |
if st.button("Reset Data", key='reset2'):
|
| 113 |
st.cache_data.clear()
|
| 114 |
-
game_model, overall_stats, timestamp, prop_frame, prop_trends = init_baselines()
|
| 115 |
qb_stats = overall_stats.loc[overall_stats['Position'] == 'QB']
|
| 116 |
non_qb_stats = overall_stats.loc[overall_stats['Position'] != 'QB']
|
| 117 |
team_dict = dict(zip(prop_frame['Player'], prop_frame['Team']))
|
|
@@ -137,7 +142,7 @@ with tab3:
|
|
| 137 |
st.info(t_stamp)
|
| 138 |
if st.button("Reset Data", key='reset3'):
|
| 139 |
st.cache_data.clear()
|
| 140 |
-
game_model, overall_stats, timestamp, prop_frame, prop_trends = init_baselines()
|
| 141 |
qb_stats = overall_stats.loc[overall_stats['Position'] == 'QB']
|
| 142 |
non_qb_stats = overall_stats.loc[overall_stats['Position'] != 'QB']
|
| 143 |
team_dict = dict(zip(prop_frame['Player'], prop_frame['Team']))
|
|
@@ -163,7 +168,7 @@ with tab4:
|
|
| 163 |
st.info(t_stamp)
|
| 164 |
if st.button("Reset Data", key='reset4'):
|
| 165 |
st.cache_data.clear()
|
| 166 |
-
game_model, overall_stats, timestamp, prop_frame, prop_trends = init_baselines()
|
| 167 |
qb_stats = overall_stats.loc[overall_stats['Position'] == 'QB']
|
| 168 |
non_qb_stats = overall_stats.loc[overall_stats['Position'] != 'QB']
|
| 169 |
team_dict = dict(zip(prop_frame['Player'], prop_frame['Team']))
|
|
@@ -190,7 +195,7 @@ with tab5:
|
|
| 190 |
st.info(t_stamp)
|
| 191 |
if st.button("Reset Data", key='reset5'):
|
| 192 |
st.cache_data.clear()
|
| 193 |
-
game_model, overall_stats, timestamp, prop_frame, prop_trends = init_baselines()
|
| 194 |
qb_stats = overall_stats.loc[overall_stats['Position'] == 'QB']
|
| 195 |
non_qb_stats = overall_stats.loc[overall_stats['Position'] != 'QB']
|
| 196 |
team_dict = dict(zip(prop_frame['Player'], prop_frame['Team']))
|
|
@@ -337,7 +342,7 @@ with tab6:
|
|
| 337 |
st.info('The Over and Under percentages are a compositve percentage based on simulations, historical performance, and implied probabilities, and may be different than you would expect based purely on the median projection. Likewise, the Edge of a bet is not the only indicator of if you should make the bet or not as the suggestion is using a base acceptable threshold to determine how much edge you should have for each stat category.')
|
| 338 |
if st.button("Reset Data/Load Data", key='reset6'):
|
| 339 |
st.cache_data.clear()
|
| 340 |
-
game_model, overall_stats, timestamp, prop_frame, prop_trends = init_baselines()
|
| 341 |
qb_stats = overall_stats.loc[overall_stats['Position'] == 'QB']
|
| 342 |
non_qb_stats = overall_stats.loc[overall_stats['Position'] != 'QB']
|
| 343 |
team_dict = dict(zip(prop_frame['Player'], prop_frame['Team']))
|
|
@@ -351,6 +356,19 @@ with tab6:
|
|
| 351 |
export_container = st.empty()
|
| 352 |
|
| 353 |
with col1:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 354 |
prop_type_var = st.selectbox('Select prop category', options = ['All Props', 'pass_yards', 'rush_yards', 'rec_yards', 'receptions', 'rush_attempts'])
|
| 355 |
|
| 356 |
if st.button('Simulate Prop Category'):
|
|
@@ -360,6 +378,11 @@ with tab6:
|
|
| 360 |
if prop_type_var == 'All Props':
|
| 361 |
for prop in all_sim_vars:
|
| 362 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 363 |
prop_df = prop_frame[['Player', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
| 364 |
prop_df = prop_df.loc[prop_df['prop_type'] == prop]
|
| 365 |
prop_df = prop_df[['Player', 'over_prop', 'over_line', 'under_line']]
|
|
@@ -450,9 +473,14 @@ with tab6:
|
|
| 450 |
final_outcomes = sim_all_hold
|
| 451 |
|
| 452 |
elif prop_type_var != 'All Props':
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 453 |
|
| 454 |
if prop_type_var == "pass_yards":
|
| 455 |
-
prop_df = prop_frame[['Player', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
| 456 |
prop_df = prop_df.loc[prop_df['prop_type'] == 'pass_yards']
|
| 457 |
prop_df = prop_df[['Player', 'over_prop', 'over_line', 'under_line']]
|
| 458 |
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|
|
@@ -462,7 +490,6 @@ with tab6:
|
|
| 462 |
prop_df['Under'] = np.where(prop_df['under_line'] < 0, (-(prop_df['under_line'])/((-(prop_df['under_line']))+101)), 101/(prop_df['under_line']+101))
|
| 463 |
df = pd.merge(overall_stats, prop_df, how='left', left_on=['Player'], right_on = ['Player'])
|
| 464 |
elif prop_type_var == "rush_yards":
|
| 465 |
-
prop_df = prop_frame[['Player', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
| 466 |
prop_df = prop_df.loc[prop_df['prop_type'] == 'rush_yards']
|
| 467 |
prop_df = prop_df[['Player', 'over_prop', 'over_line', 'under_line']]
|
| 468 |
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|
|
@@ -472,7 +499,6 @@ with tab6:
|
|
| 472 |
prop_df['Under'] = np.where(prop_df['under_line'] < 0, (-(prop_df['under_line'])/((-(prop_df['under_line']))+101)), 101/(prop_df['under_line']+101))
|
| 473 |
df = pd.merge(overall_stats, prop_df, how='left', left_on=['Player'], right_on = ['Player'])
|
| 474 |
elif prop_type_var == "rec_yards":
|
| 475 |
-
prop_df = prop_frame[['Player', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
| 476 |
prop_df = prop_df.loc[prop_df['prop_type'] == 'rec_yards']
|
| 477 |
prop_df = prop_df[['Player', 'over_prop', 'over_line', 'under_line']]
|
| 478 |
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|
|
@@ -482,7 +508,6 @@ with tab6:
|
|
| 482 |
prop_df['Under'] = np.where(prop_df['under_line'] < 0, (-(prop_df['under_line'])/((-(prop_df['under_line']))+101)), 101/(prop_df['under_line']+101))
|
| 483 |
df = pd.merge(overall_stats, prop_df, how='left', left_on=['Player'], right_on = ['Player'])
|
| 484 |
elif prop_type_var == "receptions":
|
| 485 |
-
prop_df = prop_frame[['Player', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
| 486 |
prop_df = prop_df.loc[prop_df['prop_type'] == 'receptions']
|
| 487 |
prop_df = prop_df[['Player', 'over_prop', 'over_line', 'under_line']]
|
| 488 |
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|
|
@@ -492,7 +517,6 @@ with tab6:
|
|
| 492 |
prop_df['Under'] = np.where(prop_df['under_line'] < 0, (-(prop_df['under_line'])/((-(prop_df['under_line']))+101)), 101/(prop_df['under_line']+101))
|
| 493 |
df = pd.merge(overall_stats, prop_df, how='left', left_on=['Player'], right_on = ['Player'])
|
| 494 |
elif prop_type_var == "rush_attempts":
|
| 495 |
-
prop_df = prop_frame[['Player', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
| 496 |
prop_df = prop_df.loc[prop_df['prop_type'] == 'rush_attempts']
|
| 497 |
prop_df = prop_df[['Player', 'over_prop', 'over_line', 'under_line']]
|
| 498 |
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|
|
@@ -502,7 +526,6 @@ with tab6:
|
|
| 502 |
prop_df['Under'] = np.where(prop_df['under_line'] < 0, (-(prop_df['under_line'])/((-(prop_df['under_line']))+101)), 101/(prop_df['under_line']+101))
|
| 503 |
df = pd.merge(overall_stats, prop_df, how='left', left_on=['Player'], right_on = ['Player'])
|
| 504 |
elif prop_type_var == "pass_attempts":
|
| 505 |
-
prop_df = prop_frame[['Player', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
| 506 |
prop_df = prop_df.loc[prop_df['prop_type'] == 'pass_attempts']
|
| 507 |
prop_df = prop_df[['Player', 'over_prop', 'over_line', 'under_line']]
|
| 508 |
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|
|
@@ -512,7 +535,6 @@ with tab6:
|
|
| 512 |
prop_df['Under'] = np.where(prop_df['under_line'] < 0, (-(prop_df['under_line'])/((-(prop_df['under_line']))+101)), 101/(prop_df['under_line']+101))
|
| 513 |
df = pd.merge(overall_stats, prop_df, how='left', left_on=['Player'], right_on = ['Player'])
|
| 514 |
elif prop_type_var == "pass_completions":
|
| 515 |
-
prop_df = prop_frame[['Player', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
| 516 |
prop_df = prop_df.loc[prop_df['prop_type'] == 'pass_completions']
|
| 517 |
prop_df = prop_df[['Player', 'over_prop', 'over_line', 'under_line']]
|
| 518 |
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|
|
|
|
| 59 |
raw_display.replace('', np.nan, inplace=True)
|
| 60 |
raw_display.replace('#DIV/0!', np.nan, inplace=True)
|
| 61 |
prop_frame = raw_display.dropna()
|
| 62 |
+
|
| 63 |
+
worksheet = sh.worksheet('Pick6_ingest')
|
| 64 |
+
raw_display = pd.DataFrame(worksheet.get_all_records())
|
| 65 |
+
raw_display.replace('', np.nan, inplace=True)
|
| 66 |
+
pick_frame = raw_display.dropna(subset='Player')
|
| 67 |
|
| 68 |
+
return game_model, overall_stats, timestamp, prop_frame, prop_trends, pick_frame
|
| 69 |
|
| 70 |
+
game_model, overall_stats, timestamp, prop_frame, prop_trends, pick_frame = init_baselines()
|
| 71 |
qb_stats = overall_stats.loc[overall_stats['Position'] == 'QB']
|
| 72 |
non_qb_stats = overall_stats.loc[overall_stats['Position'] != 'QB']
|
| 73 |
team_dict = dict(zip(prop_frame['Player'], prop_frame['Team']))
|
|
|
|
| 88 |
st.info(t_stamp)
|
| 89 |
if st.button("Reset Data", key='reset1'):
|
| 90 |
st.cache_data.clear()
|
| 91 |
+
game_model, overall_stats, timestamp, prop_frame, prop_trends, pick_frame = init_baselines()
|
| 92 |
qb_stats = overall_stats.loc[overall_stats['Position'] == 'QB']
|
| 93 |
non_qb_stats = overall_stats.loc[overall_stats['Position'] != 'QB']
|
| 94 |
team_dict = dict(zip(prop_frame['Player'], prop_frame['Team']))
|
|
|
|
| 116 |
st.info(t_stamp)
|
| 117 |
if st.button("Reset Data", key='reset2'):
|
| 118 |
st.cache_data.clear()
|
| 119 |
+
game_model, overall_stats, timestamp, prop_frame, prop_trends, pick_frame = init_baselines()
|
| 120 |
qb_stats = overall_stats.loc[overall_stats['Position'] == 'QB']
|
| 121 |
non_qb_stats = overall_stats.loc[overall_stats['Position'] != 'QB']
|
| 122 |
team_dict = dict(zip(prop_frame['Player'], prop_frame['Team']))
|
|
|
|
| 142 |
st.info(t_stamp)
|
| 143 |
if st.button("Reset Data", key='reset3'):
|
| 144 |
st.cache_data.clear()
|
| 145 |
+
game_model, overall_stats, timestamp, prop_frame, prop_trends, pick_frame = init_baselines()
|
| 146 |
qb_stats = overall_stats.loc[overall_stats['Position'] == 'QB']
|
| 147 |
non_qb_stats = overall_stats.loc[overall_stats['Position'] != 'QB']
|
| 148 |
team_dict = dict(zip(prop_frame['Player'], prop_frame['Team']))
|
|
|
|
| 168 |
st.info(t_stamp)
|
| 169 |
if st.button("Reset Data", key='reset4'):
|
| 170 |
st.cache_data.clear()
|
| 171 |
+
game_model, overall_stats, timestamp, prop_frame, prop_trends, pick_frame = init_baselines()
|
| 172 |
qb_stats = overall_stats.loc[overall_stats['Position'] == 'QB']
|
| 173 |
non_qb_stats = overall_stats.loc[overall_stats['Position'] != 'QB']
|
| 174 |
team_dict = dict(zip(prop_frame['Player'], prop_frame['Team']))
|
|
|
|
| 195 |
st.info(t_stamp)
|
| 196 |
if st.button("Reset Data", key='reset5'):
|
| 197 |
st.cache_data.clear()
|
| 198 |
+
game_model, overall_stats, timestamp, prop_frame, prop_trends, pick_frame = init_baselines()
|
| 199 |
qb_stats = overall_stats.loc[overall_stats['Position'] == 'QB']
|
| 200 |
non_qb_stats = overall_stats.loc[overall_stats['Position'] != 'QB']
|
| 201 |
team_dict = dict(zip(prop_frame['Player'], prop_frame['Team']))
|
|
|
|
| 342 |
st.info('The Over and Under percentages are a compositve percentage based on simulations, historical performance, and implied probabilities, and may be different than you would expect based purely on the median projection. Likewise, the Edge of a bet is not the only indicator of if you should make the bet or not as the suggestion is using a base acceptable threshold to determine how much edge you should have for each stat category.')
|
| 343 |
if st.button("Reset Data/Load Data", key='reset6'):
|
| 344 |
st.cache_data.clear()
|
| 345 |
+
game_model, overall_stats, timestamp, prop_frame, prop_trends, pick_frame = init_baselines()
|
| 346 |
qb_stats = overall_stats.loc[overall_stats['Position'] == 'QB']
|
| 347 |
non_qb_stats = overall_stats.loc[overall_stats['Position'] != 'QB']
|
| 348 |
team_dict = dict(zip(prop_frame['Player'], prop_frame['Team']))
|
|
|
|
| 356 |
export_container = st.empty()
|
| 357 |
|
| 358 |
with col1:
|
| 359 |
+
game_select_var = st.selectbox('Select prop source', options = ['Aggregate', 'Pick6'])
|
| 360 |
+
if game_select_var == 'Aggregate':
|
| 361 |
+
prop_df = prop_frame[['Player', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
| 362 |
+
elif game_select_var == 'Pick6':
|
| 363 |
+
prop_df = pick_frame[['Full_name', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
| 364 |
+
prop_df.rename(columns={"Full_name": "Player"}, inplace = True)
|
| 365 |
+
st.download_button(
|
| 366 |
+
label="Download Prop Source",
|
| 367 |
+
data=convert_df_to_csv(prop_df),
|
| 368 |
+
file_name='Nba_prop_source.csv',
|
| 369 |
+
mime='text/csv',
|
| 370 |
+
key='prop_source',
|
| 371 |
+
)
|
| 372 |
prop_type_var = st.selectbox('Select prop category', options = ['All Props', 'pass_yards', 'rush_yards', 'rec_yards', 'receptions', 'rush_attempts'])
|
| 373 |
|
| 374 |
if st.button('Simulate Prop Category'):
|
|
|
|
| 378 |
if prop_type_var == 'All Props':
|
| 379 |
for prop in all_sim_vars:
|
| 380 |
|
| 381 |
+
if game_select_var == 'Aggregate':
|
| 382 |
+
prop_df = prop_frame[['Player', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
| 383 |
+
elif game_select_var == 'Pick6':
|
| 384 |
+
prop_df = pick_frame[['Full_name', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
| 385 |
+
prop_df.rename(columns={"Full_name": "Player"}, inplace = True)
|
| 386 |
prop_df = prop_frame[['Player', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
| 387 |
prop_df = prop_df.loc[prop_df['prop_type'] == prop]
|
| 388 |
prop_df = prop_df[['Player', 'over_prop', 'over_line', 'under_line']]
|
|
|
|
| 473 |
final_outcomes = sim_all_hold
|
| 474 |
|
| 475 |
elif prop_type_var != 'All Props':
|
| 476 |
+
|
| 477 |
+
if game_select_var == 'Aggregate':
|
| 478 |
+
prop_df = prop_frame[['Player', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
| 479 |
+
elif game_select_var == 'Pick6':
|
| 480 |
+
prop_df = pick_frame[['Full_name', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
| 481 |
+
prop_df.rename(columns={"Full_name": "Player"}, inplace = True)
|
| 482 |
|
| 483 |
if prop_type_var == "pass_yards":
|
|
|
|
| 484 |
prop_df = prop_df.loc[prop_df['prop_type'] == 'pass_yards']
|
| 485 |
prop_df = prop_df[['Player', 'over_prop', 'over_line', 'under_line']]
|
| 486 |
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|
|
|
|
| 490 |
prop_df['Under'] = np.where(prop_df['under_line'] < 0, (-(prop_df['under_line'])/((-(prop_df['under_line']))+101)), 101/(prop_df['under_line']+101))
|
| 491 |
df = pd.merge(overall_stats, prop_df, how='left', left_on=['Player'], right_on = ['Player'])
|
| 492 |
elif prop_type_var == "rush_yards":
|
|
|
|
| 493 |
prop_df = prop_df.loc[prop_df['prop_type'] == 'rush_yards']
|
| 494 |
prop_df = prop_df[['Player', 'over_prop', 'over_line', 'under_line']]
|
| 495 |
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|
|
|
|
| 499 |
prop_df['Under'] = np.where(prop_df['under_line'] < 0, (-(prop_df['under_line'])/((-(prop_df['under_line']))+101)), 101/(prop_df['under_line']+101))
|
| 500 |
df = pd.merge(overall_stats, prop_df, how='left', left_on=['Player'], right_on = ['Player'])
|
| 501 |
elif prop_type_var == "rec_yards":
|
|
|
|
| 502 |
prop_df = prop_df.loc[prop_df['prop_type'] == 'rec_yards']
|
| 503 |
prop_df = prop_df[['Player', 'over_prop', 'over_line', 'under_line']]
|
| 504 |
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|
|
|
|
| 508 |
prop_df['Under'] = np.where(prop_df['under_line'] < 0, (-(prop_df['under_line'])/((-(prop_df['under_line']))+101)), 101/(prop_df['under_line']+101))
|
| 509 |
df = pd.merge(overall_stats, prop_df, how='left', left_on=['Player'], right_on = ['Player'])
|
| 510 |
elif prop_type_var == "receptions":
|
|
|
|
| 511 |
prop_df = prop_df.loc[prop_df['prop_type'] == 'receptions']
|
| 512 |
prop_df = prop_df[['Player', 'over_prop', 'over_line', 'under_line']]
|
| 513 |
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|
|
|
|
| 517 |
prop_df['Under'] = np.where(prop_df['under_line'] < 0, (-(prop_df['under_line'])/((-(prop_df['under_line']))+101)), 101/(prop_df['under_line']+101))
|
| 518 |
df = pd.merge(overall_stats, prop_df, how='left', left_on=['Player'], right_on = ['Player'])
|
| 519 |
elif prop_type_var == "rush_attempts":
|
|
|
|
| 520 |
prop_df = prop_df.loc[prop_df['prop_type'] == 'rush_attempts']
|
| 521 |
prop_df = prop_df[['Player', 'over_prop', 'over_line', 'under_line']]
|
| 522 |
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|
|
|
|
| 526 |
prop_df['Under'] = np.where(prop_df['under_line'] < 0, (-(prop_df['under_line'])/((-(prop_df['under_line']))+101)), 101/(prop_df['under_line']+101))
|
| 527 |
df = pd.merge(overall_stats, prop_df, how='left', left_on=['Player'], right_on = ['Player'])
|
| 528 |
elif prop_type_var == "pass_attempts":
|
|
|
|
| 529 |
prop_df = prop_df.loc[prop_df['prop_type'] == 'pass_attempts']
|
| 530 |
prop_df = prop_df[['Player', 'over_prop', 'over_line', 'under_line']]
|
| 531 |
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|
|
|
|
| 535 |
prop_df['Under'] = np.where(prop_df['under_line'] < 0, (-(prop_df['under_line'])/((-(prop_df['under_line']))+101)), 101/(prop_df['under_line']+101))
|
| 536 |
df = pd.merge(overall_stats, prop_df, how='left', left_on=['Player'], right_on = ['Player'])
|
| 537 |
elif prop_type_var == "pass_completions":
|
|
|
|
| 538 |
prop_df = prop_df.loc[prop_df['prop_type'] == 'pass_completions']
|
| 539 |
prop_df = prop_df[['Player', 'over_prop', 'over_line', 'under_line']]
|
| 540 |
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|