James McCool commited on
Commit
76c1d87
·
1 Parent(s): 5404e76

Enhance player summary generation in app.py: refactor logic to handle Captain and FLEX positions separately for improved accuracy in lineup statistics, and ensure consistent display of player performance metrics in the summary table.

Browse files
Files changed (1) hide show
  1. app.py +73 -73
app.py CHANGED
@@ -1144,11 +1144,44 @@ with tab2:
1144
  use_container_width=True
1145
  )
1146
 
1147
- # Create player summary dataframe
1148
- player_stats = []
1149
- player_columns = [col for col in st.session_state['portfolio'].columns if col not in excluded_cols]
1150
-
1151
- if type_var == 'Showdown':
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1152
  # Handle Captain positions
1153
  for player in player_names:
1154
  # Create mask for lineups where this player is Captain (first column)
@@ -1180,71 +1213,38 @@ with tab2:
1180
  'Avg Finish %': st.session_state['portfolio'][flex_mask]['Finish_percentile'].mean(),
1181
  'Avg Lineup Edge': st.session_state['portfolio'][flex_mask]['Lineup Edge'].mean(),
1182
  })
1183
- else:
1184
- if sport_var == 'CS2':
1185
- # Handle Captain positions
1186
- for player in player_names:
1187
- # Create mask for lineups where this player is Captain (first column)
1188
- cpt_mask = st.session_state['portfolio'][player_columns[0]] == player
1189
-
1190
- if cpt_mask.any():
1191
- player_stats.append({
1192
- 'Player': f"{player} (CPT)",
1193
- 'Lineup Count': cpt_mask.sum(),
1194
- 'Avg Median': st.session_state['portfolio'][cpt_mask]['median'].mean(),
1195
- 'Avg Own': st.session_state['portfolio'][cpt_mask]['Own'].mean(),
1196
- 'Avg Dupes': st.session_state['portfolio'][cpt_mask]['Dupes'].mean(),
1197
- 'Avg Finish %': st.session_state['portfolio'][cpt_mask]['Finish_percentile'].mean(),
1198
- 'Avg Lineup Edge': st.session_state['portfolio'][cpt_mask]['Lineup Edge'].mean(),
1199
- })
1200
-
1201
- # Create mask for lineups where this player is FLEX (other columns)
1202
- flex_mask = st.session_state['portfolio'][player_columns[1:]].apply(
1203
- lambda row: player in list(row), axis=1
1204
- )
1205
-
1206
- if flex_mask.any():
1207
- player_stats.append({
1208
- 'Player': f"{player} (FLEX)",
1209
- 'Lineup Count': flex_mask.sum(),
1210
- 'Avg Median': st.session_state['portfolio'][flex_mask]['median'].mean(),
1211
- 'Avg Own': st.session_state['portfolio'][flex_mask]['Own'].mean(),
1212
- 'Avg Dupes': st.session_state['portfolio'][flex_mask]['Dupes'].mean(),
1213
- 'Avg Finish %': st.session_state['portfolio'][flex_mask]['Finish_percentile'].mean(),
1214
- 'Avg Lineup Edge': st.session_state['portfolio'][flex_mask]['Lineup Edge'].mean(),
1215
- })
1216
- elif sport_var != 'CS2':
1217
- # Original Classic format processing
1218
- for player in player_names:
1219
- player_mask = st.session_state['portfolio'][player_columns].apply(
1220
- lambda row: player in list(row), axis=1
1221
- )
1222
-
1223
- if player_mask.any():
1224
- player_stats.append({
1225
- 'Player': player,
1226
- 'Lineup Count': player_mask.sum(),
1227
- 'Avg Median': st.session_state['portfolio'][player_mask]['median'].mean(),
1228
- 'Avg Own': st.session_state['portfolio'][player_mask]['Own'].mean(),
1229
- 'Avg Dupes': st.session_state['portfolio'][player_mask]['Dupes'].mean(),
1230
- 'Avg Finish %': st.session_state['portfolio'][player_mask]['Finish_percentile'].mean(),
1231
- 'Avg Lineup Edge': st.session_state['portfolio'][player_mask]['Lineup Edge'].mean(),
1232
- })
1233
-
1234
- player_summary = pd.DataFrame(player_stats)
1235
- player_summary = player_summary.sort_values('Lineup Count', ascending=False)
1236
-
1237
- st.subheader("Player Summary")
1238
- st.dataframe(
1239
- player_summary.style
1240
- .background_gradient(axis=0).background_gradient(cmap='RdYlGn').background_gradient(cmap='RdYlGn_r', subset=['Avg Finish %', 'Avg Own', 'Avg Dupes'])
1241
- .format({
1242
- 'Avg Median': '{:.2f}',
1243
- 'Avg Own': '{:.2f}',
1244
- 'Avg Dupes': '{:.2f}',
1245
- 'Avg Finish %': '{:.2%}',
1246
- 'Avg Lineup Edge': '{:.2%}'
1247
- }),
1248
- height=400,
1249
- use_container_width=True
1250
- )
 
