Spaces:
Sleeping
Sleeping
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
|