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
import pandas as pd | |
import numpy as np | |
def volatility_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='Lineup Edge', ascending = False) | |
working_portfolio = working_portfolio.reset_index(drop=True) | |
curr_own_type_max = working_portfolio.loc[0, 'Diversity'] + (slack_var / 20 * working_portfolio.loc[0, 'Diversity']) | |
for i in range(1, len(working_portfolio)): | |
if working_portfolio.loc[i, 'Diversity'] < curr_own_type_max: | |
rows_to_drop.append(i) | |
else: | |
curr_own_type_max = working_portfolio.loc[i, 'Diversity'] + (slack_var / 20 * working_portfolio.loc[i, 'Diversity']) | |
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='Lineup Edge', ascending=False).head(lineup_target) | |
else: | |
rows_to_drop = [] | |
working_portfolio = portfolio.copy() | |
working_portfolio = working_portfolio.sort_values(by='Lineup Edge', ascending = False) | |
working_portfolio = working_portfolio.reset_index(drop=True) | |
curr_own_type_max = working_portfolio.loc[0, 'Diversity'] + (slack_var / 20 * working_portfolio.loc[0, 'Diversity']) | |
for i in range(1, len(working_portfolio)): | |
if working_portfolio.loc[i, 'Diversity'] < curr_own_type_max: | |
rows_to_drop.append(i) | |
else: | |
curr_own_type_max = working_portfolio.loc[i, 'Diversity'] + (slack_var / 20 * working_portfolio.loc[i, 'Diversity']) | |
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='Lineup Edge', ascending=False).head(lineup_target) | |
return concat_portfolio.sort_values(by='Lineup Edge', ascending=False) | |