James McCool commited on
Commit
cc0edce
·
1 Parent(s): 8c81703

Add volatility preset option in app.py and implement volatility_preset function. Updated lineup generation logic to include new preset for enhanced lineup edge management.

Browse files
app.py CHANGED
@@ -23,6 +23,7 @@ from global_func.get_portfolio_names import get_portfolio_names
23
  from global_func.small_field_preset import small_field_preset
24
  from global_func.large_field_preset import large_field_preset
25
  from global_func.hedging_preset import hedging_preset
 
26
 
27
  freq_format = {'Finish_percentile': '{:.2%}', 'Lineup Edge': '{:.2%}', 'Win%': '{:.2%}'}
28
  stacking_sports = ['MLB', 'NHL', 'NFL']
@@ -1111,7 +1112,7 @@ with tab2:
1111
  with st.expander('Presets'):
1112
  st.info("Still heavily in testing here, I'll announce when they are ready for use.")
1113
  with st.form(key='Small Field Preset'):
1114
- preset_choice = st.selectbox("Preset", options=['Small Field (Heavy Own)', 'Large Field (Manage Similarity)', 'Hedge Chalk (Manage Leverage)'], index=0)
1115
  lineup_target = st.number_input("Lineups to produce", value=150, min_value=1, step=1)
1116
  submitted = st.form_submit_button("Submit")
1117
  if submitted:
@@ -1119,6 +1120,8 @@ with tab2:
1119
  parsed_frame = small_field_preset(st.session_state['working_frame'], lineup_target, excluded_cols)
1120
  elif preset_choice == 'Large Field (Manage Similarity)':
1121
  parsed_frame = large_field_preset(st.session_state['working_frame'], lineup_target, excluded_cols)
 
 
1122
  elif preset_choice == 'Hedge Chalk (Manage Leverage)':
1123
  parsed_frame = hedging_preset(st.session_state['working_frame'], lineup_target, st.session_state['projections_df'])
1124
  st.session_state['working_frame'] = parsed_frame.reset_index(drop=True)
 
23
  from global_func.small_field_preset import small_field_preset
24
  from global_func.large_field_preset import large_field_preset
25
  from global_func.hedging_preset import hedging_preset
26
+ from global_func.volatility_preset import volatility_preset
27
 
28
  freq_format = {'Finish_percentile': '{:.2%}', 'Lineup Edge': '{:.2%}', 'Win%': '{:.2%}'}
29
  stacking_sports = ['MLB', 'NHL', 'NFL']
 
1112
  with st.expander('Presets'):
1113
  st.info("Still heavily in testing here, I'll announce when they are ready for use.")
1114
  with st.form(key='Small Field Preset'):
1115
+ preset_choice = st.selectbox("Preset", options=['Small Field (Heavy Own)', 'Large Field (Manage Similarity)', 'Hedge Chalk (Manage Leverage)', 'Volatility (Heavy Lineup Edge)'], index=0)
1116
  lineup_target = st.number_input("Lineups to produce", value=150, min_value=1, step=1)
1117
  submitted = st.form_submit_button("Submit")
1118
  if submitted:
 
1120
  parsed_frame = small_field_preset(st.session_state['working_frame'], lineup_target, excluded_cols)
1121
  elif preset_choice == 'Large Field (Manage Similarity)':
1122
  parsed_frame = large_field_preset(st.session_state['working_frame'], lineup_target, excluded_cols)
1123
+ elif preset_choice == 'Volatility (Heavy Lineup Edge)':
1124
+ parsed_frame = volatility_preset(st.session_state['working_frame'], lineup_target, excluded_cols)
1125
  elif preset_choice == 'Hedge Chalk (Manage Leverage)':
1126
  parsed_frame = hedging_preset(st.session_state['working_frame'], lineup_target, st.session_state['projections_df'])
1127
  st.session_state['working_frame'] = parsed_frame.reset_index(drop=True)
