James McCool commited on
Commit
e43f97d
·
1 Parent(s): 4955178

Refactor player statistics calculation in app.py to streamline logic for 'Showdown' and 'Classic' formats. Introduce session state management for player exposures when the source is 'Portfolio', enhancing lineup generation accuracy and user experience.

Browse files
Files changed (1) hide show
  1. app.py +62 -56
app.py CHANGED
@@ -1242,42 +1242,10 @@ with tab2:
1242
  player_stats = []
1243
  player_columns = [col for col in display_frame.columns if col not in excluded_cols]
1244
 
1245
- if type_var == 'Showdown':
1246
- for player in player_names:
1247
- # Create mask for lineups where this player is Captain (first column)
1248
- cpt_mask = display_frame[player_columns[0]] == player
1249
-
1250
- if cpt_mask.any():
1251
- player_stats.append({
1252
- 'Player': f"{player} (CPT)",
1253
- 'Lineup Count': cpt_mask.sum(),
1254
- 'Exposure': cpt_mask.sum() / len(display_frame),
1255
- 'Avg Median': display_frame[cpt_mask]['median'].mean(),
1256
- 'Avg Own': display_frame[cpt_mask]['Own'].mean(),
1257
- 'Avg Dupes': display_frame[cpt_mask]['Dupes'].mean(),
1258
- 'Avg Finish %': display_frame[cpt_mask]['Finish_percentile'].mean(),
1259
- 'Avg Lineup Edge': display_frame[cpt_mask]['Lineup Edge'].mean(),
1260
- })
1261
-
1262
- # Create mask for lineups where this player is FLEX (other columns)
1263
- flex_mask = display_frame[player_columns[1:]].apply(
1264
- lambda row: player in list(row), axis=1
1265
- )
1266
-
1267
- if flex_mask.any():
1268
- player_stats.append({
1269
- 'Player': f"{player} (FLEX)",
1270
- 'Lineup Count': flex_mask.sum(),
1271
- 'Exposure': flex_mask.sum() / len(display_frame),
1272
- 'Avg Median': display_frame[flex_mask]['median'].mean(),
1273
- 'Avg Own': display_frame[flex_mask]['Own'].mean(),
1274
- 'Avg Dupes': display_frame[flex_mask]['Dupes'].mean(),
1275
- 'Avg Finish %': display_frame[flex_mask]['Finish_percentile'].mean(),
1276
- 'Avg Lineup Edge': display_frame[flex_mask]['Lineup Edge'].mean(),
1277
- })
1278
  else:
1279
- if sport_var == 'CS2':
1280
- # Handle Captain positions
1281
  for player in player_names:
1282
  # Create mask for lineups where this player is Captain (first column)
1283
  cpt_mask = display_frame[player_columns[0]] == player
@@ -1310,27 +1278,65 @@ with tab2:
1310
  'Avg Finish %': display_frame[flex_mask]['Finish_percentile'].mean(),
1311
  'Avg Lineup Edge': display_frame[flex_mask]['Lineup Edge'].mean(),
1312
  })
1313
- elif sport_var != 'CS2':
1314
- # Original Classic format processing
1315
- for player in player_names:
1316
- player_mask = display_frame[player_columns].apply(
1317
- lambda row: player in list(row), axis=1
1318
- )
1319
-
1320
- if player_mask.any():
1321
- player_stats.append({
1322
- 'Player': player,
1323
- 'Lineup Count': player_mask.sum(),
1324
- 'Exposure': player_mask.sum() / len(display_frame),
1325
- 'Avg Median': display_frame[player_mask]['median'].mean(),
1326
- 'Avg Own': display_frame[player_mask]['Own'].mean(),
1327
- 'Avg Dupes': display_frame[player_mask]['Dupes'].mean(),
1328
- 'Avg Finish %': display_frame[player_mask]['Finish_percentile'].mean(),
1329
- 'Avg Lineup Edge': display_frame[player_mask]['Lineup Edge'].mean(),
1330
- })
1331
-
1332
- player_summary = pd.DataFrame(player_stats)
1333
- player_summary = player_summary.sort_values('Lineup Count', ascending=False)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1334
 
1335
  st.subheader("Player Summary")
