James McCool commited on
Commit
f5058ea
·
1 Parent(s): dadc802

okay lets try it this way

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