global_func/large_field_preset.py CHANGED
@@ -7,7 +7,6 @@ def large_field_preset(portfolio: pd.DataFrame, lineup_target: int, exclude_cols
7
 
8
  concat_portfolio = portfolio.copy()
9
  concat_portfolio = concat_portfolio.sort_values(by='Similarity Score', ascending=True).reset_index(drop=True)
10
- concat_portfolio = concat_portfolio[concat_portfolio['Lineup Edge'] > 0]
11
 
12
  # Calculate target similarity scores for linear progression
13
  similarity_floor = concat_portfolio['Similarity Score'].min()
 
7
 
8
  concat_portfolio = portfolio.copy()
9
  concat_portfolio = concat_portfolio.sort_values(by='Similarity Score', ascending=True).reset_index(drop=True)
 
10
 
11
  # Calculate target similarity scores for linear progression
12
  similarity_floor = concat_portfolio['Similarity Score'].min()
global_func/small_field_preset.py CHANGED
@@ -1,7 +1,6 @@
1
  import pandas as pd
2
 
3
  def small_field_preset(portfolio: pd.DataFrame, lineup_target: int, exclude_cols: list):
4
-
5
  excluded_cols = ['salary', 'median', 'Own', 'Finish_percentile', 'Dupes', 'Stack', 'Size', 'Win%', 'Lineup Edge', 'Weighted Own', 'Geomean', 'Similarity Score']
6
  player_columns = [col for col in portfolio.columns if col not in excluded_cols]
7
 
 
1
  import pandas as pd
2
 
3
  def small_field_preset(portfolio: pd.DataFrame, lineup_target: int, exclude_cols: list):
 
4
  excluded_cols = ['salary', 'median', 'Own', 'Finish_percentile', 'Dupes', 'Stack', 'Size', 'Win%', 'Lineup Edge', 'Weighted Own', 'Geomean', 'Similarity Score']
5
  player_columns = [col for col in portfolio.columns if col not in excluded_cols]
6
 
global_func/volatility_preset.py ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ import numpy as np
3
+
4
+ def volatility_preset(portfolio: pd.DataFrame, lineup_target: int, exclude_cols: list):
5
+ excluded_cols = ['salary', 'median', 'Own', 'Finish_percentile', 'Dupes', 'Stack', 'Size', 'Win%', 'Lineup Edge', 'Weighted Own', 'Geomean', 'Similarity Score']
6
+ player_columns = [col for col in portfolio.columns if col not in excluded_cols]
7
+
8
+ for slack_var in range(1, 20):
9
+ concat_portfolio = pd.DataFrame(columns=portfolio.columns)
10
+
11
+ for team in portfolio['Stack'].unique():
12
+ rows_to_drop = []
13
+ working_portfolio = portfolio.copy()
14
+ working_portfolio = working_portfolio[working_portfolio['Stack'] == team].sort_values(by='Lineup Edge', ascending = False)
15
+ working_portfolio = working_portfolio.reset_index(drop=True)
16
+ curr_own_type_max = working_portfolio.loc[0, 'median'] + (slack_var / 20 * working_portfolio.loc[0, 'median'])
17
+
18
+ for i in range(1, len(working_portfolio)):
19
+ if working_portfolio.loc[i, 'median'] < curr_own_type_max:
20
+ rows_to_drop.append(i)
21
+ else:
22
+ curr_own_type_max = working_portfolio.loc[i, 'median'] + (slack_var / 20 * working_portfolio.loc[i, 'median'])
23
+
24
+ working_portfolio = working_portfolio.drop(rows_to_drop).reset_index(drop=True)
25
+ concat_portfolio = pd.concat([concat_portfolio, working_portfolio])
26
+
27
+ if len(concat_portfolio) >= lineup_target:
28
+ return concat_portfolio.sort_values(by='Lineup Edge', ascending=False).head(lineup_target)
29
+
30
+ return concat_portfolio.sort_values(by='Lineup Edge', ascending=False)