DFS_Portfolio_Manager / global_func /volatility_preset.py
James McCool
Update volatility_preset function to use 'Similarity Score' for row filtering instead of 'median'. This change improves the accuracy of lineup adjustments by ensuring the correct comparison for ownership type maximums.
2a7d830
import pandas as pd
import numpy as np
def volatility_preset(portfolio: pd.DataFrame, lineup_target: int, exclude_cols: list):
excluded_cols = ['salary', 'median', 'Own', 'Finish_percentile', 'Dupes', 'Stack', 'Size', 'Win%', 'Lineup Edge', 'Weighted Own', 'Geomean', 'Similarity Score']
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)
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, 'Similarity Score'] + (slack_var / 20 * working_portfolio.loc[0, 'Similarity Score'])
for i in range(1, len(working_portfolio)):
if working_portfolio.loc[i, 'Similarity Score'] < curr_own_type_max:
rows_to_drop.append(i)
else:
curr_own_type_max = working_portfolio.loc[i, 'Similarity Score'] + (slack_var / 20 * working_portfolio.loc[i, 'Similarity Score'])
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)