James McCool
commited on
Commit
·
5a5c5db
1
Parent(s):
d0e6684
Add distribute_preset function and update app.py for preset selection
Browse files- Introduced a new `distribute_preset` function to manage portfolio distribution based on weighted ownership and finish percentiles.
- Updated `app.py` to include the new preset option 'Distributed (Spread Risk)' in the selection dropdown, replacing the previous 'Volatile' option.
- Adjusted logic to call the `distribute_preset` function when the new preset is selected, enhancing lineup generation capabilities.
- app.py +4 -5
- global_func/distribute_preset.py +27 -0
app.py
CHANGED
|
@@ -22,6 +22,7 @@ from global_func.trim_portfolio import trim_portfolio
|
|
| 22 |
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 |
|
| 26 |
freq_format = {'Finish_percentile': '{:.2%}', 'Lineup Edge': '{:.2%}', 'Win%': '{:.2%}'}
|
| 27 |
stacking_sports = ['MLB', 'NHL', 'NFL']
|
|
@@ -1107,7 +1108,7 @@ with tab2:
|
|
| 1107 |
with st.expander('Presets'):
|
| 1108 |
st.info("Still heavily in testing here, I'll announce when they are ready for use.")
|
| 1109 |
with st.form(key='Small Field Preset'):
|
| 1110 |
-
preset_choice = st.selectbox("Preset", options=['Small Field (Heavy Own)', 'Large Field (Finish Percentile / Edge)', '
|
| 1111 |
lineup_target = st.number_input("Lineups to produce", value=150, min_value=1, step=1)
|
| 1112 |
submitted = st.form_submit_button("Submit")
|
| 1113 |
if submitted:
|
|
@@ -1115,10 +1116,8 @@ with tab2:
|
|
| 1115 |
parsed_frame = small_field_preset(st.session_state['working_frame'], lineup_target, excluded_cols)
|
| 1116 |
elif preset_choice == 'Large Field (Finish Percentile / Edge)':
|
| 1117 |
parsed_frame = large_field_preset(st.session_state['working_frame'], lineup_target, excluded_cols)
|
| 1118 |
-
|
| 1119 |
-
|
| 1120 |
-
# elif preset_choice == 'Distributed':
|
| 1121 |
-
# parsed_frame = distributed_preset(st.session_state['working_frame'], lineup_target)
|
| 1122 |
st.session_state['working_frame'] = parsed_frame.reset_index(drop=True)
|
| 1123 |
st.session_state['export_merge'] = st.session_state['working_frame'].copy()
|
| 1124 |
|
|
|
|
| 22 |
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.distribute_preset import distribute_preset
|
| 26 |
|
| 27 |
freq_format = {'Finish_percentile': '{:.2%}', 'Lineup Edge': '{:.2%}', 'Win%': '{:.2%}'}
|
| 28 |
stacking_sports = ['MLB', 'NHL', 'NFL']
|
|
|
|
| 1108 |
with st.expander('Presets'):
|
| 1109 |
st.info("Still heavily in testing here, I'll announce when they are ready for use.")
|
| 1110 |
with st.form(key='Small Field Preset'):
|
| 1111 |
+
preset_choice = st.selectbox("Preset", options=['Small Field (Heavy Own)', 'Large Field (Finish Percentile / Edge)', 'Distributed (Spread Risk)'], index=0)
|
| 1112 |
lineup_target = st.number_input("Lineups to produce", value=150, min_value=1, step=1)
|
| 1113 |
submitted = st.form_submit_button("Submit")
|
| 1114 |
if submitted:
|
|
|
|
| 1116 |
parsed_frame = small_field_preset(st.session_state['working_frame'], lineup_target, excluded_cols)
|
| 1117 |
elif preset_choice == 'Large Field (Finish Percentile / Edge)':
|
| 1118 |
parsed_frame = large_field_preset(st.session_state['working_frame'], lineup_target, excluded_cols)
|
| 1119 |
+
elif preset_choice == 'Distributed (Spread Risk)':
|
| 1120 |
+
parsed_frame = distribute_preset(st.session_state['working_frame'], lineup_target, excluded_cols)
|
|
|
|
|
|
|
| 1121 |
st.session_state['working_frame'] = parsed_frame.reset_index(drop=True)
|
| 1122 |
st.session_state['export_merge'] = st.session_state['working_frame'].copy()
|
| 1123 |
|
global_func/distribute_preset.py
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pandas as pd
|
| 2 |
+
|
| 3 |
+
def distribute_preset(portfolio: pd.DataFrame, lineup_target: int, exclude_cols: list):
|
| 4 |
+
|
| 5 |
+
for slack_var in range(1, 20):
|
| 6 |
+
concat_portfolio = pd.DataFrame(columns=portfolio.columns)
|
| 7 |
+
|
| 8 |
+
for finishing_range in range(1, 20):
|
| 9 |
+
rows_to_drop = []
|
| 10 |
+
working_portfolio = portfolio.copy()
|
| 11 |
+
working_portfolio = working_portfolio[(working_portfolio['Finish_percentile'] <= (finishing_range / 100)) & (working_portfolio['Finish_percentile'] >= ((finishing_range - 1) / 100))].sort_values(by='Median', ascending = True)
|
| 12 |
+
working_portfolio = working_portfolio.reset_index(drop=True)
|
| 13 |
+
curr_own_type_max = working_portfolio.loc[0, 'Weighted Own'] + (slack_var / 20 * working_portfolio.loc[0, 'Weighted Own'])
|
| 14 |
+
|
| 15 |
+
for i in range(1, len(working_portfolio)):
|
| 16 |
+
if working_portfolio.loc[i, 'Weighted'] > curr_own_type_max:
|
| 17 |
+
rows_to_drop.append(i)
|
| 18 |
+
else:
|
| 19 |
+
curr_own_type_max = working_portfolio.loc[i, 'Weighted'] + (slack_var / 20 * working_portfolio.loc[i, 'Weighted'])
|
| 20 |
+
|
| 21 |
+
working_portfolio = working_portfolio.drop(rows_to_drop).reset_index(drop=True)
|
| 22 |
+
concat_portfolio = pd.concat([concat_portfolio, working_portfolio])
|
| 23 |
+
|
| 24 |
+
if len(concat_portfolio) >= lineup_target:
|
| 25 |
+
return concat_portfolio.sort_values(by='Finish_percentile', ascending=True).head(lineup_target)
|
| 26 |
+
|
| 27 |
+
return concat_portfolio.sort_values(by='Finish_percentile', ascending=True)
|