James McCool commited on
Commit
3160bd1
·
1 Parent(s): 4d615ec

okay fine fuck it

Browse files
Files changed (1) hide show
  1. app.py +152 -166
app.py CHANGED
@@ -3305,176 +3305,162 @@ if selected_tab == 'Manage Portfolio':
3305
  )
3306
  player_stats_col, stack_stats_col, combos_col = st.tabs(['Player Stats', 'Stack Stats', 'Combos'])
3307
  with player_stats_col:
3308
- position_parse_col, analyze_button_col = st.tabs(['Position Parse', 'Analyze Players'])
3309
- with position_parse_col:
3310
- if type_var == 'Showdown':
3311
- position_parse_options = ['All', *showdown_position_lists]
3312
  else:
3313
- position_parse_options = ['All', *sport_position_lists[site_var][sport_var]]
3314
- position_parse = st.selectbox("Parse by:", options=position_parse_options, index=0, key='position_parse')
3315
- with analyze_button_col:
3316
- if st.button("Analyze Players", key='analyze_players'):
3317
- player_stats = []
3318
-
3319
- if st.session_state['settings_base'] and 'origin_player_exposures' in st.session_state and display_frame_source == 'Portfolio':
3320
- if position_parse != 'All':
3321
- st.session_state['player_summary'] = st.session_state['origin_player_exposures'][st.session_state['origin_player_exposures']['Position'].str.contains(position_parse)]
 
 
 
 
 
 
 
 
 
 
 
 
3322
  else:
3323
- st.session_state['player_summary'] = st.session_state['origin_player_exposures']
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3324
  else:
