James McCool commited on
Commit
d829d73
·
1 Parent(s): b1f6d22

Add showdown slate handling and dynamic database integration

Browse files

- Introduced new showdown selections for DraftKings and FanDuel.
- Implemented dynamic database collection retrieval for showdown seed frames.
- Updated functions to utilize translation dictionaries for slate names.
- Enhanced data loading and state management for showdown contest simulations.

src/sim_func_hold/showdown_functions.py CHANGED
@@ -5,14 +5,9 @@ from pymongo import MongoClient
5
  from database import db
6
 
7
  @st.cache_data(ttl = 599)
8
- def init_DK_SD_seed_frames(slate, split):
9
- if slate == 'Showdown #1':
10
- collection = db["DK_NFL_SD_seed_frame"]
11
- elif slate == 'Showdown #2':
12
- collection = db["DK_NFL_Secondary_SD_seed_frame"]
13
- elif slate == 'Showdown #3':
14
- collection = db["DK_NFL_Auxiliary_SD_seed_frame"]
15
-
16
  cursor = collection.find().limit(split)
17
 
18
  raw_display = pd.DataFrame(list(cursor))
@@ -22,14 +17,9 @@ def init_DK_SD_seed_frames(slate, split):
22
  return DK_seed
23
 
24
  @st.cache_data(ttl = 599)
25
- def init_FD_SD_seed_frames(slate, split):
26
- if slate == 'Showdown #1':
27
- collection = db[f"FD_NFL_SD_seed_frame"]
28
- elif slate == 'Showdown #2':
29
- collection = db[f"FD_NFL_Secondary_SD_seed_frame"]
30
- elif slate == 'Showdown #3':
31
- collection = db[f"FD_NFL_Auxiliary_SD_seed_frame"]
32
-
33
  cursor = collection.find().limit(split)
34
 
35
  raw_display = pd.DataFrame(list(cursor))
@@ -44,7 +34,6 @@ def init_SD_baselines(slate_var):
44
  cursor = collection.find()
45
 
46
  raw_display = pd.DataFrame(list(cursor))
47
- raw_display = raw_display[raw_display['slate'] == slate_var]
48
  raw_display = raw_display[raw_display['version'] == 'overall']
49
  raw_display = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
50
  'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_id', 'site']]
@@ -63,7 +52,6 @@ def init_SD_baselines(slate_var):
63
  cursor = collection.find()
64
 
65
  raw_display = pd.DataFrame(list(cursor))
66
- raw_display = raw_display[raw_display['slate'] == slate_var]
67
  raw_display = raw_display[raw_display['version'] == 'overall']
68
  raw_display = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
69
  'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_id', 'site']]
 
5
  from database import db
6
 
7
  @st.cache_data(ttl = 599)
8
+ def init_DK_SD_seed_frames(slate, split, translation_dict):
9
+ # Now dynamic
10
+ collection = db[translation_dict[slate]]
 
 
 
 
 
11
  cursor = collection.find().limit(split)
12
 
13
  raw_display = pd.DataFrame(list(cursor))
 
17
  return DK_seed
18
 
19
  @st.cache_data(ttl = 599)
20
+ def init_FD_SD_seed_frames(slate, split, translation_dict):
21
+ # Now dynamic
22
+ collection = db[translation_dict[slate]]
 
 
 
 
 
23
  cursor = collection.find().limit(split)
24
 
25
  raw_display = pd.DataFrame(list(cursor))
 
34
  cursor = collection.find()
35
 
36
  raw_display = pd.DataFrame(list(cursor))
 
37
  raw_display = raw_display[raw_display['version'] == 'overall']
38
  raw_display = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
39
  'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_id', 'site']]
 
52
  cursor = collection.find()
53
 
54
  raw_display = pd.DataFrame(list(cursor))
 
55
  raw_display = raw_display[raw_display['version'] == 'overall']
56
  raw_display = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
57
  'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_id', 'site']]
src/streamlit_app.py CHANGED
@@ -20,6 +20,27 @@ fd_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'sal
20
  dk_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
