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