James McCool commited on
Commit
1e8363d
·
1 Parent(s): d077a00

Refactor app.py to implement a unified selection interface for view, site, and model across all tabs, enhancing user experience and maintaining consistent data handling. Introduce caching for data conversion function to optimize performance.

Browse files
Files changed (1) hide show
  1. app.py +40 -53
app.py CHANGED
@@ -104,6 +104,7 @@ def init_FD_lineups():
104
 
105
  return FD_seed
106
 
 
107
  def convert_df_to_csv(df):
108
  return df.to_csv().encode('utf-8')
109
 
@@ -115,17 +116,17 @@ def convert_df(array):
115
  roo_data, sd_roo_data, scoring_percentages = init_baselines()
116
  hold_display = roo_data
117
 
118
- tab1, tab2, tab3 = st.tabs(["Scoring Percentages", "Player ROO", "Optimals"])
 
 
 
 
 
 
 
119
 
120
- with tab1:
121
  st.header("Scoring Percentages")
122
-
123
- with st.container():
124
- col1, col2 = st.columns([3, 3])
125
- with col1:
126
- view_var1 = st.selectbox("Select view", ["Simple", "Advanced"], key='view_var1')
127
- with col2:
128
- site_var1 = st.selectbox("What site do you want to view?", ('Draftkings', 'Fanduel'), key='site_var1')
129
 
130
  with st.expander("Info and Filters"):
131
  col1, col2, col3 = st.columns([3, 3, 3])
@@ -143,21 +144,14 @@ with tab1:
143
  with col3:
144
  own_var1 = st.radio("How would you like to display team ownership?", ('Sum', 'Average'))
145
  st.title("Scoring Percentages")
146
- if view_var1 == "Simple":
147
  scoring_percentages = scoring_percentages[['Names', 'Avg Score', '8+ runs', 'Win Percentage']]
148
  st.dataframe(scoring_percentages.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(game_format, precision=2), height=750, use_container_width = True, hide_index=True)
149
- elif view_var1 == "Advanced":
150
  st.dataframe(scoring_percentages.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(game_format, precision=2), height=750, use_container_width = True, hide_index=True)
151
 
152
- with tab2:
153
  st.header("Player ROO")
154
-
155
- with st.container():
156
- col1, col2 = st.columns([3, 3])
157
- with col1:
158
- view_var2 = st.selectbox("Select view", ["Simple", "Advanced"], key='view_var2')
159
- with col2:
160
- site_var2 = st.selectbox("What site do you want to view?", ('Draftkings', 'Fanduel'), key='site_var2')
161
 
162
  with st.expander("Info and Filters"):
163
  col1, col2, col3, col4 = st.columns([3, 3, 3, 3])
@@ -179,7 +173,7 @@ with tab2:
179
 
180
  if slate_type_var2 == 'Regular':
181
  player_roo_raw = roo_data.copy()
182
- if site_var2 == 'Draftkings':
183
  player_roo_raw['Site'] = 'Draftkings'
184
 
185
  if pos_var2 == 'All':
@@ -188,7 +182,7 @@ with tab2:
188
  player_roo_raw = player_roo_raw[player_roo_raw['Position'] == 'SP']
189
  elif pos_var2 == 'Hitters':
190
  player_roo_raw = player_roo_raw[player_roo_raw['Position'] != 'SP']
191
- elif site_var2 == 'Fanduel':
192
  player_roo_raw['Site'] = 'Fanduel'
193
 
194
  if pos_var2 == 'All':
@@ -207,26 +201,19 @@ with tab2:
207
 
208
  elif slate_type_var2 == 'Showdown':
209
  player_roo_raw = sd_roo_data.copy()
210
- if site_var2 == 'Draftkings':
211
  player_roo_raw['Site'] = 'Draftkings'
212
- elif site_var2 == 'Fanduel':
213
  player_roo_raw['Site'] = 'Fanduel'
