James McCool commited on
Commit
b5abcc5
·
1 Parent(s): 2675c26

Enhance app.py: add support for secondary slate data retrieval and processing, update overall stats function to include new data, and improve data export functionality for both Draftkings and Fanduel

Browse files
Files changed (1) hide show
  1. app.py +59 -36
app.py CHANGED
@@ -19,7 +19,9 @@ def init_conn():
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
  fd_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
 
23
 
24
  roo_format = {'Top_finish': '{:.2%}', 'Top_5_finish': '{:.2%}', 'Top_10_finish': '{:.2%}', '20+%': '{:.2%}', '4x%': '{:.2%}', '5x%': '{:.2%}', '6x%': '{:.2%}', 'GPP%': '{:.2%}'}
25
 
@@ -101,6 +103,16 @@ def load_overall_stats():
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
  collection = db["Player_Range_Of_Outcomes"]
105
  cursor = collection.find()
106
 
@@ -113,7 +125,7 @@ def load_overall_stats():
113
 
114
  timestamp = raw_display['timestamp'].values[0]
115
 
116
- return dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, timestamp
117
 
118
  @st.cache_data(ttl = 60)
119
  def init_DK_lineups(slate_desig: str):
@@ -233,8 +245,11 @@ def convert_df(array):
233
  array = pd.DataFrame(array, columns=column_names)
234
  return array.to_csv().encode('utf-8')
235
 
236
- dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, timestamp = load_overall_stats()
237
  salary_dict = dict(zip(roo_raw.Player, roo_raw.Salary))
 
 
 
238
 
239
  try:
240
  dk_lineups = init_DK_lineups('Main Slate')
@@ -259,10 +274,18 @@ with tab1:
259
  with col2:
260
  if st.button("Load/Reset Data", key='reset1'):
261
  st.cache_data.clear()
262
- dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, timestamp = load_overall_stats()
 
263
  id_dict = dict(zip(roo_raw.Player, roo_raw.player_ID))
264
- dk_lineups = init_DK_lineups('Main Slate')
265
- fd_lineups = init_FD_lineups('Main Slate')
 
 
 
 
 
 
 
266
  t_stamp = f"Last Update: " + str(timestamp) + f" CST"
267
  for key in st.session_state.keys():
268
  del st.session_state[key]
@@ -338,28 +361,33 @@ with tab2:
338
  with st.expander("Info and Filters"):
339
  if st.button("Load/Reset Data", key='reset2'):
340
  st.cache_data.clear()
341
- dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, timestamp = load_overall_stats()
342
- dk_lineups = init_DK_lineups('Main Slate')
343
- fd_lineups = init_FD_lineups('Main Slate')
 
 
 
 
 
 
 
 
 
344
  t_stamp = f"Last Update: " + str(timestamp) + f" CST"
345
  for key in st.session_state.keys():
346
  del st.session_state[key]
347
 
348
  col1, col2, col3, col4, col5 = st.columns(5)
349
  with col1:
350
- slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Just the Main Slate'))
351
  with col2:
352
  site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'))
353
  with col3:
354
- lineup_num_var = st.number_input("How many lineups do you want to display?", min_value=1, max_value=1000, value=150, step=1)
355
  with col4:
 
 
356
  if site_var1 == 'Draftkings':
357
- raw_baselines = dk_raw
358
- ROO_slice = roo_raw[roo_raw['site'] == 'Draftkings']
359
- id_dict = dict(zip(ROO_slice.Player, ROO_slice.player_ID))
360
- # Get the minimum and maximum ownership values from dk_lineups
361
- min_own = np.min(dk_lineups[:,14])
362
- max_own = np.max(dk_lineups[:,14])
363
  column_names = dk_columns
364
 
365
  player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1')
@@ -369,11 +397,6 @@ with tab2:
369
  player_var2 = dk_raw.Player.values.tolist()
370
 
371
  elif site_var1 == 'Fanduel':
372
- raw_baselines = fd_raw
373
- ROO_slice = roo_raw[roo_raw['site'] == 'Fanduel']
374
- id_dict = dict(zip(ROO_slice.Player, ROO_slice.player_ID))
375
- min_own = np.min(fd_lineups[:,15])
376
- max_own = np.max(fd_lineups[:,15])
377
  column_names = fd_columns
378
 
379
  player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1')
@@ -381,21 +404,21 @@ with tab2:
381
  player_var2 = st.multiselect('Which players do you want?', options = fd_raw['Player'].unique())
382
  elif player_var1 == 'Full Slate':
383
  player_var2 = fd_raw.Player.values.tolist()
384
- with col5:
385
- if st.button("Prepare data export", key='data_export'):
386
- data_export = st.session_state.working_seed.copy()
387
- if site_var1 == 'Draftkings':
388
- for col_idx in range(8):
389
- data_export[:, col_idx] = np.array([id_dict.get(player, player) for player in data_export[:, col_idx]])
390
- elif site_var1 == 'Fanduel':
391
- for col_idx in range(9):
392
- data_export[:, col_idx] = np.array([id_dict.get(player, player) for player in data_export[:, col_idx]])
393
- st.download_button(
394
- label="Export optimals set",
395
- data=convert_df(data_export),
396
- file_name='NBA_optimals_export.csv',
397
- mime='text/csv',
398
- )
399
 
400
  if site_var1 == 'Draftkings':
401
  if 'working_seed' in st.session_state:
 
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
 
 
103
  raw_display = raw_display.apply(pd.to_numeric, errors='ignore')
104
  fd_raw_sec = raw_display.sort_values(by='Median', ascending=False)