1336
  st.dataframe(
 
1242
  player_stats = []
1243
  player_columns = [col for col in display_frame.columns if col not in excluded_cols]
1244
 
1245
+ if 'origin_player_exposures' in st.session_state and display_frame_source == 'Portfolio':
1246
+ player_summary = st.session_state['origin_player_exposures']
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1247
  else:
1248
+ if type_var == 'Showdown':
 
1249
  for player in player_names:
1250
  # Create mask for lineups where this player is Captain (first column)
1251
  cpt_mask = display_frame[player_columns[0]] == player
 
1278
  'Avg Finish %': display_frame[flex_mask]['Finish_percentile'].mean(),
1279
  'Avg Lineup Edge': display_frame[flex_mask]['Lineup Edge'].mean(),
1280
  })
1281
+ else:
1282
+ if sport_var == 'CS2':
1283
+ # Handle Captain positions
1284
+ for player in player_names:
1285
+ # Create mask for lineups where this player is Captain (first column)
1286
+ cpt_mask = display_frame[player_columns[0]] == player
1287
+
1288
+ if cpt_mask.any():
1289
+ player_stats.append({
1290
+ 'Player': f"{player} (CPT)",
1291
+ 'Lineup Count': cpt_mask.sum(),
1292
+ 'Exposure': cpt_mask.sum() / len(display_frame),
1293
+ 'Avg Median': display_frame[cpt_mask]['median'].mean(),
1294
+ 'Avg Own': display_frame[cpt_mask]['Own'].mean(),
1295
+ 'Avg Dupes': display_frame[cpt_mask]['Dupes'].mean(),
1296
+ 'Avg Finish %': display_frame[cpt_mask]['Finish_percentile'].mean(),
1297
+ 'Avg Lineup Edge': display_frame[cpt_mask]['Lineup Edge'].mean(),
1298
+ })
1299
+
1300
+ # Create mask for lineups where this player is FLEX (other columns)
1301
+ flex_mask = display_frame[player_columns[1:]].apply(
1302
+ lambda row: player in list(row), axis=1
1303
+ )
1304
+
1305
+ if flex_mask.any():
1306
+ player_stats.append({
1307
+ 'Player': f"{player} (FLEX)",
1308
+ 'Lineup Count': flex_mask.sum(),
1309
+ 'Exposure': flex_mask.sum() / len(display_frame),
1310
+ 'Avg Median': display_frame[flex_mask]['median'].mean(),
1311
+ 'Avg Own': display_frame[flex_mask]['Own'].mean(),
1312
+ 'Avg Dupes': display_frame[flex_mask]['Dupes'].mean(),
1313
+ 'Avg Finish %': display_frame[flex_mask]['Finish_percentile'].mean(),
1314
+ 'Avg Lineup Edge': display_frame[flex_mask]['Lineup Edge'].mean(),
1315
+ })
1316
+ elif sport_var != 'CS2':
1317
+ # Original Classic format processing
1318
+ for player in player_names:
1319
+ player_mask = display_frame[player_columns].apply(
1320
+ lambda row: player in list(row), axis=1
1321
+ )
1322
+
1323
+ if player_mask.any():
1324
+ player_stats.append({
1325
+ 'Player': player,
1326
+ 'Lineup Count': player_mask.sum(),
1327
+ 'Exposure': player_mask.sum() / len(display_frame),
1328
+ 'Avg Median': display_frame[player_mask]['median'].mean(),
1329
+ 'Avg Own': display_frame[player_mask]['Own'].mean(),
1330
+ 'Avg Dupes': display_frame[player_mask]['Dupes'].mean(),
1331
+ 'Avg Finish %': display_frame[player_mask]['Finish_percentile'].mean(),
1332
+ 'Avg Lineup Edge': display_frame[player_mask]['Lineup Edge'].mean(),
1333
+ })
1334
+
1335
+ player_summary = pd.DataFrame(player_stats)
1336
+ player_summary = player_summary.sort_values('Lineup Count', ascending=False)
1337
+ if display_frame_source == 'Portfolio':
1338
+ if 'origin_player_exposures' not in st.session_state:
1339
+ st.session_state['origin_player_exposures'] = player_summary.copy()
1340
 
1341
  st.subheader("Player Summary")
1342
  st.dataframe(