214
  st.session_state['player_roo'] = player_roo_raw.drop(columns=['site', 'slate', 'version', 'timestamp'])
215
- if view_var2 == "Simple":
216
  st.session_state['player_roo'] = st.session_state['player_roo'][['Player', 'Position', 'Salary', 'Median', 'Ceiling', 'Own']]
217
  st.dataframe(st.session_state['player_roo'].style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), height=750, use_container_width = True, hide_index=True)
218
- elif view_var2 == "Advanced":
219
  st.dataframe(st.session_state['player_roo'].style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), height=750, use_container_width = True, hide_index=True)
220
 
221
- with tab3:
222
  st.header("Optimals")
223
-
224
- with st.container():
225
- col1, col2 = st.columns([3, 3])
226
- with col1:
227
- site_var3 = st.selectbox("What site do you want to view?", ('Draftkings', 'Fanduel'), key='site_var3')
228
- with col2:
229
- view_var3 = st.selectbox("Select view", ["Simple", "Advanced"], key='view_var3')
230
 
231
  with st.expander("Info and Filters"):
232
  if st.button("Load/Reset Data", key='reset3'):
@@ -242,14 +229,14 @@ with tab3:
242
  slate_var3 = st.radio("Which slate data are you loading?", ('Main', 'Secondary', 'Auxiliary'))
243
 
244
  if slate_type_var3 == 'Regular':
245
- if site_var3 == 'Draftkings':
246
  dk_lineups = init_DK_lineups(slate_var3)
247
- elif site_var3 == 'Fanduel':
248
  fd_lineups = init_FD_lineups(slate_var3)
249
  elif slate_type_var3 == 'Showdown':
250
- if site_var3 == 'Draftkings':
251
  dk_lineups = init_DK_lineups(slate_var3)
252
- elif site_var3 == 'Fanduel':
253
  fd_lineups = init_FD_lineups(slate_var3)
254
  lineup_num_var = st.number_input("How many lineups do you want to display?", min_value=1, max_value=1000, value=150, step=1)
255
 
@@ -258,7 +245,7 @@ with tab3:
258
  elif slate_type_var3 == 'Showdown':
259
  raw_baselines = sd_roo_data
260
 
261
- if site_var3 == 'Draftkings':
262
  if slate_type_var3 == 'Regular':
263
  ROO_slice = raw_baselines[raw_baselines['Site'] == 'Draftkings']
264
  player_salaries = dict(zip(ROO_slice['Player'], ROO_slice['Salary']))
@@ -275,7 +262,7 @@ with tab3:
275
  elif player_var1 == 'Full Slate':
276
  player_var2 = raw_baselines.Player.values.tolist()
277
 
278
- elif site_var3 == 'Fanduel':
279
  raw_baselines = hold_display
280
  if slate_type_var3 == 'Regular':
281
  ROO_slice = raw_baselines[raw_baselines['Site'] == 'Fanduel']
@@ -294,10 +281,10 @@ with tab3:
294
 
295
  if st.button("Prepare data export", key='data_export'):
296
  data_export = st.session_state.working_seed.copy()
297
- # if site_var3 == 'Draftkings':
298
  # for col_idx in range(6):
299
  # data_export[:, col_idx] = np.array([id_dict.get(player, player) for player in data_export[:, col_idx]])
300
- # elif site_var3 == 'Fanduel':
301
  # for col_idx in range(6):
302
  # data_export[:, col_idx] = np.array([id_dict.get(player, player) for player in data_export[:, col_idx]])
303
  st.download_button(
@@ -307,7 +294,7 @@ with tab3:
307
  mime='text/csv',
308
  )
309
 
310
- if site_var3 == 'Draftkings':
311
  if 'working_seed' in st.session_state:
312
  st.session_state.working_seed = st.session_state.working_seed
313
  if player_var1 == 'Specific Players':
@@ -324,7 +311,7 @@ with tab3:
324
  st.session_state.working_seed = dk_lineups.copy()
325
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
326
 
