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- app.py +22 -1
- 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.
|
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 + (
|
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 |
-
|
277 |
-
|
278 |
-
|
279 |
-
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
if
|
|
|
|
|
|
|
|
|
287 |
working_frame.at[row, col] = insert_player
|
288 |
break
|
289 |
-
|
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 |
|