1144
  use_container_width=True
1145
  )
1146
 
1147
+ # Create player summary dataframe
1148
+ player_stats = []
1149
+ player_columns = [col for col in st.session_state['portfolio'].columns if col not in excluded_cols]
1150
+
1151
+ if type_var == 'Showdown':
1152
+ # Handle Captain positions
1153
+ for player in player_names:
1154
+ # Create mask for lineups where this player is Captain (first column)
1155
+ cpt_mask = st.session_state['portfolio'][player_columns[0]] == player
1156
+
1157
+ if cpt_mask.any():
1158
+ player_stats.append({
1159
+ 'Player': f"{player} (CPT)",
1160
+ 'Lineup Count': cpt_mask.sum(),
1161
+ 'Avg Median': st.session_state['portfolio'][cpt_mask]['median'].mean(),
1162
+ 'Avg Own': st.session_state['portfolio'][cpt_mask]['Own'].mean(),
1163
+ 'Avg Dupes': st.session_state['portfolio'][cpt_mask]['Dupes'].mean(),
1164
+ 'Avg Finish %': st.session_state['portfolio'][cpt_mask]['Finish_percentile'].mean(),
1165
+ 'Avg Lineup Edge': st.session_state['portfolio'][cpt_mask]['Lineup Edge'].mean(),
1166
+ })
1167
+
1168
+ # Create mask for lineups where this player is FLEX (other columns)
1169
+ flex_mask = st.session_state['portfolio'][player_columns[1:]].apply(
1170
+ lambda row: player in list(row), axis=1
1171
+ )
1172
+
1173
+ if flex_mask.any():
1174
+ player_stats.append({
1175
+ 'Player': f"{player} (FLEX)",
1176
+ 'Lineup Count': flex_mask.sum(),
1177
+ 'Avg Median': st.session_state['portfolio'][flex_mask]['median'].mean(),
1178
+ 'Avg Own': st.session_state['portfolio'][flex_mask]['Own'].mean(),
1179
+ 'Avg Dupes': st.session_state['portfolio'][flex_mask]['Dupes'].mean(),
1180
+ 'Avg Finish %': st.session_state['portfolio'][flex_mask]['Finish_percentile'].mean(),
1181
+ 'Avg Lineup Edge': st.session_state['portfolio'][flex_mask]['Lineup Edge'].mean(),
1182
+ })
1183
+ else:
1184
+ if sport_var == 'CS2':
1185
  # Handle Captain positions
1186
  for player in player_names:
1187
  # Create mask for lineups where this player is Captain (first column)
 
1213
  'Avg Finish %': st.session_state['portfolio'][flex_mask]['Finish_percentile'].mean(),
1214
  'Avg Lineup Edge': st.session_state['portfolio'][flex_mask]['Lineup Edge'].mean(),
1215
  })
1216
+ elif sport_var != 'CS2':
1217
+ # Original Classic format processing
1218
+ for player in player_names:
1219
+ player_mask = st.session_state['portfolio'][player_columns].apply(
1220
+ lambda row: player in list(row), axis=1
1221
+ )
1222
+
1223
+ if player_mask.any():
1224
+ player_stats.append({
1225
+ 'Player': player,
1226
+ 'Lineup Count': player_mask.sum(),
1227
+ 'Avg Median': st.session_state['portfolio'][player_mask]['median'].mean(),
1228
+ 'Avg Own': st.session_state['portfolio'][player_mask]['Own'].mean(),
1229
+ 'Avg Dupes': st.session_state['portfolio'][player_mask]['Dupes'].mean(),
1230
+ 'Avg Finish %': st.session_state['portfolio'][player_mask]['Finish_percentile'].mean(),
1231
+ 'Avg Lineup Edge': st.session_state['portfolio'][player_mask]['Lineup Edge'].mean(),
1232
+ })
1233
+
1234
+ player_summary = pd.DataFrame(player_stats)
1235
+ player_summary = player_summary.sort_values('Lineup Count', ascending=False)
1236
+
1237
+ st.subheader("Player Summary")
1238
+ st.dataframe(
1239
+ player_summary.style
1240
+ .background_gradient(axis=0).background_gradient(cmap='RdYlGn').background_gradient(cmap='RdYlGn_r', subset=['Avg Finish %', 'Avg Own', 'Avg Dupes'])
1241
+ .format({
1242
+ 'Avg Median': '{:.2f}',
1243
+ 'Avg Own': '{:.2f}',
1244
+ 'Avg Dupes': '{:.2f}',
1245
+ 'Avg Finish %': '{:.2%}',
1246
+ 'Avg Lineup Edge': '{:.2%}'
1247
+ }),
1248
+ height=400,
1249
+ use_container_width=True
1250
+ )