James McCool commited on
Commit
f02bae9
·
1 Parent(s): 6c387a5

Refactor Streamlit app layout and functionality to improve user experience. Introduced new columns for data loading and viewing options, added a segmented control for tab selection, and streamlined data reset logic. Enhanced site selection handling for Draftkings and Fanduel, ensuring consistent functionality across different views.

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +73 -61
src/streamlit_app.py CHANGED
@@ -184,19 +184,42 @@ dk_id_dict_sd = dict(zip(sd_roo_data['Player'], sd_roo_data['player_id']))
184
  fd_id_dict = dict(zip(roo_data[roo_data['Site'] == 'Fanduel']['Player'], roo_data[roo_data['Site'] == 'Fanduel']['player_id']))
185
  fd_id_dict_sd = dk_id_dict_sd
186
  hold_display = roo_data
187
- lineup_display = []
188
- check_list = []
189
- rand_player = 0
190
- boost_player = 0
191
- salaryCut = 0
192
 
193
- tab1, tab2 = st.tabs(["Player Overall Projections", "Optimals and Exposures"])
194
-
195
- with tab1:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
196
  with st.expander("Info and Filters"):
197
  if st.button("Reset Data", key='reset1'):
198
- # Clear values from *all* all in-memory and on-disk data caches:
199
- # i.e. clear values from both square and cube
200
  st.cache_data.clear()
201
  roo_data, sd_roo_data, timestamp = init_baselines()
202
  dk_id_dict = dict(zip(roo_data[roo_data['Site'] == 'Draftkings']['Player'], roo_data[roo_data['Site'] == 'Draftkings']['player_id']))
@@ -210,20 +233,14 @@ with tab1:
210
  del st.session_state[key]
211
 
212
  st.write(timestamp)
213
-
214
- col1, col2, col3 = st.columns(3)
215
- with col1:
216
- view_var = st.radio("Select a View", ["Simple", "Advanced"])
217
- with col2:
218
- site_var = st.radio("Select a Site", ["Draftkings", "FanDuel"])
219
- with col3:
220
- type_var = st.radio("Select a Type", ["Full Slate", "Showdown"])
221
- if type_var == "Full Slate":
222
- display = hold_display[hold_display['Site'] == site_var]
223
- display = display.drop_duplicates(subset=['Player'])
224
- elif type_var == "Showdown":
225
- display = sd_roo_data
226
- display = display.drop_duplicates(subset=['Player'])
227
 
228
  export_data = display.copy()
229
  export_data_pm = display[['Player', 'Salary', 'Median', 'Own']]
@@ -263,7 +280,7 @@ with tab1:
263
  display = display.set_index('Player')
264
  st.dataframe(display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), height=750, use_container_width = True)
265
 
266
- with tab2:
267
  with st.expander("Info and Filters"):
268
  if st.button("Load/Reset Data", key='reset2'):
269
  st.cache_data.clear()
@@ -279,35 +296,30 @@ with tab2:
279
  for key in st.session_state.keys():
280
  del st.session_state[key]
281
 
282
- col1, col2, col3, col4, col5 = st.columns(5)
283
- with col1:
284
- site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'))
285
- if site_var1 == 'Draftkings':
286
- id_dict = dk_id_dict.copy()
287
- id_dict_sd = dk_id_dict_sd.copy()
288
- elif site_var1 == 'Fanduel':
289
- id_dict = fd_id_dict.copy()
290
- id_dict_sd = fd_id_dict_sd.copy()
291
-
292
- with col2:
293
  slate_var1 = st.radio("Which data are you loading?", ('Regular', 'Showdown'))
294
  if slate_var1 == 'Regular':
295
- if site_var1 == 'Draftkings':
296
  dk_lineups = init_DK_lineups('Regular')
297
- elif site_var1 == 'Fanduel':
 
298
  fd_lineups = init_FD_lineups('Regular')
 
299
  elif slate_var1 == 'Showdown':
300
- if site_var1 == 'Draftkings':
301
  dk_lineups = init_DK_lineups('Showdown')
302
- elif site_var1 == 'Fanduel':
 
303
  fd_lineups = init_FD_lineups('Showdown')
 
304
 
305
  if slate_var1 == 'Regular':