327
- elif site_var3 == 'Fanduel':
328
  if 'working_seed' in st.session_state:
329
  st.session_state.working_seed = st.session_state.working_seed
330
  if player_var1 == 'Specific Players':
@@ -342,10 +329,10 @@ with tab3:
342
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
343
 
344
  export_file = st.session_state.data_export_display.copy()
345
- # if site_var3 == 'Draftkings':
346
  # for col_idx in range(6):
347
  # export_file.iloc[:, col_idx] = export_file.iloc[:, col_idx].map(id_dict)
348
- # elif site_var3 == 'Fanduel':
349
  # for col_idx in range(6):
350
  # export_file.iloc[:, col_idx] = export_file.iloc[:, col_idx].map(id_dict)
351
 
@@ -353,9 +340,9 @@ with tab3:
353
  if st.button("Reset Optimals", key='reset3'):
354
  for key in st.session_state.keys():
355
  del st.session_state[key]
356
- if site_var3 == 'Draftkings':
357
  st.session_state.working_seed = dk_lineups.copy()
358
- elif site_var3 == 'Fanduel':
359
  st.session_state.working_seed = fd_lineups.copy()
360
  if 'data_export_display' in st.session_state:
361
  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)
@@ -369,7 +356,7 @@ with tab3:
369
  with st.container():
370
  if 'working_seed' in st.session_state:
371
  # Create a new dataframe with summary statistics
372
- if site_var3 == 'Draftkings':
373
  summary_df = pd.DataFrame({
374
  'Metric': ['Min', 'Average', 'Max', 'STDdev'],
375
  'Salary': [
@@ -391,7 +378,7 @@ with tab3:
391
  np.std(st.session_state.working_seed[:,8])
392
  ]
393
  })
394
- elif site_var3 == 'Fanduel':
395
  summary_df = pd.DataFrame({
396
  'Metric': ['Min', 'Average', 'Max', 'STDdev'],
397
  'Salary': [
@@ -429,9 +416,9 @@ with tab3:
429
  tab1, tab2 = st.tabs(["Display Frequency", "Seed Frame Frequency"])
430
  with tab1:
431
  if 'data_export_display' in st.session_state:
432
- if site_var3 == 'Draftkings':
433
  player_columns = st.session_state.data_export_display.iloc[:, :6]
434
- elif site_var3 == 'Fanduel':
435
  player_columns = st.session_state.data_export_display.iloc[:, :6]
436
 
437
  # Flatten the DataFrame and count unique values
@@ -465,9 +452,9 @@ with tab3:
465
  )
466
  with tab2:
467
  if 'working_seed' in st.session_state:
468
- if site_var3 == 'Draftkings':
469
  player_columns = st.session_state.working_seed[:, :6]
470
- elif site_var3 == 'Fanduel':
471
  player_columns = st.session_state.working_seed[:, :6]
472
 
473
  # Flatten the DataFrame and count unique values
 
104
 
105
  return FD_seed
106
 
107
+ @st.cache_data
108
  def convert_df_to_csv(df):
109
  return df.to_csv().encode('utf-8')
110
 
 
116
  roo_data, sd_roo_data, scoring_percentages = init_baselines()
117
  hold_display = roo_data
118
 
119
+ with st.container():
120
+ col1, col2, col3 = st.columns([3, 3, 3])
121
+ with col1:
122
+ view_var = st.selectbox("Select view", ["Simple", "Advanced"], key='view_var')
123
+ with col2:
124
+ site_var = st.selectbox("What site do you want to view?", ('Draftkings', 'Fanduel'), key='site_var')
125
+ with col3:
126
+ model_var = st.radio("What do you want to view?", ('Scoring Percentages', 'Player ROO', 'Optimals'), key='model_var')
127
 
128
+ if model_var == 'Scoring Percentages':
129
  st.header("Scoring Percentages")
 
 
 
 
 
 
 
130
 
131
  with st.expander("Info and Filters"):
132
  col1, col2, col3 = st.columns([3, 3, 3])
 
144
  with col3:
145
  own_var1 = st.radio("How would you like to display team ownership?", ('Sum', 'Average'))
146
  st.title("Scoring Percentages")
147
+ if view_var == "Simple":
148
  scoring_percentages = scoring_percentages[['Names', 'Avg Score', '8+ runs', 'Win Percentage']]
149
  st.dataframe(scoring_percentages.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(game_format, precision=2), height=750, use_container_width = True, hide_index=True)
150
+ elif view_var == "Advanced":
151
  st.dataframe(scoring_percentages.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(game_format, precision=2), height=750, use_container_width = True, hide_index=True)
152
 
153
+ if model_var == 'Player ROO':
154
  st.header("Player ROO")
 
 
 
 
 
 
 
155
 
156
  with st.expander("Info and Filters"):
157
  col1, col2, col3, col4 = st.columns([3, 3, 3, 3])
 
173
 
174
  if slate_type_var2 == 'Regular':
175
  player_roo_raw = roo_data.copy()
176
+ if site_var == 'Draftkings':
177
  player_roo_raw['Site'] = 'Draftkings'
178
 
179
  if pos_var2 == 'All':
 
182
  player_roo_raw = player_roo_raw[player_roo_raw['Position'] == 'SP']
183
  elif pos_var2 == 'Hitters':
184
  player_roo_raw = player_roo_raw[player_roo_raw['Position'] != 'SP']
185
+ elif site_var == 'Fanduel':
186
  player_roo_raw['Site'] = 'Fanduel'
187
 
188
  if pos_var2 == 'All':
 
201
 
202
  elif slate_type_var2 == 'Showdown':
203
  player_roo_raw = sd_roo_data.copy()
204
+ if site_var == 'Draftkings':
205
  player_roo_raw['Site'] = 'Draftkings'
206
+ elif site_var == 'Fanduel':
207
  player_roo_raw['Site'] = 'Fanduel'
208
  st.session_state['player_roo'] = player_roo_raw.drop(columns=['site', 'slate', 'version', 'timestamp'])
209
+ if view_var == "Simple":
210
  st.session_state['player_roo'] = st.session_state['player_roo'][['Player', 'Position', 'Salary', 'Median', 'Ceiling', 'Own']]
211
  st.dataframe(st.session_state['player_roo'].style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), height=750, use_container_width = True, hide_index=True)
212
+ elif view_var == "Advanced":
213
  st.dataframe(st.session_state['player_roo'].style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), height=750, use_container_width = True, hide_index=True)
214
 
215
+ if model_var == 'Optimals':
216
  st.header("Optimals")
 
 
 
 
 
 
 
217
 
218
  with st.expander("Info and Filters"):
219
  if st.button("Load/Reset Data", key='reset3'):
 
229
  slate_var3 = st.radio("Which slate data are you loading?", ('Main', 'Secondary', 'Auxiliary'))
230
 
231
  if slate_type_var3 == 'Regular':
232
+ if site_var == 'Draftkings':
233
  dk_lineups = init_DK_lineups(slate_var3)
234
+ elif site_var == 'Fanduel':
235
  fd_lineups = init_FD_lineups(slate_var3)
236
  elif slate_type_var3 == 'Showdown':
237
+ if site_var == 'Draftkings':
238
  dk_lineups = init_DK_lineups(slate_var3)
239
+ elif site_var == 'Fanduel':
240
  fd_lineups = init_FD_lineups(slate_var3)
241
  lineup_num_var = st.number_input("How many lineups do you want to display?", min_value=1, max_value=1000, value=150, step=1)
242
 
 
245
  elif slate_type_var3 == 'Showdown':
246
  raw_baselines = sd_roo_data
247
 
248
+ if site_var == 'Draftkings':
249
  if slate_type_var3 == 'Regular':
250
  ROO_slice = raw_baselines[raw_baselines['Site'] == 'Draftkings']
