James McCool
commited on
Commit
·
57d6a24
1
Parent(s):
b452fab
Refactor display frame handling in app.py to use a unified session state variable. Update references to 'display_frame' to ensure consistency and improve data management across various functionalities, including player and stack analysis.
Browse files
app.py
CHANGED
@@ -1263,15 +1263,15 @@ with tab2:
|
|
1263 |
|
1264 |
display_frame_source = st.selectbox("Display:", options=['Portfolio', 'Export Base'], key='display_frame_source')
|
1265 |
if display_frame_source == 'Portfolio':
|
1266 |
-
display_frame = st.session_state['working_frame']
|
1267 |
-
st.session_state['export_file'] = display_frame.copy()
|
1268 |
|
1269 |
for col in st.session_state['export_file'].columns:
|
1270 |
if col not in excluded_cols:
|
1271 |
st.session_state['export_file'][col] = st.session_state['export_file'][col].map(st.session_state['export_dict'])
|
1272 |
elif display_frame_source == 'Export Base':
|
1273 |
-
display_frame = st.session_state['export_base']
|
1274 |
-
st.session_state['export_file'] = display_frame.copy()
|
1275 |
|
1276 |
for col in st.session_state['export_file'].columns:
|
1277 |
if col not in excluded_cols:
|
@@ -1297,11 +1297,11 @@ with tab2:
|
|
1297 |
if st.button("Clear Custom Export"):
|
1298 |
st.session_state['export_base'] = pd.DataFrame(columns=st.session_state['working_frame'].columns)
|
1299 |
if display_frame_source == 'Portfolio':
|
1300 |
-
display_frame = st.session_state['working_frame']
|
1301 |
elif display_frame_source == 'Export Base':
|
1302 |
-
display_frame = st.session_state['export_base']
|
1303 |
|
1304 |
-
total_rows = len(display_frame)
|
1305 |
rows_per_page = 100
|
1306 |
total_pages = (total_rows + rows_per_page - 1) // rows_per_page # Ceiling division
|
1307 |
|
@@ -1328,7 +1328,7 @@ with tab2:
|
|
1328 |
end_idx = min(start_idx + rows_per_page, total_rows)
|
1329 |
|
1330 |
# Get the subset of data for the current page
|
1331 |
-
current_page_data = display_frame.iloc[start_idx:end_idx]
|
1332 |
# Display the paginated dataframe first
|
1333 |
st.dataframe(
|
1334 |
current_page_data.style
|
@@ -1367,7 +1367,7 @@ with tab2:
|
|
1367 |
with player_stats_col:
|
1368 |
if st.button("Analyze Players", key='analyze_players'):
|
1369 |
player_stats = []
|
1370 |
-
player_columns = [col for col in display_frame.columns if col not in excluded_cols]
|
1371 |
|
1372 |
if st.session_state['settings_base'] and 'origin_player_exposures' in st.session_state and display_frame_source == 'Portfolio':
|
1373 |
st.session_state['player_summary'] = st.session_state['origin_player_exposures']
|
@@ -1375,7 +1375,7 @@ with tab2:
|
|
1375 |
if type_var == 'Showdown':
|
1376 |
if sport_var == 'GOLF':
|
1377 |
for player in player_names:
|
1378 |
-
player_mask = display_frame[player_columns].apply(
|
1379 |
lambda row: player in list(row), axis=1
|
1380 |
)
|
1381 |
|
@@ -1383,32 +1383,32 @@ with tab2:
|
|
1383 |
player_stats.append({
|
1384 |
'Player': player,
|
1385 |
'Lineup Count': player_mask.sum(),
|
1386 |
-
'Exposure': player_mask.sum() / len(display_frame),
|
1387 |
-
'Avg Median': display_frame[player_mask]['median'].mean(),
|
1388 |
-
'Avg Own': display_frame[player_mask]['Own'].mean(),
|
1389 |
-
'Avg Dupes': display_frame[player_mask]['Dupes'].mean(),
|
1390 |
-
'Avg Finish %': display_frame[player_mask]['Finish_percentile'].mean(),
|
1391 |
-
'Avg Lineup Edge': display_frame[player_mask]['Lineup Edge'].mean(),
|
1392 |
})
|
1393 |
else:
|
1394 |
for player in player_names:
|
1395 |
# Create mask for lineups where this player is Captain (first column)
|
1396 |
-
cpt_mask = display_frame[player_columns[0]] == player
|
1397 |
|
1398 |
if cpt_mask.any():
|
1399 |
player_stats.append({
|
1400 |
'Player': f"{player} (CPT)",
|
1401 |
'Lineup Count': cpt_mask.sum(),
|
1402 |
-
'Exposure': cpt_mask.sum() / len(display_frame),
|
1403 |
-
'Avg Median': display_frame[cpt_mask]['median'].mean(),
|
1404 |
-
'Avg Own': display_frame[cpt_mask]['Own'].mean(),
|
1405 |
-
'Avg Dupes': display_frame[cpt_mask]['Dupes'].mean(),
|
1406 |
-
'Avg Finish %': display_frame[cpt_mask]['Finish_percentile'].mean(),
|
1407 |
-
'Avg Lineup Edge': display_frame[cpt_mask]['Lineup Edge'].mean(),
|
1408 |
})
|
1409 |
|
1410 |
# Create mask for lineups where this player is FLEX (other columns)
|
1411 |
-
flex_mask = display_frame[player_columns[1:]].apply(
|
1412 |
lambda row: player in list(row), axis=1
|
1413 |
)
|
1414 |
|
@@ -1416,34 +1416,34 @@ with tab2:
|
|
1416 |
player_stats.append({
|
1417 |
'Player': f"{player} (FLEX)",
|
1418 |
'Lineup Count': flex_mask.sum(),
|
1419 |
-
'Exposure': flex_mask.sum() / len(display_frame),
|
1420 |
-
'Avg Median': display_frame[flex_mask]['median'].mean(),
|
1421 |
-
'Avg Own': display_frame[flex_mask]['Own'].mean(),
|
1422 |
-
'Avg Dupes': display_frame[flex_mask]['Dupes'].mean(),
|
1423 |
-
'Avg Finish %': display_frame[flex_mask]['Finish_percentile'].mean(),
|
1424 |
-
'Avg Lineup Edge': display_frame[flex_mask]['Lineup Edge'].mean(),
|
1425 |
})
|
1426 |
else:
|
1427 |
if sport_var == 'CS2' or sport_var == 'LOL':
|
1428 |
# Handle Captain positions
|
1429 |
for player in player_names:
|
1430 |
# Create mask for lineups where this player is Captain (first column)
|
1431 |
-
cpt_mask = display_frame[player_columns[0]] == player
|
1432 |
|
1433 |
if cpt_mask.any():
|
1434 |
player_stats.append({
|
1435 |
'Player': f"{player} (CPT)",
|
1436 |
'Lineup Count': cpt_mask.sum(),
|
1437 |
-
'Exposure': cpt_mask.sum() / len(display_frame),
|
1438 |
-
'Avg Median': display_frame[cpt_mask]['median'].mean(),
|
1439 |
-
'Avg Own': display_frame[cpt_mask]['Own'].mean(),
|
1440 |
-
'Avg Dupes': display_frame[cpt_mask]['Dupes'].mean(),
|
1441 |
-
'Avg Finish %': display_frame[cpt_mask]['Finish_percentile'].mean(),
|
1442 |
-
'Avg Lineup Edge': display_frame[cpt_mask]['Lineup Edge'].mean(),
|
1443 |
})
|
1444 |
|
1445 |
# Create mask for lineups where this player is FLEX (other columns)
|
1446 |
-
flex_mask = display_frame[player_columns[1:]].apply(
|
1447 |
lambda row: player in list(row), axis=1
|
1448 |
)
|
1449 |
|
@@ -1451,17 +1451,17 @@ with tab2:
|
|
1451 |
player_stats.append({
|
1452 |
'Player': f"{player} (FLEX)",
|
1453 |
'Lineup Count': flex_mask.sum(),
|
1454 |
-
'Exposure': flex_mask.sum() / len(display_frame),
|
1455 |
-
'Avg Median': display_frame[flex_mask]['median'].mean(),
|
1456 |
-
'Avg Own': display_frame[flex_mask]['Own'].mean(),
|
1457 |
-
'Avg Dupes': display_frame[flex_mask]['Dupes'].mean(),
|
1458 |
-
'Avg Finish %': display_frame[flex_mask]['Finish_percentile'].mean(),
|
1459 |
-
'Avg Lineup Edge': display_frame[flex_mask]['Lineup Edge'].mean(),
|
1460 |
})
|
1461 |
elif sport_var != 'CS2' and sport_var != 'LOL':
|
1462 |
# Original Classic format processing
|
1463 |
for player in player_names:
|
1464 |
-
player_mask = display_frame[player_columns].apply(
|
1465 |
lambda row: player in list(row), axis=1
|
1466 |
)
|
1467 |
|
@@ -1469,12 +1469,12 @@ with tab2:
|
|
1469 |
player_stats.append({
|
1470 |
'Player': player,
|
1471 |
'Lineup Count': player_mask.sum(),
|
1472 |
-
'Exposure': player_mask.sum() / len(display_frame),
|
1473 |
-
'Avg Median': display_frame[player_mask]['median'].mean(),
|
1474 |
-
'Avg Own': display_frame[player_mask]['Own'].mean(),
|
1475 |
-
'Avg Dupes': display_frame[player_mask]['Dupes'].mean(),
|
1476 |
-
'Avg Finish %': display_frame[player_mask]['Finish_percentile'].mean(),
|
1477 |
-
'Avg Lineup Edge': display_frame[player_mask]['Lineup Edge'].mean(),
|
1478 |
})
|
1479 |
|
1480 |
player_summary = pd.DataFrame(player_stats)
|
@@ -1500,26 +1500,26 @@ with tab2:
|
|
1500 |
)
|
1501 |
|
1502 |
with stack_stats_col:
|
1503 |
-
if 'Stack' in display_frame.columns:
|
1504 |
if st.button("Analyze Stacks", key='analyze_stacks'):
|
1505 |
stack_stats = []
|
1506 |
-
stack_columns = [col for col in display_frame.columns if col.startswith('Stack')]
|
1507 |
|
1508 |
if st.session_state['settings_base'] and 'origin_stack_exposures' in st.session_state and display_frame_source == 'Portfolio':
|
1509 |
st.session_state['stack_summary'] = st.session_state['origin_stack_exposures']
|
1510 |
else:
|
1511 |
for stack in st.session_state['stack_dict'].values():
|
1512 |
-
stack_mask = display_frame['Stack'] == stack
|
1513 |
if stack_mask.any():
|
1514 |
stack_stats.append({
|
1515 |
'Stack': stack,
|
1516 |
'Lineup Count': stack_mask.sum(),
|
1517 |
-
'Exposure': stack_mask.sum() / len(display_frame),
|
1518 |
-
'Avg Median': display_frame[stack_mask]['median'].mean(),
|
1519 |
-
'Avg Own': display_frame[stack_mask]['Own'].mean(),
|
1520 |
-
'Avg Dupes': display_frame[stack_mask]['Dupes'].mean(),
|
1521 |
-
'Avg Finish %': display_frame[stack_mask]['Finish_percentile'].mean(),
|
1522 |
-
'Avg Lineup Edge': display_frame[stack_mask]['Lineup Edge'].mean(),
|
1523 |
})
|
1524 |
stack_summary = pd.DataFrame(stack_stats)
|
1525 |
stack_summary = stack_summary.sort_values('Lineup Count', ascending=False).drop_duplicates()
|
@@ -1555,7 +1555,7 @@ with tab2:
|
|
1555 |
with col2:
|
1556 |
if st.button("Analyze Combos", key='analyze_combos'):
|
1557 |
st.session_state['combo_analysis'] = analyze_player_combos(
|
1558 |
-
display_frame, excluded_cols, combo_size
|
1559 |
)
|
1560 |
|
1561 |
# Display results
|
|
|
1263 |
|
1264 |
display_frame_source = st.selectbox("Display:", options=['Portfolio', 'Export Base'], key='display_frame_source')
|
1265 |
if display_frame_source == 'Portfolio':
|
1266 |
+
st.session_state['display_frame'] = st.session_state['working_frame']
|
1267 |
+
st.session_state['export_file'] = st.session_state['display_frame'].copy()
|
1268 |
|
1269 |
for col in st.session_state['export_file'].columns:
|
1270 |
if col not in excluded_cols:
|
1271 |
st.session_state['export_file'][col] = st.session_state['export_file'][col].map(st.session_state['export_dict'])
|
1272 |
elif display_frame_source == 'Export Base':
|
1273 |
+
st.session_state['display_frame'] = st.session_state['export_base']
|
1274 |
+
st.session_state['export_file'] = st.session_state['display_frame'].copy()
|
1275 |
|
1276 |
for col in st.session_state['export_file'].columns:
|
1277 |
if col not in excluded_cols:
|
|
|
1297 |
if st.button("Clear Custom Export"):
|
1298 |
st.session_state['export_base'] = pd.DataFrame(columns=st.session_state['working_frame'].columns)
|
1299 |
if display_frame_source == 'Portfolio':
|
1300 |
+
st.session_state['display_frame'] = st.session_state['working_frame']
|
1301 |
elif display_frame_source == 'Export Base':
|
1302 |
+
st.session_state['display_frame'] = st.session_state['export_base']
|
1303 |
|
1304 |
+
total_rows = len(st.session_state['display_frame'])
|
1305 |
rows_per_page = 100
|
1306 |
total_pages = (total_rows + rows_per_page - 1) // rows_per_page # Ceiling division
|
1307 |
|
|
|
1328 |
end_idx = min(start_idx + rows_per_page, total_rows)
|
1329 |
|
1330 |
# Get the subset of data for the current page
|
1331 |
+
current_page_data = st.session_state['display_frame'].iloc[start_idx:end_idx]
|
1332 |
# Display the paginated dataframe first
|
1333 |
st.dataframe(
|
1334 |
current_page_data.style
|
|
|
1367 |
with player_stats_col:
|
1368 |
if st.button("Analyze Players", key='analyze_players'):
|
1369 |
player_stats = []
|
1370 |
+
player_columns = [col for col in st.session_state['display_frame'].columns if col not in excluded_cols]
|
1371 |
|
1372 |
if st.session_state['settings_base'] and 'origin_player_exposures' in st.session_state and display_frame_source == 'Portfolio':
|
1373 |
st.session_state['player_summary'] = st.session_state['origin_player_exposures']
|
|
|
1375 |
if type_var == 'Showdown':
|
1376 |
if sport_var == 'GOLF':
|
1377 |
for player in player_names:
|
1378 |
+
player_mask = st.session_state['display_frame'][player_columns].apply(
|
1379 |
lambda row: player in list(row), axis=1
|
1380 |
)
|
1381 |
|
|
|
1383 |
player_stats.append({
|
1384 |
'Player': player,
|
1385 |
'Lineup Count': player_mask.sum(),
|
1386 |
+
'Exposure': player_mask.sum() / len(st.session_state['display_frame']),
|
1387 |
+
'Avg Median': st.session_state['display_frame'][player_mask]['median'].mean(),
|
1388 |
+
'Avg Own': st.session_state['display_frame'][player_mask]['Own'].mean(),
|
1389 |
+
'Avg Dupes': st.session_state['display_frame'][player_mask]['Dupes'].mean(),
|
1390 |
+
'Avg Finish %': st.session_state['display_frame'][player_mask]['Finish_percentile'].mean(),
|
1391 |
+
'Avg Lineup Edge': st.session_state['display_frame'][player_mask]['Lineup Edge'].mean(),
|
1392 |
})
|
1393 |
else:
|
1394 |
for player in player_names:
|
1395 |
# Create mask for lineups where this player is Captain (first column)
|
1396 |
+
cpt_mask = st.session_state['display_frame'][player_columns[0]] == player
|
1397 |
|
1398 |
if cpt_mask.any():
|
1399 |
player_stats.append({
|
1400 |
'Player': f"{player} (CPT)",
|
1401 |
'Lineup Count': cpt_mask.sum(),
|
1402 |
+
'Exposure': cpt_mask.sum() / len(st.session_state['display_frame']),
|
1403 |
+
'Avg Median': st.session_state['display_frame'][cpt_mask]['median'].mean(),
|
1404 |
+
'Avg Own': st.session_state['display_frame'][cpt_mask]['Own'].mean(),
|
1405 |
+
'Avg Dupes': st.session_state['display_frame'][cpt_mask]['Dupes'].mean(),
|
1406 |
+
'Avg Finish %': st.session_state['display_frame'][cpt_mask]['Finish_percentile'].mean(),
|
1407 |
+
'Avg Lineup Edge': st.session_state['display_frame'][cpt_mask]['Lineup Edge'].mean(),
|
1408 |
})
|
1409 |
|
1410 |
# Create mask for lineups where this player is FLEX (other columns)
|
1411 |
+
flex_mask = st.session_state['display_frame'][player_columns[1:]].apply(
|
1412 |
lambda row: player in list(row), axis=1
|
1413 |
)
|
1414 |
|
|
|
1416 |
player_stats.append({
|
1417 |
'Player': f"{player} (FLEX)",
|
1418 |
'Lineup Count': flex_mask.sum(),
|
1419 |
+
'Exposure': flex_mask.sum() / len(st.session_state['display_frame']),
|
1420 |
+
'Avg Median': st.session_state['display_frame'][flex_mask]['median'].mean(),
|
1421 |
+
'Avg Own': st.session_state['display_frame'][flex_mask]['Own'].mean(),
|
1422 |
+
'Avg Dupes': st.session_state['display_frame'][flex_mask]['Dupes'].mean(),
|
1423 |
+
'Avg Finish %': st.session_state['display_frame'][flex_mask]['Finish_percentile'].mean(),
|
1424 |
+
'Avg Lineup Edge': st.session_state['display_frame'][flex_mask]['Lineup Edge'].mean(),
|
1425 |
})
|
1426 |
else:
|
1427 |
if sport_var == 'CS2' or sport_var == 'LOL':
|
1428 |
# Handle Captain positions
|
1429 |
for player in player_names:
|
1430 |
# Create mask for lineups where this player is Captain (first column)
|
1431 |
+
cpt_mask = st.session_state['display_frame'][player_columns[0]] == player
|
1432 |
|
1433 |
if cpt_mask.any():
|
1434 |
player_stats.append({
|
1435 |
'Player': f"{player} (CPT)",
|
1436 |
'Lineup Count': cpt_mask.sum(),
|
1437 |
+
'Exposure': cpt_mask.sum() / len(st.session_state['display_frame']),
|
1438 |
+
'Avg Median': st.session_state['display_frame'][cpt_mask]['median'].mean(),
|
1439 |
+
'Avg Own': st.session_state['display_frame'][cpt_mask]['Own'].mean(),
|
1440 |
+
'Avg Dupes': st.session_state['display_frame'][cpt_mask]['Dupes'].mean(),
|
1441 |
+
'Avg Finish %': st.session_state['display_frame'][cpt_mask]['Finish_percentile'].mean(),
|
1442 |
+
'Avg Lineup Edge': st.session_state['display_frame'][cpt_mask]['Lineup Edge'].mean(),
|
1443 |
})
|
1444 |
|
1445 |
# Create mask for lineups where this player is FLEX (other columns)
|
1446 |
+
flex_mask = st.session_state['display_frame'][player_columns[1:]].apply(
|
1447 |
lambda row: player in list(row), axis=1
|
1448 |
)
|
1449 |
|
|
|
1451 |
player_stats.append({
|
1452 |
'Player': f"{player} (FLEX)",
|
1453 |
'Lineup Count': flex_mask.sum(),
|
1454 |
+
'Exposure': flex_mask.sum() / len(st.session_state['display_frame']),
|
1455 |
+
'Avg Median': st.session_state['display_frame'][flex_mask]['median'].mean(),
|
1456 |
+
'Avg Own': st.session_state['display_frame'][flex_mask]['Own'].mean(),
|
1457 |
+
'Avg Dupes': st.session_state['display_frame'][flex_mask]['Dupes'].mean(),
|
1458 |
+
'Avg Finish %': st.session_state['display_frame'][flex_mask]['Finish_percentile'].mean(),
|
1459 |
+
'Avg Lineup Edge': st.session_state['display_frame'][flex_mask]['Lineup Edge'].mean(),
|
1460 |
})
|
1461 |
elif sport_var != 'CS2' and sport_var != 'LOL':
|
1462 |
# Original Classic format processing
|
1463 |
for player in player_names:
|
1464 |
+
player_mask = st.session_state['display_frame'][player_columns].apply(
|
1465 |
lambda row: player in list(row), axis=1
|
1466 |
)
|
1467 |
|
|
|
1469 |
player_stats.append({
|
1470 |
'Player': player,
|
1471 |
'Lineup Count': player_mask.sum(),
|
1472 |
+
'Exposure': player_mask.sum() / len(st.session_state['display_frame']),
|
1473 |
+
'Avg Median': st.session_state['display_frame'][player_mask]['median'].mean(),
|
1474 |
+
'Avg Own': st.session_state['display_frame'][player_mask]['Own'].mean(),
|
1475 |
+
'Avg Dupes': st.session_state['display_frame'][player_mask]['Dupes'].mean(),
|
1476 |
+
'Avg Finish %': st.session_state['display_frame'][player_mask]['Finish_percentile'].mean(),
|
1477 |
+
'Avg Lineup Edge': st.session_state['display_frame'][player_mask]['Lineup Edge'].mean(),
|
1478 |
})
|
1479 |
|
1480 |
player_summary = pd.DataFrame(player_stats)
|
|
|
1500 |
)
|
1501 |
|
1502 |
with stack_stats_col:
|
1503 |
+
if 'Stack' in st.session_state['display_frame'].columns:
|
1504 |
if st.button("Analyze Stacks", key='analyze_stacks'):
|
1505 |
stack_stats = []
|
1506 |
+
stack_columns = [col for col in st.session_state['display_frame'].columns if col.startswith('Stack')]
|
1507 |
|
1508 |
if st.session_state['settings_base'] and 'origin_stack_exposures' in st.session_state and display_frame_source == 'Portfolio':
|
1509 |
st.session_state['stack_summary'] = st.session_state['origin_stack_exposures']
|
1510 |
else:
|
1511 |
for stack in st.session_state['stack_dict'].values():
|
1512 |
+
stack_mask = st.session_state['display_frame']['Stack'] == stack
|
1513 |
if stack_mask.any():
|
1514 |
stack_stats.append({
|
1515 |
'Stack': stack,
|
1516 |
'Lineup Count': stack_mask.sum(),
|
1517 |
+
'Exposure': stack_mask.sum() / len(st.session_state['display_frame']),
|
1518 |
+
'Avg Median': st.session_state['display_frame'][stack_mask]['median'].mean(),
|
1519 |
+
'Avg Own': st.session_state['display_frame'][stack_mask]['Own'].mean(),
|
1520 |
+
'Avg Dupes': st.session_state['display_frame'][stack_mask]['Dupes'].mean(),
|
1521 |
+
'Avg Finish %': st.session_state['display_frame'][stack_mask]['Finish_percentile'].mean(),
|
1522 |
+
'Avg Lineup Edge': st.session_state['display_frame'][stack_mask]['Lineup Edge'].mean(),
|
1523 |
})
|
1524 |
stack_summary = pd.DataFrame(stack_stats)
|
1525 |
stack_summary = stack_summary.sort_values('Lineup Count', ascending=False).drop_duplicates()
|
|
|
1555 |
with col2:
|
1556 |
if st.button("Analyze Combos", key='analyze_combos'):
|
1557 |
st.session_state['combo_analysis'] = analyze_player_combos(
|
1558 |
+
st.session_state['display_frame'], excluded_cols, combo_size
|
1559 |
)
|
1560 |
|
1561 |
# Display results
|