James McCool commited on
Commit
f08f4f1
·
1 Parent(s): 6c7cd22

Refactor portfolio filtering logic in app.py: streamline conditions for portfolio adjustments based on user selections, and ensure calculations are only performed when necessary. Add stack count adjustments for export options.

Browse files
Files changed (1) hide show
  1. app.py +103 -101
app.py CHANGED
@@ -799,114 +799,116 @@ with tab3:
799
  stack_toggle = st.selectbox("Include specific stacks?", options=['All Stacks', 'Specific Stacks'], index=0)
800
  stack_selections = st.multiselect("If Specific Stacks, Which to include?", options=sorted(list(set(stack_dict.values()))), default=[])
801
  stack_remove = st.multiselect("If Specific Stacks, Which to remove?", options=sorted(list(set(stack_dict.values()))), default=[])
802
-
 
803
  submitted = st.form_submit_button("Submit")
804
 
805
  with col2:
806
- st.session_state['portfolio'] = predict_dupes(st.session_state['portfolio'], map_dict, site_var, type_var, Contest_Size, strength_var)
807
- st.session_state['portfolio'] = st.session_state['portfolio'][st.session_state['portfolio']['Dupes'] <= max_dupes]
808
- st.session_state['portfolio'] = st.session_state['portfolio'][st.session_state['portfolio']['salary'] >= min_salary]
809
- st.session_state['portfolio'] = st.session_state['portfolio'][st.session_state['portfolio']['salary'] <= max_salary]
810
- st.session_state['portfolio'] = st.session_state['portfolio'][st.session_state['portfolio']['Finish_percentile'] <= max_finish_percentile]
811
- st.session_state['portfolio'] = st.session_state['portfolio'][st.session_state['portfolio']['Lineup Edge'] >= min_lineup_edge]
812
- if stack_dict is not None:
813
- if stack_toggle == 'All Stacks':
814
- st.session_state['portfolio'] = st.session_state['portfolio']
815
- st.session_state['portfolio'] = st.session_state['portfolio'][~st.session_state['portfolio']['Stack'].isin(stack_remove)]
816
- else:
817
- st.session_state['portfolio'] = st.session_state['portfolio'][st.session_state['portfolio']['Stack'].isin(stack_selections)]
818
- st.session_state['portfolio'] = st.session_state['portfolio'][~st.session_state['portfolio']['Stack'].isin(stack_remove)]
819
- if player_remove:
820
- # Create mask for lineups that contain any of the removed players
821
- player_columns = [col for col in st.session_state['portfolio'].columns if col not in excluded_cols]
822
- remove_mask = st.session_state['portfolio'][player_columns].apply(
823
- lambda row: not any(player in list(row) for player in player_remove), axis=1
824
- )
825
- st.session_state['portfolio'] = st.session_state['portfolio'][remove_mask]
826
-
827
- if player_lock:
828
- # Create mask for lineups that contain all locked players
829
- player_columns = [col for col in st.session_state['portfolio'].columns if col not in excluded_cols]
830
-
831
- lock_mask = st.session_state['portfolio'][player_columns].apply(
832
- lambda row: all(player in list(row) for player in player_lock), axis=1
833
- )
834
- st.session_state['portfolio'] = st.session_state['portfolio'][lock_mask]
835
- export_file = st.session_state['portfolio'].copy()
836
- st.session_state['portfolio'] = st.session_state['portfolio'].sort_values(by='median', ascending=False)
837
- if csv_file is not None:
838
- player_columns = [col for col in st.session_state['portfolio'].columns if col not in excluded_cols]
839
- for col in player_columns:
840
- export_file[col] = export_file[col].map(st.session_state['export_dict'])
841
- with st.expander("Download options"):
842
  if stack_dict is not None:
843
- with st.form(key='stack_form'):
844
- st.subheader("Stack Count Adjustments")
845
- st.info("This allows you to fine tune the stacks that you wish to export. If you want to make sure you don't export any of a specific stack you can 0 it out.")
846
- # Create a container for stack value inputs
847
- sort_container = st.container()
848
- with sort_container:
849
- sort_var = st.selectbox("Sort export portfolio by:", options=['median', 'Lineup Edge', 'Own'])
850
-
851
- # Get unique stack values
852
- unique_stacks = sorted(list(set(stack_dict.values())))
853
-
854
- # Create a dictionary to store stack multipliers
855
- if 'stack_multipliers' not in st.session_state:
856
- st.session_state.stack_multipliers = {stack: 0.0 for stack in unique_stacks}
857
-
858
- # Create columns for the stack inputs
859
- num_cols = 6 # Number of columns to display
860
- for i in range(0, len(unique_stacks), num_cols):
861
- cols = st.columns(num_cols)
862
- for j, stack in enumerate(unique_stacks[i:i+num_cols]):
863
- with cols[j]:
864
- # Create a unique key for each number input
865
- key = f"stack_count_{stack}"
866
- # Get the current count of this stack in the portfolio
867
- current_stack_count = len(st.session_state['portfolio'][st.session_state['portfolio']['Stack'] == stack])
868
- # Create number input with current value and max value based on actual count
869
- st.session_state.stack_multipliers[stack] = st.number_input(
870
- f"{stack} count",
871
- min_value=0.0,
872
- max_value=float(current_stack_count),
873
- value=0.0,
874
- step=1.0,
875
- key=key
876
- )
877
-
878
- # Create a copy of the portfolio
879
- portfolio_copy = st.session_state['portfolio'].copy()
880
-
881
- # Create a list to store selected rows
882
- selected_rows = []
883
-
884
- # For each stack, select the top N rows based on the count value
885
- for stack in unique_stacks:
886
- if stack in st.session_state.stack_multipliers:
887
- count = int(st.session_state.stack_multipliers[stack])
888
- # Get rows for this stack
889
- stack_rows = portfolio_copy[portfolio_copy['Stack'] == stack]
890
- # Sort by median and take top N rows
891
- top_rows = stack_rows.nlargest(count, sort_var)
892
- selected_rows.append(top_rows)
893
-
894
- # Combine all selected rows
895
- portfolio_copy = pd.concat(selected_rows)
896
-
897
- # Update export_file with filtered data
898
- export_file = portfolio_copy.copy()
899
- for col in export_file.columns:
900
- if col not in excluded_cols:
901
- export_file[col] = export_file[col].map(st.session_state['export_dict'])
902
-
903
- submitted = st.form_submit_button("Submit")
904
- if submitted:
905
- st.write('Export portfolio updated!')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
906
 
907
  st.download_button(label="Download Portfolio", data=export_file.to_csv(index=False), file_name="portfolio.csv", mime="text/csv")
908
 
909
-
910
  # Add pagination controls below the dataframe
911
  total_rows = len(st.session_state['portfolio'])
912
  rows_per_page = 500
 
799
  stack_toggle = st.selectbox("Include specific stacks?", options=['All Stacks', 'Specific Stacks'], index=0)
800
  stack_selections = st.multiselect("If Specific Stacks, Which to include?", options=sorted(list(set(stack_dict.values()))), default=[])
801
  stack_remove = st.multiselect("If Specific Stacks, Which to remove?", options=sorted(list(set(stack_dict.values()))), default=[])
802
+
803
+ st.session_state['math_done'] = False
804
  submitted = st.form_submit_button("Submit")
805
 
806
  with col2:
807
+ if 'math_done' not in st.session_state or st.session_state['math_done'] == False:
808
+ st.session_state['portfolio'] = predict_dupes(st.session_state['portfolio'], map_dict, site_var, type_var, Contest_Size, strength_var)
809
+ st.session_state['portfolio'] = st.session_state['portfolio'][st.session_state['portfolio']['Dupes'] <= max_dupes]
810
+ st.session_state['portfolio'] = st.session_state['portfolio'][st.session_state['portfolio']['salary'] >= min_salary]
811
+ st.session_state['portfolio'] = st.session_state['portfolio'][st.session_state['portfolio']['salary'] <= max_salary]
812
+ st.session_state['portfolio'] = st.session_state['portfolio'][st.session_state['portfolio']['Finish_percentile'] <= max_finish_percentile]
813
+ st.session_state['portfolio'] = st.session_state['portfolio'][st.session_state['portfolio']['Lineup Edge'] >= min_lineup_edge]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
814
  if stack_dict is not None:
