DFS_Portfolio_Manager / global_func /small_field_preset.py
James McCool
Enhance volatility_preset function to include sport-specific logic for MLB, allowing dynamic adjustments in player selection based on team diversity. This update improves lineup generation accuracy by refining the handling of team constraints and optimizing the portfolio based on lineup edge.
e8898ed
raw
history blame
2.87 kB
import pandas as pd
import numpy as np
def small_field_preset(portfolio: pd.DataFrame, lineup_target: int, exclude_cols: list, sport: str):
excluded_cols = ['salary', 'median', 'Own', 'Finish_percentile', 'Dupes', 'Stack', 'Size', 'Win%', 'Lineup Edge', 'Weighted Own', 'Geomean', 'Diversity']
player_columns = [col for col in portfolio.columns if col not in excluded_cols]
for slack_var in range(1, 20):
concat_portfolio = pd.DataFrame(columns=portfolio.columns)
if sport == 'MLB':
for team in portfolio['Stack'].unique():
rows_to_drop = []
working_portfolio = portfolio.copy()
working_portfolio = working_portfolio[working_portfolio['Stack'] == team].sort_values(by='Own', ascending = False)
working_portfolio = working_portfolio.reset_index(drop=True)
curr_own_type_max = working_portfolio.loc[0, 'Weighted Own'] + (slack_var / 20 * working_portfolio.loc[0, 'Weighted Own'])
for i in range(1, len(working_portfolio)):
if working_portfolio.loc[i, 'Weighted Own'] > curr_own_type_max:
rows_to_drop.append(i)
else:
curr_own_type_max = working_portfolio.loc[i, 'Weighted Own'] + (slack_var / 20 * working_portfolio.loc[i, 'Weighted Own'])
working_portfolio = working_portfolio.drop(rows_to_drop).reset_index(drop=True)
concat_portfolio = pd.concat([concat_portfolio, working_portfolio])
if len(concat_portfolio) >= lineup_target:
return concat_portfolio.sort_values(by='Own', ascending=False).head(lineup_target)
else:
rows_to_drop = []
working_portfolio = portfolio.copy()
working_portfolio = working_portfolio.sort_values(by='Own', ascending = False)
working_portfolio = working_portfolio.reset_index(drop=True)
curr_own_type_max = working_portfolio.loc[0, 'Weighted Own'] + (slack_var / 20 * working_portfolio.loc[0, 'Weighted Own'])
for i in range(1, len(working_portfolio)):
if working_portfolio.loc[i, 'Weighted Own'] > curr_own_type_max:
rows_to_drop.append(i)
else:
curr_own_type_max = working_portfolio.loc[i, 'Weighted Own'] + (slack_var / 20 * working_portfolio.loc[i, 'Weighted Own'])
working_portfolio = working_portfolio.drop(rows_to_drop).reset_index(drop=True)
concat_portfolio = pd.concat([concat_portfolio, working_portfolio])
if len(concat_portfolio) >= lineup_target:
return concat_portfolio.sort_values(by='Own', ascending=False).head(lineup_target)
return concat_portfolio.sort_values(by='Own', ascending=False)