3325
- if type_var == 'Showdown':
3326
- if sport_var == 'GOLF':
3327
- for player in player_names:
3328
- player_mask = st.session_state['display_frame'][st.session_state['player_columns']].apply(
3329
- lambda row: player in list(row), axis=1
3330
- )
3331
-
3332
- if player_mask.any():
3333
- player_stats.append({
3334
- 'Player': player,
3335
- 'Position': st.session_state['map_dict']['pos_map'][player],
3336
- 'Team': st.session_state['map_dict']['team_map'][player],
3337
- 'ProjOwn': st.session_state['map_dict']['own_map'][player] / 100.0,
3338
- 'Exposure': player_mask.sum() / len(st.session_state['display_frame']),
3339
- 'Avg Median': st.session_state['display_frame'][player_mask]['median'].mean(),
3340
- 'Avg Own': st.session_state['display_frame'][player_mask]['Own'].mean(),
3341
- 'Avg Dupes': st.session_state['display_frame'][player_mask]['Dupes'].mean(),
3342
- 'Avg Finish %': st.session_state['display_frame'][player_mask]['Finish_percentile'].mean(),
3343
- 'Avg Lineup Edge': st.session_state['display_frame'][player_mask]['Lineup Edge'].mean(),
3344
- 'Avg Diversity': st.session_state['display_frame'][player_mask]['Diversity'].mean(),
3345
- })
3346
- else:
3347
- for player in player_names:
3348
- # Create mask for lineups where this player is Captain (first column)
3349
- cpt_mask = st.session_state['display_frame'][st.session_state['player_columns'][0]] == player
3350
-
3351
- if cpt_mask.any():
3352
- player_stats.append({
3353
- 'Player': f"{player} (CPT)",
3354
- 'Position': 'CPT',
3355
- 'Team': st.session_state['map_dict']['team_map'][player],
3356
- 'ProjOwn': st.session_state['map_dict']['cpt_own_map'][player] / 100.0,
3357
- 'Exposure': cpt_mask.sum() / len(st.session_state['display_frame']),
3358
- 'Own_Edge': st.session_state['map_dict']['cpt_own_map'][player] / 100.0 - (cpt_mask.sum() / len(st.session_state['display_frame'])),
3359
- 'Avg Median': st.session_state['display_frame'][cpt_mask]['median'].mean(),
3360
- 'Avg Own': st.session_state['display_frame'][cpt_mask]['Own'].mean(),
3361
- 'Avg Dupes': st.session_state['display_frame'][cpt_mask]['Dupes'].mean(),
3362
- 'Avg Finish %': st.session_state['display_frame'][cpt_mask]['Finish_percentile'].mean(),
3363
- 'Avg Lineup Edge': st.session_state['display_frame'][cpt_mask]['Lineup Edge'].mean(),
3364
- 'Avg Diversity': st.session_state['display_frame'][cpt_mask]['Diversity'].mean(),
3365
- })
3366
-
3367
- # Create mask for lineups where this player is FLEX (other columns)
3368
- flex_mask = st.session_state['display_frame'][st.session_state['player_columns'][1:]].apply(
3369
- lambda row: player in list(row), axis=1
3370
- )
3371
-
3372
- if flex_mask.any():
3373
- player_stats.append({
3374
- 'Player': f"{player} (FLEX)",
3375
- 'Position': 'FLEX',
3376
- 'Team': st.session_state['map_dict']['team_map'][player],
3377
- 'ProjOwn': (st.session_state['map_dict']['own_map'][player] - st.session_state['map_dict']['cpt_own_map'][player]) / 100.0,
3378
- 'Exposure': flex_mask.sum() / len(st.session_state['display_frame']),
3379
- 'Own_Edge': (st.session_state['map_dict']['own_map'][player] - st.session_state['map_dict']['cpt_own_map'][player]) / 100.0 - (flex_mask.sum() / len(st.session_state['display_frame'])),
3380
- 'Avg Median': st.session_state['display_frame'][flex_mask]['median'].mean(),
3381
- 'Avg Own': st.session_state['display_frame'][flex_mask]['Own'].mean(),
3382
- 'Avg Dupes': st.session_state['display_frame'][flex_mask]['Dupes'].mean(),
3383
- 'Avg Finish %': st.session_state['display_frame'][flex_mask]['Finish_percentile'].mean(),
3384
- 'Avg Lineup Edge': st.session_state['display_frame'][flex_mask]['Lineup Edge'].mean(),
3385
- 'Avg Diversity': st.session_state['display_frame'][flex_mask]['Diversity'].mean(),
3386
- })
3387
- else:
3388
- if sport_var == 'CS2' or sport_var == 'LOL':
3389
- # Handle Captain positions
3390
- for player in player_names:
3391
- # Create mask for lineups where this player is Captain (first column)
3392
- cpt_mask = st.session_state['display_frame'][st.session_state['player_columns'][0]] == player
3393
-
3394
- if cpt_mask.any():
3395
- player_stats.append({
3396
- 'Player': f"{player} (CPT)",
3397
- 'Position': 'CPT',
3398
- 'Team': st.session_state['map_dict']['team_map'][player],
3399
- 'ProjOwn': st.session_state['map_dict']['cpt_own_map'][player] / 100.0,
3400
- 'Exposure': cpt_mask.sum() / len(st.session_state['display_frame']),
3401
- 'Own_Edge': st.session_state['map_dict']['cpt_own_map'][player] / 100.0 - (cpt_mask.sum() / len(st.session_state['display_frame'])),
3402
- 'Avg Median': st.session_state['display_frame'][cpt_mask]['median'].mean(),
3403
- 'Avg Own': st.session_state['display_frame'][cpt_mask]['Own'].mean(),
3404
- 'Avg Dupes': st.session_state['display_frame'][cpt_mask]['Dupes'].mean(),
3405
- 'Avg Finish %': st.session_state['display_frame'][cpt_mask]['Finish_percentile'].mean(),
3406
- 'Avg Lineup Edge': st.session_state['display_frame'][cpt_mask]['Lineup Edge'].mean(),
3407
- 'Avg Diversity': st.session_state['display_frame'][cpt_mask]['Diversity'].mean(),
3408
- })
3409
-
3410
- # Create mask for lineups where this player is FLEX (other columns)
3411
- flex_mask = st.session_state['display_frame'][st.session_state['player_columns'][1:]].apply(
3412
- lambda row: player in list(row), axis=1
3413
- )
3414
-
3415
- if flex_mask.any():
3416
- player_stats.append({
3417
- 'Player': f"{player} (FLEX)",
3418
- 'Position': 'FLEX',
3419
- 'Team': st.session_state['map_dict']['team_map'][player],
3420
- 'ProjOwn': (st.session_state['map_dict']['own_map'][player] - st.session_state['map_dict']['cpt_own_map'][player]) / 100.0,
3421
- 'Exposure': flex_mask.sum() / len(st.session_state['display_frame']),
3422
- 'Own_Edge': (st.session_state['map_dict']['own_map'][player] - st.session_state['map_dict']['cpt_own_map'][player]) / 100.0 - (flex_mask.sum() / len(st.session_state['display_frame'])),
3423
- 'Avg Median': st.session_state['display_frame'][flex_mask]['median'].mean(),
3424
- 'Avg Own': st.session_state['display_frame'][flex_mask]['Own'].mean(),
3425
- 'Avg Dupes': st.session_state['display_frame'][flex_mask]['Dupes'].mean(),
3426
- 'Avg Finish %': st.session_state['display_frame'][flex_mask]['Finish_percentile'].mean(),
3427
- 'Avg Lineup Edge': st.session_state['display_frame'][flex_mask]['Lineup Edge'].mean(),
3428
- 'Avg Diversity': st.session_state['display_frame'][flex_mask]['Diversity'].mean(),
3429
- })
3430
- elif sport_var != 'CS2' and sport_var != 'LOL':
3431
- # Original Classic format processing
3432
- for player in player_names:
3433
- player_mask = st.session_state['display_frame'][st.session_state['player_columns']].apply(
3434
- lambda row: player in list(row), axis=1
3435
- )
3436
-
3437
- if player_mask.any():
3438
- player_stats.append({
3439
- 'Player': player,
3440
- 'Position': st.session_state['map_dict']['pos_map'][player],
3441
- 'Team': st.session_state['map_dict']['team_map'][player],
3442
- 'ProjOwn': st.session_state['map_dict']['own_map'][player] / 100.0,
3443
- 'Exposure': player_mask.sum() / len(st.session_state['display_frame']),
3444
- 'Own_Edge': st.session_state['map_dict']['own_map'][player] / 100.0 - (player_mask.sum() / len(st.session_state['display_frame'])),
3445
- 'Avg Median': st.session_state['display_frame'][player_mask]['median'].mean(),
3446
- 'Avg Own': st.session_state['display_frame'][player_mask]['Own'].mean(),
3447
- 'Avg Dupes': st.session_state['display_frame'][player_mask]['Dupes'].mean(),
3448
- 'Avg Finish %': st.session_state['display_frame'][player_mask]['Finish_percentile'].mean(),
3449
- 'Avg Lineup Edge': st.session_state['display_frame'][player_mask]['Lineup Edge'].mean(),
3450
- 'Avg Diversity': st.session_state['display_frame'][player_mask]['Diversity'].mean(),
3451
- })
3452
-
3453
- player_summary = pd.DataFrame(player_stats)
3454
- player_summary = player_summary.sort_values('Exposure', ascending=False)
3455
- st.session_state['player_summary'] = player_summary.copy()
3456
- if 'origin_player_exposures' not in st.session_state:
3457
- st.session_state['origin_player_exposures'] = player_summary.copy()
3458
-
3459
 