105
 
106
+ collection = db["Player_SD_Range_Of_Outcomes"]
107
+ cursor = collection.find()
108
+
109
+ raw_display = pd.DataFrame(list(cursor))
110
+ 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%',
111
+ 'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'site', 'version', 'slate', 'timestamp', 'player_ID']]
112
+ raw_display = raw_display.loc[raw_display['Median'] > 0]
113
+ raw_display = raw_display.apply(pd.to_numeric, errors='ignore')
114
+ sd_raw = raw_display.sort_values(by='Median', ascending=False)
115
+
116
  collection = db["Player_Range_Of_Outcomes"]
117
  cursor = collection.find()
118
 
 
125
 
126
  timestamp = raw_display['timestamp'].values[0]
127
 
128
+ return dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, sd_raw, timestamp
129
 
130
  @st.cache_data(ttl = 60)
131
  def init_DK_lineups(slate_desig: str):
 
245
  array = pd.DataFrame(array, columns=column_names)
246
  return array.to_csv().encode('utf-8')
247
 
248
+ dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, sd_raw, timestamp = load_overall_stats()
249
  salary_dict = dict(zip(roo_raw.Player, roo_raw.Salary))
250
+ id_dict = dict(zip(roo_raw.Player, roo_raw.player_ID))
251
+ salary_dict_sd = dict(zip(sd_raw.Player, sd_raw.Salary))
252
+ id_dict_sd = dict(zip(sd_raw.Player, sd_raw.player_ID))
253
 
254
  try:
255
  dk_lineups = init_DK_lineups('Main Slate')
 
274
  with col2:
275
  if st.button("Load/Reset Data", key='reset1'):
276
  st.cache_data.clear()
277
+ dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, sd_raw, timestamp = load_overall_stats()
278
+ salary_dict = dict(zip(roo_raw.Player, roo_raw.Salary))
279
  id_dict = dict(zip(roo_raw.Player, roo_raw.player_ID))
280
+ salary_dict_sd = dict(zip(sd_raw.Player, sd_raw.Salary))
281
+ id_dict_sd = dict(zip(sd_raw.Player, sd_raw.player_ID))
282
+
283
+ try:
284
+ dk_lineups = init_DK_lineups('Main Slate')
285
+ fd_lineups = init_FD_lineups('Main Slate')
286
+ except:
287
+ dk_lineups = pd.DataFrame(columns=dk_columns)
288
+ fd_lineups = pd.DataFrame(columns=fd_columns)
289
  t_stamp = f"Last Update: " + str(timestamp) + f" CST"
290
  for key in st.session_state.keys():
291
  del st.session_state[key]
 
361
  with st.expander("Info and Filters"):
362
  if st.button("Load/Reset Data", key='reset2'):
363
  st.cache_data.clear()
364
+ dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, sd_raw, timestamp = load_overall_stats()
365
+ salary_dict = dict(zip(roo_raw.Player, roo_raw.Salary))
366
+ id_dict = dict(zip(roo_raw.Player, roo_raw.player_ID))
367
+ salary_dict_sd = dict(zip(sd_raw.Player, sd_raw.Salary))
368
+ id_dict_sd = dict(zip(sd_raw.Player, sd_raw.player_ID))
369
+
370
+ try:
371
+ dk_lineups = init_DK_lineups('Main Slate')
372
+ fd_lineups = init_FD_lineups('Main Slate')
373
+ except:
374
+ dk_lineups = pd.DataFrame(columns=dk_columns)
375
+ fd_lineups = pd.DataFrame(columns=fd_columns)
376
  t_stamp = f"Last Update: " + str(timestamp) + f" CST"
377
  for key in st.session_state.keys():
378
  del st.session_state[key]
379
 
380
  col1, col2, col3, col4, col5 = st.columns(5)
381
  with col1:
382
+ slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary'))
383
  with col2:
384
  site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'))
385
  with col3:
386
+ slate_type_var1 = st.radio("What slate type are you working with?", ('Regular', 'Showdown'))
387
  with col4:
388
+ lineup_num_var = st.number_input("How many lineups do you want to display?", min_value=1, max_value=1000, value=150, step=1)
389
+ with col5:
390
  if site_var1 == 'Draftkings':
 
 
 
 
 
 
391
  column_names = dk_columns
392
 
393
  player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1')
 
397
  player_var2 = dk_raw.Player.values.tolist()
398
 
399
  elif site_var1 == 'Fanduel':
 
 
 
 
 
400
  column_names = fd_columns
401
 
402
  player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1')
 
404
  player_var2 = st.multiselect('Which players do you want?', options = fd_raw['Player'].unique())
405
  elif player_var1 == 'Full Slate':
406
  player_var2 = fd_raw.Player.values.tolist()
407
+ if st.button("Prepare data export", key='data_export'):
408
+ data_export = st.session_state.working_seed.copy()
409
+ if site_var1 == 'Draftkings':
410
+ for col_idx in range(8):
411
+ data_export[:, col_idx] = np.array([id_dict.get(player, player) for player in data_export[:, col_idx]])
412
+ elif site_var1 == 'Fanduel':
413
+ for col_idx in range(9):
414
+ data_export[:, col_idx] = np.array([id_dict.get(player, player) for player in data_export[:, col_idx]])
415
+ st.download_button(
416
+ label="Export optimals set",
417
+ data=convert_df(data_export),
418
+ file_name='NBA_optimals_export.csv',
419
+ mime='text/csv',
420
+ )
421
+
422
 
423
  if site_var1 == 'Draftkings':
424
  if 'working_seed' in st.session_state: