James McCool commited on
Commit
a4e3e2e
·
1 Parent(s): e8a3351

Refactor session state handling in app.py

Browse files

- Updated the management of player columns and mapping dictionaries to utilize session state, improving data consistency and accessibility.
- Enhanced filtering logic for user selections, ensuring that the displayed contest information reflects the latest user inputs and selections.
- Streamlined the application of calculations for player exposures and stack sizes, enhancing performance and user experience.

Files changed (1) hide show
  1. app.py +62 -61
app.py CHANGED
@@ -150,12 +150,12 @@ with tab1:
150
  with tab2:
151
  excluded_cols = ['BaseName', 'EntryCount']
152
  if 'Contest' in st.session_state and 'duplication_frame' not in st.session_state:
153
- player_columns = [col for col in st.session_state['Contest'].columns if col not in excluded_cols]
154
- for col in player_columns:
155
  st.session_state['Contest'][col] = st.session_state['Contest'][col].astype(str)
156
 
157
  # Create mapping dictionaries
158
- map_dict = {
159
  'pos_map': st.session_state['pos_dict'],
160
  'team_map': st.session_state['team_dict'],
161
  'salary_map': st.session_state['salary_dict'],
@@ -168,22 +168,22 @@ with tab2:
168
  if type_var == 'Classic':
169
  working_df['stack'] = working_df.apply(
170
  lambda row: Counter(
171
- map_dict['team_map'].get(player, '') for player in row[4:]
172
- if map_dict['team_map'].get(player, '') != ''
173
- ).most_common(1)[0][0] if any(map_dict['team_map'].get(player, '') for player in row[4:]) else '',
174
  axis=1
175
  )
176
  working_df['stack_size'] = working_df.apply(
177
  lambda row: Counter(
178
- map_dict['team_map'].get(player, '') for player in row[4:]
179
- if map_dict['team_map'].get(player, '') != ''
180
- ).most_common(1)[0][1] if any(map_dict['team_map'].get(player, '') for player in row[4:]) else '',
181
  axis=1
182
  )
183
- working_df['salary'] = working_df.apply(lambda row: sum(map_dict['salary_map'].get(player, 0) for player in row), axis=1)
184
  working_df['actual_fpts'] = working_df.apply(lambda row: sum(st.session_state['actual_dict'].get(player, 0) for player in row), axis=1)
185
  working_df['actual_own'] = working_df.apply(lambda row: sum(st.session_state['ownership_dict'].get(player, 0) for player in row), axis=1)
186
- working_df['sorted'] = working_df[player_columns].apply(
187
  lambda row: ','.join(sorted(row.values)),
188
  axis=1
189
  )
@@ -209,22 +209,22 @@ with tab2:
209
  elif type_var == 'Showdown':
210
  working_df['stack'] = working_df.apply(
211
  lambda row: Counter(
212
- map_dict['team_map'].get(player, '') for player in row[2:]
213
- if map_dict['team_map'].get(player, '') != ''
214
- ).most_common(1)[0][0] if any(map_dict['team_map'].get(player, '') for player in row[2:]) else '',
215
  axis=1
216
  )
217
  working_df['stack_size'] = working_df.apply(
218
  lambda row: Counter(
219
- map_dict['team_map'].get(player, '') for player in row[2:]
220
- if map_dict['team_map'].get(player, '') != ''
221
- ).most_common(1)[0][1] if any(map_dict['team_map'].get(player, '') for player in row[2:]) else '',
222
  axis=1
223
  )
224
  # Modified salary calculation with 1.5x multiplier for first player
225
  working_df['salary'] = working_df.apply(
226
- lambda row: (map_dict['salary_map'].get(row[2], 0) * 1.5) +
227
- sum(map_dict['salary_map'].get(player, 0) for player in row[3:]),
228
  axis=1
229
  )
230
  # Modified actual_fpts calculation with 1.5x multiplier for first player
@@ -234,7 +234,7 @@ with tab2:
234
  axis=1
235
  )
236
  working_df['actual_own'] = working_df.apply(lambda row: sum(st.session_state['ownership_dict'].get(player, 0) for player in row), axis=1)
237
- working_df['sorted'] = working_df[player_columns].apply(
238
  lambda row: ','.join(sorted(row.values)),
239
  axis=1
240
  )
@@ -257,8 +257,9 @@ with tab2:
257
  working_df['finish'] = working_df['index']
258
  working_df = working_df.drop(['sorted', 'index'], axis=1)
