import pandas as pd def create_stack_exposures(df: pd.DataFrame, entrants: list = None): stack_exposures = pd.DataFrame() if entrants is not None: overall_stacks = pd.Series(list(df[df['BaseName'].isin(entrants)]['stack'])).value_counts() else: overall_stacks = pd.Series(list(df['stack'])).value_counts() top_1per_stacks = pd.Series(list(df[df['percentile_finish'] <= 0.01]['stack'])).value_counts() top_5per_stacks = pd.Series(list(df[df['percentile_finish'] <= 0.05]['stack'])).value_counts() top_10per_stacks = pd.Series(list(df[df['percentile_finish'] <= 0.10]['stack'])).value_counts() top_20per_stacks = pd.Series(list(df[df['percentile_finish'] <= 0.20]['stack'])).value_counts() stacks_contest_len = len(df) stacks_len_1per = len(df[df['percentile_finish'] <= 0.01]) stacks_len_5per = len(df[df['percentile_finish'] <= 0.05]) stacks_len_10per = len(df[df['percentile_finish'] <= 0.10]) stacks_len_20per = len(df[df['percentile_finish'] <= 0.20]) each_set_name = ['Overall', ' Top 1%', ' Top 5%', 'Top 10%', 'Top 20%'] each_stacks_set = [overall_stacks, top_1per_stacks, top_5per_stacks, top_10per_stacks, top_20per_stacks] each_stacks_len_set = [stacks_contest_len, stacks_len_1per, stacks_len_5per, stacks_len_10per, stacks_len_20per] stack_count_var = 0 for each_stack in each_stacks_set: stack_frame = each_stack.to_frame().reset_index().rename(columns={'index': 'Stack', 'count': 'Count'}) stack_frame['Percent'] = stack_frame['Count'] / each_stacks_len_set[stack_count_var] stack_frame = stack_frame[['Stack', 'Percent']] stack_frame = stack_frame.rename(columns={'Percent': f'Exposure {each_set_name[stack_count_var]}'}) if len(stack_exposures) == 0: stack_exposures = stack_frame else: stack_exposures = pd.merge(stack_exposures, stack_frame, on='Stack', how='outer') stack_count_var += 1 return stack_exposures