James McCool commited on
Commit
6c81ee5
·
1 Parent(s): 7900a20

Refactor player and stack statistics display in app.py: streamline player summary calculations and add stack summary section for enhanced data visualization and user experience.

Browse files
Files changed (1) hide show
  1. app.py +108 -72
app.py CHANGED
@@ -1208,45 +1208,13 @@ with tab2:
1208
  height=1000,
1209
  use_container_width=True
1210
  )
 
 
 
 
 
1211
 
1212
- # Create player summary dataframe
1213
- player_stats = []
1214
- player_columns = [col for col in display_frame.columns if col not in excluded_cols]
1215
-
1216
- if type_var == 'Showdown':
1217
- for player in player_names:
1218
- # Create mask for lineups where this player is Captain (first column)
1219
- cpt_mask = display_frame[player_columns[0]] == player
1220
-
1221
- if cpt_mask.any():
1222
- player_stats.append({
1223
- 'Player': f"{player} (CPT)",
1224
- 'Lineup Count': cpt_mask.sum(),
1225
- 'Avg Median': display_frame[cpt_mask]['median'].mean(),
1226
- 'Avg Own': display_frame[cpt_mask]['Own'].mean(),
1227
- 'Avg Dupes': display_frame[cpt_mask]['Dupes'].mean(),
1228
- 'Avg Finish %': display_frame[cpt_mask]['Finish_percentile'].mean(),
1229
- 'Avg Lineup Edge': display_frame[cpt_mask]['Lineup Edge'].mean(),
1230
- })
1231
-
1232
- # Create mask for lineups where this player is FLEX (other columns)
1233
- flex_mask = display_frame[player_columns[1:]].apply(
1234
- lambda row: player in list(row), axis=1
1235
- )
1236
-
1237
- if flex_mask.any():
1238
- player_stats.append({
1239
- 'Player': f"{player} (FLEX)",
1240
- 'Lineup Count': flex_mask.sum(),
1241
- 'Avg Median': display_frame[flex_mask]['median'].mean(),
1242
- 'Avg Own': display_frame[flex_mask]['Own'].mean(),
1243
- 'Avg Dupes': display_frame[flex_mask]['Dupes'].mean(),
1244
- 'Avg Finish %': display_frame[flex_mask]['Finish_percentile'].mean(),
1245
- 'Avg Lineup Edge': display_frame[flex_mask]['Lineup Edge'].mean(),
1246
- })
1247
- else:
1248
- if sport_var == 'CS2':
1249
- # Handle Captain positions
1250
  for player in player_names:
1251
  # Create mask for lineups where this player is Captain (first column)
1252
  cpt_mask = display_frame[player_columns[0]] == player
@@ -1277,38 +1245,106 @@ with tab2:
1277
  'Avg Finish %': display_frame[flex_mask]['Finish_percentile'].mean(),
1278
  'Avg Lineup Edge': display_frame[flex_mask]['Lineup Edge'].mean(),
1279
  })
1280
- elif sport_var != 'CS2':
1281
- # Original Classic format processing
1282
- for player in player_names:
1283
- player_mask = display_frame[player_columns].apply(
1284
- lambda row: player in list(row), axis=1
1285
- )
1286
-
1287
- if player_mask.any():
1288
- player_stats.append({
1289
- 'Player': player,
1290
- 'Lineup Count': player_mask.sum(),
1291
- 'Avg Median': display_frame[player_mask]['median'].mean(),
1292
- 'Avg Own': display_frame[player_mask]['Own'].mean(),
1293
- 'Avg Dupes': display_frame[player_mask]['Dupes'].mean(),
1294
- 'Avg Finish %': display_frame[player_mask]['Finish_percentile'].mean(),
1295
- 'Avg Lineup Edge': display_frame[player_mask]['Lineup Edge'].mean(),
1296
- })
1297
-
1298
- player_summary = pd.DataFrame(player_stats)
1299
- player_summary = player_summary.sort_values('Lineup Count', ascending=False)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1300
 
1301
- st.subheader("Player Summary")
1302
- st.dataframe(
1303
- player_summary.style
1304
- .background_gradient(axis=0).background_gradient(cmap='RdYlGn').background_gradient(cmap='RdYlGn_r', subset=['Avg Finish %', 'Avg Own', 'Avg Dupes'])
1305
- .format({
1306
- 'Avg Median': '{:.2f}',
1307
- 'Avg Own': '{:.2f}',
1308
- 'Avg Dupes': '{:.2f}',
1309
- 'Avg Finish %': '{:.2%}',
1310
- 'Avg Lineup Edge': '{:.2%}'
1311
- }),
1312
- height=400,
1313
- use_container_width=True
1314
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1208
  height=1000,
1209
  use_container_width=True
1210
  )
1211
+ player_stats_col, stack_stats_col = st.columns(2)
1212
+ with player_stats_col:
1213
+
1214
+ player_stats = []
1215
+ player_columns = [col for col in display_frame.columns if col not in excluded_cols]
1216
 
1217
+ if type_var == 'Showdown':
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1218
  for player in player_names:
1219
  # Create mask for lineups where this player is Captain (first column)
1220
  cpt_mask = display_frame[player_columns[0]] == player
 
1245
  'Avg Finish %': display_frame[flex_mask]['Finish_percentile'].mean(),
1246
  'Avg Lineup Edge': display_frame[flex_mask]['Lineup Edge'].mean(),
1247
  })
