James McCool commited on
Commit
fb1703c
1 Parent(s): ba1b862

added poisson calc, reintroduced 3-pointers

Browse files
Files changed (1) hide show
  1. app.py +25 -12
app.py CHANGED
@@ -6,6 +6,7 @@ for name in dir():
6
  del globals()[name]
7
 
8
  import numpy as np
 
9
  import pandas as pd
10
  import streamlit as st
11
  import gspread
@@ -13,6 +14,7 @@ import plotly.express as px
13
  import pymongo
14
  import random
15
  import gc
 
16
  from datetime import datetime
17
 
18
  @st.cache_resource
@@ -67,6 +69,13 @@ all_sim_vars = ['NBA_GAME_PLAYER_POINTS', 'NBA_GAME_PLAYER_REBOUNDS', 'NBA_GAME_
67
  pick6_sim_vars = ['Points', 'Rebounds', 'Assists', 'Points + Assists + Rebounds', 'Points + Assists', 'Points + Rebounds', 'Assists + Rebounds']
68
  sim_all_hold = pd.DataFrame(columns=['Player', 'Team', 'Book', 'Prop Type', 'Prop', 'Mean_Outcome', 'Imp Over', 'Over%', 'Imp Under', 'Under%', 'Bet?', 'Edge'])
69
 
 
 
 
 
 
 
 
70
  def add_column(df):
71
  return_df = df
72
  return_df['2P'] = return_df["Minutes"] * return_df["FG2M"]
@@ -412,9 +421,10 @@ with tab5:
412
  key='prop_source',
413
  )
414
  if game_select_var == 'Aggregate':
415
- prop_type_var = st.selectbox('Select prop category', options = ['All Props', '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'])
 
416
  elif game_select_var == 'Pick6':
417
- prop_type_var = st.selectbox('Select prop category', options = ['All Props', 'Points', 'Rebounds', 'Assists', 'Points + Assists + Rebounds', 'Points + Assists', 'Points + Rebounds', 'Assists + Rebounds'])
418
 
419
  if st.button('Simulate Prop Category'):
420
  with col2:
@@ -423,10 +433,11 @@ with tab5:
423
  if prop_type_var == 'All Props':
424
  if game_select_var == 'Aggregate':
425
  prop_df_raw = prop_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
426
- 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']
 
427
  elif game_select_var == 'Pick6':
428
  prop_df_raw = pick_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
429
- sim_vars = ['Points', 'Rebounds', 'Assists', 'Points + Assists + Rebounds', 'Points + Assists', 'Points + Rebounds', 'Assists + Rebounds']
430
 
431
  player_df = player_stats.copy()
432
 
@@ -505,16 +516,17 @@ with tab5:
505
  prop_check = (overall_file - prop_file)
506
 
507
  players_only['Mean_Outcome'] = overall_file.mean(axis=1)
 
 
 
508
  players_only['10%'] = overall_file.quantile(0.1, axis=1)
509
  players_only['90%'] = overall_file.quantile(0.9, axis=1)
510
- players_only['Over'] = prop_check[prop_check > 0].count(axis=1)/float(total_sims)
511
  players_only['Imp Over'] = players_only['Player'].map(over_dict)
512
  players_only['Over%'] = players_only[["Over", "Imp Over"]].mean(axis=1)
513
- players_only['Under'] = prop_check[prop_check < 0].count(axis=1)/float(total_sims)
514
  players_only['Imp Under'] = players_only['Player'].map(under_dict)
515
  players_only['Under%'] = players_only[["Under", "Imp Under"]].mean(axis=1)
516
- players_only['Prop'] = players_only['Player'].map(prop_dict)
517
- players_only['Book'] = players_only['Player'].map(book_dict)
518
  players_only['Prop_avg'] = players_only['Prop'].mean() / 100
519
  players_only['prop_threshold'] = .10
520
  players_only = players_only[players_only['Mean_Outcome'] > 0]
@@ -650,16 +662,17 @@ with tab5:
650
  prop_check = (overall_file - prop_file)
651
 
652
  players_only['Mean_Outcome'] = overall_file.mean(axis=1)
 
 
 
653
  players_only['10%'] = overall_file.quantile(0.1, axis=1)
654
  players_only['90%'] = overall_file.quantile(0.9, axis=1)
655
- players_only['Over'] = prop_check[prop_check > 0].count(axis=1)/float(total_sims)
656
  players_only['Imp Over'] = players_only['Player'].map(over_dict)
657
  players_only['Over%'] = players_only[["Over", "Imp Over"]].mean(axis=1)
658
- players_only['Under'] = prop_check[prop_check < 0].count(axis=1)/float(total_sims)
659
  players_only['Imp Under'] = players_only['Player'].map(under_dict)
660
  players_only['Under%'] = players_only[["Under", "Imp Under"]].mean(axis=1)
661
- players_only['Book'] = players_only['Player'].map(book_dict)
662
- players_only['Prop'] = players_only['Player'].map(prop_dict)
663
  players_only['Prop_avg'] = players_only['Prop'].mean() / 100
664
  players_only['prop_threshold'] = .10
665
  players_only = players_only[players_only['Mean_Outcome'] > 0]
 
6
  del globals()[name]
7
 
8
  import numpy as np
9
+ from numpy import where as np_where
10
  import pandas as pd
11
  import streamlit as st
12
  import gspread
 
14
  import pymongo
15
  import random
16
  import gc
17
+ import scipy.stats as stats
18
  from datetime import datetime
19
 
20
  @st.cache_resource
 
69
  pick6_sim_vars = ['Points', 'Rebounds', 'Assists', 'Points + Assists + Rebounds', 'Points + Assists', 'Points + Rebounds', 'Assists + Rebounds']
