James McCool commited on
Commit
d18e5a9
·
1 Parent(s): 6d2f6bb

Add stack size exposure calculations in app.py and create_stack_size_exposures.py

Browse files

- Introduced the create_stack_size_exposures function to calculate stack size exposures based on player performance metrics.
- Updated app.py to integrate the new function, allowing for the display of stack size exposure data in the user interface.
- Enhanced tab structure in app.py to reflect the addition of stack size information, improving overall data presentation and user experience.

app.py CHANGED
@@ -12,6 +12,7 @@ from global_func.load_file import load_file
12
  from global_func.find_name_mismatches import find_name_mismatches
13
  from global_func.create_player_exposures import create_player_exposures
14
  from global_func.create_stack_exposures import create_stack_exposures
 
15
 
16
  player_exposure_format = {'Exposure Overall': '{:.2%}', 'Exposure Top 1%': '{:.2%}', 'Exposure Top 5%': '{:.2%}', 'Exposure Top 10%': '{:.2%}', 'Exposure Top 20%': '{:.2%}'}
17
  if 'calc_toggle' not in st.session_state:
@@ -238,7 +239,7 @@ with tab2:
238
  )
239
 
240
  with st.container():
241
- tab1, tab2, tab3 = st.tabs(['Player Used Info', 'Stack Used Info', 'Duplication Info'])
242
  with tab1:
243
 
244
  if entry_parse_var == 'All':
@@ -272,4 +273,18 @@ with tab2:
272
  format(formatter='{:.2%}', subset=st.session_state['stack_frame'].select_dtypes(include=['number']).columns),
273
  hide_index=True)
274
  with tab3:
275
- st.write('holding')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  from global_func.find_name_mismatches import find_name_mismatches
13
  from global_func.create_player_exposures import create_player_exposures
14
  from global_func.create_stack_exposures import create_stack_exposures
15
+ from global_func.create_stack_size_exposures import create_stack_size_exposures
16
 
17
  player_exposure_format = {'Exposure Overall': '{:.2%}', 'Exposure Top 1%': '{:.2%}', 'Exposure Top 5%': '{:.2%}', 'Exposure Top 10%': '{:.2%}', 'Exposure Top 20%': '{:.2%}'}
18
  if 'calc_toggle' not in st.session_state:
 
239
  )
240
 
241
  with st.container():
242
+ tab1, tab2, tab3 = st.tabs(['Player Used Info', 'Stack Used Info', 'Stack Size Info'])
243
  with tab1:
244
 
245
  if entry_parse_var == 'All':
 
273
  format(formatter='{:.2%}', subset=st.session_state['stack_frame'].select_dtypes(include=['number']).columns),
274
  hide_index=True)
275
  with tab3:
276
+
277
+ if entry_parse_var == 'All':
278
+ st.session_state['stack_size_frame'] = create_stack_size_exposures(working_df)
279
+ st.dataframe(st.session_state['stack_size_frame'].
280
+ sort_values(by='Exposure Overall', ascending=False).
281
+ style.background_gradient(cmap='RdYlGn').
282
+ format(formatter='{:.2%}', subset=st.session_state['stack_size_frame'].select_dtypes(include=['number']).columns),
283
+ hide_index=True)
284
+ else:
285
+ st.session_state['stack_size_frame'] = create_stack_size_exposures(working_df, entry_names)
286
+ st.dataframe(st.session_state['stack_size_frame'].
287
+ sort_values(by='Exposure Overall', ascending=False).
288
+ style.background_gradient(cmap='RdYlGn').
289
+ format(formatter='{:.2%}', subset=st.session_state['stack_size_frame'].select_dtypes(include=['number']).columns),
290
+ hide_index=True)
global_func/create_stack_size_exposures.py ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+
3
+ def create_stack_size_exposures(df: pd.DataFrame, entrants: list = None):
4
+ stack_size_exposures = pd.DataFrame()
5
+ if entrants is not None:
6
+ overall_stack_sizes = pd.Series(list(df[df['BaseName'].isin(entrants)]['stack_size'])).value_counts()
7
+ else:
8
+ overall_stack_sizes = pd.Series(list(df['stack_size'])).value_counts()
9
+ top_1per_stack_sizes = pd.Series(list(df[df['percentile_finish'] <= 0.01]['stack_size'])).value_counts()
10
+ top_5per_stack_sizes = pd.Series(list(df[df['percentile_finish'] <= 0.05]['stack_size'])).value_counts()
11
+ top_10per_stack_sizes = pd.Series(list(df[df['percentile_finish'] <= 0.10]['stack_size'])).value_counts()
12
+ top_20per_stack_sizes = pd.Series(list(df[df['percentile_finish'] <= 0.20]['stack_size'])).value_counts()
13
+ stack_sizes_contest_len = len(df)
14
+ stack_sizes_len_1per = len(df[df['percentile_finish'] <= 0.01])
15
+ stack_sizes_len_5per = len(df[df['percentile_finish'] <= 0.05])
16
+ stack_sizes_len_10per = len(df[df['percentile_finish'] <= 0.10])
17
+ stack_sizes_len_20per = len(df[df['percentile_finish'] <= 0.20])
18
+ each_set_name = ['Overall', ' Top 1%', ' Top 5%', 'Top 10%', 'Top 20%']
19
+ each_stack_sizes_set = [overall_stack_sizes, top_1per_stack_sizes, top_5per_stack_sizes, top_10per_stack_sizes, top_20per_stack_sizes]
20
+ each_stack_sizes_len_set = [stack_sizes_contest_len, stack_sizes_len_1per, stack_sizes_len_5per, stack_sizes_len_10per, stack_sizes_len_20per]
21
+ stack_size_count_var = 0
22
+ for each_stack_size in each_stack_sizes_set:
23
+ stack_size_frame = each_stack_size.to_frame().reset_index().rename(columns={'index': 'Size', 'count': 'Count'})
24
+ stack_size_frame['Percent'] = stack_size_frame['Count'] / each_stack_sizes_len_set[stack_size_count_var]
25
+ stack_size_frame = stack_size_frame[['Size', 'Percent']]
26
+ stack_size_frame = stack_size_frame.rename(columns={'Percent': f'Exposure {each_set_name[stack_size_count_var]}'})
27
+ if len(stack_size_exposures) == 0:
28
+ stack_size_exposures = stack_size_frame
29
+ else:
30
+ stack_size_exposures = pd.merge(stack_size_exposures, stack_size_frame, on='Size', how='outer')
31
+ stack_size_count_var += 1
32
+
33
+ return stack_size_exposures