James McCool commited on
Commit
841c7fd
·
1 Parent(s): ab2c770

Enhance support for WNBA alongside NBA in data loading and lineup initialization; refactor column management and statistics calculations for both leagues.

Browse files
Files changed (1) hide show
  1. app.py +502 -221
app.py CHANGED
@@ -13,109 +13,168 @@ def init_conn():
13
  uri = st.secrets['mongo_uri']
14
  client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000)
15
  db = client["NBA_DFS"]
 
16
 
17
- return db
18
 
19
- db = init_conn()
20
 
21
- dk_columns = ['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
22
- dk_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
23
- fd_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
24
- fd_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
 
 
 
 
 
25
 
26
  roo_format = {'Top_finish': '{:.2%}', 'Top_5_finish': '{:.2%}', 'Top_10_finish': '{:.2%}', '20+%': '{:.2%}', '4x%': '{:.2%}', '5x%': '{:.2%}', '6x%': '{:.2%}', 'GPP%': '{:.2%}'}
27
 
28
  @st.cache_data(ttl=60)
29
- def load_overall_stats():
30
- collection = db["DK_Player_Stats"]
 
 
 
31
  cursor = collection.find()
32
 
33
  raw_display = pd.DataFrame(list(cursor))
34
- raw_display = raw_display[['Name', 'Salary', 'Position', 'Team', 'Opp', 'Minutes', 'FGM', 'FGA', 'FG2M', 'FG2A', 'Threes', 'FG3A', 'FTM', 'FTA', 'TRB', 'AST', 'STL', 'BLK', 'TOV', '2P', '3P', 'FT',
35
- 'Points', 'Rebounds', 'Assists', 'PRA', 'PR', 'PA', 'RA', 'Steals', 'Blocks', 'Turnovers', 'Fantasy', 'Raw', 'Own']]
36
- raw_display = raw_display.rename(columns={"Name": "Player", "Nickname": "Player", "Fantasy": "Median"})
 
 
 
37
  raw_display = raw_display.loc[raw_display['Median'] > 0]
38
  raw_display = raw_display.apply(pd.to_numeric, errors='ignore')
39
  dk_raw = raw_display.sort_values(by='Median', ascending=False)
40
 
41
- collection = db["FD_Player_Stats"]
 
 
 
42
  cursor = collection.find()
43
 
44
  raw_display = pd.DataFrame(list(cursor))
45
- raw_display = raw_display[['Nickname', 'Salary', 'Position', 'Team', 'Opp', 'Minutes', 'FGM', 'FGA', 'FG2M', 'FG2A', 'Threes', 'FG3A', 'FTM', 'FTA', 'TRB', 'AST', 'STL', 'BLK', 'TOV', '2P', '3P', 'FT',
46
- 'Points', 'Rebounds', 'Assists', 'PRA', 'PR', 'PA', 'RA', 'Steals', 'Blocks', 'Turnovers', 'Fantasy', 'Raw', 'Own']]
47
- raw_display = raw_display.rename(columns={"Name": "Player", "Nickname": "Player", "Fantasy": "Median"})
 
 
 
48
  raw_display = raw_display.loc[raw_display['Median'] > 0]
49
  raw_display = raw_display.apply(pd.to_numeric, errors='ignore')
50
  fd_raw = raw_display.sort_values(by='Median', ascending=False)
51
 
52
- collection = db["Secondary_DK_Player_Stats"]
 
 
 
53
  cursor = collection.find()
54
 
55
  raw_display = pd.DataFrame(list(cursor))
56
- raw_display = raw_display[['Name', 'Salary', 'Position', 'Team', 'Opp', 'Minutes', 'FGM', 'FGA', 'FG2M', 'FG2A', 'Threes', 'FG3A', 'FTM', 'FTA', 'TRB', 'AST', 'STL', 'BLK', 'TOV', '2P', '3P', 'FT',
57
- 'Points', 'Rebounds', 'Assists', 'PRA', 'PR', 'PA', 'RA', 'Steals', 'Blocks', 'Turnovers', 'Fantasy', 'Raw', 'Own']]
58
- raw_display = raw_display.rename(columns={"Name": "Player", "Nickname": "Player", "Fantasy": "Median"})
 
 
 
59
  raw_display = raw_display.loc[raw_display['Median'] > 0]
60
  raw_display = raw_display.apply(pd.to_numeric, errors='ignore')
61
  dk_raw_sec = raw_display.sort_values(by='Median', ascending=False)
62
 
63
- collection = db["Secondary_FD_Player_Stats"]
 
 
 
64
  cursor = collection.find()
65
 
66
  raw_display = pd.DataFrame(list(cursor))
67
- raw_display = raw_display[['Nickname', 'Salary', 'Position', 'Team', 'Opp', 'Minutes', 'FGM', 'FGA', 'FG2M', 'FG2A', 'Threes', 'FG3A', 'FTM', 'FTA', 'TRB', 'AST', 'STL', 'BLK', 'TOV', '2P', '3P', 'FT',
68
- 'Points', 'Rebounds', 'Assists', 'PRA', 'PR', 'PA', 'RA', 'Steals', 'Blocks', 'Turnovers', 'Fantasy', 'Raw', 'Own']]
69
- raw_display = raw_display.rename(columns={"Name": "Player", "Nickname": "Player", "Fantasy": "Median"})
 
 
 
70
  raw_display = raw_display.loc[raw_display['Median'] > 0]
71
  raw_display = raw_display.apply(pd.to_numeric, errors='ignore')
72
  fd_raw_sec = raw_display.sort_values(by='Median', ascending=False)
73
 
74
- collection = db["Player_SD_Range_Of_Outcomes"]
 
 
 
75
  cursor = collection.find()
76
 
77
  raw_display = pd.DataFrame(list(cursor))
78
  raw_display = raw_display[['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%',
79
  'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'site', 'version', 'slate', 'timestamp', 'player_id']]
 
80
  raw_display = raw_display.rename(columns={"player_id": "player_ID"})
81
  raw_display = raw_display.loc[raw_display['Median'] > 0]
82
  raw_display = raw_display.apply(pd.to_numeric, errors='ignore')
83
  sd_raw = raw_display.sort_values(by='Median', ascending=False)
 
 
 
 
84
 
85
  print(sd_raw.head(10))
86
 
87
- collection = db["Player_Range_Of_Outcomes"]
 
 
 
88
  cursor = collection.find()
89
 
90
  raw_display = pd.DataFrame(list(cursor))
91
- raw_display = raw_display[['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%',
92
- 'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'site', 'version', 'slate', 'timestamp', 'player_ID']]
 
 
 
 
 
 
93
  raw_display = raw_display.loc[raw_display['Median'] > 0]
94
  raw_display = raw_display.apply(pd.to_numeric, errors='ignore')
95
  roo_raw = raw_display.sort_values(by='Median', ascending=False)
96
 
97
  timestamp = raw_display['timestamp'].values[0]
98
 
99
- return dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, sd_raw, timestamp
100
 
101
  @st.cache_data(ttl = 60)
102
- def init_DK_lineups(slate_desig: str):
103
 
104
  if slate_desig == 'Main Slate':
105
- collection = db['DK_NBA_name_map']
 
 
 
106
  cursor = collection.find()
107
  raw_data = pd.DataFrame(list(cursor))
108
  names_dict = dict(zip(raw_data['key'], raw_data['value']))
109
-
110
- collection = db["DK_NBA_seed_frame"]
 
 
 
111
  cursor = collection.find().limit(10000)
112
  elif slate_desig == 'Secondary':
113
- collection = db['DK_NBA_Secondary_name_map']
 
 
 
114
  cursor = collection.find()
115
  raw_data = pd.DataFrame(list(cursor))
116
  names_dict = dict(zip(raw_data['key'], raw_data['value']))
117
-
118
- collection = db["DK_NBA_Secondary_seed_frame"]
 
 
 
119
  cursor = collection.find().limit(10000)
120
  elif slate_desig == 'Auxiliary':
121
  collection = db['DK_NBA_Auxiliary_name_map']
@@ -127,8 +186,13 @@ def init_DK_lineups(slate_desig: str):
127
  cursor = collection.find().limit(10000)
128
 
129
  raw_display = pd.DataFrame(list(cursor))
130
- raw_display = raw_display[['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
131
- dict_columns = ['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX']
 
 
 
 
 
132
  for col in dict_columns:
133
  raw_display[col] = raw_display[col].map(names_dict)
134
  DK_seed = raw_display.to_numpy()
@@ -136,16 +200,22 @@ def init_DK_lineups(slate_desig: str):
136
  return DK_seed
137
 
138
  @st.cache_data(ttl = 60)
139
- def init_DK_SD_lineups(slate_desig: str):
140
 
141
  if slate_desig == 'Main Slate':
142
- collection = db["DK_NBA_SD_seed_frame"]
 
 
 
143
  elif slate_desig == 'Secondary':
144
- collection = db["DK_NBA_Secondary_SD_seed_frame"]
 
 
 
145
  elif slate_desig == 'Auxiliary':
146
  collection = db["DK_NBA_Auxiliary_SD_seed_frame"]
147
 
148
- cursor = collection.find().limit(10000)
149
 
150
  raw_display = pd.DataFrame(list(cursor))
151
  raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
@@ -154,23 +224,35 @@ def init_DK_SD_lineups(slate_desig: str):
154
  return DK_seed
155
 
156
  @st.cache_data(ttl = 60)
157
- def init_FD_lineups(slate_desig: str):
158
 
159
  if slate_desig == 'Main Slate':
160
- collection = db['FD_NBA_name_map']
 
 
 
161
  cursor = collection.find()
162
  raw_data = pd.DataFrame(list(cursor))
163
  names_dict = dict(zip(raw_data['key'], raw_data['value']))
164
 
165
- collection = db["FD_NBA_seed_frame"]
 
 
 
166
  cursor = collection.find().limit(10000)
167
  elif slate_desig == 'Secondary':
168
- collection = db['FD_NBA_Secondary_name_map']
 
 
 
169
  cursor = collection.find()
170
  raw_data = pd.DataFrame(list(cursor))
171
  names_dict = dict(zip(raw_data['key'], raw_data['value']))
172
 
173
- collection = db["FD_NBA_Secondary_seed_frame"]
 
 
 
174
  cursor = collection.find().limit(10000)
175
  elif slate_desig == 'Auxiliary':
176
  collection = db['FD_NBA_Auxiliary_name_map']
@@ -182,8 +264,12 @@ def init_FD_lineups(slate_desig: str):
182
  cursor = collection.find().limit(10000)
183
 
184
  raw_display = pd.DataFrame(list(cursor))
185
- raw_display = raw_display[['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
186
- dict_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1']
 
 
 
 
187
  for col in dict_columns:
188
  raw_display[col] = raw_display[col].map(names_dict)
189
  FD_seed = raw_display.to_numpy()
@@ -191,16 +277,22 @@ def init_FD_lineups(slate_desig: str):
191
  return FD_seed
192
 
193
  @st.cache_data(ttl = 60)
194
- def init_FD_SD_lineups(slate_desig: str):
195
 
196
  if slate_desig == 'Main Slate':
197
- collection = db["FD_NBA_SD_seed_frame"]
 
 
 
198
  elif slate_desig == 'Secondary':
199
- collection = db["FD_NBA_Secondary_SD_seed_frame"]
 
 
 
200
  elif slate_desig == 'Auxiliary':
201
  collection = db["FD_NBA_Auxiliary_SD_seed_frame"]
202
 
203
- cursor = collection.find().limit(10000)
204
 
205
  raw_display = pd.DataFrame(list(cursor))
206
  raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
@@ -216,15 +308,23 @@ def convert_df(array):
216
  array = pd.DataFrame(array, columns=column_names)
217
  return array.to_csv().encode('utf-8')
218
 
219
- dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, sd_raw, timestamp = load_overall_stats()
220
  salary_dict = dict(zip(roo_raw.Player, roo_raw.Salary))
221
  id_dict = dict(zip(roo_raw.Player, roo_raw.player_ID))
222
  salary_dict_sd = dict(zip(sd_raw.Player, sd_raw.Salary))
223
- id_dict_sd = dict(zip(sd_raw.Player, sd_raw.player_ID))
224
- dk_lineups = pd.DataFrame(columns=dk_columns)
225
- dk_sd_lineups = pd.DataFrame(columns=dk_sd_columns)
226
- fd_lineups = pd.DataFrame(columns=fd_columns)
227
- fd_sd_lineups = pd.DataFrame(columns=fd_sd_columns)
 
 
 
 
 
 
 
 
228
  t_stamp = f"Last Update: " + str(timestamp) + f" CST"
229
 
230
  tab1, tab2 = st.tabs(['Range of Outcomes', 'Optimals'])
@@ -242,24 +342,33 @@ with tab1:
242
  with col2:
243
  if st.button("Load/Reset Data", key='reset1'):
244
  st.cache_data.clear()
245
- dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, sd_raw, timestamp = load_overall_stats()
246
  salary_dict = dict(zip(roo_raw.Player, roo_raw.Salary))
247
  id_dict = dict(zip(roo_raw.Player, roo_raw.player_ID))
248
  salary_dict_sd = dict(zip(sd_raw.Player, sd_raw.Salary))
249
- id_dict_sd = dict(zip(sd_raw.Player, sd_raw.player_ID))
250
- dk_lineups = pd.DataFrame(columns=dk_columns)
251
- dk_sd_lineups = pd.DataFrame(columns=dk_sd_columns)
252
- fd_lineups = pd.DataFrame(columns=fd_columns)
253
- fd_sd_lineups = pd.DataFrame(columns=fd_sd_columns)
 
 
 
 
 
 
254
  t_stamp = f"Last Update: " + str(timestamp) + f" CST"
255
  for key in st.session_state.keys():
256
  del st.session_state[key]
257
- col1, col2, col3, col4, col5 = st.columns(5)
258
  with col1:
259
  view_var2 = st.radio("View Type", ('Simple', 'Advanced'), key='view_var2')
260
  with col2:
261
- slate_type_var2 = st.radio("What slate type are you working with?", ('Regular', 'Showdown'), key='slate_type_var2')
 
262
  with col3:
 
 
263
  site_var2 = st.radio("Site", ('Draftkings', 'Fanduel'), key='site_var2')
264
 
265
  # Process site selection
@@ -273,7 +382,7 @@ with tab1:
273
  site_baselines = roo_raw[roo_raw['site'] == 'Fanduel']
274
  elif slate_type_var2 == 'Showdown':
275
  site_baselines = sd_raw[sd_raw['site'] == 'Fanduel']
276
- with col4:
277
  slate_split = st.radio("Slate Type", ('Main Slate', 'Secondary'), key='slate_split')
278
 
279
  if slate_split == 'Main Slate':
@@ -287,7 +396,7 @@ with tab1:
287
  elif slate_type_var2 == 'Showdown':
288
  raw_baselines = site_baselines[site_baselines['slate'] == 'Showdown #2']
289
 
290
- with col5:
291
  split_var2 = st.radio("Slate Range", ('Full Slate Run', 'Specific Games'), key='split_var2')
292
  if split_var2 == 'Specific Games':
293
  team_var2 = st.multiselect('Select teams for ROO', options=raw_baselines['Team'].unique(), key='team_var2')
@@ -339,36 +448,50 @@ with tab2:
339
  with st.expander("Info and Filters"):
340
  if st.button("Load/Reset Data", key='reset2'):
341
  st.cache_data.clear()
342
- dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, sd_raw, timestamp = load_overall_stats()
343
  salary_dict = dict(zip(roo_raw.Player, roo_raw.Salary))
344
  id_dict = dict(zip(roo_raw.Player, roo_raw.player_ID))
345
  salary_dict_sd = dict(zip(sd_raw.Player, sd_raw.Salary))
346
- id_dict_sd = dict(zip(sd_raw.Player, sd_raw.player_ID))
347
- dk_lineups = pd.DataFrame(columns=dk_columns)
348
- dk_sd_lineups = pd.DataFrame(columns=dk_sd_columns)
349
- fd_lineups = pd.DataFrame(columns=fd_columns)
350
- fd_sd_lineups = pd.DataFrame(columns=fd_sd_columns)
 
 
 
 
 
 
351
  t_stamp = f"Last Update: " + str(timestamp) + f" CST"
352
  for key in st.session_state.keys():
353
  del st.session_state[key]
354
 
355
- col1, col2, col3, col4, col5 = st.columns(5)
356
  with col1:
357
- slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary'))
358
  with col2:
 
 
359
  site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'))
360
  if 'working_seed' in st.session_state:
361
  del st.session_state['working_seed']
362
- with col3:
363
- slate_type_var1 = st.radio("What slate type are you working with?", ('Regular', 'Showdown'))
364
  with col4:
365
- lineup_num_var = st.number_input("How many lineups do you want to display?", min_value=1, max_value=1000, value=150, step=1)
366
  with col5:
 
 
367
  if site_var1 == 'Draftkings':
368
- if slate_type_var1 == 'Regular':
369
- column_names = dk_columns
370
- elif slate_type_var1 == 'Showdown':
371
- column_names = dk_sd_columns
 
 
 
 
 
 
372
 
373
  player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1')
374
  if player_var1 == 'Specific Players':
@@ -377,10 +500,16 @@ with tab2:
377
  player_var2 = dk_raw.Player.values.tolist()
378
 
379
  elif site_var1 == 'Fanduel':
380
- if slate_type_var1 == 'Regular':
381
- column_names = fd_columns
382
- elif slate_type_var1 == 'Showdown':
383
- column_names = fd_sd_columns
 
 
 
 
 
 
384
 
385
  player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1')
386
  if player_var1 == 'Specific Players':
@@ -388,19 +517,42 @@ with tab2:
388
  elif player_var1 == 'Full Slate':
389
  player_var2 = fd_raw.Player.values.tolist()
390
  if st.button("Prepare data export", key='data_export'):
391
- data_export = st.session_state.working_seed.copy()
392
  if site_var1 == 'Draftkings':
393
- for col_idx in range(8):
394
- data_export[:, col_idx] = np.array([id_dict.get(player, player) for player in data_export[:, col_idx]])
 
 
 
 
 
 
 
 
 
395
  elif site_var1 == 'Fanduel':
396
- for col_idx in range(9):
397
- data_export[:, col_idx] = np.array([id_dict.get(player, player) for player in data_export[:, col_idx]])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
398
  st.download_button(
399
- label="Export optimals set",
400
  data=convert_df(data_export),
401
  file_name='NBA_optimals_export.csv',
402
  mime='text/csv',
403
- )
404
 
405
 
406
  if site_var1 == 'Draftkings':
@@ -414,17 +566,17 @@ with tab2:
414
 
415
  elif 'working_seed' not in st.session_state:
416
  if slate_type_var1 == 'Regular':
417
- st.session_state.working_seed = init_DK_lineups(slate_var1)
418
  elif slate_type_var1 == 'Showdown':
419
- st.session_state.working_seed = init_DK_SD_lineups(slate_var1)
420
  st.session_state.working_seed = st.session_state.working_seed
421
  if player_var1 == 'Specific Players':
422
  st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]
423
  elif player_var1 == 'Full Slate':
424
  if slate_type_var1 == 'Regular':
425
- st.session_state.working_seed = init_DK_lineups(slate_var1)
426
  elif slate_type_var1 == 'Showdown':
427
- st.session_state.working_seed = init_DK_SD_lineups(slate_var1)
428
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
429
 
430
  elif site_var1 == 'Fanduel':
@@ -438,17 +590,17 @@ with tab2:
438
 
439
  elif 'working_seed' not in st.session_state:
440
  if slate_type_var1 == 'Regular':
441
- st.session_state.working_seed = init_FD_lineups(slate_var1)
442
  elif slate_type_var1 == 'Showdown':
443
- st.session_state.working_seed = init_FD_SD_lineups(slate_var1)
444
  st.session_state.working_seed = st.session_state.working_seed
445
  if player_var1 == 'Specific Players':
446
  st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]
447
  elif player_var1 == 'Full Slate':
448
  if slate_type_var1 == 'Regular':
449
- st.session_state.working_seed = init_FD_lineups(slate_var1)
450
  elif slate_type_var1 == 'Showdown':
451
- st.session_state.working_seed = init_FD_SD_lineups(slate_var1)
452
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
453
 
454
  export_file = st.session_state.data_export_display.copy()
@@ -457,30 +609,42 @@ with tab2:
457
  for col_idx in range(8):
458
  export_file.iloc[:, col_idx] = export_file.iloc[:, col_idx].map(id_dict)
459
  elif slate_type_var1 == 'Showdown':
460
- for col_idx in range(5):
461
- export_file.iloc[:, col_idx] = export_file.iloc[:, col_idx].map(id_dict_sd)
462
  elif site_var1 == 'Fanduel':
463
  if slate_type_var1 == 'Regular':
464
  for col_idx in range(9):
465
  export_file.iloc[:, col_idx] = export_file.iloc[:, col_idx].map(id_dict)
466
  elif slate_type_var1 == 'Showdown':
467
- for col_idx in range(5):
468
- export_file.iloc[:, col_idx] = export_file.iloc[:, col_idx].map(id_dict_sd)
469
 
470
  with st.container():
471
  if st.button("Reset Optimals", key='reset3'):
472
  for key in st.session_state.keys():
473
  del st.session_state[key]
474
  if site_var1 == 'Draftkings':
475
- if slate_type_var1 == 'Regular':
476
- st.session_state.working_seed = dk_lineups.copy()
477
- elif slate_type_var1 == 'Showdown':
478
- st.session_state.working_seed = dk_sd_lineups.copy()
 
 
 
 
 
 
479
  elif site_var1 == 'Fanduel':
480
- if slate_type_var1 == 'Regular':
481
- st.session_state.working_seed = fd_lineups.copy()
482
- elif slate_type_var1 == 'Showdown':
483
- st.session_state.working_seed = fd_sd_lineups.copy()
 
 
 
 
 
 
484
  if 'data_export_display' in st.session_state:
485
  st.dataframe(st.session_state.data_export_display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), height=500, use_container_width = True)
486
  st.download_button(
@@ -494,96 +658,188 @@ with tab2:
494
  if 'working_seed' in st.session_state:
495
  # Create a new dataframe with summary statistics
496
  if site_var1 == 'Draftkings':
497
- if slate_type_var1 == 'Regular':
498
- summary_df = pd.DataFrame({
499
- 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
500
- 'Salary': [
501
- np.min(st.session_state.working_seed[:,8]),
502
- np.mean(st.session_state.working_seed[:,8]),
503
- np.max(st.session_state.working_seed[:,8]),
504
- np.std(st.session_state.working_seed[:,8])
505
- ],
506
- 'Proj': [
507
- np.min(st.session_state.working_seed[:,9]),
508
- np.mean(st.session_state.working_seed[:,9]),
509
- np.max(st.session_state.working_seed[:,9]),
510
- np.std(st.session_state.working_seed[:,9])
511
- ],
512
- 'Own': [
513
- np.min(st.session_state.working_seed[:,14]),
514
- np.mean(st.session_state.working_seed[:,14]),
515
- np.max(st.session_state.working_seed[:,14]),
516
- np.std(st.session_state.working_seed[:,14])
517
- ]
518
- })
519
- elif slate_type_var1 == 'Showdown':
520
- summary_df = pd.DataFrame({
521
- 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
522
- 'Salary': [
523
- np.min(st.session_state.working_seed[:,6]),
524
- np.mean(st.session_state.working_seed[:,6]),
525
- np.max(st.session_state.working_seed[:,6]),
526
- np.std(st.session_state.working_seed[:,6])
527
- ],
528
- 'Proj': [
529
- np.min(st.session_state.working_seed[:,7]),
530
- np.mean(st.session_state.working_seed[:,7]),
531
- np.max(st.session_state.working_seed[:,7]),
532
- np.std(st.session_state.working_seed[:,7])
533
- ],
534
- 'Own': [
535
- np.min(st.session_state.working_seed[:,12]),
536
- np.mean(st.session_state.working_seed[:,12]),
537
- np.max(st.session_state.working_seed[:,12]),
538
- np.std(st.session_state.working_seed[:,12])
539
- ]
540
- })
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
541
 
542
  elif site_var1 == 'Fanduel':
543
- if slate_type_var1 == 'Regular':
544
- summary_df = pd.DataFrame({
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
545
  'Metric': ['Min', 'Average', 'Max', 'STDdev'],
546
- 'Salary': [
547
- np.min(st.session_state.working_seed[:,9]),
548
- np.mean(st.session_state.working_seed[:,9]),
549
- np.max(st.session_state.working_seed[:,9]),
550
- np.std(st.session_state.working_seed[:,9])
551
- ],
552
- 'Proj': [
553
- np.min(st.session_state.working_seed[:,10]),
554
- np.mean(st.session_state.working_seed[:,10]),
555
- np.max(st.session_state.working_seed[:,10]),
556
- np.std(st.session_state.working_seed[:,10])
557
- ],
558
- 'Own': [
559
- np.min(st.session_state.working_seed[:,15]),
560
- np.mean(st.session_state.working_seed[:,15]),
561
- np.max(st.session_state.working_seed[:,15]),
562
- np.std(st.session_state.working_seed[:,15])
563
- ]
564
- })
565
- elif slate_type_var1 == 'Showdown':
566
- summary_df = pd.DataFrame({
567
- 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
568
- 'Salary': [
569
- np.min(st.session_state.working_seed[:,6]),
570
- np.mean(st.session_state.working_seed[:,6]),
571
- np.max(st.session_state.working_seed[:,6]),
572
- np.std(st.session_state.working_seed[:,6])
573
- ],
574
- 'Proj': [
575
- np.min(st.session_state.working_seed[:,7]),
576
- np.mean(st.session_state.working_seed[:,7]),
577
- np.max(st.session_state.working_seed[:,7]),
578
- np.std(st.session_state.working_seed[:,7])
579
- ],
580
- 'Own': [
581
- np.min(st.session_state.working_seed[:,12]),
582
- np.mean(st.session_state.working_seed[:,12]),
583
- np.max(st.session_state.working_seed[:,12]),
584
- np.std(st.session_state.working_seed[:,12])
585
- ]
586
- })
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
587
 
588
  # Set the index of the summary dataframe as the "Metric" column
589
  summary_df = summary_df.set_index('Metric')
@@ -600,16 +856,29 @@ with tab2:
600
  tab1, tab2 = st.tabs(["Display Frequency", "Seed Frame Frequency"])
601
  with tab1:
602
  if 'data_export_display' in st.session_state:
603
- if slate_type_var1 == 'Regular':
604
- if site_var1 == 'Draftkings':
605
- player_columns = st.session_state.data_export_display.iloc[:, :8]
606
- elif site_var1 == 'Fanduel':
607
- player_columns = st.session_state.data_export_display.iloc[:, :9]
608
- elif slate_type_var1 == 'Showdown':
609
- if site_var1 == 'Draftkings':
610
- player_columns = st.session_state.data_export_display.iloc[:, :5]
611
- elif site_var1 == 'Fanduel':
612
- player_columns = st.session_state.data_export_display.iloc[:, :5]
 
 
 
 
 
 
 
 
 
 
 
 
 
613
 
614
  # Flatten the DataFrame and count unique values
615
  value_counts = player_columns.values.flatten().tolist()
@@ -640,16 +909,28 @@ with tab2:
640
  )
641
  with tab2:
642
  if 'working_seed' in st.session_state:
643
- if slate_type_var1 == 'Regular':
644
- if site_var1 == 'Draftkings':
645
- player_columns = st.session_state.working_seed[:, :8]
646
- elif site_var1 == 'Fanduel':
647
- player_columns = st.session_state.working_seed[:, :9]
648
- elif slate_type_var1 == 'Showdown':
649
- if site_var1 == 'Draftkings':
650
- player_columns = st.session_state.working_seed[:, :5]
651
- elif site_var1 == 'Fanduel':
652
- player_columns = st.session_state.working_seed[:, :5]
 
 
 
 
 
 
 
 
 
 
 
 
653
 
654
  # Flatten the DataFrame and count unique values
655
  value_counts = player_columns.flatten().tolist()
 
13
  uri = st.secrets['mongo_uri']
14
  client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000)
15
  db = client["NBA_DFS"]
16
+ wnba_db = client["WNBA_DFS"]
17
 
18
+ return db, wnba_db
19
 
20
+ db, wnba_db = init_conn()
21
 
22
+ dk_nba_columns = ['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
23
+ dk_nba_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
24
+ fd_nba_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
25
+ fd_nba_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
26
+
27
+ dk_wnba_columns = ['G1', 'G2', 'F1', 'F2', 'F3', 'UTIL', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
28
+ dk_wnba_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
29
+ fd_wnba_columns = ['G1', 'G2', 'G3', 'F1', 'F2', 'F3', 'F4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
30
+ fd_wnba_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
31
 
32
  roo_format = {'Top_finish': '{:.2%}', 'Top_5_finish': '{:.2%}', 'Top_10_finish': '{:.2%}', '20+%': '{:.2%}', '4x%': '{:.2%}', '5x%': '{:.2%}', '6x%': '{:.2%}', 'GPP%': '{:.2%}'}
33
 
34
  @st.cache_data(ttl=60)
35
+ def load_overall_stats(league: str):
36
+ if league == 'NBA':
37
+ collection = db["DK_Player_Stats"]
38
+ elif league == 'WNBA':
39
+ collection = wnba_db["DK_Player_Stats"]
40
  cursor = collection.find()
41
 
42
  raw_display = pd.DataFrame(list(cursor))
43
+ if league == 'NBA':
44
+ raw_display = raw_display[['Name', 'Salary', 'Position', 'Team', 'Opp', 'Minutes', 'FGM', 'FGA', 'FG2M', 'FG2A', 'Threes', 'FG3A', 'FTM', 'FTA', 'TRB', 'AST', 'STL', 'BLK', 'TOV', '2P', '3P', 'FT',
45
+ 'Points', 'Rebounds', 'Assists', 'PRA', 'PR', 'PA', 'RA', 'Steals', 'Blocks', 'Turnovers', 'Fantasy', 'Raw', 'Own']]
46
+ raw_display = raw_display.rename(columns={"Name": "Player", "Nickname": "Player", "Fantasy": "Median"})
47
+ elif league == 'WNBA':
48
+ raw_display = raw_display.rename(columns={"Name": "Player", "Nickname": "Player", "DK_Proj": "Median", "DK_ID": "ID", "DK_Pos": "Position", "DK_Salary": "Salary", "DK_Own": "Own"})
49
  raw_display = raw_display.loc[raw_display['Median'] > 0]
50
  raw_display = raw_display.apply(pd.to_numeric, errors='ignore')
51
  dk_raw = raw_display.sort_values(by='Median', ascending=False)
52
 
53
+ if league == 'NBA':
54
+ collection = db["FD_Player_Stats"]
55
+ elif league == 'WNBA':
56
+ collection = wnba_db["FD_Player_Stats"]
57
  cursor = collection.find()
58
 
59
  raw_display = pd.DataFrame(list(cursor))
60
+ if league == 'NBA':
61
+ raw_display = raw_display[['Nickname', 'Salary', 'Position', 'Team', 'Opp', 'Minutes', 'FGM', 'FGA', 'FG2M', 'FG2A', 'Threes', 'FG3A', 'FTM', 'FTA', 'TRB', 'AST', 'STL', 'BLK', 'TOV', '2P', '3P', 'FT',
62
+ 'Points', 'Rebounds', 'Assists', 'PRA', 'PR', 'PA', 'RA', 'Steals', 'Blocks', 'Turnovers', 'Fantasy', 'Raw', 'Own']]
63
+ raw_display = raw_display.rename(columns={"Name": "Player", "Nickname": "Player", "Fantasy": "Median"})
64
+ elif league == 'WNBA':
65
+ raw_display = raw_display.rename(columns={"Name": "Player", "Nickname": "Player", "FD_Proj": "Median", "FD_ID": "ID", "FD_Pos": "Position", "FD_Salary": "Salary", "FD_Own": "Own"})
66
  raw_display = raw_display.loc[raw_display['Median'] > 0]
67
  raw_display = raw_display.apply(pd.to_numeric, errors='ignore')
68
  fd_raw = raw_display.sort_values(by='Median', ascending=False)
69
 
70
+ if league == 'NBA':
71
+ collection = db["Secondary_DK_Player_Stats"]
72
+ elif league == 'WNBA':
73
+ collection = wnba_db["Secondary_DK_Player_Stats"]
74
  cursor = collection.find()
75
 
76
  raw_display = pd.DataFrame(list(cursor))
77
+ if league == 'NBA':
78
+ raw_display = raw_display[['Name', 'Salary', 'Position', 'Team', 'Opp', 'Minutes', 'FGM', 'FGA', 'FG2M', 'FG2A', 'Threes', 'FG3A', 'FTM', 'FTA', 'TRB', 'AST', 'STL', 'BLK', 'TOV', '2P', '3P', 'FT',
79
+ 'Points', 'Rebounds', 'Assists', 'PRA', 'PR', 'PA', 'RA', 'Steals', 'Blocks', 'Turnovers', 'Fantasy', 'Raw', 'Own']]
80
+ raw_display = raw_display.rename(columns={"Name": "Player", "Nickname": "Player", "Fantasy": "Median"})
81
+ elif league == 'WNBA':
82
+ raw_display = raw_display.rename(columns={"Name": "Player", "Nickname": "Player", "DK_Proj": "Median", "DK_ID": "ID", "DK_Pos": "Position", "DK_Salary": "Salary", "DK_Own": "Own"})
83
  raw_display = raw_display.loc[raw_display['Median'] > 0]
84
  raw_display = raw_display.apply(pd.to_numeric, errors='ignore')
85
  dk_raw_sec = raw_display.sort_values(by='Median', ascending=False)
86
 
87
+ if league == 'NBA':
88
+ collection = db["Secondary_FD_Player_Stats"]
89
+ elif league == 'WNBA':
90
+ collection = wnba_db["Secondary_FD_Player_Stats"]
91
  cursor = collection.find()
92
 
93
  raw_display = pd.DataFrame(list(cursor))
94
+ if league == 'NBA':
95
+ raw_display = raw_display[['Nickname', 'Salary', 'Position', 'Team', 'Opp', 'Minutes', 'FGM', 'FGA', 'FG2M', 'FG2A', 'Threes', 'FG3A', 'FTM', 'FTA', 'TRB', 'AST', 'STL', 'BLK', 'TOV', '2P', '3P', 'FT',
96
+ 'Points', 'Rebounds', 'Assists', 'PRA', 'PR', 'PA', 'RA', 'Steals', 'Blocks', 'Turnovers', 'Fantasy', 'Raw', 'Own']]
97
+ raw_display = raw_display.rename(columns={"Name": "Player", "Nickname": "Player", "Fantasy": "Median"})
98
+ elif league == 'WNBA':
99
+ raw_display = raw_display.rename(columns={"Name": "Player", "Nickname": "Player", "FD_Proj": "Median", "FD_ID": "ID", "FD_Pos": "Position", "FD_Salary": "Salary", "FD_Own": "Own"})
100
  raw_display = raw_display.loc[raw_display['Median'] > 0]
101
  raw_display = raw_display.apply(pd.to_numeric, errors='ignore')
102
  fd_raw_sec = raw_display.sort_values(by='Median', ascending=False)
103
 
104
+ if league == 'NBA':
105
+ collection = db["Player_SD_Range_Of_Outcomes"]
106
+ elif league == 'WNBA':
107
+ collection = wnba_db["Player_SD_Range_Of_Outcomes"]
108
  cursor = collection.find()
109
 
110
  raw_display = pd.DataFrame(list(cursor))
111
  raw_display = raw_display[['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%',
112
  'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'site', 'version', 'slate', 'timestamp', 'player_id']]
113
+ raw_display['Median'] = raw_display['Median'].replace('', 0).astype(float)
114
  raw_display = raw_display.rename(columns={"player_id": "player_ID"})
115
  raw_display = raw_display.loc[raw_display['Median'] > 0]
116
  raw_display = raw_display.apply(pd.to_numeric, errors='ignore')
117
  sd_raw = raw_display.sort_values(by='Median', ascending=False)
118
+ dk_sd_raw = sd_raw[sd_raw['site'] == 'Draftkings']
119
+ fd_sd_raw = sd_raw[sd_raw['site'] == 'Fanduel']
120
+ fd_sd_raw['player_ID'] = fd_sd_raw['player_ID'].astype(str)
121
+ fd_sd_raw['player_ID'] = fd_sd_raw['player_ID'].str.rsplit('-', n=1).str[0].astype(str)
122
 
123
  print(sd_raw.head(10))
124
 
125
+ if league == 'NBA':
126
+ collection = db["Player_Range_Of_Outcomes"]
127
+ elif league == 'WNBA':
128
+ collection = wnba_db["Player_Range_Of_Outcomes"]
129
  cursor = collection.find()
130
 
131
  raw_display = pd.DataFrame(list(cursor))
132
+ try:
133
+ raw_display = raw_display[['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%',
134
+ 'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'site', 'version', 'slate', 'timestamp', 'player_ID']]
135
+ except:
136
+ raw_display = raw_display[['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%',
137
+ 'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'site', 'version', 'slate', 'timestamp', 'player_id']]
138
+ raw_display = raw_display.rename(columns={"player_id": "player_ID"})
139
+ raw_display['Median'] = raw_display['Median'].replace('', 0).astype(float)
140
  raw_display = raw_display.loc[raw_display['Median'] > 0]
141
  raw_display = raw_display.apply(pd.to_numeric, errors='ignore')
142
  roo_raw = raw_display.sort_values(by='Median', ascending=False)
143
 
144
  timestamp = raw_display['timestamp'].values[0]
145
 
146
+ return dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, sd_raw, dk_sd_raw, fd_sd_raw, timestamp
147
 
148
  @st.cache_data(ttl = 60)
149
+ def init_DK_lineups(slate_desig: str, league: str):
150
 
151
  if slate_desig == 'Main Slate':
152
+ if league == 'NBA':
153
+ collection = db['DK_NBA_name_map']
154
+ elif league == 'WNBA':
155
+ collection = wnba_db['DK_WNBA_name_map']
156
  cursor = collection.find()
157
  raw_data = pd.DataFrame(list(cursor))
158
  names_dict = dict(zip(raw_data['key'], raw_data['value']))
159
+
160
+ if league == 'NBA':
161
+ collection = db["DK_NBA_seed_frame"]
162
+ elif league == 'WNBA':
163
+ collection = wnba_db["DK_WNBA_seed_frame"]
164
  cursor = collection.find().limit(10000)
165
  elif slate_desig == 'Secondary':
166
+ if league == 'NBA':
167
+ collection = db['DK_NBA_Secondary_name_map']
168
+ elif league == 'WNBA':
169
+ collection = wnba_db['DK_WNBA_Secondary_name_map']
170
  cursor = collection.find()
171
  raw_data = pd.DataFrame(list(cursor))
172
  names_dict = dict(zip(raw_data['key'], raw_data['value']))
173
+
174
+ if league == 'NBA':
175
+ collection = db["DK_NBA_Secondary_seed_frame"]
176
+ elif league == 'WNBA':
177
+ collection = wnba_db["DK_WNBA_Secondary_seed_frame"]
178
  cursor = collection.find().limit(10000)
179
  elif slate_desig == 'Auxiliary':
180
  collection = db['DK_NBA_Auxiliary_name_map']
 
186
  cursor = collection.find().limit(10000)
187
 
188
  raw_display = pd.DataFrame(list(cursor))
189
+ if league == 'NBA':
190
+ raw_display = raw_display[['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
191
+ dict_columns = ['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX']
192
+ elif league == 'WNBA':
193
+ raw_display = raw_display[['G1', 'G2', 'F1', 'F2', 'F3', 'UTIL', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
194
+ dict_columns = ['G1', 'G2', 'F1', 'F2', 'F3', 'UTIL']
195
+
196
  for col in dict_columns:
197
  raw_display[col] = raw_display[col].map(names_dict)
198
  DK_seed = raw_display.to_numpy()
 
200
  return DK_seed
201
 
202
  @st.cache_data(ttl = 60)
203
+ def init_DK_SD_lineups(slate_desig: str, league: str):
204
 
205
  if slate_desig == 'Main Slate':
206
+ if league == 'NBA':
207
+ collection = db["DK_NBA_SD_seed_frame"]
208
+ elif league == 'WNBA':
209
+ collection = wnba_db["DK_WNBA_SD_seed_frame"]
210
  elif slate_desig == 'Secondary':
211
+ if league == 'NBA':
212
+ collection = db["DK_NBA_Secondary_SD_seed_frame"]
213
+ elif league == 'WNBA':
214
+ collection = wnba_db["DK_WNBA_Secondary_SD_seed_frame"]
215
  elif slate_desig == 'Auxiliary':
216
  collection = db["DK_NBA_Auxiliary_SD_seed_frame"]
217
 
218
+ cursor = collection.find({"Team_count": {"$lt": 6}}).limit(10000)
219
 
220
  raw_display = pd.DataFrame(list(cursor))
221
  raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
 
224
  return DK_seed
225
 
226
  @st.cache_data(ttl = 60)
227
+ def init_FD_lineups(slate_desig: str, league: str):
228
 
229
  if slate_desig == 'Main Slate':
230
+ if league == 'NBA':
231
+ collection = db['FD_NBA_name_map']
232
+ elif league == 'WNBA':
233
+ collection = wnba_db['FD_WNBA_name_map']
234
  cursor = collection.find()
235
  raw_data = pd.DataFrame(list(cursor))
236
  names_dict = dict(zip(raw_data['key'], raw_data['value']))
237
 
238
+ if league == 'NBA':
239
+ collection = db["FD_NBA_seed_frame"]
240
+ elif league == 'WNBA':
241
+ collection = wnba_db["FD_WNBA_seed_frame"]
242
  cursor = collection.find().limit(10000)
243
  elif slate_desig == 'Secondary':
244
+ if league == 'NBA':
245
+ collection = db['FD_NBA_Secondary_name_map']
246
+ elif league == 'WNBA':
247
+ collection = wnba_db['FD_WNBA_Secondary_name_map']
248
  cursor = collection.find()
249
  raw_data = pd.DataFrame(list(cursor))
250
  names_dict = dict(zip(raw_data['key'], raw_data['value']))
251
 
252
+ if league == 'NBA':
253
+ collection = db["FD_NBA_Secondary_seed_frame"]
254
+ elif league == 'WNBA':
255
+ collection = wnba_db["FD_WNBA_Secondary_seed_frame"]
256
  cursor = collection.find().limit(10000)
257
  elif slate_desig == 'Auxiliary':
258
  collection = db['FD_NBA_Auxiliary_name_map']
 
264
  cursor = collection.find().limit(10000)
265
 
266
  raw_display = pd.DataFrame(list(cursor))
267
+ if league == 'NBA':
268
+ raw_display = raw_display[['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
269
+ dict_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1']
270
+ elif league == 'WNBA':
271
+ raw_display = raw_display[['G1', 'G2', 'G3', 'F1', 'F2', 'F3', 'F4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
272
+ dict_columns = ['G1', 'G2', 'G3', 'F1', 'F2', 'F3', 'F4']
273
  for col in dict_columns:
274
  raw_display[col] = raw_display[col].map(names_dict)
275
  FD_seed = raw_display.to_numpy()
 
277
  return FD_seed
278
 
279
  @st.cache_data(ttl = 60)
280
+ def init_FD_SD_lineups(slate_desig: str, league: str):
281
 
282
  if slate_desig == 'Main Slate':
283
+ if league == 'NBA':
284
+ collection = db["FD_NBA_SD_seed_frame"]
285
+ elif league == 'WNBA':
286
+ collection = wnba_db["FD_WNBA_SD_seed_frame"]
287
  elif slate_desig == 'Secondary':
288
+ if league == 'NBA':
289
+ collection = db["FD_NBA_Secondary_SD_seed_frame"]
290
+ elif league == 'WNBA':
291
+ collection = wnba_db["FD_WNBA_Secondary_SD_seed_frame"]
292
  elif slate_desig == 'Auxiliary':
293
  collection = db["FD_NBA_Auxiliary_SD_seed_frame"]
294
 
295
+ cursor = collection.find({"Team_count": {"$lt": 6}}).limit(10000)
296
 
297
  raw_display = pd.DataFrame(list(cursor))
298
  raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
 
308
  array = pd.DataFrame(array, columns=column_names)
309
  return array.to_csv().encode('utf-8')
310
 
311
+ dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, sd_raw, dk_sd_raw, fd_sd_raw, timestamp = load_overall_stats('NBA')
312
  salary_dict = dict(zip(roo_raw.Player, roo_raw.Salary))
313
  id_dict = dict(zip(roo_raw.Player, roo_raw.player_ID))
314
  salary_dict_sd = dict(zip(sd_raw.Player, sd_raw.Salary))
315
+ dk_id_dict_sd = dict(zip(dk_sd_raw.Player, dk_sd_raw.player_ID))
316
+ fd_id_dict_sd = dict(zip(fd_sd_raw.Player, fd_sd_raw.player_ID))
317
+
318
+ dk_nba_lineups = pd.DataFrame(columns=dk_nba_columns)
319
+ dk_nba_sd_lineups = pd.DataFrame(columns=dk_nba_sd_columns)
320
+ fd_nba_lineups = pd.DataFrame(columns=fd_nba_columns)
321
+ fd_nba_sd_lineups = pd.DataFrame(columns=fd_nba_sd_columns)
322
+
323
+ dk_wnba_lineups = pd.DataFrame(columns=dk_wnba_columns)
324
+ dk_wnba_sd_lineups = pd.DataFrame(columns=dk_wnba_sd_columns)
325
+ fd_wnba_lineups = pd.DataFrame(columns=fd_wnba_columns)
326
+ fd_wnba_sd_lineups = pd.DataFrame(columns=fd_wnba_sd_columns)
327
+
328
  t_stamp = f"Last Update: " + str(timestamp) + f" CST"
329
 
330
  tab1, tab2 = st.tabs(['Range of Outcomes', 'Optimals'])
 
342
  with col2:
343
  if st.button("Load/Reset Data", key='reset1'):
344
  st.cache_data.clear()
345
+ dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, sd_raw, dk_sd_raw, fd_sd_raw, timestamp = load_overall_stats('NBA')
346
  salary_dict = dict(zip(roo_raw.Player, roo_raw.Salary))
347
  id_dict = dict(zip(roo_raw.Player, roo_raw.player_ID))
348
  salary_dict_sd = dict(zip(sd_raw.Player, sd_raw.Salary))
349
+ dk_id_dict_sd = dict(zip(dk_sd_raw.Player, dk_sd_raw.player_ID))
350
+ fd_id_dict_sd = dict(zip(fd_sd_raw.Player, fd_sd_raw.player_ID))
351
+ dk_nba_lineups = pd.DataFrame(columns=dk_nba_columns)
352
+ dk_nba_sd_lineups = pd.DataFrame(columns=dk_nba_sd_columns)
353
+ fd_nba_lineups = pd.DataFrame(columns=fd_nba_columns)
354
+ fd_nba_sd_lineups = pd.DataFrame(columns=fd_nba_sd_columns)
355
+
356
+ dk_wnba_lineups = pd.DataFrame(columns=dk_wnba_columns)
357
+ dk_wnba_sd_lineups = pd.DataFrame(columns=dk_wnba_sd_columns)
358
+ fd_wnba_lineups = pd.DataFrame(columns=fd_wnba_columns)
359
+ fd_wnba_sd_lineups = pd.DataFrame(columns=fd_wnba_sd_columns)
360
  t_stamp = f"Last Update: " + str(timestamp) + f" CST"
361
  for key in st.session_state.keys():
362
  del st.session_state[key]
363
+ col1, col2, col3, col4, col5, col6 = st.columns(6)
364
  with col1:
365
  view_var2 = st.radio("View Type", ('Simple', 'Advanced'), key='view_var2')
366
  with col2:
367
+ league_var = st.radio("What League to load:", ('NBA', 'WNBA'), key='league_var')
368
+ dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, sd_raw, dk_sd_raw, fd_sd_raw, timestamp = load_overall_stats(league_var)
369
  with col3:
370
+ slate_type_var2 = st.radio("What slate type are you working with?", ('Regular', 'Showdown'), key='slate_type_var2')
371
+ with col4:
372
  site_var2 = st.radio("Site", ('Draftkings', 'Fanduel'), key='site_var2')
373
 
374
  # Process site selection
 
382
  site_baselines = roo_raw[roo_raw['site'] == 'Fanduel']
383
  elif slate_type_var2 == 'Showdown':
384
  site_baselines = sd_raw[sd_raw['site'] == 'Fanduel']
385
+ with col5:
386
  slate_split = st.radio("Slate Type", ('Main Slate', 'Secondary'), key='slate_split')
387
 
388
  if slate_split == 'Main Slate':
 
396
  elif slate_type_var2 == 'Showdown':
397
  raw_baselines = site_baselines[site_baselines['slate'] == 'Showdown #2']
398
 
399
+ with col6:
400
  split_var2 = st.radio("Slate Range", ('Full Slate Run', 'Specific Games'), key='split_var2')
401
  if split_var2 == 'Specific Games':
402
  team_var2 = st.multiselect('Select teams for ROO', options=raw_baselines['Team'].unique(), key='team_var2')
 
448
  with st.expander("Info and Filters"):
449
  if st.button("Load/Reset Data", key='reset2'):
450
  st.cache_data.clear()
451
+ dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, sd_raw, dk_sd_raw, fd_sd_raw, timestamp = load_overall_stats('NBA')
452
  salary_dict = dict(zip(roo_raw.Player, roo_raw.Salary))
453
  id_dict = dict(zip(roo_raw.Player, roo_raw.player_ID))
454
  salary_dict_sd = dict(zip(sd_raw.Player, sd_raw.Salary))
455
+ dk_id_dict_sd = dict(zip(dk_sd_raw.Player, dk_sd_raw.player_ID))
456
+ fd_id_dict_sd = dict(zip(fd_sd_raw.Player, fd_sd_raw.player_ID))
457
+ dk_nba_lineups = pd.DataFrame(columns=dk_nba_columns)
458
+ dk_nba_sd_lineups = pd.DataFrame(columns=dk_nba_sd_columns)
459
+ fd_nba_lineups = pd.DataFrame(columns=fd_nba_columns)
460
+ fd_nba_sd_lineups = pd.DataFrame(columns=fd_nba_sd_columns)
461
+
462
+ dk_wnba_lineups = pd.DataFrame(columns=dk_wnba_columns)
463
+ dk_wnba_sd_lineups = pd.DataFrame(columns=dk_wnba_sd_columns)
464
+ fd_wnba_lineups = pd.DataFrame(columns=fd_wnba_columns)
465
+ fd_wnba_sd_lineups = pd.DataFrame(columns=fd_wnba_sd_columns)
466
  t_stamp = f"Last Update: " + str(timestamp) + f" CST"
467
  for key in st.session_state.keys():
468
  del st.session_state[key]
469
 
470
+ col1, col2, col3, col4, col5, col6 = st.columns(6)
471
  with col1:
472
+ league_var2 = st.radio("What League to load:", ('NBA', 'WNBA'), key='league_var2')
473
  with col2:
474
+ slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary'))
475
+ with col3:
476
  site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'))
477
  if 'working_seed' in st.session_state:
478
  del st.session_state['working_seed']
 
 
479
  with col4:
480
+ slate_type_var1 = st.radio("What slate type are you working with?", ('Regular', 'Showdown'))
481
  with col5:
482
+ lineup_num_var = st.number_input("How many lineups do you want to display?", min_value=1, max_value=1000, value=150, step=1)
483
+ with col6:
484
  if site_var1 == 'Draftkings':
485
+ if league_var2 == 'NBA':
486
+ if slate_type_var1 == 'Regular':
487
+ column_names = dk_nba_columns
488
+ elif slate_type_var1 == 'Showdown':
489
+ column_names = dk_nba_sd_columns
490
+ elif league_var2 == 'WNBA':
491
+ if slate_type_var1 == 'Regular':
492
+ column_names = dk_wnba_columns
493
+ elif slate_type_var1 == 'Showdown':
494
+ column_names = dk_wnba_sd_columns
495
 
496
  player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1')
497
  if player_var1 == 'Specific Players':
 
500
  player_var2 = dk_raw.Player.values.tolist()
501
 
502
  elif site_var1 == 'Fanduel':
503
+ if league_var2 == 'NBA':
504
+ if slate_type_var1 == 'Regular':
505
+ column_names = fd_nba_columns
506
+ elif slate_type_var1 == 'Showdown':
507
+ column_names = fd_nba_sd_columns
508
+ elif league_var2 == 'WNBA':
509
+ if slate_type_var1 == 'Regular':
510
+ column_names = fd_wnba_columns
511
+ elif slate_type_var1 == 'Showdown':
512
+ column_names = fd_wnba_sd_columns
513
 
514
  player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1')
515
  if player_var1 == 'Specific Players':
 
517
  elif player_var1 == 'Full Slate':
518
  player_var2 = fd_raw.Player.values.tolist()
519
  if st.button("Prepare data export", key='data_export'):
520
+
521
  if site_var1 == 'Draftkings':
522
+ if slate_type_var1 == 'Regular':
523
+ data_export = init_DK_lineups(slate_var1, league_var2)
524
+ data_export_names = data_export.copy()
525
+ for col_idx in range(8):
526
+ data_export[:, col_idx] = np.array([id_dict.get(player, player) for player in data_export[:, col_idx]])
527
+ elif slate_type_var1 == 'Showdown':
528
+ data_export = init_DK_SD_lineups(slate_var1, league_var2)
529
+ data_export_names = data_export.copy()
530
+ for col_idx in range(6):
531
+ data_export[:, col_idx] = np.array([dk_id_dict_sd.get(player, player) for player in data_export[:, col_idx]])
532
+
533
  elif site_var1 == 'Fanduel':
534
+ if slate_type_var1 == 'Regular':
535
+ data_export = init_FD_lineups(slate_var1, league_var2)
536
+ data_export_names = data_export.copy()
537
+ for col_idx in range(9):
538
+ data_export[:, col_idx] = np.array([id_dict.get(player, player) for player in data_export[:, col_idx]])
539
+ elif slate_type_var1 == 'Showdown':
540
+ data_export = init_FD_SD_lineups(slate_var1, league_var2)
541
+ data_export_names = data_export.copy()
542
+ for col_idx in range(6):
543
+ data_export[:, col_idx] = np.array([fd_id_dict_sd.get(player, player) for player in data_export[:, col_idx]])
544
+ st.download_button(
545
+ label="Export optimals (Names)",
546
+ data=convert_df(data_export_names),
547
+ file_name='NBA_optimals_export.csv',
548
+ mime='text/csv',
549
+ )
550
  st.download_button(
551
+ label="Export optimals (IDs)",
552
  data=convert_df(data_export),
553
  file_name='NBA_optimals_export.csv',
554
  mime='text/csv',
555
+ )
556
 
557
 
558
  if site_var1 == 'Draftkings':
 
566
 
567
  elif 'working_seed' not in st.session_state:
568
  if slate_type_var1 == 'Regular':
569
+ st.session_state.working_seed = init_DK_lineups(slate_var1, league_var2)
570
  elif slate_type_var1 == 'Showdown':
571
+ st.session_state.working_seed = init_DK_SD_lineups(slate_var1, league_var2)
572
  st.session_state.working_seed = st.session_state.working_seed
573
  if player_var1 == 'Specific Players':
574
  st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]
575
  elif player_var1 == 'Full Slate':
576
  if slate_type_var1 == 'Regular':
577
+ st.session_state.working_seed = init_DK_lineups(slate_var1, league_var2)
578
  elif slate_type_var1 == 'Showdown':
579
+ st.session_state.working_seed = init_DK_SD_lineups(slate_var1, league_var2)
580
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
581
 
582
  elif site_var1 == 'Fanduel':
 
590
 
591
  elif 'working_seed' not in st.session_state:
592
  if slate_type_var1 == 'Regular':
593
+ st.session_state.working_seed = init_FD_lineups(slate_var1, league_var2)
594
  elif slate_type_var1 == 'Showdown':
595
+ st.session_state.working_seed = init_FD_SD_lineups(slate_var1, league_var2)
596
  st.session_state.working_seed = st.session_state.working_seed
597
  if player_var1 == 'Specific Players':
598
  st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]
599
  elif player_var1 == 'Full Slate':
600
  if slate_type_var1 == 'Regular':
601
+ st.session_state.working_seed = init_FD_lineups(slate_var1, league_var2)
602
  elif slate_type_var1 == 'Showdown':
603
+ st.session_state.working_seed = init_FD_SD_lineups(slate_var1, league_var2)
604
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
605
 
606
  export_file = st.session_state.data_export_display.copy()
 
609
  for col_idx in range(8):
610
  export_file.iloc[:, col_idx] = export_file.iloc[:, col_idx].map(id_dict)
611
  elif slate_type_var1 == 'Showdown':
612
+ for col_idx in range(6):
613
+ export_file.iloc[:, col_idx] = export_file.iloc[:, col_idx].map(dk_id_dict_sd)
614
  elif site_var1 == 'Fanduel':
615
  if slate_type_var1 == 'Regular':
616
  for col_idx in range(9):
617
  export_file.iloc[:, col_idx] = export_file.iloc[:, col_idx].map(id_dict)
618
  elif slate_type_var1 == 'Showdown':
619
+ for col_idx in range(6):
620
+ export_file.iloc[:, col_idx] = export_file.iloc[:, col_idx].map(fd_id_dict_sd)
621
 
622
  with st.container():
623
  if st.button("Reset Optimals", key='reset3'):
624
  for key in st.session_state.keys():
625
  del st.session_state[key]
626
  if site_var1 == 'Draftkings':
627
+ if league_var2 == 'NBA':
628
+ if slate_type_var1 == 'Regular':
629
+ st.session_state.working_seed = dk_nba_lineups.copy()
630
+ elif slate_type_var1 == 'Showdown':
631
+ st.session_state.working_seed = dk_nba_sd_lineups.copy()
632
+ elif league_var2 == 'WNBA':
633
+ if slate_type_var1 == 'Regular':
634
+ st.session_state.working_seed = dk_wnba_lineups.copy()
635
+ elif slate_type_var1 == 'Showdown':
636
+ st.session_state.working_seed = dk_wnba_sd_lineups.copy()
637
  elif site_var1 == 'Fanduel':
638
+ if league_var2 == 'NBA':
639
+ if slate_type_var1 == 'Regular':
640
+ st.session_state.working_seed = fd_nba_lineups.copy()
641
+ elif slate_type_var1 == 'Showdown':
642
+ st.session_state.working_seed = fd_nba_sd_lineups.copy()
643
+ elif league_var2 == 'WNBA':
644
+ if slate_type_var1 == 'Regular':
645
+ st.session_state.working_seed = fd_wnba_lineups.copy()
646
+ elif slate_type_var1 == 'Showdown':
647
+ st.session_state.working_seed = fd_wnba_sd_lineups.copy()
648
  if 'data_export_display' in st.session_state:
649
  st.dataframe(st.session_state.data_export_display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), height=500, use_container_width = True)
650
  st.download_button(
 
658
  if 'working_seed' in st.session_state:
659
  # Create a new dataframe with summary statistics
660
  if site_var1 == 'Draftkings':
661
+ if league_var2 == 'NBA':
662
+ if slate_type_var1 == 'Regular':
663
+ summary_df = pd.DataFrame({
664
+ 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
665
+ 'Salary': [
666
+ np.min(st.session_state.working_seed[:,8]),
667
+ np.mean(st.session_state.working_seed[:,8]),
668
+ np.max(st.session_state.working_seed[:,8]),
669
+ np.std(st.session_state.working_seed[:,8])
670
+ ],
671
+ 'Proj': [
672
+ np.min(st.session_state.working_seed[:,9]),
673
+ np.mean(st.session_state.working_seed[:,9]),
674
+ np.max(st.session_state.working_seed[:,9]),
675
+ np.std(st.session_state.working_seed[:,9])
676
+ ],
677
+ 'Own': [
678
+ np.min(st.session_state.working_seed[:,14]),
679
+ np.mean(st.session_state.working_seed[:,14]),
680
+ np.max(st.session_state.working_seed[:,14]),
681
+ np.std(st.session_state.working_seed[:,14])
682
+ ]
683
+ })
684
+ elif slate_type_var1 == 'Showdown':
685
+ summary_df = pd.DataFrame({
686
+ 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
687
+ 'Salary': [
688
+ np.min(st.session_state.working_seed[:,6]),
689
+ np.mean(st.session_state.working_seed[:,6]),
690
+ np.max(st.session_state.working_seed[:,6]),
691
+ np.std(st.session_state.working_seed[:,6])
692
+ ],
693
+ 'Proj': [
694
+ np.min(st.session_state.working_seed[:,7]),
695
+ np.mean(st.session_state.working_seed[:,7]),
696
+ np.max(st.session_state.working_seed[:,7]),
697
+ np.std(st.session_state.working_seed[:,7])
698
+ ],
699
+ 'Own': [
700
+ np.min(st.session_state.working_seed[:,12]),
701
+ np.mean(st.session_state.working_seed[:,12]),
702
+ np.max(st.session_state.working_seed[:,12]),
703
+ np.std(st.session_state.working_seed[:,12])
704
+ ]
705
+ })
706
+ elif league_var2 == 'WNBA':
707
+ if slate_type_var1 == 'Regular':
708
+ summary_df = pd.DataFrame({
709
+ 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
710
+ 'Salary': [
711
+ np.min(st.session_state.working_seed[:,6]),
712
+ np.mean(st.session_state.working_seed[:,6]),
713
+ np.max(st.session_state.working_seed[:,6]),
714
+ np.std(st.session_state.working_seed[:,6])
715
+ ],
716
+ 'Proj': [
717
+ np.min(st.session_state.working_seed[:,7]),
718
+ np.mean(st.session_state.working_seed[:,7]),
719
+ np.max(st.session_state.working_seed[:,7]),
720
+ np.std(st.session_state.working_seed[:,7])
721
+ ],
722
+ 'Own': [
723
+ np.min(st.session_state.working_seed[:,12]),
724
+ np.mean(st.session_state.working_seed[:,12]),
725
+ np.max(st.session_state.working_seed[:,12]),
726
+ np.std(st.session_state.working_seed[:,12])
727
+ ]
728
+ })
729
+ elif slate_type_var1 == 'Showdown':
730
+ summary_df = pd.DataFrame({
731
+ 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
732
+ 'Salary': [
733
+ np.min(st.session_state.working_seed[:,6]),
734
+ np.mean(st.session_state.working_seed[:,6]),
735
+ np.max(st.session_state.working_seed[:,6]),
736
+ np.std(st.session_state.working_seed[:,6])
737
+ ],
738
+ 'Proj': [
739
+ np.min(st.session_state.working_seed[:,7]),
740
+ np.mean(st.session_state.working_seed[:,7]),
741
+ np.max(st.session_state.working_seed[:,7]),
742
+ np.std(st.session_state.working_seed[:,7])
743
+ ],
744
+ 'Own': [
745
+ np.min(st.session_state.working_seed[:,12]),
746
+ np.mean(st.session_state.working_seed[:,12]),
747
+ np.max(st.session_state.working_seed[:,12]),
748
+ np.std(st.session_state.working_seed[:,12])
749
+ ]
750
+ })
751
 
752
  elif site_var1 == 'Fanduel':
753
+ if league_var2 == 'NBA':
754
+ if slate_type_var1 == 'Regular':
755
+ summary_df = pd.DataFrame({
756
+ 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
757
+ 'Salary': [
758
+ np.min(st.session_state.working_seed[:,9]),
759
+ np.mean(st.session_state.working_seed[:,9]),
760
+ np.max(st.session_state.working_seed[:,9]),
761
+ np.std(st.session_state.working_seed[:,9])
762
+ ],
763
+ 'Proj': [
764
+ np.min(st.session_state.working_seed[:,10]),
765
+ np.mean(st.session_state.working_seed[:,10]),
766
+ np.max(st.session_state.working_seed[:,10]),
767
+ np.std(st.session_state.working_seed[:,10])
768
+ ],
769
+ 'Own': [
770
+ np.min(st.session_state.working_seed[:,15]),
771
+ np.mean(st.session_state.working_seed[:,15]),
772
+ np.max(st.session_state.working_seed[:,15]),
773
+ np.std(st.session_state.working_seed[:,15])
774
+ ]
775
+ })
776
+ elif slate_type_var1 == 'Showdown':
777
+ summary_df = pd.DataFrame({
778
  'Metric': ['Min', 'Average', 'Max', 'STDdev'],
779
+ 'Salary': [
780
+ np.min(st.session_state.working_seed[:,6]),
781
+ np.mean(st.session_state.working_seed[:,6]),
782
+ np.max(st.session_state.working_seed[:,6]),
783
+ np.std(st.session_state.working_seed[:,6])
784
+ ],
785
+ 'Proj': [
786
+ np.min(st.session_state.working_seed[:,7]),
787
+ np.mean(st.session_state.working_seed[:,7]),
788
+ np.max(st.session_state.working_seed[:,7]),
789
+ np.std(st.session_state.working_seed[:,7])
790
+ ],
791
+ 'Own': [
792
+ np.min(st.session_state.working_seed[:,12]),
793
+ np.mean(st.session_state.working_seed[:,12]),
794
+ np.max(st.session_state.working_seed[:,12]),
795
+ np.std(st.session_state.working_seed[:,12])
796
+ ]
797
+ })
798
+ elif league_var2 == 'WNBA':
799
+ if slate_type_var1 == 'Regular':
800
+ summary_df = pd.DataFrame({
801
+ 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
802
+ 'Salary': [
803
+ np.min(st.session_state.working_seed[:,7]),
804
+ np.mean(st.session_state.working_seed[:,7]),
805
+ np.max(st.session_state.working_seed[:,7]),
806
+ np.std(st.session_state.working_seed[:,7])
807
+ ],
808
+ 'Proj': [
809
+ np.min(st.session_state.working_seed[:,8]),
810
+ np.mean(st.session_state.working_seed[:,8]),
811
+ np.max(st.session_state.working_seed[:,8]),
812
+ np.std(st.session_state.working_seed[:,8])
813
+ ],
814
+ 'Own': [
815
+ np.min(st.session_state.working_seed[:,13]),
816
+ np.mean(st.session_state.working_seed[:,13]),
817
+ np.max(st.session_state.working_seed[:,13]),
818
+ np.std(st.session_state.working_seed[:,13])
819
+ ]
820
+ })
821
+ elif slate_type_var1 == 'Showdown':
822
+ summary_df = pd.DataFrame({
823
+ 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
824
+ 'Salary': [
825
+ np.min(st.session_state.working_seed[:,6]),
826
+ np.mean(st.session_state.working_seed[:,6]),
827
+ np.max(st.session_state.working_seed[:,6]),
828
+ np.std(st.session_state.working_seed[:,6])
829
+ ],
830
+ 'Proj': [
831
+ np.min(st.session_state.working_seed[:,7]),
832
+ np.mean(st.session_state.working_seed[:,7]),
833
+ np.max(st.session_state.working_seed[:,7]),
834
+ np.std(st.session_state.working_seed[:,7])
835
+ ],
836
+ 'Own': [
837
+ np.min(st.session_state.working_seed[:,12]),
838
+ np.mean(st.session_state.working_seed[:,12]),
839
+ np.max(st.session_state.working_seed[:,12]),
840
+ np.std(st.session_state.working_seed[:,12])
841
+ ]
842
+ })
843
 
844
  # Set the index of the summary dataframe as the "Metric" column
845
  summary_df = summary_df.set_index('Metric')
 
856
  tab1, tab2 = st.tabs(["Display Frequency", "Seed Frame Frequency"])
857
  with tab1:
858
  if 'data_export_display' in st.session_state:
859
+ if league_var2 == 'NBA':
860
+ if slate_type_var1 == 'Regular':
861
+ if site_var1 == 'Draftkings':
862
+ player_columns = st.session_state.data_export_display.iloc[:, :8]
863
+ elif site_var1 == 'Fanduel':
864
+ player_columns = st.session_state.data_export_display.iloc[:, :9]
865
+ elif slate_type_var1 == 'Showdown':
866
+ if site_var1 == 'Draftkings':
867
+ player_columns = st.session_state.data_export_display.iloc[:, :5]
868
+ elif site_var1 == 'Fanduel':
869
+ player_columns = st.session_state.data_export_display.iloc[:, :5]
870
+ elif league_var2 == 'WNBA':
871
+ if slate_type_var1 == 'Regular':
872
+ if site_var1 == 'Draftkings':
873
+ player_columns = st.session_state.data_export_display.iloc[:, :7]
874
+ elif site_var1 == 'Fanduel':
875
+ player_columns = st.session_state.data_export_display.iloc[:, :8]
876
+ elif slate_type_var1 == 'Showdown':
877
+ if site_var1 == 'Draftkings':
878
+ player_columns = st.session_state.data_export_display.iloc[:, :5]
879
+ elif site_var1 == 'Fanduel':
880
+ player_columns = st.session_state.data_export_display.iloc[:, :5]
881
+
882
 
883
  # Flatten the DataFrame and count unique values
884
  value_counts = player_columns.values.flatten().tolist()
 
909
  )
910
  with tab2:
911
  if 'working_seed' in st.session_state:
912
+ if league_var2 == 'NBA':
913
+ if slate_type_var1 == 'Regular':
914
+ if site_var1 == 'Draftkings':
915
+ player_columns = st.session_state.working_seed[:, :8]
916
+ elif site_var1 == 'Fanduel':
917
+ player_columns = st.session_state.working_seed[:, :9]
918
+ elif slate_type_var1 == 'Showdown':
919
+ if site_var1 == 'Draftkings':
920
+ player_columns = st.session_state.working_seed[:, :5]
921
+ elif site_var1 == 'Fanduel':
922
+ player_columns = st.session_state.working_seed[:, :5]
923
+ elif league_var2 == 'WNBA':
924
+ if slate_type_var1 == 'Regular':
925
+ if site_var1 == 'Draftkings':
926
+ player_columns = st.session_state.working_seed[:, :7]
927
+ elif site_var1 == 'Fanduel':
928
+ player_columns = st.session_state.working_seed[:, :8]
929
+ elif slate_type_var1 == 'Showdown':
930
+ if site_var1 == 'Draftkings':
931
+ player_columns = st.session_state.working_seed[:, :5]
932
+ elif site_var1 == 'Fanduel':
933
+ player_columns = st.session_state.working_seed[:, :5]
934
 
935
  # Flatten the DataFrame and count unique values
936
  value_counts = player_columns.flatten().tolist()