Spaces:
Running
Running
James McCool
commited on
Commit
·
1210272
1
Parent(s):
4cd9ca0
Refactor prop data handling to include 'Trending Over' and 'Trending Under' metrics in player prop simulations. Updated DataFrame structures and calculations to incorporate these new columns across various functions, enhancing the analysis of player performance trends.
Browse files
app.py
CHANGED
@@ -68,7 +68,7 @@ prop_format = {'L5 Success': '{:.2%}', 'L10_Success': '{:.2%}', 'L20_success': '
|
|
68 |
prop_table_options = ['NBA_GAME_PLAYER_POINTS', 'NBA_GAME_PLAYER_REBOUNDS', 'NBA_GAME_PLAYER_ASSISTS', 'NBA_GAME_PLAYER_POINTS_REBOUNDS_ASSISTS', 'NBA_GAME_PLAYER_POINTS_REBOUNDS', 'NBA_GAME_PLAYER_POINTS_ASSISTS', 'NBA_GAME_PLAYER_REBOUNDS_ASSISTS']
|
69 |
all_sim_vars = ['NBA_GAME_PLAYER_POINTS', 'NBA_GAME_PLAYER_REBOUNDS', 'NBA_GAME_PLAYER_ASSISTS', 'NBA_GAME_PLAYER_POINTS_REBOUNDS_ASSISTS', 'NBA_GAME_PLAYER_POINTS_REBOUNDS', 'NBA_GAME_PLAYER_POINTS_ASSISTS', 'NBA_GAME_PLAYER_REBOUNDS_ASSISTS']
|
70 |
pick6_sim_vars = ['Points', 'Rebounds', 'Assists', 'Points + Assists + Rebounds', 'Points + Assists', 'Points + Rebounds', 'Assists + Rebounds']
|
71 |
-
sim_all_hold = pd.DataFrame(columns=['Player', 'Team', 'Book', 'Prop Type', 'Prop', 'Mean_Outcome', 'Imp Over', 'Over%', 'Imp Under', 'Under%', 'Bet?', 'Edge'])
|
72 |
|
73 |
def calculate_poisson(row):
|
74 |
mean_val = row['Mean_Outcome']
|
@@ -477,9 +477,9 @@ with tab6:
|
|
477 |
else:
|
478 |
book_selections = [book_select_var]
|
479 |
if game_select_var == 'Aggregate':
|
480 |
-
prop_df = prop_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
481 |
elif game_select_var == 'Pick6':
|
482 |
-
prop_df = pick_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
483 |
book_selections = ['Pick6']
|
484 |
st.download_button(
|
485 |
label="Download Prop Source",
|
@@ -500,11 +500,11 @@ with tab6:
|
|
500 |
with df_hold_container.container():
|
501 |
if prop_type_var == 'All Props':
|
502 |
if game_select_var == 'Aggregate':
|
503 |
-
prop_df_raw = prop_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
504 |
sim_vars = ['NBA_GAME_PLAYER_POINTS', 'NBA_GAME_PLAYER_REBOUNDS', 'NBA_GAME_PLAYER_ASSISTS', 'NBA_GAME_PLAYER_POINTS_REBOUNDS_ASSISTS', 'NBA_GAME_PLAYER_POINTS_REBOUNDS',
|
505 |
'NBA_GAME_PLAYER_POINTS_ASSISTS', 'NBA_GAME_PLAYER_REBOUNDS_ASSISTS', 'NBA_GAME_PLAYER_3_POINTERS_MADE']
|
506 |
elif game_select_var == 'Pick6':
|
507 |
-
prop_df_raw = pick_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
508 |
sim_vars = ['Points', 'Rebounds', 'Assists', 'Points + Assists + Rebounds', 'Points + Assists', 'Points + Rebounds', 'Assists + Rebounds', '3-Pointers Made']
|
509 |
|
510 |
player_df = player_stats.copy()
|
@@ -514,7 +514,7 @@ with tab6:
|
|
514 |
for books in book_selections:
|
515 |
prop_df = prop_df_raw[prop_df_raw['prop_type'] == prop]
|
516 |
prop_df = prop_df[prop_df['book'] == books]
|
517 |
-
prop_df = prop_df[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
518 |
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|
519 |
prop_df['Over'] = 1 / prop_df['over_line']
|
520 |
prop_df['Under'] = 1 / prop_df['under_line']
|
@@ -524,10 +524,14 @@ with tab6:
|
|
524 |
book_dict = dict(zip(prop_df.Player, prop_df.book))
|
525 |
over_dict = dict(zip(prop_df.Player, prop_df.Over))
|
526 |
under_dict = dict(zip(prop_df.Player, prop_df.Under))
|
|
|
|
|
527 |
|
528 |
player_df['book'] = player_df['Player'].map(book_dict)
|
529 |
player_df['Prop'] = player_df['Player'].map(prop_dict)
|
530 |
player_df['prop_type'] = player_df['Player'].map(prop_type_dict)
|
|
|
|
|
531 |
|
532 |
df = player_df.reset_index(drop=True)
|
533 |
|
@@ -586,15 +590,17 @@ with tab6:
|
|
586 |
players_only['Mean_Outcome'] = overall_file.mean(axis=1)
|
587 |
players_only['Book'] = players_only['Player'].map(book_dict)
|
588 |
players_only['Prop'] = players_only['Player'].map(prop_dict)
|
|
|
|
|
589 |
players_only['poisson_var'] = players_only.apply(calculate_poisson, axis=1)
|
590 |
players_only['10%'] = overall_file.quantile(0.1, axis=1)
|
591 |
players_only['90%'] = overall_file.quantile(0.9, axis=1)
|
592 |
players_only['Over'] = np_where(players_only['Prop'] <= 3, players_only['poisson_var'], prop_check[prop_check > 0].count(axis=1)/float(total_sims))
|
593 |
players_only['Imp Over'] = players_only['Player'].map(over_dict)
|
594 |
-
players_only['Over%'] = players_only[["Over", "Imp Over"]].mean(axis=1)
|
595 |
players_only['Under'] = np_where(players_only['Prop'] <= 3, 1 - players_only['poisson_var'], prop_check[prop_check < 0].count(axis=1)/float(total_sims))
|
596 |
players_only['Imp Under'] = players_only['Player'].map(under_dict)
|
597 |
-
players_only['Under%'] = players_only[["Under", "Imp Under"]].mean(axis=1)
|
598 |
players_only['Prop_avg'] = players_only['Prop'].mean() / 100
|
599 |
players_only['prop_threshold'] = .10
|
600 |
players_only = players_only[players_only['Mean_Outcome'] > 0]
|
@@ -609,7 +615,7 @@ with tab6:
|
|
609 |
players_only['Player'] = hold_file[['Player']]
|
610 |
players_only['Team'] = players_only['Player'].map(team_dict)
|
611 |
|
612 |
-
leg_outcomes = players_only[['Player', 'Team', 'Book', 'Prop Type', 'Prop', 'Mean_Outcome', 'Imp Over', 'Over%', 'Imp Under', 'Under%', 'Bet?', 'Edge']]
|
613 |
sim_all_hold = pd.concat([sim_all_hold, leg_outcomes], ignore_index=True)
|
614 |
|
615 |
final_outcomes = sim_all_hold
|
@@ -620,9 +626,9 @@ with tab6:
|
|
620 |
player_df = player_stats.copy()
|
621 |
|
622 |
if game_select_var == 'Aggregate':
|
623 |
-
prop_df_raw = prop_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
624 |
elif game_select_var == 'Pick6':
|
625 |
-
prop_df_raw = pick_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
626 |
|
627 |
for books in book_selections:
|
628 |
prop_df = prop_df_raw[prop_df_raw['book'] == books]
|
@@ -660,7 +666,7 @@ with tab6:
|
|
660 |
elif prop_type_var == "Assists + Rebounds":
|
661 |
prop_df = prop_df[prop_df['prop_type'] == 'Assists + Rebounds']
|
662 |
|
663 |
-
prop_df = prop_df[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
|
664 |
prop_df = prop_df.rename(columns={"over_prop": "Prop"})
|
665 |
prop_df['Over'] = 1 / prop_df['over_line']
|
666 |
prop_df['Under'] = 1 / prop_df['under_line']
|
@@ -670,10 +676,14 @@ with tab6:
|
|
670 |
book_dict = dict(zip(prop_df.Player, prop_df.book))
|
671 |
over_dict = dict(zip(prop_df.Player, prop_df.Over))
|
672 |
under_dict = dict(zip(prop_df.Player, prop_df.Under))
|
|
|
|
|
673 |
|
674 |
player_df['book'] = player_df['Player'].map(book_dict)
|
675 |
player_df['Prop'] = player_df['Player'].map(prop_dict)
|
676 |
player_df['prop_type'] = player_df['Player'].map(prop_type_dict)
|
|
|
|
|
677 |
|
678 |
df = player_df.reset_index(drop=True)
|
679 |
|
@@ -732,15 +742,17 @@ with tab6:
|
|
732 |
players_only['Mean_Outcome'] = overall_file.mean(axis=1)
|
733 |
players_only['Book'] = players_only['Player'].map(book_dict)
|
734 |
players_only['Prop'] = players_only['Player'].map(prop_dict)
|
|
|
|
|
735 |
players_only['poisson_var'] = players_only.apply(calculate_poisson, axis=1)
|
736 |
players_only['10%'] = overall_file.quantile(0.1, axis=1)
|
737 |
players_only['90%'] = overall_file.quantile(0.9, axis=1)
|
738 |
players_only['Over'] = np_where(players_only['Prop'] <= 3, players_only['poisson_var'], prop_check[prop_check > 0].count(axis=1)/float(total_sims))
|
739 |
players_only['Imp Over'] = players_only['Player'].map(over_dict)
|
740 |
-
players_only['Over%'] = players_only[["Over", "Imp Over"]].mean(axis=1)
|
741 |
players_only['Under'] = np_where(players_only['Prop'] <= 3, 1 - players_only['poisson_var'], prop_check[prop_check < 0].count(axis=1)/float(total_sims))
|
742 |
players_only['Imp Under'] = players_only['Player'].map(under_dict)
|
743 |
-
players_only['Under%'] = players_only[["Under", "Imp Under"]].mean(axis=1)
|
744 |
players_only['Prop_avg'] = players_only['Prop'].mean() / 100
|
745 |
players_only['prop_threshold'] = .10
|
746 |
players_only = players_only[players_only['Mean_Outcome'] > 0]
|
@@ -755,7 +767,7 @@ with tab6:
|
|
755 |
players_only['Player'] = hold_file[['Player']]
|
756 |
players_only['Team'] = players_only['Player'].map(team_dict)
|
757 |
|
758 |
-
leg_outcomes = players_only[['Player', 'Team', 'Book', 'Prop Type', 'Prop', 'Mean_Outcome', 'Imp Over', 'Over%', 'Imp Under', 'Under%', 'Bet?', 'Edge']]
|
759 |
sim_all_hold = pd.concat([sim_all_hold, leg_outcomes], ignore_index=True)
|
760 |
|
761 |
final_outcomes = sim_all_hold
|
|
|
68 |
prop_table_options = ['NBA_GAME_PLAYER_POINTS', 'NBA_GAME_PLAYER_REBOUNDS', 'NBA_GAME_PLAYER_ASSISTS', 'NBA_GAME_PLAYER_POINTS_REBOUNDS_ASSISTS', 'NBA_GAME_PLAYER_POINTS_REBOUNDS', 'NBA_GAME_PLAYER_POINTS_ASSISTS', 'NBA_GAME_PLAYER_REBOUNDS_ASSISTS']
|
69 |
all_sim_vars = ['NBA_GAME_PLAYER_POINTS', 'NBA_GAME_PLAYER_REBOUNDS', 'NBA_GAME_PLAYER_ASSISTS', 'NBA_GAME_PLAYER_POINTS_REBOUNDS_ASSISTS', 'NBA_GAME_PLAYER_POINTS_REBOUNDS', 'NBA_GAME_PLAYER_POINTS_ASSISTS', 'NBA_GAME_PLAYER_REBOUNDS_ASSISTS']
|
70 |
pick6_sim_vars = ['Points', 'Rebounds', 'Assists', 'Points + Assists + Rebounds', 'Points + Assists', 'Points + Rebounds', 'Assists + Rebounds']
|
71 |
+
sim_all_hold = pd.DataFrame(columns=['Player', 'Team', 'Book', 'Prop Type', 'Prop', 'Mean_Outcome', 'Imp Over', 'Trending Over', 'Over%', 'Imp Under', 'Trending Under', 'Under%', 'Bet?', 'Edge'])
|
72 |
|
73 |
def calculate_poisson(row):
|
74 |
mean_val = row['Mean_Outcome']
|
|
|
477 |
else:
|
478 |
book_selections = [book_select_var]
|
479 |
if game_select_var == 'Aggregate':
|
480 |
+
prop_df = prop_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type', 'Trending Over', 'Trending Under']]
|
481 |
elif game_select_var == 'Pick6':
|
482 |
+
prop_df = pick_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type', 'Trending Over', 'Trending Under']]
|
483 |
book_selections = ['Pick6']
|
484 |
st.download_button(
|
485 |
label="Download Prop Source",
|
|
|
500 |
with df_hold_container.container():
|
501 |
if prop_type_var == 'All Props':
|
502 |
if game_select_var == 'Aggregate':
|
503 |
+
prop_df_raw = prop_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type', 'Trending Over', 'Trending Under']]
|
504 |
sim_vars = ['NBA_GAME_PLAYER_POINTS', 'NBA_GAME_PLAYER_REBOUNDS', 'NBA_GAME_PLAYER_ASSISTS', 'NBA_GAME_PLAYER_POINTS_REBOUNDS_ASSISTS', 'NBA_GAME_PLAYER_POINTS_REBOUNDS',
|
505 |
'NBA_GAME_PLAYER_POINTS_ASSISTS', 'NBA_GAME_PLAYER_REBOUNDS_ASSISTS', 'NBA_GAME_PLAYER_3_POINTERS_MADE']
|
506 |
elif game_select_var == 'Pick6':
|
507 |
+
prop_df_raw = pick_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type', 'Trending Over', 'Trending Under']]
|
508 |
sim_vars = ['Points', 'Rebounds', 'Assists', 'Points + Assists + Rebounds', 'Points + Assists', 'Points + Rebounds', 'Assists + Rebounds', '3-Pointers Made']
|
509 |
|
510 |
player_df = player_stats.copy()
|
|
|
514 |
for books in book_selections:
|
515 |
prop_df = prop_df_raw[prop_df_raw['prop_type'] == prop]
|
516 |
prop_df = prop_df[prop_df['book'] == books]
|
517 |
+
prop_df = prop_df[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type', 'Trending Over', 'Trending Under']]
|
518 |
prop_df.rename(columns={"over_prop": "Prop"}, inplace = True)
|
519 |
prop_df['Over'] = 1 / prop_df['over_line']
|
520 |
prop_df['Under'] = 1 / prop_df['under_line']
|
|
|
524 |
book_dict = dict(zip(prop_df.Player, prop_df.book))
|
525 |
over_dict = dict(zip(prop_df.Player, prop_df.Over))
|
526 |
under_dict = dict(zip(prop_df.Player, prop_df.Under))
|
527 |
+
trending_over_dict = dict(zip(prop_df.Player, prop_df['Trending Over']))
|
528 |
+
trending_under_dict = dict(zip(prop_df.Player, prop_df['Trending Under']))
|
529 |
|
530 |
player_df['book'] = player_df['Player'].map(book_dict)
|
531 |
player_df['Prop'] = player_df['Player'].map(prop_dict)
|
532 |
player_df['prop_type'] = player_df['Player'].map(prop_type_dict)
|
533 |
+
player_df['Trending Over'] = player_df['Player'].map(trending_over_dict)
|
534 |
+
player_df['Trending Under'] = player_df['Player'].map(trending_under_dict)
|
535 |
|
536 |
df = player_df.reset_index(drop=True)
|
537 |
|
|
|
590 |
players_only['Mean_Outcome'] = overall_file.mean(axis=1)
|
591 |
players_only['Book'] = players_only['Player'].map(book_dict)
|
592 |
players_only['Prop'] = players_only['Player'].map(prop_dict)
|
593 |
+
players_only['Trending Over'] = players_only['Player'].map(trending_over_dict)
|
594 |
+
players_only['Trending Under'] = players_only['Player'].map(trending_under_dict)
|
595 |
players_only['poisson_var'] = players_only.apply(calculate_poisson, axis=1)
|
596 |
players_only['10%'] = overall_file.quantile(0.1, axis=1)
|
597 |
players_only['90%'] = overall_file.quantile(0.9, axis=1)
|
598 |
players_only['Over'] = np_where(players_only['Prop'] <= 3, players_only['poisson_var'], prop_check[prop_check > 0].count(axis=1)/float(total_sims))
|
599 |
players_only['Imp Over'] = players_only['Player'].map(over_dict)
|
600 |
+
players_only['Over%'] = players_only[["Over", "Imp Over", "Trending Over"]].mean(axis=1)
|
601 |
players_only['Under'] = np_where(players_only['Prop'] <= 3, 1 - players_only['poisson_var'], prop_check[prop_check < 0].count(axis=1)/float(total_sims))
|
602 |
players_only['Imp Under'] = players_only['Player'].map(under_dict)
|
603 |
+
players_only['Under%'] = players_only[["Under", "Imp Under", "Trending Under"]].mean(axis=1)
|
604 |
players_only['Prop_avg'] = players_only['Prop'].mean() / 100
|
605 |
players_only['prop_threshold'] = .10
|
606 |
players_only = players_only[players_only['Mean_Outcome'] > 0]
|
|
|
615 |
players_only['Player'] = hold_file[['Player']]
|
616 |
players_only['Team'] = players_only['Player'].map(team_dict)
|
617 |
|
618 |
+
leg_outcomes = players_only[['Player', 'Team', 'Book', 'Prop Type', 'Prop', 'Mean_Outcome', 'Imp Over', 'Trending Over', 'Over%', 'Imp Under', 'Trending Under', 'Under%', 'Bet?', 'Edge']]
|
619 |
sim_all_hold = pd.concat([sim_all_hold, leg_outcomes], ignore_index=True)
|
620 |
|
621 |
final_outcomes = sim_all_hold
|
|
|
626 |
player_df = player_stats.copy()
|
627 |
|
628 |
if game_select_var == 'Aggregate':
|
629 |
+
prop_df_raw = prop_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type', 'Trending Over', 'Trending Under']]
|
630 |
elif game_select_var == 'Pick6':
|
631 |
+
prop_df_raw = pick_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type', 'Trending Over', 'Trending Under']]
|
632 |
|
633 |
for books in book_selections:
|
634 |
prop_df = prop_df_raw[prop_df_raw['book'] == books]
|
|
|
666 |
elif prop_type_var == "Assists + Rebounds":
|
667 |
prop_df = prop_df[prop_df['prop_type'] == 'Assists + Rebounds']
|
668 |
|
669 |
+
prop_df = prop_df[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type', 'Trending Over', 'Trending Under']]
|
670 |
prop_df = prop_df.rename(columns={"over_prop": "Prop"})
|
671 |
prop_df['Over'] = 1 / prop_df['over_line']
|
672 |
prop_df['Under'] = 1 / prop_df['under_line']
|
|
|
676 |
book_dict = dict(zip(prop_df.Player, prop_df.book))
|
677 |
over_dict = dict(zip(prop_df.Player, prop_df.Over))
|
678 |
under_dict = dict(zip(prop_df.Player, prop_df.Under))
|
679 |
+
trending_over_dict = dict(zip(prop_df.Player, prop_df['Trending Over']))
|
680 |
+
trending_under_dict = dict(zip(prop_df.Player, prop_df['Trending Under']))
|
681 |
|
682 |
player_df['book'] = player_df['Player'].map(book_dict)
|
683 |
player_df['Prop'] = player_df['Player'].map(prop_dict)
|
684 |
player_df['prop_type'] = player_df['Player'].map(prop_type_dict)
|
685 |
+
player_df['Trending Over'] = player_df['Player'].map(trending_over_dict)
|
686 |
+
player_df['Trending Under'] = player_df['Player'].map(trending_under_dict)
|
687 |
|
688 |
df = player_df.reset_index(drop=True)
|
689 |
|
|
|
742 |
players_only['Mean_Outcome'] = overall_file.mean(axis=1)
|
743 |
players_only['Book'] = players_only['Player'].map(book_dict)
|
744 |
players_only['Prop'] = players_only['Player'].map(prop_dict)
|
745 |
+
players_only['Trending Over'] = players_only['Player'].map(trending_over_dict)
|
746 |
+
players_only['Trending Under'] = players_only['Player'].map(trending_under_dict)
|
747 |
players_only['poisson_var'] = players_only.apply(calculate_poisson, axis=1)
|
748 |
players_only['10%'] = overall_file.quantile(0.1, axis=1)
|
749 |
players_only['90%'] = overall_file.quantile(0.9, axis=1)
|
750 |
players_only['Over'] = np_where(players_only['Prop'] <= 3, players_only['poisson_var'], prop_check[prop_check > 0].count(axis=1)/float(total_sims))
|
751 |
players_only['Imp Over'] = players_only['Player'].map(over_dict)
|
752 |
+
players_only['Over%'] = players_only[["Over", "Imp Over", "Trending Over"]].mean(axis=1)
|
753 |
players_only['Under'] = np_where(players_only['Prop'] <= 3, 1 - players_only['poisson_var'], prop_check[prop_check < 0].count(axis=1)/float(total_sims))
|
754 |
players_only['Imp Under'] = players_only['Player'].map(under_dict)
|
755 |
+
players_only['Under%'] = players_only[["Under", "Imp Under", "Trending Under"]].mean(axis=1)
|
756 |
players_only['Prop_avg'] = players_only['Prop'].mean() / 100
|
757 |
players_only['prop_threshold'] = .10
|
758 |
players_only = players_only[players_only['Mean_Outcome'] > 0]
|
|
|
767 |
players_only['Player'] = hold_file[['Player']]
|
768 |
players_only['Team'] = players_only['Player'].map(team_dict)
|
769 |
|
770 |
+
leg_outcomes = players_only[['Player', 'Team', 'Book', 'Prop Type', 'Prop', 'Mean_Outcome', 'Imp Over', 'Trending Over', 'Over%', 'Imp Under', 'Trending Under', 'Under%', 'Bet?', 'Edge']]
|
771 |
sim_all_hold = pd.concat([sim_all_hold, leg_outcomes], ignore_index=True)
|
772 |
|
773 |
final_outcomes = sim_all_hold
|