3460
- st.subheader("Player Summary")
3461
- st.dataframe(
3462
- st.session_state['player_summary'].style
3463
- .background_gradient(axis=0).background_gradient(cmap='RdYlGn').background_gradient(cmap='RdYlGn_r', subset=['Avg Finish %', 'Avg Own', 'Avg Dupes'])
3464
- .format({
3465
- 'ProjOwn': '{:.2%}',
3466
- 'Own_Edge': '{:.2%}',
3467
- 'Avg Median': '{:.2f}',
3468
- 'Avg Own': '{:.2f}',
3469
- 'Avg Dupes': '{:.2f}',
3470
- 'Avg Finish %': '{:.2%}',
3471
- 'Avg Lineup Edge': '{:.2%}',
3472
- 'Exposure': '{:.2%}',
3473
- 'Avg Diversity': '{:.2%}'
3474
- }),
3475
- height=400,
3476
- use_container_width=True
3477
- )
 
 
 
 
 
 
 
3478
 
3479
  with stack_stats_col:
3480
  if 'Stack' in st.session_state['display_frame'].columns:
 
3305
  )
3306
  player_stats_col, stack_stats_col, combos_col = st.tabs(['Player Stats', 'Stack Stats', 'Combos'])
3307
  with player_stats_col:
3308
+
3309
+ if st.button("Analyze Players", key='analyze_players'):
 
 
3310
  else:
