James McCool commited on
Commit
6aa2078
·
1 Parent(s): f7a9234

restrucuring to NBA

Browse files
src/database.py CHANGED
@@ -8,7 +8,7 @@ def init_conn():
8
  if not uri:
9
  uri = st.secrets['mongo_uri']
10
  client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000)
11
- db = client["NFL_Database"]
12
  return db
13
 
14
  # Initialize the database connection
 
8
  if not uri:
9
  uri = st.secrets['mongo_uri']
10
  client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000)
11
+ db = client["NBA_Database"]
12
  return db
13
 
14
  # Initialize the database connection
src/sim_func_hold/regular_functions.py CHANGED
@@ -30,8 +30,8 @@ def init_DK_seed_frames(slate_var, sharp_split):
30
  cursor = collection.find().limit(sharp_split)
31
 
32
  raw_display = pd.DataFrame(list(cursor))
33
- raw_display = raw_display[['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
34
- dict_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
35
  for col in dict_columns:
36
  raw_display[col] = raw_display[col].map(names_dict)
37
  DK_seed = raw_display.to_numpy()
@@ -39,7 +39,7 @@ def init_DK_seed_frames(slate_var, sharp_split):
39
  return DK_seed
40
 
41
  @st.cache_data(ttl = 599)
42
- def init_FD_seed_frames(slate_var, sharp_split):
43
 
44
  if slate_var == 'Main Slate':
45
  collection = db['FD_NFL_name_map']
@@ -64,8 +64,8 @@ def init_FD_seed_frames(slate_var, sharp_split):
64
  cursor = collection.find().limit(sharp_split)
65
 
66
  raw_display = pd.DataFrame(list(cursor))
67
- raw_display = raw_display[['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
68
- dict_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
69
  for col in dict_columns:
70
  raw_display[col] = raw_display[col].map(names_dict)
71
  FD_seed = raw_display.to_numpy()
@@ -74,24 +74,20 @@ def init_FD_seed_frames(slate_var, sharp_split):
74
 
75
  @st.cache_data(ttl = 599)
76
  def init_baselines(slate_var):
77
- collection = db["DK_NFL_ROO"]
78
  cursor = collection.find()
79
 
80
  raw_display = pd.DataFrame(list(cursor))
81
  raw_display = raw_display[raw_display['slate'] == slate_var]
82
  raw_display = raw_display[raw_display['version'] == 'overall']
83
- dk_raw = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
84
- 'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_ID', 'site']]
 
85
  dk_raw['STDev'] = (dk_raw['Ceiling'] - dk_raw['Floor']) / 4
86
 
87
- collection = db["FD_NFL_ROO"]
88
- cursor = collection.find()
89
-
90
- raw_display = pd.DataFrame(list(cursor))
91
- raw_display = raw_display[raw_display['slate'] == slate_var]
92
- raw_display = raw_display[raw_display['version'] == 'overall']
93
- fd_raw = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
94
- 'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_ID', 'site']]
95
  fd_raw['STDev'] = (fd_raw['Ceiling'] - fd_raw['Floor']) / 4
96
 
97
  return dk_raw, fd_raw
@@ -103,7 +99,7 @@ def convert_df(array):
103
 
104
  @st.cache_data
105
  def calculate_DK_value_frequencies(np_array):
106
- unique, counts = np.unique(np_array[:, :9], return_counts=True)
107
  frequencies = counts / len(np_array) # Normalize by the number of rows
108
  combined_array = np.column_stack((unique, frequencies))
109
  return combined_array
@@ -116,7 +112,7 @@ def calculate_FD_value_frequencies(np_array):
116
  return combined_array
117
 
118
  @st.cache_data
119
- def sim_contest(Sim_size, seed_frame, maps_dict, Contest_Size):
120
  SimVar = 1
121
  Sim_Winners = []
122
  fp_array = seed_frame.copy()
@@ -139,7 +135,10 @@ def sim_contest(Sim_size, seed_frame, maps_dict, Contest_Size):
139
 
140
  sample_arrays = sample_arrays1
141
 
142
- final_array = sample_arrays[sample_arrays[:, 10].argsort()[::-1]]
 
 
 
143
  best_lineup = final_array[final_array[:, -1].argsort(kind='stable')[::-1][:1]]
144
  Sim_Winners.append(best_lineup)
145
  SimVar += 1
 
30
  cursor = collection.find().limit(sharp_split)
31
 
32
  raw_display = pd.DataFrame(list(cursor))