70
  sim_all_hold = pd.DataFrame(columns=['Player', 'Team', 'Book', 'Prop Type', 'Prop', 'Mean_Outcome', 'Imp Over', 'Over%', 'Imp Under', 'Under%', 'Bet?', 'Edge'])
71
 
72
+ def calculate_poisson(row):
73
+ mean_val = row['Mean_Outcome']
74
+ threshold = row['Prop']
75
+ cdf_value = stats.poisson.cdf(threshold, mean_val)
76
+ probability = 1 - cdf_value
77
+ return probability
78
+
79
  def add_column(df):
80
  return_df = df
81
  return_df['2P'] = return_df["Minutes"] * return_df["FG2M"]
 
421
  key='prop_source',
422
  )
423
  if game_select_var == 'Aggregate':
424
+ prop_type_var = st.selectbox('Select prop category', options = ['All Props', 'NBA_GAME_PLAYER_POINTS', 'NBA_GAME_PLAYER_REBOUNDS', 'NBA_GAME_PLAYER_ASSISTS', 'NBA_GAME_PLAYER_POINTS_REBOUNDS_ASSISTS',
425
+ 'NBA_GAME_PLAYER_POINTS_REBOUNDS', 'NBA_GAME_PLAYER_POINTS_ASSISTS', 'NBA_GAME_PLAYER_REBOUNDS_ASSISTS', 'NBA_GAME_PLAYER_3_POINTERS_MADE'])
426
  elif game_select_var == 'Pick6':
427
+ prop_type_var = st.selectbox('Select prop category', options = ['All Props', 'Points', 'Rebounds', 'Assists', 'Points + Assists + Rebounds', 'Points + Assists', 'Points + Rebounds', 'Assists + Rebounds', '3-Pointers Made'])
428
 
429
  if st.button('Simulate Prop Category'):
430
  with col2:
 
433
  if prop_type_var == 'All Props':
434
  if game_select_var == 'Aggregate':
435
  prop_df_raw = prop_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
436
+ 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',
437
+ 'NBA_GAME_PLAYER_POINTS_ASSISTS', 'NBA_GAME_PLAYER_REBOUNDS_ASSISTS', 'NBA_GAME_PLAYER_3_POINTERS_MADE']
438
  elif game_select_var == 'Pick6':
439
  prop_df_raw = pick_frame[['Player', 'book', 'over_prop', 'over_line', 'under_line', 'prop_type']]
440
+ sim_vars = ['Points', 'Rebounds', 'Assists', 'Points + Assists + Rebounds', 'Points + Assists', 'Points + Rebounds', 'Assists + Rebounds', '3-Pointers Made']
441
 
442
  player_df = player_stats.copy()
443
 
 
516
  prop_check = (overall_file - prop_file)
517
 
518
  players_only['Mean_Outcome'] = overall_file.mean(axis=1)
519
+ players_only['Book'] = players_only['Player'].map(book_dict)
520
+ players_only['Prop'] = players_only['Player'].map(prop_dict)
521
+ players_only['poisson_var'] = players_only.apply(calculate_poisson, axis=1)
522
  players_only['10%'] = overall_file.quantile(0.1, axis=1)
523
  players_only['90%'] = overall_file.quantile(0.9, axis=1)
524
+ players_only['Over'] = np_where(overall_file['Prop'] <= 3, players_only['poisson_var'], prop_check[prop_check > 0].count(axis=1)/float(total_sims))
525
  players_only['Imp Over'] = players_only['Player'].map(over_dict)
526
  players_only['Over%'] = players_only[["Over", "Imp Over"]].mean(axis=1)
527
+ players_only['Under'] = np_where(overall_file['Prop'] <= 3, 1 - players_only['poisson_var'], prop_check[prop_check < 0].count(axis=1)/float(total_sims))
528
  players_only['Imp Under'] = players_only['Player'].map(under_dict)
529
  players_only['Under%'] = players_only[["Under", "Imp Under"]].mean(axis=1)
 
 
530
  players_only['Prop_avg'] = players_only['Prop'].mean() / 100
531
  players_only['prop_threshold'] = .10
532
  players_only = players_only[players_only['Mean_Outcome'] > 0]
 
662
  prop_check = (overall_file - prop_file)
663
 
664
  players_only['Mean_Outcome'] = overall_file.mean(axis=1)
665
+ players_only['Book'] = players_only['Player'].map(book_dict)
666
+ players_only['Prop'] = players_only['Player'].map(prop_dict)
667
+ players_only['poisson_var'] = players_only.apply(calculate_poisson, axis=1)
668
  players_only['10%'] = overall_file.quantile(0.1, axis=1)
669
  players_only['90%'] = overall_file.quantile(0.9, axis=1)
670
+ players_only['Over'] = np_where(overall_file['Prop'] <= 3, players_only['poisson_var'], prop_check[prop_check > 0].count(axis=1)/float(total_sims))
671
  players_only['Imp Over'] = players_only['Player'].map(over_dict)
672
  players_only['Over%'] = players_only[["Over", "Imp Over"]].mean(axis=1)
673
+ players_only['Under'] = np_where(overall_file['Prop'] <= 3, 1 - players_only['poisson_var'], prop_check[prop_check < 0].count(axis=1)/float(total_sims))
674
  players_only['Imp Under'] = players_only['Player'].map(under_dict)
675
  players_only['Under%'] = players_only[["Under", "Imp Under"]].mean(axis=1)
 
 
676
  players_only['Prop_avg'] = players_only['Prop'].mean() / 100
677
  players_only['prop_threshold'] = .10
678
  players_only = players_only[players_only['Mean_Outcome'] > 0]