21
  fd_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  st.markdown("""
24
  <style>
25
  /* Tab styling */
@@ -57,16 +78,55 @@ st.markdown("""
57
 
58
  </style>""", unsafe_allow_html=True)
59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  if st.button("Load/Reset Data", key='reset2'):
61
  st.cache_data.clear()
62
  for key in st.session_state.keys():
63
  del st.session_state[key]
 
 
64
  DK_seed = init_DK_seed_frames('Main Slate', 10000)
65
- DK_sd_seed = init_DK_SD_seed_frames('Main Slate', 10000)
66
  FD_seed = init_FD_seed_frames('Main Slate', 10000)
67
- FD_sd_seed = init_FD_SD_seed_frames('Main Slate', 10000)
68
  dk_raw, fd_raw = init_baselines('Main Slate')
69
- dk_sd_raw, fd_sd_raw = init_SD_baselines('Main Slate')
70
  dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_ID))
71
  dk_sd_id_dict = dict(zip(dk_sd_raw.Player, dk_sd_raw.player_ID))
72
  fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_ID))
@@ -548,8 +608,8 @@ if selected_tab == "Regular Slate Contest Sims":
548
  )
549
 
550
  if selected_tab == "Showdown Contest Sims":
551
- dk_raw, fd_raw = init_SD_baselines('Showdown #1')
552
- raw_baselines = dk_raw
553
  column_names = dk_sd_columns
554
  with st.expander("Info and Filters"):
555
  site_data_col, slate_data_col, contest_size_col, contest_sharpness_col = st.columns([1, 1, 1, 1])
@@ -557,7 +617,7 @@ if selected_tab == "Showdown Contest Sims":
557
  sim_site_var2 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='sim_site_var2')
558
 
559
  with slate_data_col:
560
- sim_slate_var2 = st.radio("Which data are you loading?", ('Showdown #1', 'Showdown #2', 'Showdown #3'), key='sim_slate_var2')
561
 
562
  with contest_size_col:
563
  contest_var2 = st.selectbox("What contest size are you simulating?", ('Small', 'Medium', 'Large'), key='contest_var2')
@@ -586,14 +646,14 @@ if selected_tab == "Showdown Contest Sims":
586
 
587
  if 'sd_working_seed' not in st.session_state:
588
  if sim_site_var2 == 'Draftkings':
589
- st.session_state.sd_working_seed = init_DK_SD_seed_frames(sim_slate_var2, sharp_split)
590
- export_id_dict = dict(zip(dk_raw.Player, dk_raw.player_ID))
591
- raw_baselines = dk_raw
592
  column_names = dk_sd_columns
593
  elif sim_site_var2 == 'Fanduel':
594
- st.session_state.sd_working_seed = init_FD_SD_seed_frames(sim_slate_var2, sharp_split)
595
- export_id_dict = dict(zip(fd_raw.Player, fd_raw.player_ID))
596
- raw_baselines = fd_raw
597
  column_names = fd_sd_columns
598
  maps_dict = {
599
  'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
@@ -646,7 +706,7 @@ if selected_tab == "Showdown Contest Sims":
646
  'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev)),
647
  'cpt_STDev_map':dict(zip(raw_baselines.Player,raw_baselines['CPT_STDev']))
648
  }
649
- Sim_Winners = sim_SD_contest(1000, st.session_state.working_seed, maps_dict, Contest_Size)
650
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
651
 
652
  #st.table(Sim_Winner_Frame)
@@ -677,7 +737,7 @@ if selected_tab == "Showdown Contest Sims":
677
  freq_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:6].values, return_counts=True)),
678
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
679
  elif sim_site_var2 == 'Fanduel':
680
- freq_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:5].values, return_counts=True)),
681
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
682
  freq_working['Freq'] = freq_working['Freq'].astype(int)
683
  freq_working['Position'] = freq_working['Player'].map(maps_dict['Pos_map'])
 
20
  dk_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
21
  fd_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
22
 
23
+ showdown_selections = ['Showdown #1', 'Showdown #2', 'Showdown #3', 'Showdown #4', 'Showdown #5', 'Showdown #6', 'Showdown #7', 'Showdown #8', 'Showdown #9', 'Showdown #10', 'Showdown #11', 'Showdown #12', 'Showdown #13', 'Showdown #14', 'Showdown #15']
24
+ dk_db_showdown_selections = ['DK_NFL_SD_seed_frame_Showdown #1', 'DK_NFL_SD_seed_frame_Showdown #2', 'DK_NFL_SD_seed_frame_Showdown #3', 'DK_NFL_SD_seed_frame_Showdown #4', 'DK_NFL_SD_seed_frame_Showdown #5', 'DK_NFL_SD_seed_frame_Showdown #6',
25
+ 'DK_NFL_SD_seed_frame_Showdown #7', 'DK_NFL_SD_seed_frame_Showdown #8', 'DK_NFL_SD_seed_frame_Showdown #9', 'DK_NFL_SD_seed_frame_Showdown #10', 'DK_NFL_SD_seed_frame_Showdown #11', 'DK_NFL_SD_seed_frame_Showdown #12', 'DK_NFL_SD_seed_frame_Showdown #13',
26
+ 'DK_NFL_SD_seed_frame_Showdown #14', 'DK_NFL_SD_seed_frame_Showdown #15']
27
+ fd_db_showdown_selections = ['FD_NFL_SD_seed_frame_Showdown #1', 'FD_NFL_SD_seed_frame_Showdown #2', 'FD_NFL_SD_seed_frame_Showdown #3', 'FD_NFL_SD_seed_frame_Showdown #4', 'FD_NFL_SD_seed_frame_Showdown #5', 'FD_NFL_SD_seed_frame_Showdown #6',
28
+ 'FD_NFL_SD_seed_frame_Showdown #7', 'FD_NFL_SD_seed_frame_Showdown #8', 'FD_NFL_SD_seed_frame_Showdown #9', 'FD_NFL_SD_seed_frame_Showdown #10', 'FD_NFL_SD_seed_frame_Showdown #11', 'FD_NFL_SD_seed_frame_Showdown #12', 'FD_NFL_SD_seed_frame_Showdown #13',
29
+ 'FD_NFL_SD_seed_frame_Showdown #14', 'FD_NFL_SD_seed_frame_Showdown #15']
30
+
31
+ dk_showdown_db_translation = dict(zip(showdown_selections, dk_db_showdown_selections))
32
+ fd_showdown_db_translation = dict(zip(showdown_selections, fd_db_showdown_selections))
33
+
34
+ # Probably should have done this in a dictionary to start with
35
+ wrong_team_names = ['Denver Broncos', 'Washington Commanders', 'Cincinnati Bengals', 'Arizona Cardinals', 'Los Angeles Rams', 'Pittsburgh Steelers',
36
+ 'Jacksonville Jaguars', 'New England Patriots', 'Tampa Bay Buccaneers', 'San Francisco 49ers', 'Green Bay Packers', 'New York Jets',
37
+ 'Indianapolis Colts', 'Miami Dolphins', 'Detroit Lions', 'Las Vegas Raiders', 'Atlanta Falcons', 'Seattle Seahawks', 'Houston Texans',
38
+ 'New Orleans Saints', 'Carolina Panthers', 'New York Giants', 'Cleveland Browns', 'Tennessee Titans', 'Philadelphia Eagles', 'Dallas Cowboys',
39
+ 'Kansas City Chiefs', 'Los Angeles Chargers', 'Baltimore Ravens', 'Buffalo Bills', 'Minnesota Vikings', 'Chicago Bears']
40
+ right_name_teams = ['Broncos', 'Commanders', 'Bengals', 'Cardinals', 'Rams', 'Steelers', 'Jaguars', 'Patriots', 'Buccaneers', '49ers', 'Packers',
41
+ 'Jets', 'Colts', 'Dolphins', 'Lions', 'Raiders', 'Falcons', 'Seahawks', 'Texans', 'Saints', 'Panthers', 'Giants', 'Browns', 'Titans', 'Eagles', 'Cowboys',
42
+ 'Chiefs', 'Chargers', 'Ravens', 'Bills', 'Vikings', 'Bears']
43
+
44
  st.markdown("""
45
  <style>
46
  /* Tab styling */
 
78
 
79
  </style>""", unsafe_allow_html=True)
80
 
81
+ @st.cache_resource(ttl=60)
82
+ def define_dk_showdown_slates():
83
+ collection = db["DK_SD_NFL_ROO"]
84
+ cursor = collection.find()
85
+ raw_display = pd.DataFrame(list(cursor))
86
+ unique_slates = raw_display['slate'].unique()
87
+
88
+ slate_names = []
89
+
90
+ for slate in unique_slates:
91
+ slate_data = raw_display[raw_display['slate'] == slate]
92
+ slate_name = slate_data.iloc[0]['Team'] + ' vs. ' + slate_data.iloc[0]['Opp']
93
+ slate_names.append(slate_name)
94
+
95
+ slate_name_lookup = dict(zip(slate_names, unique_slates))
96
+ return slate_names, slate_name_lookup
97
+
98
+ @st.cache_resource(ttl=60)
99
+ def define_fd_showdown_slates():
100
+ collection = db["FD_SD_NFL_ROO"]
101
+ cursor = collection.find()
102
+ raw_display = pd.DataFrame(list(cursor))
103
+ unique_slates = raw_display['slate'].unique()
104
+
105
+ slate_names = []
106
+
107
+ for slate in unique_slates:
108
+ slate_data = raw_display[raw_display['slate'] == slate]
109
+ slate_name = slate_data.iloc[0]['Team'] + ' vs. ' + slate_data.iloc[0]['Opp']
110
+ slate_names.append(slate_name)
111
+
112
+ slate_name_lookup = dict(zip(slate_names, unique_slates))
113
+ return slate_names, slate_name_lookup
114
+
115
+ slate_names_dk, slate_name_lookup_dk = define_dk_showdown_slates()
116
+ slate_names_fd, slate_name_lookup_fd = define_fd_showdown_slates()
117
+
118
  if st.button("Load/Reset Data", key='reset2'):
119
  st.cache_data.clear()
120
  for key in st.session_state.keys():
121
  del st.session_state[key]
122
+ slate_names_dk, slate_name_lookup_dk = define_dk_showdown_slates()
123
+ slate_names_fd, slate_name_lookup_fd = define_fd_showdown_slates()
124
  DK_seed = init_DK_seed_frames('Main Slate', 10000)
125
+ DK_sd_seed = init_DK_SD_seed_frames("Showdown #1", 10000, dk_showdown_db_translation)
126
  FD_seed = init_FD_seed_frames('Main Slate', 10000)
127
+ FD_sd_seed = init_FD_SD_seed_frames("Showdown #1", 10000, fd_showdown_db_translation)
128
  dk_raw, fd_raw = init_baselines('Main Slate')
129
+ dk_sd_raw, fd_sd_raw = init_SD_baselines('Showdown #1')
130
  dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_ID))
131
  dk_sd_id_dict = dict(zip(dk_sd_raw.Player, dk_sd_raw.player_ID))
132
  fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_ID))
 
608
  )
609
 
610
  if selected_tab == "Showdown Contest Sims":
611
+ dk_sd_raw, fd_sd_raw = init_SD_baselines('Showdown #1')
612
+ raw_baselines = dk_sd_raw
613
  column_names = dk_sd_columns
614
  with st.expander("Info and Filters"):
615
  site_data_col, slate_data_col, contest_size_col, contest_sharpness_col = st.columns([1, 1, 1, 1])
 
617
  sim_site_var2 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='sim_site_var2')
618
 
619
  with slate_data_col:
620
+ sim_slate_var2 = st.radio("Which data are you loading?", slate_names_dk if sim_site_var2 == 'Draftkings' else slate_names_fd, key='sim_slate_var2')
621
 
622
  with contest_size_col:
623
  contest_var2 = st.selectbox("What contest size are you simulating?", ('Small', 'Medium', 'Large'), key='contest_var2')
 
646
 
647
  if 'sd_working_seed' not in st.session_state:
648
  if sim_site_var2 == 'Draftkings':
649
+ st.session_state.sd_working_seed = init_DK_SD_seed_frames(slate_name_lookup_dk[sim_slate_var2], sharp_split, dk_showdown_db_translation)
650
+ export_id_dict = dict(zip(dk_sd_raw.Player, dk_sd_raw.player_ID))
651
+ raw_baselines = dk_sd_raw
652
  column_names = dk_sd_columns
653
  elif sim_site_var2 == 'Fanduel':
654
+ st.session_state.sd_working_seed = init_FD_SD_seed_frames(slate_name_lookup_fd[sim_slate_var2], sharp_split, fd_showdown_db_translation)
655
+ export_id_dict = dict(zip(fd_sd_raw.Player, fd_sd_raw.player_ID))
656
+ raw_baselines = fd_sd_raw
657
  column_names = fd_sd_columns
658
  maps_dict = {
659
  'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
 
706
  'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev)),
707
  'cpt_STDev_map':dict(zip(raw_baselines.Player,raw_baselines['CPT_STDev']))
708
  }
709
+ Sim_Winners = sim_SD_contest(1000, st.session_state.sd_working_seed, maps_dict, Contest_Size)
710
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
711
 
712
  #st.table(Sim_Winner_Frame)
 
737
  freq_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:6].values, return_counts=True)),
738
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
739
  elif sim_site_var2 == 'Fanduel':
740
+ freq_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:6].values, return_counts=True)),
741
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
742
  freq_working['Freq'] = freq_working['Freq'].astype(int)
743
  freq_working['Position'] = freq_working['Player'].map(maps_dict['Pos_map'])