3311
+ if type_var == 'Showdown':
3312
+ if sport_var == 'GOLF':
3313
+ for player in player_names:
3314
+ player_mask = st.session_state['display_frame'][st.session_state['player_columns']].apply(
3315
+ lambda row: player in list(row), axis=1
3316
+ )
3317
+
3318
+ if player_mask.any():
3319
+ player_stats.append({
3320
+ 'Player': player,
3321
+ 'Position': st.session_state['map_dict']['pos_map'][player],
3322
+ 'Team': st.session_state['map_dict']['team_map'][player],
3323
+ 'ProjOwn': st.session_state['map_dict']['own_map'][player] / 100.0,
3324
+ 'Exposure': player_mask.sum() / len(st.session_state['display_frame']),
3325
+ 'Avg Median': st.session_state['display_frame'][player_mask]['median'].mean(),
3326
+ 'Avg Own': st.session_state['display_frame'][player_mask]['Own'].mean(),
3327
+ 'Avg Dupes': st.session_state['display_frame'][player_mask]['Dupes'].mean(),
3328
+ 'Avg Finish %': st.session_state['display_frame'][player_mask]['Finish_percentile'].mean(),
3329
+ 'Avg Lineup Edge': st.session_state['display_frame'][player_mask]['Lineup Edge'].mean(),
3330
+ 'Avg Diversity': st.session_state['display_frame'][player_mask]['Diversity'].mean(),
3331
+ })
3332
  else:
3333
+ for player in player_names:
3334
+ # Create mask for lineups where this player is Captain (first column)
3335
+ cpt_mask = st.session_state['display_frame'][st.session_state['player_columns'][0]] == player
3336
+
3337
+ if cpt_mask.any():
3338
+ player_stats.append({
3339
+ 'Player': f"{player} (CPT)",
3340
+ 'Position': 'CPT',
3341
+ 'Team': st.session_state['map_dict']['team_map'][player],
3342
+ 'ProjOwn': st.session_state['map_dict']['cpt_own_map'][player] / 100.0,
3343
+ 'Exposure': cpt_mask.sum() / len(st.session_state['display_frame']),
3344
+ 'Own_Edge': st.session_state['map_dict']['cpt_own_map'][player] / 100.0 - (cpt_mask.sum() / len(st.session_state['display_frame'])),
3345
+ 'Avg Median': st.session_state['display_frame'][cpt_mask]['median'].mean(),
3346
+ 'Avg Own': st.session_state['display_frame'][cpt_mask]['Own'].mean(),
3347
+ 'Avg Dupes': st.session_state['display_frame'][cpt_mask]['Dupes'].mean(),
3348
+ 'Avg Finish %': st.session_state['display_frame'][cpt_mask]['Finish_percentile'].mean(),
3349
+ 'Avg Lineup Edge': st.session_state['display_frame'][cpt_mask]['Lineup Edge'].mean(),
3350
+ 'Avg Diversity': st.session_state['display_frame'][cpt_mask]['Diversity'].mean(),
3351
+ })
3352
+
3353
+ # Create mask for lineups where this player is FLEX (other columns)
3354
+ flex_mask = st.session_state['display_frame'][st.session_state['player_columns'][1:]].apply(
3355
+ lambda row: player in list(row), axis=1
3356
+ )
3357
+
3358
+ if flex_mask.any():
3359
+ player_stats.append({
3360
+ 'Player': f"{player} (FLEX)",
3361
+ 'Position': 'FLEX',
3362
+ 'Team': st.session_state['map_dict']['team_map'][player],
3363
+ 'ProjOwn': (st.session_state['map_dict']['own_map'][player] - st.session_state['map_dict']['cpt_own_map'][player]) / 100.0,
3364
+ 'Exposure': flex_mask.sum() / len(st.session_state['display_frame']),
3365
+ 'Own_Edge': (st.session_state['map_dict']['own_map'][player] - st.session_state['map_dict']['cpt_own_map'][player]) / 100.0 - (flex_mask.sum() / len(st.session_state['display_frame'])),
3366
+ 'Avg Median': st.session_state['display_frame'][flex_mask]['median'].mean(),
3367
+ 'Avg Own': st.session_state['display_frame'][flex_mask]['Own'].mean(),
3368
+ 'Avg Dupes': st.session_state['display_frame'][flex_mask]['Dupes'].mean(),
3369
+ 'Avg Finish %': st.session_state['display_frame'][flex_mask]['Finish_percentile'].mean(),
3370
+ 'Avg Lineup Edge': st.session_state['display_frame'][flex_mask]['Lineup Edge'].mean(),
3371
+ 'Avg Diversity': st.session_state['display_frame'][flex_mask]['Diversity'].mean(),
3372
+ })
3373
  else:
3374
+ if sport_var == 'CS2' or sport_var == 'LOL':
3375
+ # Handle Captain positions
3376
+ for player in player_names:
3377
+ # Create mask for lineups where this player is Captain (first column)
3378
+ cpt_mask = st.session_state['display_frame'][st.session_state['player_columns'][0]] == player
3379
+
3380
+ if cpt_mask.any():
3381
+ player_stats.append({
3382
+ 'Player': f"{player} (CPT)",
3383
+ 'Position': 'CPT',
3384
+ 'Team': st.session_state['map_dict']['team_map'][player],
3385
+ 'ProjOwn': st.session_state['map_dict']['cpt_own_map'][player] / 100.0,
3386
+ 'Exposure': cpt_mask.sum() / len(st.session_state['display_frame']),
3387
+ 'Own_Edge': st.session_state['map_dict']['cpt_own_map'][player] / 100.0 - (cpt_mask.sum() / len(st.session_state['display_frame'])),
3388
+ 'Avg Median': st.session_state['display_frame'][cpt_mask]['median'].mean(),
3389
+ 'Avg Own': st.session_state['display_frame'][cpt_mask]['Own'].mean(),
3390
+ 'Avg Dupes': st.session_state['display_frame'][cpt_mask]['Dupes'].mean(),
3391
+ 'Avg Finish %': st.session_state['display_frame'][cpt_mask]['Finish_percentile'].mean(),
3392
+ 'Avg Lineup Edge': st.session_state['display_frame'][cpt_mask]['Lineup Edge'].mean(),
3393
+ 'Avg Diversity': st.session_state['display_frame'][cpt_mask]['Diversity'].mean(),
3394
+ })
3395
+
3396
+ # Create mask for lineups where this player is FLEX (other columns)
3397
+ flex_mask = st.session_state['display_frame'][st.session_state['player_columns'][1:]].apply(
3398
+ lambda row: player in list(row), axis=1
3399
+ )
3400
+
3401
+ if flex_mask.any():
3402
+ player_stats.append({
3403
+ 'Player': f"{player} (FLEX)",
3404
+ 'Position': 'FLEX',
3405
+ 'Team': st.session_state['map_dict']['team_map'][player],
3406
+ 'ProjOwn': (st.session_state['map_dict']['own_map'][player] - st.session_state['map_dict']['cpt_own_map'][player]) / 100.0,
3407
+ 'Exposure': flex_mask.sum() / len(st.session_state['display_frame']),
3408
+ 'Own_Edge': (st.session_state['map_dict']['own_map'][player] - st.session_state['map_dict']['cpt_own_map'][player]) / 100.0 - (flex_mask.sum() / len(st.session_state['display_frame'])),
3409
+ 'Avg Median': st.session_state['display_frame'][flex_mask]['median'].mean(),
3410
+ 'Avg Own': st.session_state['display_frame'][flex_mask]['Own'].mean(),
3411
+ 'Avg Dupes': st.session_state['display_frame'][flex_mask]['Dupes'].mean(),
3412
+ 'Avg Finish %': st.session_state['display_frame'][flex_mask]['Finish_percentile'].mean(),
3413
+ 'Avg Lineup Edge': st.session_state['display_frame'][flex_mask]['Lineup Edge'].mean(),
3414
+ 'Avg Diversity': st.session_state['display_frame'][flex_mask]['Diversity'].mean(),
3415
+ })
3416
+ elif sport_var != 'CS2' and sport_var != 'LOL':
3417
+ # Original Classic format processing
3418
+ for player in player_names:
3419
+ player_mask = st.session_state['display_frame'][st.session_state['player_columns']].apply(
3420
+ lambda row: player in list(row), axis=1
3421
+ )
3422
+
3423
+ if player_mask.any():
3424
+ player_stats.append({
3425
+ 'Player': player,
3426
+ 'Position': st.session_state['map_dict']['pos_map'][player],
3427
+ 'Team': st.session_state['map_dict']['team_map'][player],
3428
+ 'ProjOwn': st.session_state['map_dict']['own_map'][player] / 100.0,
3429
+ 'Exposure': player_mask.sum() / len(st.session_state['display_frame']),
3430
+ 'Own_Edge': st.session_state['map_dict']['own_map'][player] / 100.0 - (player_mask.sum() / len(st.session_state['display_frame'])),
3431
+ 'Avg Median': st.session_state['display_frame'][player_mask]['median'].mean(),
3432
+ 'Avg Own': st.session_state['display_frame'][player_mask]['Own'].mean(),
3433
+ 'Avg Dupes': st.session_state['display_frame'][player_mask]['Dupes'].mean(),
3434
+ 'Avg Finish %': st.session_state['display_frame'][player_mask]['Finish_percentile'].mean(),
3435
+ 'Avg Lineup Edge': st.session_state['display_frame'][player_mask]['Lineup Edge'].mean(),
3436
+ 'Avg Diversity': st.session_state['display_frame'][player_mask]['Diversity'].mean(),
3437
+ })
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3438
 
