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
Files changed (1) hide show
  1. app.py +61 -61
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