James McCool commited on
Commit
87bb04e
·
1 Parent(s): 38f865e

Enhance exposure_spread function by adding salary_max parameter for improved salary filtering and adjusting lineups_to_remove calculation to a 125% factor, refining player selection logic and ensuring existing players are excluded from comparable options.

Browse files
Files changed (2) hide show
  1. app.py +22 -1
  2. global_func/exposure_spread.py +26 -18
app.py CHANGED
@@ -46,6 +46,27 @@ with st.container():
46
 
47
  with col4:
48
  type_var = st.selectbox("Select Game Type", ['Classic', 'Showdown'])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
 
50
  tab1, tab2 = st.tabs(["Data Load", "Manage Portfolio"])
51
  with tab1:
@@ -1176,7 +1197,7 @@ with tab2:
1176
  submitted = st.form_submit_button("Submit")
1177
  if submitted:
1178
  st.session_state['settings_base'] = False
1179
- parsed_frame = exposure_spread(st.session_state['working_frame'], exposure_player, exposure_target, exposure_stack_bool, remove_teams_exposure, st.session_state['projections_df'], sport_var, type_var)
1180
  st.session_state['working_frame'] = parsed_frame.reset_index(drop=True)
1181
  st.session_state['export_merge'] = st.session_state['working_frame'].copy()
1182
  with st.container():
 
46
 
47
  with col4:
48
  type_var = st.selectbox("Select Game Type", ['Classic', 'Showdown'])
49
+
50
+ if site_var == 'Draftkings':
51
+ salary_max = 50000
52
+ elif site_var == 'Fanduel':
53
+ if type_var == 'Classic':
54
+ if sport_var == 'MLB':
55
+ salary_max = 40000
56
+ elif sport_var == 'WNBA':
57
+ salary_max = 40000
58
+ elif sport_var == 'GOLF':
59
+ salary_max = 60000
60
+ elif sport_var == 'MMA':
61
+ salary_max = 100
62
+ elif sport_var == 'NFL':
63
+ salary_max = 60000
64
+ elif sport_var == 'NASCAR':
65
+ salary_max = 50000
66
+ else:
67
+ salary_max = 60000
68
+ elif type_var == 'Showdown':
69
+ salary_max = 60000
70
 
71
  tab1, tab2 = st.tabs(["Data Load", "Manage Portfolio"])
72
  with tab1:
 
1197
  submitted = st.form_submit_button("Submit")
1198
  if submitted:
1199
  st.session_state['settings_base'] = False
1200
+ parsed_frame = exposure_spread(st.session_state['working_frame'], exposure_player, exposure_target, exposure_stack_bool, remove_teams_exposure, st.session_state['projections_df'], sport_var, type_var, salary_max)
1201
  st.session_state['working_frame'] = parsed_frame.reset_index(drop=True)
1202
  st.session_state['export_merge'] = st.session_state['working_frame'].copy()
1203
  with st.container():
global_func/exposure_spread.py CHANGED
@@ -209,7 +209,7 @@ def check_position_eligibility(sport, column_name, player_positions):
209
  # Default fallback - assume exact position match
210
  return column_name in player_positions
211
 
212
- def exposure_spread(working_frame, exposure_player, exposure_target, exposure_stack_bool, remove_teams, projections_df, sport_var, type_var):
213
  # Find comparable players in the projections
214
  comparable_players = projections_df[projections_df['player_names'] == exposure_player]
215
 
@@ -240,7 +240,7 @@ def exposure_spread(working_frame, exposure_player, exposure_target, exposure_st
240
  player_exposure = player_mask.sum() / len(working_frame)
241
 
242
  # find the number of lineups that need to be removed to reach the target exposure
243
- lineups_to_remove = ((player_exposure - exposure_target) * len(working_frame)) * 1.5
244
 
245
  # isolate the rows that contain the player
246
  player_rows = working_frame[player_mask]
@@ -257,7 +257,7 @@ def exposure_spread(working_frame, exposure_player, exposure_target, exposure_st
257
  if change_counter < math.ceil(lineups_to_remove):
258
  comparable_players = projections_df[
259
  (projections_df['salary'] >= comp_salary_low) &
260
- (projections_df['salary'] <= comp_salary_high + (50000 - working_frame['salary'][row])) &
261
  (projections_df['median'] >= comp_projection_low) &
262
  (projections_df['position'].apply(lambda x: has_position_overlap(x, comp_player_position)))
263
  ]
@@ -271,24 +271,32 @@ def exposure_spread(working_frame, exposure_player, exposure_target, exposure_st
271
  )
272
  comparable_players = comparable_players[remove_mask]
273
 
 
 
 
 
 
 
 
274
  # Create a list of comparable players
275
  comparable_player_list = comparable_players['player_names'].tolist()
276
- insert_player = random.choice(comparable_player_list)
277
- # Find which column contains the exposure_player
278
- row_data = working_frame.iloc[row]
279
- for col in working_frame.columns:
280
- if row_data[col] == exposure_player:
281
- # Get the replacement player's positions
282
- replacement_player_positions = projections_df[projections_df['player_names'] == insert_player]['position'].iloc[0].split('/')
283
-
284
- # Check if the replacement player is eligible for this column
285
- if type_var == 'Classic':
286
- if check_position_eligibility(sport_var, col, replacement_player_positions):
 
 
 
 
287
  working_frame.at[row, col] = insert_player
288
  break
289
- else:
290
- working_frame.at[row, col] = insert_player
291
- break
292
- change_counter += 1
293
  return working_frame
294
 
 
209
  # Default fallback - assume exact position match
210
  return column_name in player_positions
211
 
212
+ def exposure_spread(working_frame, exposure_player, exposure_target, exposure_stack_bool, remove_teams, projections_df, sport_var, type_var, salary_max):
213
  # Find comparable players in the projections
214
  comparable_players = projections_df[projections_df['player_names'] == exposure_player]
215
 
 
240
  player_exposure = player_mask.sum() / len(working_frame)
241
 
242
  # find the number of lineups that need to be removed to reach the target exposure
243
+ lineups_to_remove = ((player_exposure - exposure_target) * len(working_frame)) * 1.25
244
 
245
  # isolate the rows that contain the player
246
  player_rows = working_frame[player_mask]
 
257
  if change_counter < math.ceil(lineups_to_remove):
258
  comparable_players = projections_df[
259
  (projections_df['salary'] >= comp_salary_low) &
260
+ (projections_df['salary'] <= comp_salary_high + (salary_max - working_frame['salary'][row])) &
261
  (projections_df['median'] >= comp_projection_low) &
262
  (projections_df['position'].apply(lambda x: has_position_overlap(x, comp_player_position)))
263
  ]
 
271
  )
272
  comparable_players = comparable_players[remove_mask]
273
 
274
+ # Get the current row data to check for existing players
275
+ current_row_data = working_frame.iloc[row]
276
+
277
+ # Filter out players that are already present in this row
278
+ existing_players = set(current_row_data.values)
279
+ comparable_players = comparable_players[~comparable_players['player_names'].isin(existing_players)]
280
+
281
  # Create a list of comparable players
282
  comparable_player_list = comparable_players['player_names'].tolist()
283
+ if comparable_player_list:
284
+ insert_player = random.choice(comparable_player_list)
285
+ # Find which column contains the exposure_player
286
+ row_data = working_frame.iloc[row]
287
+ for col in working_frame.columns:
288
+ if row_data[col] == exposure_player:
289
+ # Get the replacement player's positions
290
+ replacement_player_positions = projections_df[projections_df['player_names'] == insert_player]['position'].iloc[0].split('/')
291
+
292
+ # Check if the replacement player is eligible for this column
293
+ if type_var == 'Classic':
294
+ if check_position_eligibility(sport_var, col, replacement_player_positions):
295
+ working_frame.at[row, col] = insert_player
296
+ break
297
+ else:
298
  working_frame.at[row, col] = insert_player
299
  break
300
+ change_counter += 1
 
 
 
301
  return working_frame
302