259
  # working_df['stack_size'] = working_df['stack_size'].fillna(1).astype(int)
260
- st.session_state['field_player_frame'] = create_player_exposures(working_df, player_columns)
261
  st.session_state['field_stack_frame'] = create_stack_exposures(working_df)
 
262
 
263
  with st.expander("Info and filters"):
264
  st.info("Note that any filtering here needs to be reset manually, i.e. if you parse down the specific users and want to reset the table, just backtrack your filtering by setting it back to 'All'")
@@ -268,22 +269,22 @@ with tab2:
268
  with st.form(key='filter_form'):
269
  users_var, entries_var, stack_var, stack_size_var, player_var = st.columns(5)
270
  with users_var:
271
- entry_parse_var = st.selectbox("Do you want to view a specific user(s)?", ['All', 'Specific'], key = 'entry_parse_var')
272
- entry_names = st.multiselect("Select players", options=st.session_state['entry_list'], default=[], key = 'entry_names')
273
  with entries_var:
274
- low_entries_var = st.number_input("Low end of entries range", min_value=0, max_value=150, value=1, key = 'low_entries_var')
275
- high_entries_var = st.number_input("High end of entries range", min_value=0, max_value=150, value=150, key = 'high_entries_var')
276
  with stack_var:
277
- stack_parse_var = st.selectbox("Do you want to view lineups with specific team(s)?", ['All', 'Specific'], key = 'stack_parse_var')
278
- stack_names = st.multiselect("Select teams", options=working_df['stack'].unique(), default=[], key = 'stack_names')
279
  with stack_size_var:
280
- stack_size_parse_var = st.selectbox("Do you want to view a specific stack size(s)?", ['All', 'Specific'], key = 'stack_size_parse_var')
281
- stack_size_names = st.multiselect("Select stack sizes", options=working_df['stack_size'].unique(), default=[], key = 'stack_size_names')
282
  with player_var:
283
- unique_players = pd.unique(working_df[player_columns].values.ravel('K'))
284
- unique_players = [p for p in unique_players if p != 'nan'] # Remove any NaN values
285
- player_parse_var = st.selectbox("Do you want to view lineups with specific player(s)?", ['All', 'Specific'], key = 'player_parse_var')
286
- player_names = st.multiselect("Select players", options=unique_players, default=[], key = 'player_names')
287
  submitted = st.form_submit_button("Submit")
288
  if submitted:
289
  if 'player_frame' in st.session_state:
@@ -291,17 +292,17 @@ with tab2:
291
  if 'stack_frame' in st.session_state:
292
  del st.session_state['stack_frame']
293
 
294
- if entry_parse_var == 'Specific' and entry_names:
295
- working_df = working_df[working_df['BaseName'].isin(entry_names)]
296
- if stack_parse_var == 'Specific' and stack_names:
297
- working_df = working_df[working_df['stack'].isin(stack_names)]
298
- if stack_size_parse_var == 'Specific' and stack_size_names:
299
- working_df = working_df[working_df['stack_size'].isin(stack_size_names)]
300
- if player_parse_var == 'Specific' and player_names:
301
- mask = working_df[player_columns].apply(lambda row: all(player in row.values for player in player_names), axis=1)
302
- working_df = working_df[mask]
303
- if low_entries_var and high_entries_var:
304
- working_df = working_df[working_df['EntryCount'].between(low_entries_var, high_entries_var)]
305
 
306
  # Initialize pagination in session state if not exists
307
  if 'current_page' not in st.session_state:
@@ -309,7 +310,7 @@ with tab2:
309
 
310
  # Calculate total pages
311
  rows_per_page = 500
312
- total_rows = len(working_df)
313
  total_pages = (total_rows + rows_per_page - 1) // rows_per_page
314
 
315
  # Create pagination controls in a single row
@@ -337,7 +338,7 @@ with tab2:
337
  start_idx = (st.session_state.current_page - 1) * rows_per_page
338
  end_idx = min((st.session_state.current_page) * rows_per_page, total_rows)
339
  st.dataframe(
340
- working_df.iloc[start_idx:end_idx].style
341
  .background_gradient(axis=0)
342
  .background_gradient(cmap='RdYlGn')
343
  .format(precision=2),
@@ -363,14 +364,14 @@ with tab2:
363
  else:
364
  pos_select = None
365
 
366
- if entry_parse_var == 'All':
367
 
368
- st.session_state['player_frame'] = create_player_exposures(working_df, player_columns)
369
  hold_frame = st.session_state['player_frame'].copy()
370
  if sport_select == 'GOLF':
371
  hold_frame['Pos'] = 'G'
372
  else:
373
- hold_frame['Pos'] = hold_frame['Player'].map(map_dict['pos_map'])
374
  st.session_state['player_frame'].insert(1, 'Pos', hold_frame['Pos'])
375
  st.session_state['player_frame'] = st.session_state['player_frame'].dropna(subset=['Pos'])
376
  if pos_select:
@@ -383,12 +384,12 @@ with tab2:
383
  hide_index=True)
