James McCool commited on
Commit
45a70a9
·
1 Parent(s): f49d54b

Refactor app.py to utilize create_player_exposures function

Browse files

- Replaced repetitive code for calculating player exposures with a new function, create_player_exposures, improving code maintainability and readability.
- Streamlined the handling of player exposure data for both 'All' and specific entry names, enhancing performance and clarity in the application.

Files changed (2) hide show
  1. app.py +4 -54
  2. global_func/create_player_exposures.py +33 -0
app.py CHANGED
@@ -7,15 +7,10 @@ from fuzzywuzzy import process
7
  from collections import Counter
8
 
9
  ## import global functions
10
- from global_func.clean_player_name import clean_player_name
11
  from global_func.load_contest_file import load_contest_file
12
  from global_func.load_file import load_file
13
- from global_func.load_ss_file import load_ss_file
14
  from global_func.find_name_mismatches import find_name_mismatches
15
- from global_func.predict_dupes import predict_dupes
16
- from global_func.highlight_rows import highlight_changes, highlight_changes_winners, highlight_changes_losers
17
- from global_func.load_csv import load_csv
18
- from global_func.find_csv_mismatches import find_csv_mismatches
19
 
20
  player_exposure_format = {'Exposure Overall': '{:.2%}', 'Exposure Top 1%': '{:.2%}', 'Exposure Top 5%': '{:.2%}', 'Exposure Top 10%': '{:.2%}', 'Exposure Top 20%': '{:.2%}'}
21
  if 'calc_toggle' not in st.session_state:
@@ -239,61 +234,16 @@ with tab2:
239
  with st.container():
240
  tab1, tab2, tab3 = st.tabs(['Player Used Info', 'Stack Used Info', 'Duplication Info'])
241
  with tab1:
 
242
  if entry_parse_var == 'All':
243
- overall_players = pd.Series(list(working_df[player_columns].values.flatten())).value_counts()
244
- top_1per_players = pd.Series(list(working_df[working_df['percentile_finish'] <= 0.01][player_columns].values.flatten())).value_counts()
245
- top_5per_players = pd.Series(list(working_df[working_df['percentile_finish'] <= 0.05][player_columns].values.flatten())).value_counts()
246
- top_10per_players = pd.Series(list(working_df[working_df['percentile_finish'] <= 0.10][player_columns].values.flatten())).value_counts()
247
- top_20per_players = pd.Series(list(working_df[working_df['percentile_finish'] <= 0.20][player_columns].values.flatten())).value_counts()
248
- contest_len = len(working_df)
249
- len_1per = len(working_df[working_df['percentile_finish'] <= 0.01])
250
- len_5per = len(working_df[working_df['percentile_finish'] <= 0.05])
251
- len_10per = len(working_df[working_df['percentile_finish'] <= 0.10])
252
- len_20per = len(working_df[working_df['percentile_finish'] <= 0.20])
253
- each_set_name = ['Overall', ' Top 1%', ' Top 5%', 'Top 10%', 'Top 20%']
254
- each_frame_set = [overall_players, top_1per_players, top_5per_players, top_10per_players, top_20per_players]
255
- each_len_set = [contest_len, len_1per, len_5per, len_10per, len_20per]
256
- player_count_var = 0
257
- for each_set in each_frame_set:
258
- set_frame = each_set.to_frame().reset_index().rename(columns={'index': 'Player', 'count': 'Count'})
259
- set_frame['Percent'] = set_frame['Count'] / each_len_set[player_count_var]
260
- set_frame = set_frame[['Player', 'Percent']]
261
- set_frame = set_frame.rename(columns={'Percent': f'Exposure {each_set_name[player_count_var]}'})
262
- if 'player_frame' not in st.session_state:
263
- st.session_state['player_frame'] = set_frame
264
- else:
265
- st.session_state['player_frame'] = pd.merge(st.session_state['player_frame'], set_frame, on='Player', how='outer')
266
- player_count_var += 1
267
  st.dataframe(st.session_state['player_frame'].
268
  sort_values(by='Exposure Overall', ascending=False).
269
  style.background_gradient(cmap='RdYlGn').
270
  format(formatter='{:.2%}', subset=st.session_state['player_frame'].select_dtypes(include=['number']).columns),
271
  hide_index=True)
272
  else:
