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
Files changed (1) hide show
  1. app.py +77 -21
app.py CHANGED
@@ -787,11 +787,34 @@ with tab2:
787
  }
788
 
789
  if type_var == 'Classic':
790
- 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)
791
- 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)
792
- 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)
793
- if stack_dict is not None:
794
- st.session_state['portfolio']['Stack'] = st.session_state['portfolio'].index.map(stack_dict)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- # Original Classic format processing
1070
- for player in player_names:
1071
- player_mask = st.session_state['portfolio'][player_columns].apply(
1072
- lambda row: player in list(row), axis=1
1073
- )
1074
-
1075
- if player_mask.any():
1076
- player_stats.append({
1077
- 'Player': player,
1078
- 'Lineup Count': player_mask.sum(),
1079
- 'Avg Median': st.session_state['portfolio'][player_mask]['median'].mean(),
1080
- 'Avg Own': st.session_state['portfolio'][player_mask]['Own'].mean(),
1081
- 'Avg Dupes': st.session_state['portfolio'][player_mask]['Dupes'].mean(),
1082
- 'Avg Finish %': st.session_state['portfolio'][player_mask]['Finish_percentile'].mean(),
1083
- 'Avg Lineup Edge': st.session_state['portfolio'][player_mask]['Lineup Edge'].mean(),
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)