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
app.py
CHANGED
@@ -1144,11 +1144,44 @@ with tab2:
|
|
1144 |
use_container_width=True
|
1145 |
)
|
1146 |
|
1147 |
-
|
1148 |
-
|
1149 |
-
|
1150 |
-
|
1151 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
1184 |
-
|
1185 |
-
|
1186 |
-
|
1187 |
-
|
1188 |
-
|
1189 |
-
|
1190 |
-
|
1191 |
-
|
1192 |
-
|
1193 |
-
|
1194 |
-
|
1195 |
-
|
1196 |
-
|
1197 |
-
|
1198 |
-
|
1199 |
-
|
1200 |
-
|
1201 |
-
|
1202 |
-
|
1203 |
-
|
1204 |
-
|
1205 |
-
|
1206 |
-
|
1207 |
-
|
1208 |
-
|
1209 |
-
|
1210 |
-
|
1211 |
-
|
1212 |
-
|
1213 |
-
|
1214 |
-
|
1215 |
-
|
1216 |
-
|
1217 |
-
|
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 |
+
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|