1248
+ else:
1249
+ if sport_var == 'CS2':
1250
+ # Handle Captain positions
1251
+ for player in player_names:
1252
+ # Create mask for lineups where this player is Captain (first column)
1253
+ cpt_mask = display_frame[player_columns[0]] == player
1254
+
1255
+ if cpt_mask.any():
1256
+ player_stats.append({
1257
+ 'Player': f"{player} (CPT)",
1258
+ 'Lineup Count': cpt_mask.sum(),
1259
+ 'Avg Median': display_frame[cpt_mask]['median'].mean(),
1260
+ 'Avg Own': display_frame[cpt_mask]['Own'].mean(),
1261
+ 'Avg Dupes': display_frame[cpt_mask]['Dupes'].mean(),
1262
+ 'Avg Finish %': display_frame[cpt_mask]['Finish_percentile'].mean(),
1263
+ 'Avg Lineup Edge': display_frame[cpt_mask]['Lineup Edge'].mean(),
1264
+ })
1265
+
1266
+ # Create mask for lineups where this player is FLEX (other columns)
1267
+ flex_mask = display_frame[player_columns[1:]].apply(
1268
+ lambda row: player in list(row), axis=1
1269
+ )
1270
+
1271
+ if flex_mask.any():
1272
+ player_stats.append({
1273
+ 'Player': f"{player} (FLEX)",
1274
+ 'Lineup Count': flex_mask.sum(),
1275
+ 'Avg Median': display_frame[flex_mask]['median'].mean(),
1276
+ 'Avg Own': display_frame[flex_mask]['Own'].mean(),
1277
+ 'Avg Dupes': display_frame[flex_mask]['Dupes'].mean(),
1278
+ 'Avg Finish %': display_frame[flex_mask]['Finish_percentile'].mean(),
1279
+ 'Avg Lineup Edge': display_frame[flex_mask]['Lineup Edge'].mean(),
1280
+ })
1281
+ elif sport_var != 'CS2':
1282
+ # Original Classic format processing
1283
+ for player in player_names:
1284
+ player_mask = display_frame[player_columns].apply(
1285
+ lambda row: player in list(row), axis=1
1286
+ )
1287
+
1288
+ if player_mask.any():
1289
+ player_stats.append({
1290
+ 'Player': player,
1291
+ 'Lineup Count': player_mask.sum(),
1292
+ 'Avg Median': display_frame[player_mask]['median'].mean(),
1293
+ 'Avg Own': display_frame[player_mask]['Own'].mean(),
1294
+ 'Avg Dupes': display_frame[player_mask]['Dupes'].mean(),
1295
+ 'Avg Finish %': display_frame[player_mask]['Finish_percentile'].mean(),
1296
+ 'Avg Lineup Edge': display_frame[player_mask]['Lineup Edge'].mean(),
1297
+ })
1298
+
1299
+ player_summary = pd.DataFrame(player_stats)
1300
+ player_summary = player_summary.sort_values('Lineup Count', ascending=False)
1301
+
1302
+ st.subheader("Player Summary")
1303
+ st.dataframe(
1304
+ player_summary.style
1305
+ .background_gradient(axis=0).background_gradient(cmap='RdYlGn').background_gradient(cmap='RdYlGn_r', subset=['Avg Finish %', 'Avg Own', 'Avg Dupes'])
1306
+ .format({
1307
+ 'Avg Median': '{:.2f}',
1308
+ 'Avg Own': '{:.2f}',
1309
+ 'Avg Dupes': '{:.2f}',
1310
+ 'Avg Finish %': '{:.2%}',
1311
+ 'Avg Lineup Edge': '{:.2%}'
1312
+ }),
1313
+ height=400,
1314
+ use_container_width=True
1315
+ )
1316
 
1317
+ with stack_stats_col:
1318
+ if stack_dict is not None:
1319
+ stack_stats = []
1320
+ stack_columns = [col for col in display_frame.columns if col.startswith('Stack')]
1321
+ for stack in stack_dict.values():
1322
+ stack_mask = display_frame['Stack'] == stack
1323
+ if stack_mask.any():
1324
+ stack_stats.append({
1325
+ 'Stack': stack,
1326
+ 'Lineup Count': stack_mask.sum(),
1327
+ 'Avg Median': display_frame[stack_mask]['median'].mean(),
1328
+ 'Avg Own': display_frame[stack_mask]['Own'].mean(),
1329
+ 'Avg Dupes': display_frame[stack_mask]['Dupes'].mean(),
1330
+ 'Avg Finish %': display_frame[stack_mask]['Finish_percentile'].mean(),
1331
+ 'Avg Lineup Edge': display_frame[stack_mask]['Lineup Edge'].mean(),
1332
+ })
1333
+ stack_summary = pd.DataFrame(stack_stats)
1334
+ stack_summary = stack_summary.sort_values('Lineup Count', ascending=False)
1335
+ st.subheader("Stack Summary")
1336
+ st.dataframe(
1337
+ stack_summary.style
1338
+ .background_gradient(axis=0).background_gradient(cmap='RdYlGn').background_gradient(cmap='RdYlGn_r', subset=['Avg Finish %', 'Avg Own', 'Avg Dupes'])
1339
+ .format({
1340
+ 'Avg Median': '{:.2f}',
1341
+ 'Avg Own': '{:.2f}',
1342
+ 'Avg Dupes': '{:.2f}',
1343
+ 'Avg Finish %': '{:.2%}',
1344
+ 'Avg Lineup Edge': '{:.2%}'
1345
+ }),
1346
+ height=400,
1347
+ use_container_width=True
1348
+ )
1349
+ else:
1350
+ stack_summary = pd.DataFrame(columns=['Stack', 'Lineup Count', 'Avg Median', 'Avg Own', 'Avg Dupes', 'Avg Finish %', 'Avg Lineup Edge'])