DFS_Portfolio_Manager / global_func /large_field_preset.py
James McCool
Refactor large_field_preset function to improve team-based filtering by introducing median and finish percentile rankings for enhanced sorting accuracy. Clean up temporary columns after processing to maintain DataFrame integrity.
471e1a6
raw
history blame
1.94 kB
import pandas as pd
def large_field_preset(portfolio: pd.DataFrame, lineup_target: int):
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['median_rank'] = working_portfolio['median_rank'].rank(method='first')
working_portfolio['finish_percentile_rank'] = working_portfolio['Finish_percentile'].rank(method='first')
working_portfolio['rank_agg'] = (working_portfolio['median_rank'] + working_portfolio['finish_percentile_rank']) / 2
working_portfolio = working_portfolio[working_portfolio['Stack'] == team].sort_values(by='rank_agg', ascending = True)
working_portfolio = working_portfolio[working_portfolio['Lineup Edge'] > 0]
working_portfolio = working_portfolio.reset_index(drop=True)
curr_own_type_max = working_portfolio.loc[0, 'Own'] + (slack_var / 20 * working_portfolio.loc[0, 'Own'])
for i in range(1, len(working_portfolio)):
if working_portfolio.loc[i, 'Own'] > curr_own_type_max:
rows_to_drop.append(i)
else:
curr_own_type_max = working_portfolio.loc[i, 'Own'] + (slack_var / 20 * working_portfolio.loc[i, 'Own'])
working_portfolio = working_portfolio.drop(rows_to_drop).reset_index(drop=True)
working_portfolio = working_portfolio.drop(columns=['median_rank', 'finish_percentile_rank', 'rank_agg'])
concat_portfolio = pd.concat([concat_portfolio, working_portfolio])
if len(concat_portfolio) >= lineup_target:
return concat_portfolio.sort_values(by='Finish_percentile', ascending=True).head(lineup_target)
return concat_portfolio.sort_values(by='Finish_percentile', ascending=True)