33
+ raw_display = raw_display[['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
34
+ dict_columns = ['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX']
35
  for col in dict_columns:
36
  raw_display[col] = raw_display[col].map(names_dict)
37
  DK_seed = raw_display.to_numpy()
 
39
  return DK_seed
40
 
41
  @st.cache_data(ttl = 599)
42
+ def init_FD_seed_frames(slate_var, sharp_split):
43
 
44
  if slate_var == 'Main Slate':
45
  collection = db['FD_NFL_name_map']
 
64
  cursor = collection.find().limit(sharp_split)
65
 
66
  raw_display = pd.DataFrame(list(cursor))
67
+ raw_display = raw_display[['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
68
+ dict_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C']
69
  for col in dict_columns:
70
  raw_display[col] = raw_display[col].map(names_dict)
71
  FD_seed = raw_display.to_numpy()
 
74
 
75
  @st.cache_data(ttl = 599)
76
  def init_baselines(slate_var):
77
+ collection = db["Player_Range_Of_Outcomes"]
78
  cursor = collection.find()
79
 
80
  raw_display = pd.DataFrame(list(cursor))
81
  raw_display = raw_display[raw_display['slate'] == slate_var]
82
  raw_display = raw_display[raw_display['version'] == 'overall']
83
+ dk_raw = raw_display[raw_display['site'] == 'Draftkings']
84
+ dk_raw = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%',
85
+ 'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_ID', 'site']]
86
  dk_raw['STDev'] = (dk_raw['Ceiling'] - dk_raw['Floor']) / 4
87
 
88
+ fd_raw = raw_display[raw_display['site'] == 'FanDuel']
89
+ fd_raw = fd_raw[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%',
90
+ 'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_ID', 'site']]
 
 
 
 
 
91
  fd_raw['STDev'] = (fd_raw['Ceiling'] - fd_raw['Floor']) / 4
92
 
93
  return dk_raw, fd_raw
 
99
 
100
  @st.cache_data
101
  def calculate_DK_value_frequencies(np_array):
102
+ unique, counts = np.unique(np_array[:, :8], return_counts=True)
103
  frequencies = counts / len(np_array) # Normalize by the number of rows
104
  combined_array = np.column_stack((unique, frequencies))
105
  return combined_array
 
112
  return combined_array
113
 
114
  @st.cache_data
115
+ def sim_contest(site_var, Sim_size, seed_frame, maps_dict, Contest_Size):
116
  SimVar = 1
117
  Sim_Winners = []
118
  fp_array = seed_frame.copy()
 
135
 
136
  sample_arrays = sample_arrays1
137
 
138
+ if site_var == 'Draftkings':
139
+ final_array = sample_arrays[sample_arrays[:, 9].argsort()[::-1]]
140
+ elif site_var == 'FanDuel':
141
+ final_array = sample_arrays[sample_arrays[:, 10].argsort()[::-1]]
142
  best_lineup = final_array[final_array[:, -1].argsort(kind='stable')[::-1][:1]]
143
  Sim_Winners.append(best_lineup)
144
  SimVar += 1
src/sim_func_hold/showdown_functions.py CHANGED
@@ -30,7 +30,7 @@ def init_FD_SD_seed_frames(slate, split, translation_dict):
30
 
31
  @st.cache_data(ttl = 599)
32
  def init_SD_baselines(slate_var):
33
- collection = db['DK_SD_NFL_ROO']
34
  cursor = collection.find()
35
 
36
  raw_display = pd.DataFrame(list(cursor))
@@ -46,25 +46,10 @@ def init_SD_baselines(slate_var):
46
  raw_display['STDev'] = raw_display['Median'] / 4
47
  raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4
48
 
49
- dk_raw = raw_display.dropna(subset=['Median'])
50
-
51
- collection = db['FD_SD_NFL_ROO']
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']]
58
- raw_display = raw_display.rename(columns={'player_id': 'player_ID'})
59
- raw_display['Small_Field_Own'] = raw_display['Large_Field_Own']
60
- raw_display['small_CPT_Own_raw'] = (raw_display['Small_Field_Own'] / 2) * ((100 - (100-raw_display['Small_Field_Own']))/100)
61
- small_cpt_own_var = 300 / raw_display['small_CPT_Own_raw'].sum()
62
- raw_display['small_CPT_Own'] = raw_display['small_CPT_Own_raw'] * small_cpt_own_var
63
- raw_display['cpt_Median'] = raw_display['Median'] * 1.25
64
- raw_display['STDev'] = raw_display['Median'] / 4
65
- raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4
66
-
67
- fd_raw = raw_display.dropna(subset=['Median'])
68
 
69
  return dk_raw, fd_raw
70
 
 
30
 
31
  @st.cache_data(ttl = 599)
32
  def init_SD_baselines(slate_var):
33
+ collection = db['Player_SD_Range_Of_Outcomes']
34
  cursor = collection.find()
35
 
36
  raw_display = pd.DataFrame(list(cursor))
 
46
  raw_display['STDev'] = raw_display['Median'] / 4
47
  raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4
48
 
49
+ raw_display = raw_display.dropna(subset=['Median'])
 
 
 
50
 
51
+ dk_raw = raw_display[raw_display['site'] == 'Draftkings']
52
+ fd_raw = raw_display[raw_display['site'] == 'FanDuel']
 
 
 
 
 
 
 
 
 
 
 
 
53
 
54
  return dk_raw, fd_raw
55
 
src/streamlit_app.py CHANGED
@@ -15,18 +15,18 @@ from sim_func_hold.showdown_functions import *
15
 
16
  percentages_format = {'Exposure': '{:.2%}'}
17
  freq_format = {'Exposure': '{:.2%}', 'Proj Own': '{:.2%}', 'Edge': '{:.2%}'}
18
- dk_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
19
- fd_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
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))
@@ -80,9 +80,10 @@ st.markdown("""
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 = []
@@ -97,9 +98,10 @@ def define_dk_showdown_slates():
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 = []
@@ -268,101 +270,116 @@ if selected_tab == "Regular Slate Contest Sims":
268
  st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()
269
 
270
  if sim_site_var1 == 'Draftkings':
271
- freq_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:9].values, return_counts=True)),
272
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
273
  elif sim_site_var1 == 'Fanduel':
274
- freq_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:9].values, return_counts=True)),
275
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
276
- freq_working['Freq'] = freq_working['Freq'].astype(int)
277
- freq_working['Position'] = freq_working['Player'].map(st.session_state.maps_dict['Pos_map'])
278
- freq_working['Salary'] = freq_working['Player'].map(st.session_state.maps_dict['Salary_map'])
279
- freq_working['Proj Own'] = freq_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
280
- freq_working['Exposure'] = freq_working['Freq']/(1000)
281
- freq_working['Edge'] = freq_working['Exposure'] - freq_working['Proj Own']
282
- freq_working['Team'] = freq_working['Player'].map(st.session_state.maps_dict['Team_map'])
283
- st.session_state.player_freq = freq_working.copy()
284
-
285
  if sim_site_var1 == 'Draftkings':
286
- qb_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:1].values, return_counts=True)),
287
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
288
  elif sim_site_var1 == 'Fanduel':
289
- qb_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:1].values, return_counts=True)),
290
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
291
- qb_working['Freq'] = qb_working['Freq'].astype(int)
292
- qb_working['Position'] = qb_working['Player'].map(st.session_state.maps_dict['Pos_map'])
293
- qb_working['Salary'] = qb_working['Player'].map(st.session_state.maps_dict['Salary_map'])
294
- qb_working['Proj Own'] = qb_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
295
- qb_working['Exposure'] = qb_working['Freq']/(1000)
296
- qb_working['Edge'] = qb_working['Exposure'] - qb_working['Proj Own']
297
- qb_working['Team'] = qb_working['Player'].map(st.session_state.maps_dict['Team_map'])
298
- st.session_state.qb_freq = qb_working.copy()
299
 
300
  if sim_site_var1 == 'Draftkings':
301
- rbwrte_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,1:7].values, return_counts=True)),
302
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
303
  elif sim_site_var1 == 'Fanduel':
304
- rbwrte_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,1:7].values, return_counts=True)),
305
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
306
- rbwrte_working['Freq'] = rbwrte_working['Freq'].astype(int)
307
- rbwrte_working['Position'] = rbwrte_working['Player'].map(st.session_state.maps_dict['Pos_map'])
308
- rbwrte_working['Salary'] = rbwrte_working['Player'].map(st.session_state.maps_dict['Salary_map'])
309
- rbwrte_working['Proj Own'] = rbwrte_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
310
- rbwrte_working['Exposure'] = rbwrte_working['Freq']/(1000)
311
- rbwrte_working['Edge'] = rbwrte_working['Exposure'] - rbwrte_working['Proj Own']
312
- rbwrte_working['Team'] = rbwrte_working['Player'].map(st.session_state.maps_dict['Team_map'])
313
- st.session_state.rbwrte_freq = rbwrte_working.copy()
314
 
315
  if sim_site_var1 == 'Draftkings':
316
- rb_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,1:3].values, return_counts=True)),
317
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
318
  elif sim_site_var1 == 'Fanduel':
319
- rb_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,1:3].values, return_counts=True)),
320
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
321
- rb_working['Freq'] = rb_working['Freq'].astype(int)
322
- rb_working['Position'] = rb_working['Player'].map(st.session_state.maps_dict['Pos_map'])
323
- rb_working['Salary'] = rb_working['Player'].map(st.session_state.maps_dict['Salary_map'])
324
- rb_working['Proj Own'] = rb_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
325
- rb_working['Exposure'] = rb_working['Freq']/(1000)
326
- rb_working['Edge'] = rb_working['Exposure'] - rb_working['Proj Own']
327
- rb_working['Team'] = rb_working['Player'].map(st.session_state.maps_dict['Team_map'])
328
- st.session_state.rb_freq = rb_working.copy()
329
 
330
  if sim_site_var1 == 'Draftkings':
331
- wr_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,3:6].values, return_counts=True)),
332
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
333
  elif sim_site_var1 == 'Fanduel':
334
- wr_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,3:6].values, return_counts=True)),
335
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
336
- wr_working['Freq'] = wr_working['Freq'].astype(int)
337
- wr_working['Position'] = wr_working['Player'].map(st.session_state.maps_dict['Pos_map'])
338
- wr_working['Salary'] = wr_working['Player'].map(st.session_state.maps_dict['Salary_map'])
339
- wr_working['Proj Own'] = wr_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
340
- wr_working['Exposure'] = wr_working['Freq']/(1000)
341
- wr_working['Edge'] = wr_working['Exposure'] - wr_working['Proj Own']
342
- wr_working['Team'] = wr_working['Player'].map(st.session_state.maps_dict['Team_map'])
343
- st.session_state.wr_freq = wr_working.copy()
344
 
345
  if sim_site_var1 == 'Draftkings':
346
- te_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,6:7].values, return_counts=True)),
347
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
348
  elif sim_site_var1 == 'Fanduel':
349
- te_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,6:7].values, return_counts=True)),
350
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
351
- te_working['Freq'] = te_working['Freq'].astype(int)
352
- te_working['Position'] = te_working['Player'].map(st.session_state.maps_dict['Pos_map'])
353
- te_working['Salary'] = te_working['Player'].map(st.session_state.maps_dict['Salary_map'])
354
- te_working['Proj Own'] = te_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
355
- te_working['Exposure'] = te_working['Freq']/(1000)
356
- te_working['Edge'] = te_working['Exposure'] - te_working['Proj Own']
357
- te_working['Team'] = te_working['Player'].map(st.session_state.maps_dict['Team_map'])
358
- st.session_state.te_freq = te_working.copy()
359
 
360
  if sim_site_var1 == 'Draftkings':
361
- flex_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,7:8].values, return_counts=True)),
362
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
363
  elif sim_site_var1 == 'Fanduel':
 
 
 
 
 
 
 
 
 
 
 
 
364
  flex_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,7:8].values, return_counts=True)),
365
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
 
 
 
366
  flex_working['Freq'] = flex_working['Freq'].astype(int)
367
  flex_working['Position'] = flex_working['Player'].map(st.session_state.maps_dict['Pos_map'])
368
  flex_working['Salary'] = flex_working['Player'].map(st.session_state.maps_dict['Salary_map'])
@@ -371,24 +388,9 @@ if selected_tab == "Regular Slate Contest Sims":
371
  flex_working['Edge'] = flex_working['Exposure'] - flex_working['Proj Own']
372
  flex_working['Team'] = flex_working['Player'].map(st.session_state.maps_dict['Team_map'])
373
  st.session_state.flex_freq = flex_working.copy()
374
-
375
- if sim_site_var1 == 'Draftkings':
376
- dst_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,8:9].values, return_counts=True)),
377
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
378
- elif sim_site_var1 == 'Fanduel':
379
- dst_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,8:9].values, return_counts=True)),
380
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
381
- dst_working['Freq'] = dst_working['Freq'].astype(int)
382
- dst_working['Position'] = dst_working['Player'].map(st.session_state.maps_dict['Pos_map'])
383
- dst_working['Salary'] = dst_working['Player'].map(st.session_state.maps_dict['Salary_map'])
384
- dst_working['Proj Own'] = dst_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
385
- dst_working['Exposure'] = dst_working['Freq']/(1000)
386
- dst_working['Edge'] = dst_working['Exposure'] - dst_working['Proj Own']
387
- dst_working['Team'] = dst_working['Player'].map(st.session_state.maps_dict['Team_map'])
388
- st.session_state.dst_freq = dst_working.copy()
389
 
390
  if sim_site_var1 == 'Draftkings':
391
- team_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,11:12].values, return_counts=True)),
392
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
393
  elif sim_site_var1 == 'Fanduel':
394
  team_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,11:12].values, return_counts=True)),
@@ -397,215 +399,112 @@ if selected_tab == "Regular Slate Contest Sims":
397
  team_working['Exposure'] = team_working['Freq']/(1000)
398
  st.session_state.team_freq = team_working.copy()
399
 
400
- with st.container():
401
- if st.button("Reset Sim", key='reset_sim'):
402
- for key in st.session_state.keys():
403
- del st.session_state[key]
404
- if 'player_freq' in st.session_state:
405
- player_split_var2 = st.radio("Are you wanting to isolate any lineups with specific players?", ('Full Players', 'Specific Players'), key='player_split_var2')
406
- if player_split_var2 == 'Specific Players':
407
- find_var2 = st.multiselect('Which players must be included in the lineups?', options = st.session_state.player_freq['Player'].unique())
408
- elif player_split_var2 == 'Full Players':
409
- find_var2 = st.session_state.player_freq.Player.values.tolist()
410
-
411
- if player_split_var2 == 'Specific Players':
412
- st.session_state.Sim_Winner_Display = st.session_state.Sim_Winner_Frame[np.equal.outer(st.session_state.Sim_Winner_Frame.to_numpy(), find_var2).any(axis=1).all(axis=1)]
413
- if player_split_var2 == 'Full Players':
414
- st.session_state.Sim_Winner_Display = st.session_state.Sim_Winner_Frame
415
- if 'Sim_Winner_Display' in st.session_state:
416
- st.dataframe(st.session_state.Sim_Winner_Display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True)
417
- if 'Sim_Winner_Export' in st.session_state:
418
- st.download_button(
419
- label="Export Full Frame",
420
- data=st.session_state.Sim_Winner_Export.to_csv().encode('utf-8'),
421
- file_name='MLB_consim_export.csv',
422
- mime='text/csv',
423
- )
424
- tab1, tab2 = st.tabs(['Winning Frame Statistics', 'Flex Exposure Statistics'])
425
-
426
- with tab1:
427
- if 'Sim_Winner_Display' in st.session_state:
428
- # Create a new dataframe with summary statistics
429
- summary_df = pd.DataFrame({
430
- 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
431
- 'Salary': [
432
- st.session_state.Sim_Winner_Display['salary'].min(),
433
- st.session_state.Sim_Winner_Display['salary'].mean(),
434
- st.session_state.Sim_Winner_Display['salary'].max(),
435
- st.session_state.Sim_Winner_Display['salary'].std()
436
- ],
437
- 'Proj': [
438
- st.session_state.Sim_Winner_Display['proj'].min(),
439
- st.session_state.Sim_Winner_Display['proj'].mean(),
440
- st.session_state.Sim_Winner_Display['proj'].max(),
441
- st.session_state.Sim_Winner_Display['proj'].std()
442
- ],
443
- 'Own': [
444
- st.session_state.Sim_Winner_Display['Own'].min(),
445
- st.session_state.Sim_Winner_Display['Own'].mean(),
446
- st.session_state.Sim_Winner_Display['Own'].max(),
447
- st.session_state.Sim_Winner_Display['Own'].std()
448
- ],
449
- 'Fantasy': [
450
- st.session_state.Sim_Winner_Display['Fantasy'].min(),
451
- st.session_state.Sim_Winner_Display['Fantasy'].mean(),
452
- st.session_state.Sim_Winner_Display['Fantasy'].max(),
453
- st.session_state.Sim_Winner_Display['Fantasy'].std()
454
- ],
455
- 'GPP_Proj': [
456
- st.session_state.Sim_Winner_Display['GPP_Proj'].min(),
457
- st.session_state.Sim_Winner_Display['GPP_Proj'].mean(),
458
- st.session_state.Sim_Winner_Display['GPP_Proj'].max(),
459
- st.session_state.Sim_Winner_Display['GPP_Proj'].std()
460
- ]
461
- })
462
-
463
- # Set the index of the summary dataframe as the "Metric" column
464
- summary_df = summary_df.set_index('Metric')
465
-
466
- # Display the summary dataframe
467
- st.subheader("Winning Frame Statistics")
468
- st.dataframe(summary_df.style.format({
469
- 'Salary': '{:.2f}',
470
- 'Proj': '{:.2f}',
471
- 'Fantasy': '{:.2f}',
472
- 'GPP_Proj': '{:.2f}'
473
- }).background_gradient(cmap='RdYlGn', axis=0, subset=['Salary', 'Proj', 'Own', 'Fantasy', 'GPP_Proj']), use_container_width=True)
474
-
475
- with tab2:
476
- if 'Sim_Winner_Display' in st.session_state:
477
- # Apply position mapping to FLEX column
478
- flex_positions = st.session_state.freq_copy['FLEX'].map(st.session_state.maps_dict['Pos_map'])
479
-
480
- # Count occurrences of each position in FLEX
481
- flex_counts = flex_positions.value_counts()
482
-
483
- # Calculate average statistics for each FLEX position
484
- flex_stats = st.session_state.freq_copy.groupby(flex_positions).agg({
485
- 'proj': 'mean',
486
- 'Own': 'mean',
487
- 'Fantasy': 'mean',
488
- 'GPP_Proj': 'mean'
489
- })
490
-
491
- # Combine counts and average statistics
492
- flex_summary = pd.concat([flex_counts, flex_stats], axis=1)
493
- flex_summary.columns = ['Count', 'Avg Proj', 'Avg Own', 'Avg Fantasy', 'Avg GPP_Proj']
494
- flex_summary = flex_summary.reset_index()
495
- flex_summary.columns = ['Position', 'Count', 'Avg Proj', 'Avg Own', 'Avg Fantasy', 'Avg GPP_Proj']
496
-
497
- # Display the summary dataframe
498
- st.subheader("FLEX Position Statistics")
499
- st.dataframe(flex_summary.style.format({
500
- 'Count': '{:.0f}',
501
- 'Avg Proj': '{:.2f}',
502
- 'Avg Fantasy': '{:.2f}',
503
- 'Avg GPP_Proj': '{:.2f}'
504
- }).background_gradient(cmap='RdYlGn', axis=0, subset=['Count', 'Avg Proj', 'Avg Own', 'Avg Fantasy', 'Avg GPP_Proj']), use_container_width=True)
505
-
506
- else:
507
- st.write("Simulation data or position mapping not available.")
508
- with st.container():
509
- tab1, tab2, tab3, tab4, tab5, tab6, tab7, tab8, tab9 = st.tabs(['Overall Exposures', 'QB Exposures', 'RB-WR-TE Exposures', 'RB Exposures', 'WR Exposures', 'TE Exposures', 'FLEX Exposures', 'DST Exposures', 'Team Exposures'])
510
- with tab1:
511
- if 'player_freq' in st.session_state:
512
-
513
- st.dataframe(st.session_state.player_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
514
  st.download_button(
515
- label="Export Exposures",
516
- data=st.session_state.player_freq.to_csv().encode('utf-8'),
517
- file_name='player_freq_export.csv',
518
  mime='text/csv',
519
- key='overall'
520
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
521
  with tab2:
522
- if 'qb_freq' in st.session_state:
523
-
524
- st.dataframe(st.session_state.qb_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
525
- st.download_button(
526
- label="Export Exposures",
527
- data=st.session_state.qb_freq.to_csv().encode('utf-8'),
528
- file_name='qb_freq.csv',
529
- mime='text/csv',
530
- key='qb'
531
- )
532
- with tab3:
533
- if 'rbwrte_freq' in st.session_state:
534
-
535
- st.dataframe(st.session_state.rbwrte_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
536
- st.download_button(
537
- label="Export Exposures",
538
- data=st.session_state.rbwrte_freq.to_csv().encode('utf-8'),
539
- file_name='rbwrte_freq.csv',
540
- mime='text/csv',
541
- key='rbwrte'
542
- )
543
- with tab4:
544
- if 'rb_freq' in st.session_state:
545
-
546
- st.dataframe(st.session_state.rb_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
547
- st.download_button(
548
- label="Export Exposures",
549
- data=st.session_state.rb_freq.to_csv().encode('utf-8'),
550
- file_name='rb_freq.csv',
551
- mime='text/csv',
552
- key='rb'
553
- )
554
- with tab5:
555
- if 'wr_freq' in st.session_state:
556
-
557
- st.dataframe(st.session_state.wr_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
558
- st.download_button(
559
- label="Export Exposures",
560
- data=st.session_state.wr_freq.to_csv().encode('utf-8'),
561
- file_name='wr_freq.csv',
562
- mime='text/csv',
563
- key='wr'
564
- )
565
- with tab6:
566
- if 'te_freq' in st.session_state:
567
-
568
- st.dataframe(st.session_state.te_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
569
- st.download_button(
570
- label="Export Exposures",
571
- data=st.session_state.te_freq.to_csv().encode('utf-8'),
572
- file_name='te_freq.csv',
573
- mime='text/csv',
574
- key='te'
575
- )
576
- with tab7:
577
- if 'flex_freq' in st.session_state:
578
-
579
- st.dataframe(st.session_state.flex_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
580
- st.download_button(
581
- label="Export Exposures",
582
- data=st.session_state.flex_freq.to_csv().encode('utf-8'),
583
- file_name='flex_freq.csv',
584
- mime='text/csv',
585
- key='flex'
586
- )
587
- with tab8:
588
- if 'dst_freq' in st.session_state:
589
-
590
- st.dataframe(st.session_state.dst_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
591
- st.download_button(
592
- label="Export Exposures",
593
- data=st.session_state.dst_freq.to_csv().encode('utf-8'),
594
- file_name='dst_freq.csv',
595
- mime='text/csv',
596
- key='dst'
597
- )
598
- with tab9:
599
- if 'team_freq' in st.session_state:
600
 
601
- st.dataframe(st.session_state.team_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(percentages_format, precision=2), use_container_width = True)
602
- st.download_button(
603
- label="Export Exposures",
604
- data=st.session_state.team_freq.to_csv().encode('utf-8'),
605
- file_name='team_freq.csv',
606
- mime='text/csv',
607
- key='team'
608
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
609
 
610
  if selected_tab == "Showdown Contest Sims":
611
  dk_sd_raw, fd_sd_raw = init_SD_baselines('Showdown #1')
 
15
 
16
  percentages_format = {'Exposure': '{:.2%}'}
17
  freq_format = {'Exposure': '{:.2%}', 'Proj Own': '{:.2%}', 'Edge': '{:.2%}'}
18
+ dk_columns = ['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
19
+ fd_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
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_NBA_SD_seed_frame_Showdown #1', 'DK_NBA_SD_seed_frame_Showdown #2', 'DK_NBA_SD_seed_frame_Showdown #3', 'DK_NBA_SD_seed_frame_Showdown #4', 'DK_NBA_SD_seed_frame_Showdown #5', 'DK_NBA_SD_seed_frame_Showdown #6',
25
+ 'DK_NBA_SD_seed_frame_Showdown #7', 'DK_NBA_SD_seed_frame_Showdown #8', 'DK_NBA_SD_seed_frame_Showdown #9', 'DK_NBA_SD_seed_frame_Showdown #10', 'DK_NBA_SD_seed_frame_Showdown #11', 'DK_NBA_SD_seed_frame_Showdown #12', 'DK_NBA_SD_seed_frame_Showdown #13',
26
+ 'DK_NBA_SD_seed_frame_Showdown #14', 'DK_NBA_SD_seed_frame_Showdown #15']
27
+ fd_db_showdown_selections = ['FD_NBA_SD_seed_frame_Showdown #1', 'FD_NBA_SD_seed_frame_Showdown #2', 'FD_NBA_SD_seed_frame_Showdown #3', 'FD_NBA_SD_seed_frame_Showdown #4', 'FD_NBA_SD_seed_frame_Showdown #5', 'FD_NBA_SD_seed_frame_Showdown #6',
28
+ 'FD_NBA_SD_seed_frame_Showdown #7', 'FD_NBA_SD_seed_frame_Showdown #8', 'FD_NBA_SD_seed_frame_Showdown #9', 'FD_NBA_SD_seed_frame_Showdown #10', 'FD_NBA_SD_seed_frame_Showdown #11', 'FD_NBA_SD_seed_frame_Showdown #12', 'FD_NBA_SD_seed_frame_Showdown #13',
29
+ 'FD_NBA_SD_seed_frame_Showdown #14', 'FD_NBA_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))
 
80
 
81
  @st.cache_resource(ttl=60)
82
  def define_dk_showdown_slates():
83
+ collection = db["Player_SD_Range_Of_Outcomes"]
84
  cursor = collection.find()
85
  raw_display = pd.DataFrame(list(cursor))
86
+ raw_display = raw_display[raw_display['site'] == 'Draftkings']
87
  unique_slates = raw_display['slate'].unique()
88
 
89
  slate_names = []
 
98
 
99
  @st.cache_resource(ttl=60)
100
  def define_fd_showdown_slates():
101
+ collection = db["Player_SD_Range_Of_Outcomes"]
102
  cursor = collection.find()
103
  raw_display = pd.DataFrame(list(cursor))
104
+ raw_display = raw_display[raw_display['site'] == 'FanDuel']
105
  unique_slates = raw_display['slate'].unique()
106
 
107
  slate_names = []
 
270
  st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()
271
 
272
  if sim_site_var1 == 'Draftkings':
273
+ pg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:1].values, return_counts=True)),
274
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
275
  elif sim_site_var1 == 'Fanduel':
276
+ pg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:2].values, return_counts=True)),
277
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
278
+ pg_working['Freq'] = pg_working['Freq'].astype(int)
279
+ pg_working['Position'] = pg_working['Player'].map(st.session_state.maps_dict['Pos_map'])
280
+ pg_working['Salary'] = pg_working['Player'].map(st.session_state.maps_dict['Salary_map'])
281
+ pg_working['Proj Own'] = pg_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
282
+ pg_working['Exposure'] = pg_working['Freq']/(1000)
283
+ pg_working['Edge'] = pg_working['Exposure'] - pg_working['Proj Own']
284
+ pg_working['Team'] = pg_working['Player'].map(st.session_state.maps_dict['Team_map'])
285
+ st.session_state.pg_freq = pg_working.copy()
286
+
287
  if sim_site_var1 == 'Draftkings':
288
+ sg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,1:2].values, return_counts=True)),
289
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
290
  elif sim_site_var1 == 'Fanduel':
291
+ sg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,2:4].values, return_counts=True)),
292
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
293
+ sg_working['Freq'] = sg_working['Freq'].astype(int)
294
+ sg_working['Position'] = sg_working['Player'].map(st.session_state.maps_dict['Pos_map'])
295
+ sg_working['Salary'] = sg_working['Player'].map(st.session_state.maps_dict['Salary_map'])
296
+ sg_working['Proj Own'] = sg_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
297
+ sg_working['Exposure'] = sg_working['Freq']/(1000)
298
+ sg_working['Edge'] = sg_working['Exposure'] - sg_working['Proj Own']
299
+ sg_working['Team'] = sg_working['Player'].map(st.session_state.maps_dict['Team_map'])
300
+ st.session_state.sg_freq = sg_working.copy()
301
 
302
  if sim_site_var1 == 'Draftkings':
303
+ sf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,2:3].values, return_counts=True)),
304
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
305
  elif sim_site_var1 == 'Fanduel':
306
+ sf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,4:6].values, return_counts=True)),
307
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
308
+ sf_working['Freq'] = sf_working['Freq'].astype(int)
309
+ sf_working['Position'] = sf_working['Player'].map(st.session_state.maps_dict['Pos_map'])
310
+ sf_working['Salary'] = sf_working['Player'].map(st.session_state.maps_dict['Salary_map'])
311
+ sf_working['Proj Own'] = sf_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
312
+ sf_working['Exposure'] = sf_working['Freq']/(1000)
313
+ sf_working['Edge'] = sf_working['Exposure'] - sf_working['Proj Own']
314
+ sf_working['Team'] = sf_working['Player'].map(st.session_state.maps_dict['Team_map'])
315
+ st.session_state.sf_freq = sf_working.copy()
316
 
317
  if sim_site_var1 == 'Draftkings':
318
+ pf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,3:4].values, return_counts=True)),
319
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
320
  elif sim_site_var1 == 'Fanduel':
321
+ pf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,6:8].values, return_counts=True)),
322
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
323
+ pf_working['Freq'] = pf_working['Freq'].astype(int)
324
+ pf_working['Position'] = pf_working['Player'].map(st.session_state.maps_dict['Pos_map'])
325
+ pf_working['Salary'] = pf_working['Player'].map(st.session_state.maps_dict['Salary_map'])
326
+ pf_working['Proj Own'] = pf_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
327
+ pf_working['Exposure'] = pf_working['Freq']/(1000)
328
+ pf_working['Edge'] = pf_working['Exposure'] - pf_working['Proj Own']
329
+ pf_working['Team'] = pf_working['Player'].map(st.session_state.maps_dict['Team_map'])
330
+ st.session_state.pf_freq = pf_working.copy()
331
 
332
  if sim_site_var1 == 'Draftkings':
333
+ c_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,4:5].values, return_counts=True)),
334
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
335
  elif sim_site_var1 == 'Fanduel':
336
+ c_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,8:9].values, return_counts=True)),
337
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
338
+ c_working['Freq'] = c_working['Freq'].astype(int)
339
+ c_working['Position'] = c_working['Player'].map(st.session_state.maps_dict['Pos_map'])
340
+ c_working['Salary'] = c_working['Player'].map(st.session_state.maps_dict['Salary_map'])
341
+ c_working['Proj Own'] = c_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
342
+ c_working['Exposure'] = c_working['Freq']/(1000)
343
+ c_working['Edge'] = c_working['Exposure'] - c_working['Proj Own']
344
+ c_working['Team'] = c_working['Player'].map(st.session_state.maps_dict['Team_map'])
345
+ st.session_state.c_freq = c_working.copy()
346
 
347
  if sim_site_var1 == 'Draftkings':
348
+ g_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,5:6].values, return_counts=True)),
349
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
350
  elif sim_site_var1 == 'Fanduel':
351
+ g_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:4].values, return_counts=True)),
352
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
353
+ g_working['Freq'] = g_working['Freq'].astype(int)
354
+ g_working['Position'] = g_working['Player'].map(st.session_state.maps_dict['Pos_map'])
355
+ g_working['Salary'] = g_working['Player'].map(st.session_state.maps_dict['Salary_map'])
356
+ g_working['Proj Own'] = g_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
357
+ g_working['Exposure'] = g_working['Freq']/(1000)
358
+ g_working['Edge'] = g_working['Exposure'] - g_working['Proj Own']
359
+ g_working['Team'] = g_working['Player'].map(st.session_state.maps_dict['Team_map'])
360
+ st.session_state.g_freq = g_working.copy()
361
 
362
  if sim_site_var1 == 'Draftkings':
363
+ f_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,6:7].values, return_counts=True)),
364
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
365
  elif sim_site_var1 == 'Fanduel':
366
+ f_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,4:8].values, return_counts=True)),
367
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
368
+ f_working['Freq'] = f_working['Freq'].astype(int)
369
+ f_working['Position'] = f_working['Player'].map(st.session_state.maps_dict['Pos_map'])
370
+ f_working['Salary'] = f_working['Player'].map(st.session_state.maps_dict['Salary_map'])
371
+ f_working['Proj Own'] = f_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
372
+ f_working['Exposure'] = f_working['Freq']/(1000)
373
+ f_working['Edge'] = f_working['Exposure'] - f_working['Proj Own']
374
+ f_working['Team'] = f_working['Player'].map(st.session_state.maps_dict['Team_map'])
375
+ st.session_state.f_freq = f_working.copy()
376
+
377
+ if sim_site_var1 == 'Draftkings':
378
  flex_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,7:8].values, return_counts=True)),
379
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
380
+ elif sim_site_var1 == 'Fanduel':
381
+ flex_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:9].values, return_counts=True)),
382
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
383
  flex_working['Freq'] = flex_working['Freq'].astype(int)
384
  flex_working['Position'] = flex_working['Player'].map(st.session_state.maps_dict['Pos_map'])
385
  flex_working['Salary'] = flex_working['Player'].map(st.session_state.maps_dict['Salary_map'])
 
388
  flex_working['Edge'] = flex_working['Exposure'] - flex_working['Proj Own']
389
  flex_working['Team'] = flex_working['Player'].map(st.session_state.maps_dict['Team_map'])
390
  st.session_state.flex_freq = flex_working.copy()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
391
 
392
  if sim_site_var1 == 'Draftkings':
393
+ team_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,10:11].values, return_counts=True)),
394
  columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
395
  elif sim_site_var1 == 'Fanduel':
396
  team_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,11:12].values, return_counts=True)),
 
399
  team_working['Exposure'] = team_working['Freq']/(1000)
400
  st.session_state.team_freq = team_working.copy()
401
 
402
+ with st.container():
403
+ if st.button("Reset Sim", key='reset_sim'):
404
+ for key in st.session_state.keys():
405
+ del st.session_state[key]
406
+ if 'player_freq' in st.session_state:
407
+ player_split_var2 = st.radio("Are you wanting to isolate any lineups with specific players?", ('Full Players', 'Specific Players'), key='player_split_var2')
408
+ if player_split_var2 == 'Specific Players':
409
+ find_var2 = st.multiselect('Which players must be included in the lineups?', options = st.session_state.player_freq['Player'].unique())
410
+ elif player_split_var2 == 'Full Players':
411
+ find_var2 = st.session_state.player_freq.Player.values.tolist()
412
+
413
+ if player_split_var2 == 'Specific Players':
414
+ st.session_state.Sim_Winner_Display = st.session_state.Sim_Winner_Frame[np.equal.outer(st.session_state.Sim_Winner_Frame.to_numpy(), find_var2).any(axis=1).all(axis=1)]
415
+ if player_split_var2 == 'Full Players':
416
+ st.session_state.Sim_Winner_Display = st.session_state.Sim_Winner_Frame
417
+ if 'Sim_Winner_Display' in st.session_state:
418
+ st.dataframe(st.session_state.Sim_Winner_Display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True)
419
+ if 'Sim_Winner_Export' in st.session_state:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
420
  st.download_button(
421
+ label="Export Full Frame",
422
+ data=st.session_state.Sim_Winner_Export.to_csv().encode('utf-8'),
423
+ file_name='MLB_consim_export.csv',
424
  mime='text/csv',
425
+ )
426
+ tab1, tab2 = st.tabs(['Winning Frame Statistics', 'Flex Exposure Statistics'])
427
+
428
+ with tab1:
429
+ if 'Sim_Winner_Display' in st.session_state:
430
+ # Create a new dataframe with summary statistics
431
+ summary_df = pd.DataFrame({
432
+ 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
433
+ 'Salary': [
434
+ st.session_state.Sim_Winner_Display['salary'].min(),
435
+ st.session_state.Sim_Winner_Display['salary'].mean(),
436
+ st.session_state.Sim_Winner_Display['salary'].max(),
437
+ st.session_state.Sim_Winner_Display['salary'].std()
438
+ ],
439
+ 'Proj': [
440
+ st.session_state.Sim_Winner_Display['proj'].min(),
441
+ st.session_state.Sim_Winner_Display['proj'].mean(),
442
+ st.session_state.Sim_Winner_Display['proj'].max(),
443
+ st.session_state.Sim_Winner_Display['proj'].std()
444
+ ],
445
+ 'Own': [
446
+ st.session_state.Sim_Winner_Display['Own'].min(),
447
+ st.session_state.Sim_Winner_Display['Own'].mean(),
448
+ st.session_state.Sim_Winner_Display['Own'].max(),
449
+ st.session_state.Sim_Winner_Display['Own'].std()
450
+ ],
451
+ 'Fantasy': [
452
+ st.session_state.Sim_Winner_Display['Fantasy'].min(),
453
+ st.session_state.Sim_Winner_Display['Fantasy'].mean(),
454
+ st.session_state.Sim_Winner_Display['Fantasy'].max(),
455
+ st.session_state.Sim_Winner_Display['Fantasy'].std()
456
+ ],
457
+ 'GPP_Proj': [
458
+ st.session_state.Sim_Winner_Display['GPP_Proj'].min(),
459
+ st.session_state.Sim_Winner_Display['GPP_Proj'].mean(),
460
+ st.session_state.Sim_Winner_Display['GPP_Proj'].max(),
461
+ st.session_state.Sim_Winner_Display['GPP_Proj'].std()
462
+ ]
463
+ })
464
+
465
+ # Set the index of the summary dataframe as the "Metric" column
466
+ summary_df = summary_df.set_index('Metric')
467
+
468
+ # Display the summary dataframe
469
+ st.subheader("Winning Frame Statistics")
470
+ st.dataframe(summary_df.style.format({
471
+ 'Salary': '{:.2f}',
472
+ 'Proj': '{:.2f}',
473
+ 'Fantasy': '{:.2f}',
474
+ 'GPP_Proj': '{:.2f}'
475
+ }).background_gradient(cmap='RdYlGn', axis=0, subset=['Salary', 'Proj', 'Own', 'Fantasy', 'GPP_Proj']), use_container_width=True)
476
+
477
  with tab2:
478
+ if 'Sim_Winner_Display' in st.session_state:
479
+ st.write("Yeah man that's crazy")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
480
 
481
+ else:
482
+ st.write("Simulation data or position mapping not available.")
483
+ with st.container():
484
+ tab1, tab2 = st.tabs(['Overall Exposures', 'Team Exposures'])
485
+ with tab1:
486
+ if 'player_freq' in st.session_state:
487
+
488
+ st.dataframe(st.session_state.player_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
489
+ st.download_button(
490
+ label="Export Exposures",
491
+ data=st.session_state.player_freq.to_csv().encode('utf-8'),
492
+ file_name='player_freq_export.csv',
493
+ mime='text/csv',
494
+ key='overall'
495
+ )
496
+
497
+ with tab2:
498
+ if 'team_freq' in st.session_state:
499
+
500
+ st.dataframe(st.session_state.team_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
501
+ st.download_button(
502
+ label="Export Exposures",
503
+ data=st.session_state.team_freq.to_csv().encode('utf-8'),
504
+ file_name='team_freq.csv',
505
+ mime='text/csv',
506
+ key='team'
507
+ )
508
 
509
  if selected_tab == "Showdown Contest Sims":
510
  dk_sd_raw, fd_sd_raw = init_SD_baselines('Showdown #1')