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'])
|