273
- overall_players = pd.Series(list(working_df[working_df['BaseName'].isin(entry_names)][player_columns].values.flatten())).value_counts()
274
- top_1per_players = pd.Series(list(working_df[working_df['percentile_finish'] <= 0.01][player_columns].values.flatten())).value_counts()
275
- top_5per_players = pd.Series(list(working_df[working_df['percentile_finish'] <= 0.05][player_columns].values.flatten())).value_counts()
276
- top_10per_players = pd.Series(list(working_df[working_df['percentile_finish'] <= 0.10][player_columns].values.flatten())).value_counts()
277
- top_20per_players = pd.Series(list(working_df[working_df['percentile_finish'] <= 0.20][player_columns].values.flatten())).value_counts()
278
- contest_len = len(working_df)
279
- len_1per = len(working_df[working_df['percentile_finish'] <= 0.01])
280
- len_5per = len(working_df[working_df['percentile_finish'] <= 0.05])
281
- len_10per = len(working_df[working_df['percentile_finish'] <= 0.10])
282
- len_20per = len(working_df[working_df['percentile_finish'] <= 0.20])
283
- each_set_name = ['Overall', ' Top 1%', ' Top 5%', 'Top 10%', 'Top 20%']
284
- each_frame_set = [overall_players, top_1per_players, top_5per_players, top_10per_players, top_20per_players]
285
- each_len_set = [contest_len, len_1per, len_5per, len_10per, len_20per]
286
- player_count_var = 0
287
- for each_set in each_frame_set:
288
- set_frame = each_set.to_frame().reset_index().rename(columns={'index': 'Player', 'count': 'Count'})
289
- set_frame['Percent'] = set_frame['Count'] / each_len_set[player_count_var]
290
- set_frame = set_frame[['Player', 'Percent']]
291
- set_frame = set_frame.rename(columns={'Percent': f'Exposure {each_set_name[player_count_var]}'})
292
- if 'player_frame' not in st.session_state:
293
- st.session_state['player_frame'] = set_frame
294
- else:
295
- st.session_state['player_frame'] = pd.merge(st.session_state['player_frame'], set_frame, on='Player', how='outer')
296
- player_count_var += 1
297
  st.dataframe(st.session_state['player_frame'].
298
  sort_values(by='Exposure Overall', ascending=False).
299
  style.background_gradient(cmap='RdYlGn').
 
7
  from collections import Counter
8
 
9
  ## import global functions
 
10
  from global_func.load_contest_file import load_contest_file
11
  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
 
15
  player_exposure_format = {'Exposure Overall': '{:.2%}', 'Exposure Top 1%': '{:.2%}', 'Exposure Top 5%': '{:.2%}', 'Exposure Top 10%': '{:.2%}', 'Exposure Top 20%': '{:.2%}'}
16
  if 'calc_toggle' not in st.session_state:
 
234
  with st.container():
235
  tab1, tab2, tab3 = st.tabs(['Player Used Info', 'Stack Used Info', 'Duplication Info'])
236
  with tab1:
237
+ st.session_state['field_frame'] = create_player_exposures(working_df, player_columns)
238
  if entry_parse_var == 'All':
239
+ st.session_state['player_frame'] = create_player_exposures(working_df, player_columns)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
240
  st.dataframe(st.session_state['player_frame'].
241
  sort_values(by='Exposure Overall', ascending=False).
242
  style.background_gradient(cmap='RdYlGn').
243
  format(formatter='{:.2%}', subset=st.session_state['player_frame'].select_dtypes(include=['number']).columns),
244
  hide_index=True)
245
  else:
246
+ st.session_state['player_frame'] = create_player_exposures(working_df, player_columns, entry_names)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
247
  st.dataframe(st.session_state['player_frame'].
248
  sort_values(by='Exposure Overall', ascending=False).
249
  style.background_gradient(cmap='RdYlGn').
global_func/create_player_exposures.py ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+
3
+ def create_player_exposures(df: pd.DataFrame, player_columns: list, entrants: list = None):
4
+ player_frame = pd.DataFrame()
5
+ if entrants is not None:
6
+ overall_players = pd.Series(list(df[df['BaseName'].isin(entrants)][player_columns].values.flatten())).value_counts()
7
+ else:
8
+ overall_players = pd.Series(list(df[player_columns].values.flatten())).value_counts()
9
+ top_1per_players = pd.Series(list(df[df['percentile_finish'] <= 0.01][player_columns].values.flatten())).value_counts()
10
+ top_5per_players = pd.Series(list(df[df['percentile_finish'] <= 0.05][player_columns].values.flatten())).value_counts()
11
+ top_10per_players = pd.Series(list(df[df['percentile_finish'] <= 0.10][player_columns].values.flatten())).value_counts()
12
+ top_20per_players = pd.Series(list(df[df['percentile_finish'] <= 0.20][player_columns].values.flatten())).value_counts()
13
+ contest_len = len(df)
14
+ len_1per = len(df[df['percentile_finish'] <= 0.01])
15
+ len_5per = len(df[df['percentile_finish'] <= 0.05])
16
+ len_10per = len(df[df['percentile_finish'] <= 0.10])
17
+ len_20per = len(df[df['percentile_finish'] <= 0.20])
18
+ each_set_name = ['Overall', ' Top 1%', ' Top 5%', 'Top 10%', 'Top 20%']
19
+ each_frame_set = [overall_players, top_1per_players, top_5per_players, top_10per_players, top_20per_players]
20
+ each_len_set = [contest_len, len_1per, len_5per, len_10per, len_20per]
21
+ player_count_var = 0
22
+ for each_set in each_frame_set:
23
+ set_frame = each_set.to_frame().reset_index().rename(columns={'index': 'Player', 'count': 'Count'})
24
+ set_frame['Percent'] = set_frame['Count'] / each_len_set[player_count_var]
25
+ set_frame = set_frame[['Player', 'Percent']]
26
+ set_frame = set_frame.rename(columns={'Percent': f'Exposure {each_set_name[player_count_var]}'})
27
+ if len(player_frame) == 0:
28
+ player_frame = set_frame
29
+ else:
30
+ player_frame = pd.merge(player_frame, set_frame, on='Player', how='outer')
31
+ player_count_var += 1
32
+
33
+ return player_frame