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
app.py
CHANGED
|
@@ -1208,45 +1208,13 @@ with tab2:
|
|
| 1208 |
height=1000,
|
| 1209 |
use_container_width=True
|
| 1210 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1211 |
|
| 1212 |
-
|
| 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 |
-
|
| 1281 |
-
|
| 1282 |
-
|
| 1283 |
-
|
| 1284 |
-
|
| 1285 |
-
|
| 1286 |
-
|
| 1287 |
-
|
| 1288 |
-
|
| 1289 |
-
|
| 1290 |
-
|
| 1291 |
-
|
| 1292 |
-
|
| 1293 |
-
|
| 1294 |
-
|
| 1295 |
-
|
| 1296 |
-
|
| 1297 |
-
|
| 1298 |
-
|
| 1299 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1300 |
|
| 1301 |
-
|
| 1302 |
-
|
| 1303 |
-
|
| 1304 |
-
|
| 1305 |
-
|
| 1306 |
-
|
| 1307 |
-
|
| 1308 |
-
|
| 1309 |
-
|
| 1310 |
-
|
| 1311 |
-
|
| 1312 |
-
|
| 1313 |
-
|
| 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'])
|