251
  player_salaries = dict(zip(ROO_slice['Player'], ROO_slice['Salary']))
 
262
  elif player_var1 == 'Full Slate':
263
  player_var2 = raw_baselines.Player.values.tolist()
264
 
265
+ elif site_var == 'Fanduel':
266
  raw_baselines = hold_display
267
  if slate_type_var3 == 'Regular':
268
  ROO_slice = raw_baselines[raw_baselines['Site'] == 'Fanduel']
 
281
 
282
  if st.button("Prepare data export", key='data_export'):
283
  data_export = st.session_state.working_seed.copy()
284
+ # if site_var == 'Draftkings':
285
  # for col_idx in range(6):
286
  # data_export[:, col_idx] = np.array([id_dict.get(player, player) for player in data_export[:, col_idx]])
287
+ # elif site_var == 'Fanduel':
288
  # for col_idx in range(6):
289
  # data_export[:, col_idx] = np.array([id_dict.get(player, player) for player in data_export[:, col_idx]])
290
  st.download_button(
 
294
  mime='text/csv',
295
  )
296
 
297
+ if site_var == 'Draftkings':
298
  if 'working_seed' in st.session_state:
299
  st.session_state.working_seed = st.session_state.working_seed
300
  if player_var1 == 'Specific Players':
 
311
  st.session_state.working_seed = dk_lineups.copy()
312
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
313
 
314
+ elif site_var == 'Fanduel':
315
  if 'working_seed' in st.session_state:
316
  st.session_state.working_seed = st.session_state.working_seed
317
  if player_var1 == 'Specific Players':
 
329
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
330
 
331
  export_file = st.session_state.data_export_display.copy()
332
+ # if site_var == 'Draftkings':
333
  # for col_idx in range(6):
334
  # export_file.iloc[:, col_idx] = export_file.iloc[:, col_idx].map(id_dict)
335
+ # elif site_var == 'Fanduel':
336
  # for col_idx in range(6):
337
  # export_file.iloc[:, col_idx] = export_file.iloc[:, col_idx].map(id_dict)
338
 
 
340
  if st.button("Reset Optimals", key='reset3'):
341
  for key in st.session_state.keys():
342
  del st.session_state[key]
343
+ if site_var == 'Draftkings':
344
  st.session_state.working_seed = dk_lineups.copy()
345
+ elif site_var == 'Fanduel':
346
  st.session_state.working_seed = fd_lineups.copy()
347
  if 'data_export_display' in st.session_state:
348
  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)
 
356
  with st.container():
357
  if 'working_seed' in st.session_state:
358
  # Create a new dataframe with summary statistics
359
+ if site_var == 'Draftkings':
360
  summary_df = pd.DataFrame({
361
  'Metric': ['Min', 'Average', 'Max', 'STDdev'],
362
  'Salary': [
 
378
  np.std(st.session_state.working_seed[:,8])
379
  ]
380
  })
381
+ elif site_var == 'Fanduel':
382
  summary_df = pd.DataFrame({
383
  'Metric': ['Min', 'Average', 'Max', 'STDdev'],
384
  'Salary': [
 
416
  tab1, tab2 = st.tabs(["Display Frequency", "Seed Frame Frequency"])
417
  with tab1:
418
  if 'data_export_display' in st.session_state:
419
+ if site_var == 'Draftkings':
420
  player_columns = st.session_state.data_export_display.iloc[:, :6]
421
+ elif site_var == 'Fanduel':
422
  player_columns = st.session_state.data_export_display.iloc[:, :6]
423
 
424
  # Flatten the DataFrame and count unique values
 
452
  )
453
  with tab2:
454
  if 'working_seed' in st.session_state:
455
+ if site_var == 'Draftkings':
456
  player_columns = st.session_state.working_seed[:, :6]
457
+ elif site_var == 'Fanduel':
458
  player_columns = st.session_state.working_seed[:, :6]
459
 
460
  # Flatten the DataFrame and count unique values