3439
+ player_summary = pd.DataFrame(player_stats)
3440
+ player_summary = player_summary.sort_values('Exposure', ascending=False)
3441
+ st.session_state['player_summary'] = player_summary.copy()
3442
+ if 'origin_player_exposures' not in st.session_state:
3443
+ st.session_state['origin_player_exposures'] = player_summary.copy()
3444
+
3445
+
3446
+ st.subheader("Player Summary")
3447
+ st.dataframe(
3448
+ st.session_state['player_summary'].style
3449
+ .background_gradient(axis=0).background_gradient(cmap='RdYlGn').background_gradient(cmap='RdYlGn_r', subset=['Avg Finish %', 'Avg Own', 'Avg Dupes'])
3450
+ .format({
3451
+ 'ProjOwn': '{:.2%}',
3452
+ 'Own_Edge': '{:.2%}',
3453
+ 'Avg Median': '{:.2f}',
3454
+ 'Avg Own': '{:.2f}',
3455
+ 'Avg Dupes': '{:.2f}',
3456
+ 'Avg Finish %': '{:.2%}',
3457
+ 'Avg Lineup Edge': '{:.2%}',
3458
+ 'Exposure': '{:.2%}',
3459
+ 'Avg Diversity': '{:.2%}'
3460
+ }),
3461
+ height=400,
3462
+ use_container_width=True
3463
+ )
3464
 
3465
  with stack_stats_col:
3466
  if 'Stack' in st.session_state['display_frame'].columns: