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
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
|
807 |
-
|
808 |
-
|
809 |
-
|
810 |
-
|
811 |
-
|
812 |
-
|
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 |
-
|
844 |
-
st.
|
845 |
-
st.
|
846 |
-
|
847 |
-
|
848 |
-
|
849 |
-
|
850 |
-
|
851 |
-
|
852 |
-
|
853 |
-
|
854 |
-
|
855 |
-
|
856 |
-
|
857 |
-
|
858 |
-
|
859 |
-
|
860 |
-
|
861 |
-
|
862 |
-
|
863 |
-
|
864 |
-
|
865 |
-
|
866 |
-
|
867 |
-
|
868 |
-
|
869 |
-
|
870 |
-
|
871 |
-
|
872 |
-
|
873 |
-
|
874 |
-
|
875 |
-
|
876 |
-
|
877 |
-
|
878 |
-
|
879 |
-
|
880 |
-
|
881 |
-
|
882 |
-
|
883 |
-
|
884 |
-
|
885 |
-
|
886 |
-
|
887 |
-
|
888 |
-
|
889 |
-
|
890 |
-
|
891 |
-
|
892 |
-
|
893 |
-
|
894 |
-
|
895 |
-
|
896 |
-
|
897 |
-
|
898 |
-
|
899 |
-
|
900 |
-
|
901 |
-
|
902 |
-
|
903 |
-
|
904 |
-
|
905 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|