Spaces:
Running
Running
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)
|