James McCool commited on
Commit
31a2d34
·
1 Parent(s): add3343

Add general comparison feature in app.py and create_general_comparison.py

Browse files

- Introduced a new function, create_general_comparison, to facilitate the comparison of general exposures based on user selections.
- Updated app.py to include a form for selecting generals to compare, enhancing user interaction and data analysis capabilities.
- Improved data display for general comparisons, ensuring accurate representation of exposure data in the DataFrame.

Files changed (2) hide show
  1. app.py +24 -8
  2. global_func/create_general_comparison.py +33 -0
app.py CHANGED
@@ -66,6 +66,7 @@ from global_func.grab_contest_data import grab_contest_data
66
  from global_func.create_player_comparison import create_player_comparison
67
  from global_func.create_stack_comparison import create_stack_comparison
68
  from global_func.create_size_comparison import create_size_comparison
 
69
 
70
  def is_valid_input(file):
71
  if isinstance(file, pd.DataFrame):
@@ -551,14 +552,29 @@ with tab2:
551
  hide_index=True)
552
 
553
  with tab4:
554
-
555
- if st.session_state['entry_parse_var'] == 'All':
556
- st.session_state['general_frame'] = create_general_exposures(st.session_state['display_contest_info'])
557
- st.dataframe(st.session_state['general_frame'].style.background_gradient(cmap='RdYlGn', axis=1).format(precision=2), hide_index=True)
558
-
 
 
 
 
 
 
 
 
 
 
559
  else:
560
- st.session_state['general_frame'] = create_general_exposures(st.session_state['display_contest_info'], st.session_state['entry_names'])
561
- st.dataframe(st.session_state['general_frame'].style.background_gradient(cmap='RdYlGn', axis=1).format(precision=2), hide_index=True)
 
 
 
 
 
562
 
563
  with tab5:
564
  with st.form(key='dupe_form'):
@@ -580,7 +596,7 @@ with tab2:
580
  dupe_frame['under_5%'] = dupe_frame['under_5'] / dupe_frame['EntryCount']
581
  dupe_frame['under_10%'] = dupe_frame['under_10'] / dupe_frame['EntryCount']
582
  dupe_frame = dupe_frame[['BaseName', 'EntryCount', 'average_dupes', 'uniques', 'uniques%', 'under_5', 'under_5%', 'under_10', 'under_10%']].drop_duplicates(subset='BaseName', keep='first')
583
- st.session_state['duplication_frame'] = dupe_frame.sort_values(by='EntryCount', ascending=False)
584
  if user_dupe_var == 'Specific':
585
  st.session_state['duplication_frame'] = st.session_state['duplication_frame'][st.session_state['duplication_frame']['BaseName'].isin(user_dupe_select)]
586
 
 
66
  from global_func.create_player_comparison import create_player_comparison
67
  from global_func.create_stack_comparison import create_stack_comparison
68
  from global_func.create_size_comparison import create_size_comparison
69
+ from global_func.create_general_comparison import create_general_comparison
70
 
71
  def is_valid_input(file):
72
  if isinstance(file, pd.DataFrame):
 
552
  hide_index=True)
553
 
554
  with tab4:
555
+ with st.form(key='general_comp_form'):
556
+ col1, col2 = st.columns(2)
557
+ with col1:
558
+ comp_general_var = st.selectbox("Would you like to compare with anyone?", ['No', 'Yes'], key='comp_general_var')
559
+ with col2:
560
+ comp_general_select = st.multiselect("Select generals to compare with:", st.session_state['display_contest_info']['BaseName'].sort_values().unique(), key='comp_general_select')
561
+ submitted = st.form_submit_button("Submit")
562
+ if submitted:
563
+ if comp_general_var == 'No':
564
+ comp_general_select = None
565
+ else:
566
+ comp_general_select = comp_general_select
567
+ if comp_general_var == 'Yes':
568
+ general_comp = create_general_comparison(st.session_state['display_contest_info'], comp_general_select)
569
+ st.dataframe(general_comp.style.background_gradient(cmap='RdYlGn', axis=0).format(formatter='{:.2%}', subset=general_comp.select_dtypes(include=['number']).columns), hide_index=True)
570
  else:
571
+ if st.session_state['entry_parse_var'] == 'All':
572
+ st.session_state['general_frame'] = create_general_exposures(st.session_state['display_contest_info'])
573
+ st.dataframe(st.session_state['general_frame'].style.background_gradient(cmap='RdYlGn', axis=1).format(precision=2), hide_index=True)
574
+
575
+ else:
576
+ st.session_state['general_frame'] = create_general_exposures(st.session_state['display_contest_info'], st.session_state['entry_names'])
577
+ st.dataframe(st.session_state['general_frame'].style.background_gradient(cmap='RdYlGn', axis=1).format(precision=2), hide_index=True)
578
 
579
  with tab5:
580
  with st.form(key='dupe_form'):
 
596
  dupe_frame['under_5%'] = dupe_frame['under_5'] / dupe_frame['EntryCount']
597
  dupe_frame['under_10%'] = dupe_frame['under_10'] / dupe_frame['EntryCount']
598
  dupe_frame = dupe_frame[['BaseName', 'EntryCount', 'average_dupes', 'uniques', 'uniques%', 'under_5', 'under_5%', 'under_10', 'under_10%']].drop_duplicates(subset='BaseName', keep='first')
599
+ st.session_state['duplication_frame'] = dupe_frame.sort_values(by='uniques%', ascending=False)
600
  if user_dupe_var == 'Specific':
601
  st.session_state['duplication_frame'] = st.session_state['duplication_frame'][st.session_state['duplication_frame']['BaseName'].isin(user_dupe_select)]
602
 
global_func/create_general_comparison.py ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+
3
+ def create_general_comparison(df: pd.DataFrame, entrants: list = None):
4
+ loop_list = ['Overall'] + entrants
5
+ for entrant in loop_list:
6
+ check_cols = ['salary', 'actual_fpts', 'actual_own', 'dupes', 'uniques', 'under_5', 'under_10']
7
+ general_exposures = pd.DataFrame()
8
+ for each_col in check_cols:
9
+ general_frame = pd.DataFrame()
10
+
11
+ if entrant == 'Overall':
12
+ overall_general = pd.Series(list(df[each_col])).sum()
13
+ else:
14
+ overall_general = pd.Series(list(df[df['BaseName'] == entrant][each_col])).sum()
15
+ general_contest_len = len(df)
16
+ each_set_name = ['Overall']
17
+ each_general_set = [overall_general]
18
+ each_general_len_set = [general_contest_len]
19
+ general_count_var = 0
20
+ for each_general in each_general_set:
21
+ general_frame['Stat'] = [each_col]
22
+ try:
23
+ general_frame['Average'] = [each_general / each_general_len_set[general_count_var]]
24
+ except:
25
+ general_frame['Average'] = [0]
26
+ general_frame = general_frame.rename(columns={'Average': f'Average {entrant}'})
27
+ general_exposures = pd.concat([general_exposures, general_frame], ignore_index = True, axis = 0)
28
+ general_exposures['Stat'] = general_exposures['Stat'].replace(['salary', 'actual_fpts', 'actual_own', 'dupes', 'uniques', 'under_5', 'under_10'], ['Salary Used', 'Finishing Points', 'Total Ownership', 'Duplications', 'Uniques', 'Under 5', 'Under 10'])
29
+ if entrant == 'Overall':
30
+ final_exposures = general_exposures
31
+ else:
32
+ final_exposures = pd.merge(final_exposures, general_exposures, on='Stat', how='outer')
33
+ return final_exposures