James McCool commited on
Commit
3a20f4f
·
1 Parent(s): 0543ffc

Add specific replacements feature in 'Manage Portfolio' to enhance player selection options and improve exposure calculations.

Browse files
Files changed (2) hide show
  1. app.py +3 -2
  2. global_func/exposure_spread.py +18 -12
app.py CHANGED
@@ -1517,6 +1517,7 @@ if selected_tab == 'Manage Portfolio':
1517
  else:
1518
  exposure_stack_bool = 'No'
1519
  remove_teams_exposure = st.multiselect("Removed/Locked teams?", options=sorted(list(set(st.session_state['projections_df']['team'].unique()))), default=[])
 
1520
  submitted_col, export_col = st.columns(2)
1521
  st.info("Portfolio Button applies to your overall Portfolio, Export button applies to your Custom Export")
1522
  with submitted_col:
@@ -1526,7 +1527,7 @@ if selected_tab == 'Manage Portfolio':
1526
  if reg_submitted:
1527
  st.session_state['settings_base'] = False
1528
  prior_frame = st.session_state['working_frame'].copy()
1529
- parsed_frame = exposure_spread(st.session_state['working_frame'], st.session_state['exposure_player'], exposure_target, exposure_stack_bool, remove_teams_exposure, st.session_state['projections_df'], sport_var, type_var, salary_max, stacking_sports)
1530
 
1531
  if type_var == 'Classic':
1532
  if sport_var == 'CS2' or sport_var == 'LOL':
@@ -1619,7 +1620,7 @@ if selected_tab == 'Manage Portfolio':
1619
  elif exp_submitted:
1620
  st.session_state['settings_base'] = False
1621
  prior_frame = st.session_state['export_base'].copy()
1622
- parsed_frame = exposure_spread(st.session_state['export_base'], st.session_state['exposure_player'], exposure_target, exposure_stack_bool, remove_teams_exposure, st.session_state['projections_df'], sport_var, type_var, salary_max, stacking_sports)
1623
 
1624
  if type_var == 'Classic':
1625
  if sport_var == 'CS2' or sport_var == 'LOL':
 
1517
  else:
1518
  exposure_stack_bool = 'No'
1519
  remove_teams_exposure = st.multiselect("Removed/Locked teams?", options=sorted(list(set(st.session_state['projections_df']['team'].unique()))), default=[])
1520
+ specific_replacements = st.multiselect("Specific Replacements?", options=sorted(list(set(st.session_state['projections_df']['player_names'].unique()))), default=[])
1521
  submitted_col, export_col = st.columns(2)
1522
  st.info("Portfolio Button applies to your overall Portfolio, Export button applies to your Custom Export")
1523
  with submitted_col:
 
1527
  if reg_submitted:
1528
  st.session_state['settings_base'] = False
1529
  prior_frame = st.session_state['working_frame'].copy()
1530
+ parsed_frame = exposure_spread(st.session_state['working_frame'], st.session_state['exposure_player'], exposure_target, exposure_stack_bool, remove_teams_exposure, specific_replacements, st.session_state['projections_df'], sport_var, type_var, salary_max, stacking_sports)
1531
 
1532
  if type_var == 'Classic':
1533
  if sport_var == 'CS2' or sport_var == 'LOL':
 
1620
  elif exp_submitted:
1621
  st.session_state['settings_base'] = False
1622
  prior_frame = st.session_state['export_base'].copy()
1623
+ parsed_frame = exposure_spread(st.session_state['export_base'], st.session_state['exposure_player'], exposure_target, exposure_stack_bool, remove_teams_exposure, specific_replacements, st.session_state['projections_df'], sport_var, type_var, salary_max, stacking_sports)
1624
 
1625
  if type_var == 'Classic':
1626
  if sport_var == 'CS2' or sport_var == 'LOL':
global_func/exposure_spread.py CHANGED
@@ -148,7 +148,7 @@ def check_position_eligibility(sport, column_name, player_positions):
148
  # Default fallback - assume exact position match
149
  return column_name in player_positions
150
 
151
- def exposure_spread(working_frame, exposure_player, exposure_target, exposure_stack_bool, remove_teams, projections_df, sport_var, type_var, salary_max, stacking_sports):
152
  comparable_players = projections_df[projections_df['player_names'] == exposure_player]
153
 
154
  comparable_players = comparable_players.reset_index(drop=True)
@@ -215,12 +215,15 @@ def exposure_spread(working_frame, exposure_player, exposure_target, exposure_st
215
  if lineups_to_remove > 0:
216
  for row in random_row_indices_insert:
217
  if change_counter < math.ceil(lineups_to_remove):
218
- comparable_players = projections_df[
219
- (projections_df['salary'] >= comp_salary_low) &
220
- (projections_df['salary'] <= comp_salary_high + (salary_max - working_frame['salary'][row])) &
221
- (projections_df['median'] >= comp_projection_low) &
222
- (projections_df['position'].apply(lambda x: has_position_overlap(x, comp_player_position)))
223
- ]
 
 
 
224
 
225
  if exposure_target == 0:
226
  comparable_players = comparable_players[comparable_players['player_names'] != exposure_player]
@@ -261,11 +264,14 @@ def exposure_spread(working_frame, exposure_player, exposure_target, exposure_st
261
  else:
262
  for row in random_row_indices_replace:
263
  if change_counter < math.ceil(lineups_to_add):
264
- comparable_players = projections_df[
265
- (projections_df['salary'] >= comp_salary_low) &
266
- (projections_df['salary'] <= comp_salary_high + (salary_max - working_frame['salary'][row])) &
267
- (projections_df['position'].apply(lambda x: has_position_overlap(x, comp_player_position)))
268
- ]
 
 
 
269
  if sport_var in stacking_sports:
270
  if sport_var in stacking_sports:
271
  if working_frame.iloc[row]['Size'] == 5 and comp_team != working_frame.iloc[row]['Stack']:
 
148
  # Default fallback - assume exact position match
149
  return column_name in player_positions
150
 
151
+ def exposure_spread(working_frame, exposure_player, exposure_target, exposure_stack_bool, remove_teams, specific_replacements, projections_df, sport_var, type_var, salary_max, stacking_sports):
152
  comparable_players = projections_df[projections_df['player_names'] == exposure_player]
153
 
154
  comparable_players = comparable_players.reset_index(drop=True)
 
215
  if lineups_to_remove > 0:
216
  for row in random_row_indices_insert:
217
  if change_counter < math.ceil(lineups_to_remove):
218
+ if specific_replacements != []:
219
+ comparable_players = projections_df[projections_df['player_names'].isin(specific_replacements)]
220
+ else:
221
+ comparable_players = projections_df[
222
+ (projections_df['salary'] >= comp_salary_low) &
223
+ (projections_df['salary'] <= comp_salary_high + (salary_max - working_frame['salary'][row])) &
224
+ (projections_df['median'] >= comp_projection_low) &
225
+ (projections_df['position'].apply(lambda x: has_position_overlap(x, comp_player_position)))
226
+ ]
227
 
228
  if exposure_target == 0:
229
  comparable_players = comparable_players[comparable_players['player_names'] != exposure_player]
 
264
  else:
265
  for row in random_row_indices_replace:
266
  if change_counter < math.ceil(lineups_to_add):
267
+ if specific_replacements != []:
268
+ comparable_players = projections_df[projections_df['player_names'].isin(specific_replacements)]
269
+ else:
270
+ comparable_players = projections_df[
271
+ (projections_df['salary'] >= comp_salary_low) &
272
+ (projections_df['salary'] <= comp_salary_high + (salary_max - working_frame['salary'][row])) &
273
+ (projections_df['position'].apply(lambda x: has_position_overlap(x, comp_player_position)))
274
+ ]
275
  if sport_var in stacking_sports:
276
  if sport_var in stacking_sports:
277
  if working_frame.iloc[row]['Size'] == 5 and comp_team != working_frame.iloc[row]['Stack']: