James McCool
commited on
Commit
·
3160bd1
1
Parent(s):
4d615ec
okay fine fuck it
Browse files
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 |
-
|
| 3309 |
-
|
| 3310 |
-
if type_var == 'Showdown':
|
| 3311 |
-
position_parse_options = ['All', *showdown_position_lists]
|
| 3312 |
else:
|
| 3313 |
-
|
| 3314 |
-
|
| 3315 |
-
|
| 3316 |
-
|
| 3317 |
-
|
| 3318 |
-
|
| 3319 |
-
|
| 3320 |
-
|
| 3321 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3322 |
else:
|
| 3323 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3324 |
else:
|
| 3325 |
-
if
|
| 3326 |
-
|
| 3327 |
-
|
| 3328 |
-
|
| 3329 |
-
|
| 3330 |
-
|
| 3331 |
-
|
| 3332 |
-
|
| 3333 |
-
|
| 3334 |
-
|
| 3335 |
-
|
| 3336 |
-
|
| 3337 |
-
|
| 3338 |
-
|
| 3339 |
-
|
| 3340 |
-
|
| 3341 |
-
|
| 3342 |
-
|
| 3343 |
-
|
| 3344 |
-
|
| 3345 |
-
|
| 3346 |
-
|
| 3347 |
-
for player
|
| 3348 |
-
|
| 3349 |
-
|
| 3350 |
-
|
| 3351 |
-
|
| 3352 |
-
|
| 3353 |
-
|
| 3354 |
-
|
| 3355 |
-
|
| 3356 |
-
|
| 3357 |
-
|
| 3358 |
-
|
| 3359 |
-
|
| 3360 |
-
|
| 3361 |
-
|
| 3362 |
-
|
| 3363 |
-
|
| 3364 |
-
|
| 3365 |
-
|
| 3366 |
-
|
| 3367 |
-
|
| 3368 |
-
|
| 3369 |
-
|
| 3370 |
-
|
| 3371 |
-
|
| 3372 |
-
|
| 3373 |
-
|
| 3374 |
-
|
| 3375 |
-
|
| 3376 |
-
|
| 3377 |
-
|
| 3378 |
-
|
| 3379 |
-
|
| 3380 |
-
|
| 3381 |
-
|
| 3382 |
-
|
| 3383 |
-
|
| 3384 |
-
|
| 3385 |
-
|
| 3386 |
-
|
| 3387 |
-
|
| 3388 |
-
|
| 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 |
-
|
| 3461 |
-
|
| 3462 |
-
|
| 3463 |
-
|
| 3464 |
-
.
|
| 3465 |
-
|
| 3466 |
-
|
| 3467 |
-
|
| 3468 |
-
|
| 3469 |
-
|
| 3470 |
-
|
| 3471 |
-
|
| 3472 |
-
|
| 3473 |
-
|
| 3474 |
-
}
|
| 3475 |
-
|
| 3476 |
-
|
| 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:
|