384
  else:
385
 
386
- st.session_state['player_frame'] = create_player_exposures(working_df, player_columns, entry_names)
387
  hold_frame = st.session_state['player_frame'].copy()
388
  if sport_select == 'GOLF':
389
  hold_frame['Pos'] = 'G'
390
  else:
391
- hold_frame['Pos'] = hold_frame['Player'].map(map_dict['pos_map'])
392
  st.session_state['player_frame'].insert(1, 'Pos', hold_frame['Pos'])
393
  st.session_state['player_frame'] = st.session_state['player_frame'].dropna(subset=['Pos'])
394
  if pos_select:
@@ -401,15 +402,15 @@ with tab2:
401
  hide_index=True)
402
  with tab2:
403
 
404
- if entry_parse_var == 'All':
405
- st.session_state['stack_frame'] = create_stack_exposures(working_df)
406
  st.dataframe(st.session_state['stack_frame'].
407
  sort_values(by='Exposure Overall', ascending=False).
408
  style.background_gradient(cmap='RdYlGn').
409
  format(formatter='{:.2%}', subset=st.session_state['stack_frame'].iloc[:, 1:].select_dtypes(include=['number']).columns),
410
  hide_index=True)
411
  else:
412
- st.session_state['stack_frame'] = create_stack_exposures(working_df, entry_names)
413
  st.dataframe(st.session_state['stack_frame'].
414
  sort_values(by='Exposure Overall', ascending=False).
415
  style.background_gradient(cmap='RdYlGn').
@@ -417,15 +418,15 @@ with tab2:
417
  hide_index=True)
418
  with tab3:
419
 
420
- if entry_parse_var == 'All':
421
- st.session_state['stack_size_frame'] = create_stack_size_exposures(working_df)
422
  st.dataframe(st.session_state['stack_size_frame'].
423
  sort_values(by='Exposure Overall', ascending=False).
424
  style.background_gradient(cmap='RdYlGn').
425
  format(formatter='{:.2%}', subset=st.session_state['stack_size_frame'].iloc[:, 1:].select_dtypes(include=['number']).columns),
426
  hide_index=True)
427
  else:
428
- st.session_state['stack_size_frame'] = create_stack_size_exposures(working_df, entry_names)
429
  st.dataframe(st.session_state['stack_size_frame'].
430
  sort_values(by='Exposure Overall', ascending=False).
431
  style.background_gradient(cmap='RdYlGn').
@@ -434,12 +435,12 @@ with tab2:
434
 
435
  with tab4:
436
 
437
- if entry_parse_var == 'All':
438
- st.session_state['general_frame'] = create_general_exposures(working_df)
439
  st.dataframe(st.session_state['general_frame'].style.background_gradient(cmap='RdYlGn', axis=1).format(precision=2), hide_index=True)
440
 
441
  else:
442
- st.session_state['general_frame'] = create_general_exposures(working_df, entry_names)
443
  st.dataframe(st.session_state['general_frame'].style.background_gradient(cmap='RdYlGn', axis=1).format(precision=2), hide_index=True)
444
 
445
  with tab5:
@@ -448,7 +449,7 @@ with tab2:
448
  with col1:
449
  user_dupe_var = st.selectbox("Which usage(s) would you like to view?", ['All', 'Specific'], key='user_dupe_var')
450
  with col2:
451
- user_dupe_select = st.multiselect("Select your user(s)", working_df['BaseName'].sort_values().unique(), key='user_dupe_select')
452
  submitted = st.form_submit_button("Submit")
453
  if submitted:
454
  if user_dupe_var == 'Specific':
 
150
  with tab2:
151
  excluded_cols = ['BaseName', 'EntryCount']
152
  if 'Contest' in st.session_state and 'duplication_frame' not in st.session_state:
153
+ st.session_state['player_columns'] = [col for col in st.session_state['Contest'].columns if col not in excluded_cols]
154
+ for col in st.session_state['player_columns']:
155
  st.session_state['Contest'][col] = st.session_state['Contest'][col].astype(str)
156
 
157
  # Create mapping dictionaries
158
+ st.session_state['map_dict'] = {
159
  'pos_map': st.session_state['pos_dict'],
160
  'team_map': st.session_state['team_dict'],
161
  'salary_map': st.session_state['salary_dict'],
 
168
  if type_var == 'Classic':
169
  working_df['stack'] = working_df.apply(
170
  lambda row: Counter(
171
+ st.session_state['map_dict']['team_map'].get(player, '') for player in row[4:]
172
+ if st.session_state['map_dict']['team_map'].get(player, '') != ''
173
+ ).most_common(1)[0][0] if any(st.session_state['map_dict']['team_map'].get(player, '') for player in row[4:]) else '',
174
  axis=1
175
  )
176
  working_df['stack_size'] = working_df.apply(
177
  lambda row: Counter(
178
+ st.session_state['map_dict']['team_map'].get(player, '') for player in row[4:]
179
+ if st.session_state['map_dict']['team_map'].get(player, '') != ''
180
+ ).most_common(1)[0][1] if any(st.session_state['map_dict']['team_map'].get(player, '') for player in row[4:]) else '',
181
  axis=1
182
  )
183
+ working_df['salary'] = working_df.apply(lambda row: sum(st.session_state['map_dict']['salary_map'].get(player, 0) for player in row), axis=1)
184
  working_df['actual_fpts'] = working_df.apply(lambda row: sum(st.session_state['actual_dict'].get(player, 0) for player in row), axis=1)
185
  working_df['actual_own'] = working_df.apply(lambda row: sum(st.session_state['ownership_dict'].get(player, 0) for player in row), axis=1)
186
+ working_df['sorted'] = working_df[st.session_state['player_columns']].apply(
187
  lambda row: ','.join(sorted(row.values)),
188
  axis=1
189
  )
 
209
  elif type_var == 'Showdown':
210
  working_df['stack'] = working_df.apply(
211
  lambda row: Counter(
212
+ st.session_state['map_dict']['team_map'].get(player, '') for player in row[2:]
213
+ if st.session_state['map_dict']['team_map'].get(player, '') != ''
214
+ ).most_common(1)[0][0] if any(st.session_state['map_dict']['team_map'].get(player, '') for player in row[2:]) else '',
215
  axis=1
216
  )
217
  working_df['stack_size'] = working_df.apply(
218
  lambda row: Counter(
219
+ st.session_state['map_dict']['team_map'].get(player, '') for player in row[2:]
220
+ if st.session_state['map_dict']['team_map'].get(player, '') != ''
221
+ ).most_common(1)[0][1] if any(st.session_state['map_dict']['team_map'].get(player, '') for player in row[2:]) else '',
222
  axis=1
223
  )
224
  # Modified salary calculation with 1.5x multiplier for first player
225
  working_df['salary'] = working_df.apply(
226
+ lambda row: (st.session_state['map_dict']['salary_map'].get(row[2], 0) * 1.5) +
227
+ sum(st.session_state['map_dict']['salary_map'].get(player, 0) for player in row[3:]),
228
  axis=1
229
  )
230
  # Modified actual_fpts calculation with 1.5x multiplier for first player
 
234
  axis=1
235
  )
236
  working_df['actual_own'] = working_df.apply(lambda row: sum(st.session_state['ownership_dict'].get(player, 0) for player in row), axis=1)
237
+ working_df['sorted'] = working_df[st.session_state['player_columns']].apply(
238
  lambda row: ','.join(sorted(row.values)),
239
  axis=1
240
  )
 
257
  working_df['finish'] = working_df['index']
258
  working_df = working_df.drop(['sorted', 'index'], axis=1)
259
  # working_df['stack_size'] = working_df['stack_size'].fillna(1).astype(int)
260
+ st.session_state['field_player_frame'] = create_player_exposures(working_df, st.session_state['player_columns'])
261
  st.session_state['field_stack_frame'] = create_stack_exposures(working_df)
262
+ st.session_state['display_contest_info'] = working_df.copy()
263
 
264
  with st.expander("Info and filters"):
265
  st.info("Note that any filtering here needs to be reset manually, i.e. if you parse down the specific users and want to reset the table, just backtrack your filtering by setting it back to 'All'")
 
269
  with st.form(key='filter_form'):
270
  users_var, entries_var, stack_var, stack_size_var, player_var = st.columns(5)
271
  with users_var:
272
+ st.session_state['entry_parse_var'] = st.selectbox("Do you want to view a specific user(s)?", ['All', 'Specific'], key = 'entry_parse_var')
273
+ st.session_state['entry_names'] = st.multiselect("Select players", options=st.session_state['entry_list'], default=[], key = 'entry_names')
274
  with entries_var:
275
+ st.session_state['low_entries_var'] = st.number_input("Low end of entries range", min_value=0, max_value=150, value=1, key = 'low_entries_var')
276
+ st.session_state['high_entries_var'] = st.number_input("High end of entries range", min_value=0, max_value=150, value=150, key = 'high_entries_var')
277
  with stack_var:
278
+ st.session_state['stack_parse_var'] = st.selectbox("Do you want to view lineups with specific team(s)?", ['All', 'Specific'], key = 'stack_parse_var')
279
+ st.session_state['stack_names'] = st.multiselect("Select teams", options=st.session_state['display_contest_info']['stack'].unique(), default=[], key = 'stack_names')
280
  with stack_size_var:
281
+ st.session_state['stack_size_parse_var'] = st.selectbox("Do you want to view a specific stack size(s)?", ['All', 'Specific'], key = 'stack_size_parse_var')
282
+ st.session_state['stack_size_names'] = st.multiselect("Select stack sizes", options=st.session_state['display_contest_info']['stack_size'].unique(), default=[], key = 'stack_size_names')
283
  with player_var:
284
+ st.session_state['unique_players'] = pd.unique(st.session_state['display_contest_info'][st.session_state['player_columns']].values.ravel('K'))
285
+ st.session_state['unique_players'] = [p for p in st.session_state['unique_players'] if p != 'nan'] # Remove any NaN values
286
+ st.session_state['player_parse_var'] = st.selectbox("Do you want to view lineups with specific player(s)?", ['All', 'Specific'], key = 'player_parse_var')
287
+ st.session_state['player_names'] = st.multiselect("Select players", options=st.session_state['unique_players'], default=[], key = 'player_names')
288
  submitted = st.form_submit_button("Submit")
289
  if submitted:
290
  if 'player_frame' in st.session_state:
 
292
  if 'stack_frame' in st.session_state:
293
  del st.session_state['stack_frame']
294
 
295
+ if st.session_state['entry_parse_var'] == 'Specific' and st.session_state['entry_names']:
296
+ st.session_state['display_contest_info'] = st.session_state['display_contest_info'][st.session_state['display_contest_info']['BaseName'].isin(st.session_state['entry_names'])]
297
+ if st.session_state['stack_parse_var'] == 'Specific' and st.session_state['stack_names']:
298
+ st.session_state['display_contest_info'] = st.session_state['display_contest_info'][st.session_state['display_contest_info']['stack'].isin(st.session_state['stack_names'])]
299
+ if st.session_state['stack_size_parse_var'] == 'Specific' and st.session_state['stack_size_names']:
300
+ st.session_state['display_contest_info'] = st.session_state['display_contest_info'][st.session_state['display_contest_info']['stack_size'].isin(st.session_state['stack_size_names'])]
301
+ if st.session_state['player_parse_var'] == 'Specific' and st.session_state['player_names']:
302
+ mask = st.session_state['display_contest_info'][st.session_state['player_columns']].apply(lambda row: all(player in row.values for player in st.session_state['player_names']), axis=1)
303
+ st.session_state['display_contest_info'] = st.session_state['display_contest_info'][mask]
304
+ if st.session_state['low_entries_var'] and st.session_state['high_entries_var']:
305
+ st.session_state['display_contest_info'] = st.session_state['display_contest_info'][st.session_state['display_contest_info']['EntryCount'].between(st.session_state['low_entries_var'], st.session_state['high_entries_var'])]
306
 
307
  # Initialize pagination in session state if not exists
308
  if 'current_page' not in st.session_state:
 
310
 
311
  # Calculate total pages
312
  rows_per_page = 500
313
+ total_rows = len(st.session_state['display_contest_info'])
314
  total_pages = (total_rows + rows_per_page - 1) // rows_per_page
315
 
316
  # Create pagination controls in a single row
 
338
  start_idx = (st.session_state.current_page - 1) * rows_per_page
339
  end_idx = min((st.session_state.current_page) * rows_per_page, total_rows)
340
  st.dataframe(
341
+ st.session_state['display_contest_info'].iloc[start_idx:end_idx].style
342
  .background_gradient(axis=0)
343
  .background_gradient(cmap='RdYlGn')
344
  .format(precision=2),
 
364
  else:
365
  pos_select = None
366
 
367
+ if st.session_state['entry_parse_var'] == 'All':
368
 
369
+ st.session_state['player_frame'] = create_player_exposures(st.session_state['display_contest_info'], st.session_state['player_columns'])
370
  hold_frame = st.session_state['player_frame'].copy()
371
  if sport_select == 'GOLF':
372
  hold_frame['Pos'] = 'G'
373
  else:
374
+ hold_frame['Pos'] = hold_frame['Player'].map(st.session_state['map_dict']['pos_map'])
375
  st.session_state['player_frame'].insert(1, 'Pos', hold_frame['Pos'])
376
  st.session_state['player_frame'] = st.session_state['player_frame'].dropna(subset=['Pos'])
377
  if pos_select:
 
384
  hide_index=True)
385
  else:
386
 
387
+ st.session_state['player_frame'] = create_player_exposures(st.session_state['display_contest_info'], st.session_state['player_columns'], st.session_state['entry_names'])
388
  hold_frame = st.session_state['player_frame'].copy()
389
  if sport_select == 'GOLF':
390
  hold_frame['Pos'] = 'G'
391
  else:
392
+ hold_frame['Pos'] = hold_frame['Player'].map(st.session_state['map_dict']['pos_map'])
393
  st.session_state['player_frame'].insert(1, 'Pos', hold_frame['Pos'])
394
  st.session_state['player_frame'] = st.session_state['player_frame'].dropna(subset=['Pos'])
395
  if pos_select:
 
402
  hide_index=True)
403
  with tab2:
404
 
405
+ if st.session_state['entry_parse_var'] == 'All':
406
+ st.session_state['stack_frame'] = create_stack_exposures(st.session_state['display_contest_info'])
407
  st.dataframe(st.session_state['stack_frame'].
408
  sort_values(by='Exposure Overall', ascending=False).
409
  style.background_gradient(cmap='RdYlGn').
410
  format(formatter='{:.2%}', subset=st.session_state['stack_frame'].iloc[:, 1:].select_dtypes(include=['number']).columns),
411
  hide_index=True)
412
  else:
413
+ st.session_state['stack_frame'] = create_stack_exposures(st.session_state['display_contest_info'], st.session_state['entry_names'])
414
  st.dataframe(st.session_state['stack_frame'].
415
  sort_values(by='Exposure Overall', ascending=False).
416
  style.background_gradient(cmap='RdYlGn').
 
418
  hide_index=True)
419
  with tab3:
420
 
421
+ if st.session_state['entry_parse_var'] == 'All':
422
+ st.session_state['stack_size_frame'] = create_stack_size_exposures(st.session_state['display_contest_info'])
423
  st.dataframe(st.session_state['stack_size_frame'].
424
  sort_values(by='Exposure Overall', ascending=False).
425
  style.background_gradient(cmap='RdYlGn').
426
  format(formatter='{:.2%}', subset=st.session_state['stack_size_frame'].iloc[:, 1:].select_dtypes(include=['number']).columns),
427
  hide_index=True)
428
  else:
429
+ st.session_state['stack_size_frame'] = create_stack_size_exposures(st.session_state['display_contest_info'], st.session_state['entry_names'])
430
  st.dataframe(st.session_state['stack_size_frame'].
431
  sort_values(by='Exposure Overall', ascending=False).
432
  style.background_gradient(cmap='RdYlGn').
 
435
 
436
  with tab4:
437
 
438
+ if st.session_state['entry_parse_var'] == 'All':
439
+ st.session_state['general_frame'] = create_general_exposures(st.session_state['display_contest_info'])
440
  st.dataframe(st.session_state['general_frame'].style.background_gradient(cmap='RdYlGn', axis=1).format(precision=2), hide_index=True)
441
 
442
  else:
443
+ st.session_state['general_frame'] = create_general_exposures(st.session_state['display_contest_info'], st.session_state['entry_names'])
444
  st.dataframe(st.session_state['general_frame'].style.background_gradient(cmap='RdYlGn', axis=1).format(precision=2), hide_index=True)
445
 
446
  with tab5:
 
449
  with col1:
450
  user_dupe_var = st.selectbox("Which usage(s) would you like to view?", ['All', 'Specific'], key='user_dupe_var')
451
  with col2:
452
+ user_dupe_select = st.multiselect("Select your user(s)", st.session_state['display_contest_info']['BaseName'].sort_values().unique(), key='user_dupe_select')
453
  submitted = st.form_submit_button("Submit")
454
  if submitted:
455
  if user_dupe_var == 'Specific':