James McCool
commited on
Commit
·
87e0fcb
1
Parent(s):
8b35df7
Enhance portfolio calculations in app.py: implement sport-specific logic for CS2 to differentiate salary, median, and ownership calculations for Captain and FLEX positions, improving accuracy in player statistics and overall portfolio analysis.
Browse files
app.py
CHANGED
|
@@ -787,11 +787,34 @@ with tab2:
|
|
| 787 |
}
|
| 788 |
|
| 789 |
if type_var == 'Classic':
|
| 790 |
-
|
| 791 |
-
|
| 792 |
-
|
| 793 |
-
|
| 794 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 795 |
elif type_var == 'Showdown':
|
| 796 |
# Calculate salary (CPT uses cpt_salary_map, others use salary_map)
|
| 797 |
st.session_state['portfolio']['salary'] = st.session_state['portfolio'].apply(
|
|
@@ -1066,22 +1089,55 @@ with tab2:
|
|
| 1066 |
'Avg Lineup Edge': st.session_state['portfolio'][flex_mask]['Lineup Edge'].mean(),
|
| 1067 |
})
|
| 1068 |
else:
|
| 1069 |
-
|
| 1070 |
-
|
| 1071 |
-
|
| 1072 |
-
|
| 1073 |
-
|
| 1074 |
-
|
| 1075 |
-
|
| 1076 |
-
|
| 1077 |
-
|
| 1078 |
-
|
| 1079 |
-
|
| 1080 |
-
|
| 1081 |
-
|
| 1082 |
-
|
| 1083 |
-
|
| 1084 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1085 |
|
| 1086 |
player_summary = pd.DataFrame(player_stats)
|
| 1087 |
player_summary = player_summary.sort_values('Lineup Count', ascending=False)
|
|
|
|
| 787 |
}
|
| 788 |
|
| 789 |
if type_var == 'Classic':
|
| 790 |
+
if sport_var == 'CS2':
|
| 791 |
+
# Calculate salary (CPT uses cpt_salary_map, others use salary_map)
|
| 792 |
+
st.session_state['portfolio']['salary'] = st.session_state['portfolio'].apply(
|
| 793 |
+
lambda row: map_dict['cpt_salary_map'].get(row.iloc[0], 0) +
|
| 794 |
+
sum(map_dict['salary_map'].get(player, 0) for player in row.iloc[1:]),
|
| 795 |
+
axis=1
|
| 796 |
+
)
|
| 797 |
+
|
| 798 |
+
# Calculate median (CPT uses cpt_proj_map, others use proj_map)
|
| 799 |
+
st.session_state['portfolio']['median'] = st.session_state['portfolio'].apply(
|
| 800 |
+
lambda row: map_dict['cpt_proj_map'].get(row.iloc[0], 0) +
|
| 801 |
+
sum(map_dict['proj_map'].get(player, 0) for player in row.iloc[1:]),
|
| 802 |
+
axis=1
|
| 803 |
+
)
|
| 804 |
+
|
| 805 |
+
# Calculate ownership (CPT uses cpt_own_map, others use own_map)
|
| 806 |
+
st.session_state['portfolio']['Own'] = st.session_state['portfolio'].apply(
|
| 807 |
+
lambda row: map_dict['cpt_own_map'].get(row.iloc[0], 0) +
|
| 808 |
+
sum(map_dict['own_map'].get(player, 0) for player in row.iloc[1:]),
|
| 809 |
+
axis=1
|
| 810 |
+
)
|
| 811 |
+
|
| 812 |
+
elif sport_var != 'CS2':
|
| 813 |
+
st.session_state['portfolio']['salary'] = st.session_state['portfolio'].apply(lambda row: sum(map_dict['salary_map'].get(player, 0) for player in row), axis=1)
|
| 814 |
+
st.session_state['portfolio']['median'] = st.session_state['portfolio'].apply(lambda row: sum(map_dict['proj_map'].get(player, 0) for player in row), axis=1)
|
| 815 |
+
st.session_state['portfolio']['Own'] = st.session_state['portfolio'].apply(lambda row: sum(map_dict['own_map'].get(player, 0) for player in row), axis=1)
|
| 816 |
+
if stack_dict is not None:
|
| 817 |
+
st.session_state['portfolio']['Stack'] = st.session_state['portfolio'].index.map(stack_dict)
|
| 818 |
elif type_var == 'Showdown':
|
| 819 |
# Calculate salary (CPT uses cpt_salary_map, others use salary_map)
|
| 820 |
st.session_state['portfolio']['salary'] = st.session_state['portfolio'].apply(
|
|
|
|
| 1089 |
'Avg Lineup Edge': st.session_state['portfolio'][flex_mask]['Lineup Edge'].mean(),
|
| 1090 |
})
|
| 1091 |
else:
|
| 1092 |
+
if sport_var == 'CS2':
|
| 1093 |
+
# Handle Captain positions
|
| 1094 |
+
for player in player_names:
|
| 1095 |
+
# Create mask for lineups where this player is Captain (first column)
|
| 1096 |
+
cpt_mask = st.session_state['portfolio'][player_columns[0]] == player
|
| 1097 |
+
|
| 1098 |
+
if cpt_mask.any():
|
| 1099 |
+
player_stats.append({
|
| 1100 |
+
'Player': f"{player} (CPT)",
|
| 1101 |
+
'Lineup Count': cpt_mask.sum(),
|
| 1102 |
+
'Avg Median': st.session_state['portfolio'][cpt_mask]['median'].mean(),
|
| 1103 |
+
'Avg Own': st.session_state['portfolio'][cpt_mask]['Own'].mean(),
|
| 1104 |
+
'Avg Dupes': st.session_state['portfolio'][cpt_mask]['Dupes'].mean(),
|
| 1105 |
+
'Avg Finish %': st.session_state['portfolio'][cpt_mask]['Finish_percentile'].mean(),
|
| 1106 |
+
'Avg Lineup Edge': st.session_state['portfolio'][cpt_mask]['Lineup Edge'].mean(),
|
| 1107 |
+
})
|
| 1108 |
+
|
| 1109 |
+
# Create mask for lineups where this player is FLEX (other columns)
|
| 1110 |
+
flex_mask = st.session_state['portfolio'][player_columns[1:]].apply(
|
| 1111 |
+
lambda row: player in list(row), axis=1
|
| 1112 |
+
)
|
| 1113 |
+
|
| 1114 |
+
if flex_mask.any():
|
| 1115 |
+
player_stats.append({
|
| 1116 |
+
'Player': f"{player} (FLEX)",
|
| 1117 |
+
'Lineup Count': flex_mask.sum(),
|
| 1118 |
+
'Avg Median': st.session_state['portfolio'][flex_mask]['median'].mean(),
|
| 1119 |
+
'Avg Own': st.session_state['portfolio'][flex_mask]['Own'].mean(),
|
| 1120 |
+
'Avg Dupes': st.session_state['portfolio'][flex_mask]['Dupes'].mean(),
|
| 1121 |
+
'Avg Finish %': st.session_state['portfolio'][flex_mask]['Finish_percentile'].mean(),
|
| 1122 |
+
'Avg Lineup Edge': st.session_state['portfolio'][flex_mask]['Lineup Edge'].mean(),
|
| 1123 |
+
})
|
| 1124 |
+
elif sport_var != 'CS2':
|
| 1125 |
+
# Original Classic format processing
|
| 1126 |
+
for player in player_names:
|
| 1127 |
+
player_mask = st.session_state['portfolio'][player_columns].apply(
|
| 1128 |
+
lambda row: player in list(row), axis=1
|
| 1129 |
+
)
|
| 1130 |
+
|
| 1131 |
+
if player_mask.any():
|
| 1132 |
+
player_stats.append({
|
| 1133 |
+
'Player': player,
|
| 1134 |
+
'Lineup Count': player_mask.sum(),
|
| 1135 |
+
'Avg Median': st.session_state['portfolio'][player_mask]['median'].mean(),
|
| 1136 |
+
'Avg Own': st.session_state['portfolio'][player_mask]['Own'].mean(),
|
| 1137 |
+
'Avg Dupes': st.session_state['portfolio'][player_mask]['Dupes'].mean(),
|
| 1138 |
+
'Avg Finish %': st.session_state['portfolio'][player_mask]['Finish_percentile'].mean(),
|
| 1139 |
+
'Avg Lineup Edge': st.session_state['portfolio'][player_mask]['Lineup Edge'].mean(),
|
| 1140 |
+
})
|
| 1141 |
|
| 1142 |
player_summary = pd.DataFrame(player_stats)
|
| 1143 |
player_summary = player_summary.sort_values('Lineup Count', ascending=False)
|