815
+ if stack_toggle == 'All Stacks':
816
+ st.session_state['portfolio'] = st.session_state['portfolio']
817
+ st.session_state['portfolio'] = st.session_state['portfolio'][~st.session_state['portfolio']['Stack'].isin(stack_remove)]
818
+ else:
819
+ st.session_state['portfolio'] = st.session_state['portfolio'][st.session_state['portfolio']['Stack'].isin(stack_selections)]
820
+ st.session_state['portfolio'] = st.session_state['portfolio'][~st.session_state['portfolio']['Stack'].isin(stack_remove)]
821
+ if player_remove:
822
+ # Create mask for lineups that contain any of the removed players
823
+ player_columns = [col for col in st.session_state['portfolio'].columns if col not in excluded_cols]
824
+ remove_mask = st.session_state['portfolio'][player_columns].apply(
825
+ lambda row: not any(player in list(row) for player in player_remove), axis=1
826
+ )
827
+ st.session_state['portfolio'] = st.session_state['portfolio'][remove_mask]
828
+
829
+ if player_lock:
830
+ # Create mask for lineups that contain all locked players
831
+ player_columns = [col for col in st.session_state['portfolio'].columns if col not in excluded_cols]
832
+
833
+ lock_mask = st.session_state['portfolio'][player_columns].apply(
834
+ lambda row: all(player in list(row) for player in player_lock), axis=1
835
+ )
836
+ st.session_state['portfolio'] = st.session_state['portfolio'][lock_mask]
837
+ export_file = st.session_state['portfolio'].copy()
838
+ st.session_state['portfolio'] = st.session_state['portfolio'].sort_values(by='median', ascending=False)
839
+ if csv_file is not None:
840
+ player_columns = [col for col in st.session_state['portfolio'].columns if col not in excluded_cols]
841
+ for col in player_columns:
842
+ export_file[col] = export_file[col].map(st.session_state['export_dict'])
843
+ with st.expander("Download options"):
844
+ if stack_dict is not None:
845
+ with st.form(key='stack_form'):
846
+ st.subheader("Stack Count Adjustments")
847
+ st.info("This allows you to fine tune the stacks that you wish to export. If you want to make sure you don't export any of a specific stack you can 0 it out.")
848
+ # Create a container for stack value inputs
849
+ sort_container = st.container()
850
+ with sort_container:
851
+ sort_var = st.selectbox("Sort export portfolio by:", options=['median', 'Lineup Edge', 'Own'])
852
+
853
+ # Get unique stack values
854
+ unique_stacks = sorted(list(set(stack_dict.values())))
855
+
856
+ # Create a dictionary to store stack multipliers
857
+ if 'stack_multipliers' not in st.session_state:
858
+ st.session_state.stack_multipliers = {stack: 0.0 for stack in unique_stacks}
859
+
860
+ # Create columns for the stack inputs
861
+ num_cols = 6 # Number of columns to display
862
+ for i in range(0, len(unique_stacks), num_cols):
863
+ cols = st.columns(num_cols)
864
+ for j, stack in enumerate(unique_stacks[i:i+num_cols]):
865
+ with cols[j]:
866
+ # Create a unique key for each number input
867
+ key = f"stack_count_{stack}"
868
+ # Get the current count of this stack in the portfolio
869
+ current_stack_count = len(st.session_state['portfolio'][st.session_state['portfolio']['Stack'] == stack])
870
+ # Create number input with current value and max value based on actual count
871
+ st.session_state.stack_multipliers[stack] = st.number_input(
872
+ f"{stack} count",
873
+ min_value=0.0,
874
+ max_value=float(current_stack_count),
875
+ value=0.0,
876
+ step=1.0,
877
+ key=key
878
+ )
879
+
880
+ # Create a copy of the portfolio
881
+ portfolio_copy = st.session_state['portfolio'].copy()
882
+
883
+ # Create a list to store selected rows
884
+ selected_rows = []
885
+
886
+ # For each stack, select the top N rows based on the count value
887
+ for stack in unique_stacks:
888
+ if stack in st.session_state.stack_multipliers:
889
+ count = int(st.session_state.stack_multipliers[stack])
890
+ # Get rows for this stack
891
+ stack_rows = portfolio_copy[portfolio_copy['Stack'] == stack]
892
+ # Sort by median and take top N rows
893
+ top_rows = stack_rows.nlargest(count, sort_var)
894
+ selected_rows.append(top_rows)
895
+
896
+ # Combine all selected rows
897
+ portfolio_copy = pd.concat(selected_rows)
898
+
899
+ # Update export_file with filtered data
900
+ export_file = portfolio_copy.copy()
901
+ for col in export_file.columns:
902
+ if col not in excluded_cols:
903
+ export_file[col] = export_file[col].map(st.session_state['export_dict'])
904
+
905
+ submitted = st.form_submit_button("Submit")
906
+ if submitted:
907
+ st.write('Export portfolio updated!')
908
+ st.session_state['math_done'] = True
909
 
910
  st.download_button(label="Download Portfolio", data=export_file.to_csv(index=False), file_name="portfolio.csv", mime="text/csv")
911
 
 
912
  # Add pagination controls below the dataframe
913
  total_rows = len(st.session_state['portfolio'])
914
  rows_per_page = 500