|
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 |