306
  raw_baselines = roo_data
307
  elif slate_var1 == 'Showdown':
308
  raw_baselines = sd_roo_data
309
 
310
- if site_var1 == 'Draftkings':
311
  if slate_var1 == 'Regular':
312
  ROO_slice = raw_baselines[raw_baselines['Site'] == 'Draftkings']
313
  player_salaries = dict(zip(ROO_slice['Player'], ROO_slice['Salary']))
@@ -318,7 +330,7 @@ with tab2:
318
  max_own = np.max(dk_lineups[:,8])
319
  column_names = dk_columns
320
 
321
- elif site_var1 == 'Fanduel':
322
  raw_baselines = hold_display
323
  if slate_var1 == 'Regular':
324
  ROO_slice = raw_baselines[raw_baselines['Site'] == 'Fanduel']
@@ -328,21 +340,21 @@ with tab2:
328
  min_own = np.min(fd_lineups[:,8])
329
  max_own = np.max(fd_lineups[:,8])
330
  column_names = fd_columns
331
- with col3:
332
  lineup_num_var = st.number_input("How many lineups do you want to display?", min_value=1, max_value=1000, value=150, step=1)
333
 
334
- with col4:
335
  player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1')
336
  if player_var1 == 'Specific Players':
337
  player_var2 = st.multiselect('Which players do you want?', options = raw_baselines['Player'].unique())
338
  elif player_var1 == 'Full Slate':
339
  player_var2 = raw_baselines.Player.values.tolist()
340
 
341
- with col5:
342
- if site_var1 == 'Draftkings':
343
  salary_min_var = st.number_input("Minimum salary used", min_value = 0, max_value = 50000, value = 49000, step = 100, key = 'salary_min_var')
344
  salary_max_var = st.number_input("Maximum salary used", min_value = 0, max_value = 50000, value = 50000, step = 100, key = 'salary_max_var')
345
- elif site_var1 == 'Fanduel':
346
  salary_min_var = st.number_input("Minimum salary used", min_value = 0, max_value = 60000, value = 59000, step = 100, key = 'salary_min_var')
347
  salary_max_var = st.number_input("Maximum salary used", min_value = 0, max_value = 60000, value = 60000, step = 100, key = 'salary_max_var')
348
 
@@ -351,12 +363,12 @@ with tab2:
351
  if st.button("Prepare full data export", key='data_export'):
352
  name_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
353
  data_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
354
- if site_var1 == 'Draftkings':
355
  if slate_var1 == 'Regular':
356
  map_columns = ['FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'FLEX6']
357
  elif slate_var1 == 'Showdown':
358
  map_columns = ['FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'FLEX6']
359
- elif site_var1 == 'Fanduel':
360
  if slate_var1 == 'Regular':
361
  map_columns = ['FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'FLEX6']
362
  elif slate_var1 == 'Showdown':
@@ -401,12 +413,12 @@ with tab2:
401
  if st.button("Prepare full data export (Filtered)", key='data_export_filtered'):
402
  name_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
403
  data_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
404
- if site_var1 == 'Draftkings':
405
  if slate_var1 == 'Regular':
406
  map_columns = ['FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'FLEX6']
407
  elif slate_var1 == 'Showdown':
408
  map_columns = ['FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'FLEX6']
409
- elif site_var1 == 'Fanduel':
410
  if slate_var1 == 'Regular':
411
  map_columns = ['FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'FLEX6']
412
  elif slate_var1 == 'Showdown':
@@ -453,7 +465,7 @@ with tab2:
453
  mime='text/csv',
454
  )
455
 
456
- if site_var1 == 'Draftkings':
457
  if 'working_seed' in st.session_state:
458
  st.session_state.working_seed = st.session_state.working_seed
459
  if player_var1 == 'Specific Players':
@@ -470,7 +482,7 @@ with tab2:
470
  st.session_state.working_seed = dk_lineups.copy()
471
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
472
 
473
- elif site_var1 == 'Fanduel':
474
  if 'working_seed' in st.session_state:
475
  st.session_state.working_seed = st.session_state.working_seed
476
  if player_var1 == 'Specific Players':
@@ -499,9 +511,9 @@ with tab2:
499
  if st.button("Reset Optimals", key='reset3'):
500
  for key in st.session_state.keys():
501
  del st.session_state[key]
502
- if site_var1 == 'Draftkings':
503
  st.session_state.working_seed = dk_lineups.copy()
504
- elif site_var1 == 'Fanduel':
505
  st.session_state.working_seed = fd_lineups.copy()
506
 
507
  st.session_state.data_export_display = st.session_state.data_export_display[st.session_state.data_export_display['salary'].between(salary_min_var, salary_max_var)]
@@ -517,7 +529,7 @@ with tab2:
517
  with st.container():
518
  if 'working_seed' in st.session_state:
519
  # Create a new dataframe with summary statistics
520
- if site_var1 == 'Draftkings':
521
  summary_df = pd.DataFrame({
522
  'Metric': ['Min', 'Average', 'Max', 'STDdev'],
523
  'Salary': [
@@ -539,7 +551,7 @@ with tab2:
539
  np.std(st.session_state.working_seed[:,8])
540
  ]
541
  })
542
- elif site_var1 == 'Fanduel':
543
  summary_df = pd.DataFrame({
544
  'Metric': ['Min', 'Average', 'Max', 'STDdev'],
545
  'Salary': [
@@ -577,9 +589,9 @@ with tab2:
577
  tab1, tab2 = st.tabs(["Display Frequency", "Seed Frame Frequency"])
578
  with tab1:
579
  if 'data_export_display' in st.session_state:
580
- if site_var1 == 'Draftkings':
581
  player_columns = st.session_state.data_export_display.iloc[:, :6]
582
- elif site_var1 == 'Fanduel':
583
  player_columns = st.session_state.data_export_display.iloc[:, :6]
584
 
585
  # Flatten the DataFrame and count unique values
@@ -613,9 +625,9 @@ with tab2:
613
  )
614
  with tab2:
615
  if 'working_seed' in st.session_state:
616
- if site_var1 == 'Draftkings':
617
  player_columns = st.session_state.working_seed[:, :6]
618
- elif site_var1 == 'Fanduel':
619
  player_columns = st.session_state.working_seed[:, :6]
620
 
621
  # Flatten the DataFrame and count unique values
 
184
  fd_id_dict = dict(zip(roo_data[roo_data['Site'] == 'Fanduel']['Player'], roo_data[roo_data['Site'] == 'Fanduel']['player_id']))
185
  fd_id_dict_sd = dk_id_dict_sd
186
  hold_display = roo_data
 
 
 
 
 
187
 
188
+ app_load_reset_column, app_view_site_column = st.columns([1, 9])
189
+ with app_load_reset_column:
190
+ if st.button("Load/Reset Data", key='reset_data_button'):
191
+ st.cache_data.clear()
192
+ roo_data, sd_roo_data, timestamp = init_baselines()
193
+ dk_id_dict = dict(zip(roo_data[roo_data['Site'] == 'Draftkings']['Player'], roo_data[roo_data['Site'] == 'Draftkings']['player_id']))
194
+ dk_id_dict_sd = dict(zip(sd_roo_data['Player'], sd_roo_data['player_id']))
195
+ fd_id_dict = dict(zip(roo_data[roo_data['Site'] == 'Fanduel']['Player'], roo_data[roo_data['Site'] == 'Fanduel']['player_id']))
196
+ fd_id_dict_sd = dk_id_dict_sd
197
+ dk_lineups = init_DK_lineups('Regular')
198
+ fd_lineups = init_FD_lineups('Regular')
199
+ hold_display = roo_data
200
+ for key in st.session_state.keys():
201
+ del st.session_state[key]
202
+ with app_view_site_column:
203
+ with st.container():
204
+ app_view_column, app_site_column = st.columns([3, 3])
205
+ with app_view_column:
206
+ view_var = st.selectbox("Select view", ["Simple", "Advanced"], key='view_selectbox')
207
+ with app_site_column:
208
+ site_var = st.selectbox("What site do you want to view?", ('Draftkings', 'Fanduel'), key='site_selectbox')
209
+
210
+ selected_tab = st.segmented_control(
211
+ "Select Tab",
212
+ options=["Player ROO", "Optimals"],
213
+ selection_mode='single',
214
+ default='Player ROO',
215
+ width='stretch',
216
+ label_visibility='collapsed',
217
+ key='tab_selector'
218
+ )
219
+
220
+ if selected_tab == "Player ROO":
221
  with st.expander("Info and Filters"):
222
  if st.button("Reset Data", key='reset1'):
 
 
223
  st.cache_data.clear()
224
  roo_data, sd_roo_data, timestamp = init_baselines()
225
  dk_id_dict = dict(zip(roo_data[roo_data['Site'] == 'Draftkings']['Player'], roo_data[roo_data['Site'] == 'Draftkings']['player_id']))
 
233
  del st.session_state[key]
234
 
235
  st.write(timestamp)
236
+
237
+ type_var = st.radio("Select a Type", ["Full Slate", "Showdown"])
238
+ if type_var == "Full Slate":
239
+ display = hold_display[hold_display['Site'] == site_var]
240
+ display = display.drop_duplicates(subset=['Player'])
241
+ elif type_var == "Showdown":
242
+ display = sd_roo_data
243
+ display = display.drop_duplicates(subset=['Player'])
 
 
 
 
 
 
244
 
245
  export_data = display.copy()
246
  export_data_pm = display[['Player', 'Salary', 'Median', 'Own']]
 
280
  display = display.set_index('Player')
281
  st.dataframe(display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), height=750, use_container_width = True)
282
 
283
+ if selected_tab == "Optimals":
284
  with st.expander("Info and Filters"):
285
  if st.button("Load/Reset Data", key='reset2'):
286
  st.cache_data.clear()
 
296
  for key in st.session_state.keys():
297
  del st.session_state[key]
298
 
299
+ col1, col2, col3, col4 = st.columns(5)
300
+ with col1:
 
 
 
 
 
 
 
 
 
301
  slate_var1 = st.radio("Which data are you loading?", ('Regular', 'Showdown'))
302
  if slate_var1 == 'Regular':
303
+ if site_var == 'Draftkings':
304
  dk_lineups = init_DK_lineups('Regular')
305
+ id_dict = dk_id_dict.copy()
306
+ elif site_var == 'Fanduel':
307
  fd_lineups = init_FD_lineups('Regular')
308
+ id_dict = fd_id_dict.copy()
309
  elif slate_var1 == 'Showdown':
310
+ if site_var == 'Draftkings':
311
  dk_lineups = init_DK_lineups('Showdown')
312
+ id_dict_sd = dk_id_dict_sd.copy()
313
+ elif site_var == 'Fanduel':
314
  fd_lineups = init_FD_lineups('Showdown')
315
+ id_dict_sd = fd_id_dict_sd.copy()
316
 
317
  if slate_var1 == 'Regular':
318
  raw_baselines = roo_data
319
  elif slate_var1 == 'Showdown':
320
  raw_baselines = sd_roo_data
321
 
322
+ if site_var == 'Draftkings':
323
  if slate_var1 == 'Regular':
324
  ROO_slice = raw_baselines[raw_baselines['Site'] == 'Draftkings']
325
  player_salaries = dict(zip(ROO_slice['Player'], ROO_slice['Salary']))
 
330
  max_own = np.max(dk_lineups[:,8])
331
  column_names = dk_columns
332
 
333
+ elif site_var == 'Fanduel':
334
  raw_baselines = hold_display
335
  if slate_var1 == 'Regular':
336
  ROO_slice = raw_baselines[raw_baselines['Site'] == 'Fanduel']
 
340
  min_own = np.min(fd_lineups[:,8])
341
  max_own = np.max(fd_lineups[:,8])
342
  column_names = fd_columns
343
+ with col2:
344
  lineup_num_var = st.number_input("How many lineups do you want to display?", min_value=1, max_value=1000, value=150, step=1)
345
 
346
+ with col3:
347
  player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1')
348
  if player_var1 == 'Specific Players':
349
  player_var2 = st.multiselect('Which players do you want?', options = raw_baselines['Player'].unique())
350
  elif player_var1 == 'Full Slate':
351
  player_var2 = raw_baselines.Player.values.tolist()
352
 
353
+ with col4:
354
+ if site_var == 'Draftkings':
355
  salary_min_var = st.number_input("Minimum salary used", min_value = 0, max_value = 50000, value = 49000, step = 100, key = 'salary_min_var')
356
  salary_max_var = st.number_input("Maximum salary used", min_value = 0, max_value = 50000, value = 50000, step = 100, key = 'salary_max_var')
357
+ elif site_var == 'Fanduel':
358
  salary_min_var = st.number_input("Minimum salary used", min_value = 0, max_value = 60000, value = 59000, step = 100, key = 'salary_min_var')
359
  salary_max_var = st.number_input("Maximum salary used", min_value = 0, max_value = 60000, value = 60000, step = 100, key = 'salary_max_var')
360
 
 
363
  if st.button("Prepare full data export", key='data_export'):
364
  name_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
365
  data_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
366
+ if site_var == 'Draftkings':
367
  if slate_var1 == 'Regular':
368
  map_columns = ['FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'FLEX6']
369
  elif slate_var1 == 'Showdown':
370
  map_columns = ['FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'FLEX6']
371
+ elif site_var == 'Fanduel':
372
  if slate_var1 == 'Regular':
373
  map_columns = ['FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'FLEX6']
374
  elif slate_var1 == 'Showdown':
 
413
  if st.button("Prepare full data export (Filtered)", key='data_export_filtered'):
414
  name_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
415
  data_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
416
+ if site_var == 'Draftkings':
417
  if slate_var1 == 'Regular':
418
  map_columns = ['FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'FLEX6']
419
  elif slate_var1 == 'Showdown':
420
  map_columns = ['FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'FLEX6']
421
+ elif site_var == 'Fanduel':
422
  if slate_var1 == 'Regular':
423
  map_columns = ['FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'FLEX6']
424
  elif slate_var1 == 'Showdown':
 
465
  mime='text/csv',
466
  )
467
 
468
+ if site_var == 'Draftkings':
469
  if 'working_seed' in st.session_state:
470
  st.session_state.working_seed = st.session_state.working_seed
471
  if player_var1 == 'Specific Players':
 
482
  st.session_state.working_seed = dk_lineups.copy()
483
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
484
 
485
+ elif site_var == 'Fanduel':
486
  if 'working_seed' in st.session_state:
487
  st.session_state.working_seed = st.session_state.working_seed
488
  if player_var1 == 'Specific Players':
 
511
  if st.button("Reset Optimals", key='reset3'):
512
  for key in st.session_state.keys():
513
  del st.session_state[key]
514
+ if site_var == 'Draftkings':
515
  st.session_state.working_seed = dk_lineups.copy()
516
+ elif site_var == 'Fanduel':
517
  st.session_state.working_seed = fd_lineups.copy()
518
 
519
  st.session_state.data_export_display = st.session_state.data_export_display[st.session_state.data_export_display['salary'].between(salary_min_var, salary_max_var)]
 
529
  with st.container():
530
  if 'working_seed' in st.session_state:
531
  # Create a new dataframe with summary statistics
532
+ if site_var == 'Draftkings':
533
  summary_df = pd.DataFrame({
534
  'Metric': ['Min', 'Average', 'Max', 'STDdev'],
535
  'Salary': [
 
551
  np.std(st.session_state.working_seed[:,8])
552
  ]
553
  })
554
+ elif site_var == 'Fanduel':
555
  summary_df = pd.DataFrame({
556
  'Metric': ['Min', 'Average', 'Max', 'STDdev'],
557
  'Salary': [
 
589
  tab1, tab2 = st.tabs(["Display Frequency", "Seed Frame Frequency"])
590
  with tab1:
591
  if 'data_export_display' in st.session_state:
592
+ if site_var == 'Draftkings':
593
  player_columns = st.session_state.data_export_display.iloc[:, :6]
594
+ elif site_var == 'Fanduel':
595
  player_columns = st.session_state.data_export_display.iloc[:, :6]
596
 
597
  # Flatten the DataFrame and count unique values
 
625
  )
626
  with tab2:
627
  if 'working_seed' in st.session_state:
628
+ if site_var == 'Draftkings':
629
  player_columns = st.session_state.working_seed[:, :6]
630
+ elif site_var == 'Fanduel':
631
  player_columns = st.session_state.working_seed[:, :6]
632
 
633
  # Flatten the DataFrame and count unique values