James McCool commited on
Commit
a73a1c5
·
1 Parent(s): f12b4ed

Enhance Streamlit app functionality by refining data loading and filtering logic for stacks and player tabs, adding export options for player frequency and seed frame frequency, and improving session state management for optimal data handling.

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +555 -552
src/streamlit_app.py CHANGED
@@ -773,603 +773,606 @@ with handbuilder_tab:
773
 
774
  with stacks_tab:
775
  st.session_state['current_tab'] = 'Stacks ROO'
776
- with st.expander("Info and Filters"):
777
- st.info(t_stamp)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
778
  with st.container():
779
- slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'Late Slate', 'Thurs-Mon Slate'), key='slate_var1_radio')
780
- split_var1 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var1_radio')
 
 
 
 
 
 
 
 
 
 
 
 
 
781
  if site_var == 'Draftkings':
782
- raw_baselines = dk_stacks_raw[dk_stacks_raw['slate'] == str(slate_var1)]
783
- raw_baselines = raw_baselines[raw_baselines['version'] == 'overall']
784
  raw_baselines = raw_baselines.iloc[:,:-2]
785
  elif site_var == 'Fanduel':
786
- raw_baselines = fd_stacks_raw[fd_stacks_raw['slate'] == str(slate_var1)]
787
- raw_baselines = raw_baselines[raw_baselines['version'] == 'overall']
788
  raw_baselines = raw_baselines.iloc[:,:-2]
789
- if split_var1 == 'Specific Games':
790
- team_var1 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var1_multiselect')
791
- elif split_var1 == 'Full Slate Run':
792
- team_var1 = raw_baselines.Team.values.tolist()
793
-
794
- final_stacks = raw_baselines[raw_baselines['Team'].isin(team_var1)]
795
- if view_var == 'Simple':
796
- final_stacks = final_stacks[['Team', 'QB', 'WR1_TE', 'WR2_TE', 'Salary', 'Median', '60+%', '4x%']]
797
- elif view_var == 'Advanced':
798
- final_stacks = final_stacks[['Team', 'QB', 'WR1_TE', 'WR2_TE', 'Total', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish',
799
- 'Top_10_finish', '60+%', '2x%', '3x%', '4x%', 'Own', 'LevX']]
800
- with st.container():
801
- st.dataframe(final_stacks.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), height=750, use_container_width = True, key='stacks_dataframe')
802
- st.download_button(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
803
  label="Export Tables",
804
- data=convert_df_to_csv(final_stacks),
805
- file_name='NFL_stacks_export.csv',
806
  mime='text/csv',
807
- key='stacks_export_button'
808
- )
809
-
810
- with player_tab:
811
- st.session_state['current_tab'] = 'Player ROO'
812
- with st.expander("Info and Filters"):
813
- st.info(t_stamp)
814
- slate_var2 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'Late Slate', 'Thurs-Mon Slate'), key='slate_var2_radio')
815
- if site_var == 'Draftkings':
816
- raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var2)]
817
-
818
- raw_baselines = raw_baselines.iloc[:,:-2]
819
- elif site_var == 'Fanduel':
820
- raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var2)]
821
- raw_baselines = raw_baselines.iloc[:,:-2]
822
- split_var2 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var2_radio')
823
- if split_var2 == 'Specific Games':
824
- team_var2 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var2_multiselect')
825
- elif split_var2 == 'Full Slate Run':
826
- team_var2 = raw_baselines.Team.values.tolist()
827
- pos_split2 = st.selectbox('What Position table would you like to view?', options = ['Overall', 'QB', 'RB', 'WR', 'TE'], key='pos_split2_selectbox')
828
- pos_combos2 = st.multiselect('If Overall, specific positions?', options = ['QB', 'RB', 'WR', 'TE', 'DST'], default = ['QB', 'RB', 'WR', 'TE', 'DST'], key='pos_combos2_multiselect')
829
- sal_var2 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var2_slider')
830
-
831
- if pos_split2 == 'Overall':
832
- raw_baselines = raw_baselines[raw_baselines['version'] == 'overall']
833
- elif pos_split2 == 'QB':
834
- if site_var == 'Draftkings':
835
- raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_qbs']
836
- elif site_var == 'Fanduel':
837
- raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_qbs']
838
- elif pos_split2 == 'RB':
839
- if site_var == 'Draftkings':
840
- raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_rbs']
841
- elif site_var == 'Fanduel':
842
- raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_rbs']
843
- elif pos_split2 == 'WR':
844
- if site_var == 'Draftkings':
845
- raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_wrs']
846
- elif site_var == 'Fanduel':
847
- raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_wrs']
848
- elif pos_split2 == 'TE':
849
- if site_var == 'Draftkings':
850
- raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_tes']
851
- elif site_var == 'Fanduel':
852
- raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_tes']
853
- raw_baselines = raw_baselines[raw_baselines['Position'].str.contains('|'.join(pos_combos2))]
854
- final_Proj = raw_baselines[raw_baselines['Team'].isin(team_var2)]
855
- final_Proj = final_Proj[final_Proj['Salary'] >= sal_var2[0]]
856
- final_Proj = final_Proj[final_Proj['Salary'] <= sal_var2[1]]
857
-
858
- if view_var == 'Simple':
859
- final_Proj = final_Proj[['Player', 'Position', 'Team', 'Salary', 'Median', 'Top_5_finish', '4x%']]
860
- disp_proj = final_Proj.set_index('Player')
861
- elif view_var == 'Advanced':
862
- final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX']]
863
- disp_proj = final_Proj.set_index('Player')
864
- with st.container():
865
- st.dataframe(disp_proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), height=750, use_container_width = True, key='player_dataframe')
866
- st.download_button(
867
- label="Export Tables",
868
- data=convert_df_to_csv(final_Proj),
869
- file_name='NFL_ROO_export.csv',
870
- mime='text/csv',
871
- key='player_export_button'
872
- )
873
 
874
  with optimals_tab:
875
  st.session_state['current_tab'] = 'Optimals'
876
- st.header("Optimals")
877
- with st.expander("Info and Filters"):
878
- st.info("These filters will display various optimals in the table below to pick from. If you want to export the entire set of 10,000 optimals, hit the 'Prepare full data export' button. If you would like to apply the filters here to the 10,000 optimals before you export, use the 'Prepare full data export (Filter)' button.")
879
- optimals_site_col, optimals_macro_col, optimals_salary_col, optimals_stacks_col = st.columns(4)
880
- with optimals_site_col:
881
- slate_type_var3 = st.radio("Which slate type are you loading?", ('Regular', 'Showdown'), key='slate_type_var3_radio')
882
- if slate_type_var3 == 'Regular':
883
- if site_var == 'Draftkings':
884
- raw_baselines = dk_roo_raw
885
- elif site_var == 'Fanduel':
886
- raw_baselines = fd_roo_raw
887
- elif slate_type_var3 == 'Showdown':
888
- if site_var == 'Draftkings':
889
- raw_baselines = dk_sd_roo_raw
890
- elif site_var == 'Fanduel':
891
- raw_baselines = fd_sd_roo_raw
892
- slate_var3 = st.radio("Which slate data are you loading?", ('Main', 'Secondary', 'Auxiliary'), key='slate_var3_radio')
893
- if slate_type_var3 == 'Regular':
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
894
  if site_var == 'Draftkings':
895
- dk_lineups = init_DK_lineups(slate_type_var3, slate_var3)
 
896
  elif site_var == 'Fanduel':
897
- fd_lineups = init_FD_lineups(slate_type_var3, slate_var3)
898
- elif slate_type_var3 == 'Showdown':
 
899
  if site_var == 'Draftkings':
900
- dk_lineups = init_DK_lineups(slate_type_var3, slate_var3)
 
901
  elif site_var == 'Fanduel':
902
- fd_lineups = init_FD_lineups(slate_type_var3, slate_var3)
903
- with optimals_macro_col:
904
- lineup_num_var = st.number_input("How many lineups do you want to display?", min_value=1, max_value=1000, value=150, step=1, key='lineup_num_var_input')
905
- player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1_radio')
906
- if player_var1 == 'Specific Players':
907
- player_var2 = st.multiselect('Which players do you want?', options = raw_baselines['Player'].unique(), key='player_var2_multiselect')
908
- elif player_var1 == 'Full Slate':
909
- player_var2 = raw_baselines.Player.values.tolist()
910
- with optimals_salary_col:
911
- if site_var == 'Draftkings':
912
- salary_min_var = st.number_input("Minimum salary used", min_value = 0, max_value = 50000, value = 49000, step = 100, key = 'salary_min_var_dk')
913
- salary_max_var = st.number_input("Maximum salary used", min_value = 0, max_value = 50000, value = 50000, step = 100, key = 'salary_max_var_dk')
914
- elif site_var == 'Fanduel':
915
- salary_min_var = st.number_input("Minimum salary used", min_value = 0, max_value = 60000, value = 59000, step = 100, key = 'salary_min_var_fd')
916
- salary_max_var = st.number_input("Maximum salary used", min_value = 0, max_value = 60000, value = 60000, step = 100, key = 'salary_max_var_fd')
917
- with optimals_stacks_col:
918
  if site_var == 'Draftkings':
919
- min_stacks_var = st.number_input("Minimum stacks used", min_value = 0, max_value = 5, value = 1, step = 1, key = 'min_stacks_var_dk')
920
- max_stacks_var = st.number_input("Maximum stacks used", min_value = 0, max_value = 5, value = 5, step = 1, key = 'max_stacks_var_dk')
 
 
 
 
 
 
 
 
921
  elif site_var == 'Fanduel':
922
- min_stacks_var = st.number_input("Minimum stacks used", min_value = 0, max_value = 4, value = 1, step = 1, key = 'min_stacks_var_fd')
923
- max_stacks_var = st.number_input("Maximum stacks used", min_value = 0, max_value = 4, value = 4, step = 1, key = 'max_stacks_var_fd')
924
-
925
-
926
- if site_var == 'Draftkings':
927
- raw_baselines = dk_roo_raw
928
- if slate_type_var3 == 'Regular':
929
- ROO_slice = raw_baselines
930
- player_salaries = dict(zip(ROO_slice['Player'], ROO_slice['Salary']))
931
- column_names = dk_columns
932
- elif slate_type_var3 == 'Showdown':
933
- player_salaries = dict(zip(raw_baselines['Player'], raw_baselines['Salary']))
934
- column_names = dk_sd_columns
935
-
936
-
937
- elif site_var == 'Fanduel':
938
- raw_baselines = fd_roo_raw
939
- if slate_type_var3 == 'Regular':
940
- ROO_slice = raw_baselines
941
- player_salaries = dict(zip(ROO_slice['Player'], ROO_slice['Salary']))
942
- column_names = fd_columns
943
- elif slate_type_var3 == 'Showdown':
944
- player_salaries = dict(zip(raw_baselines['Player'], raw_baselines['Salary']))
945
- column_names = fd_sd_columns
946
-
947
- reg_dl_col, filtered_dl_col, blank_dl_col = st.columns([2, 2, 6])
948
- with reg_dl_col:
949
- if st.button("Prepare full data export", key='data_export_button'):
950
- name_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
951
- data_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
952
- if site_var == 'Draftkings':
953
- if slate_type_var3 == 'Regular':
954
- map_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
955
- for col_idx in map_columns:
956
- data_export[col_idx] = data_export[col_idx].map(dk_id_map)
957
- elif slate_type_var3 == 'Showdown':
958
- map_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']
959
- for col_idx in map_columns:
960
- data_export[col_idx] = data_export[col_idx].map(dk_sd_id_map)
961
- elif site_var == 'Fanduel':
962
- if slate_type_var3 == 'Regular':
963
- map_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
964
- for col_idx in map_columns:
965
- data_export[col_idx] = data_export[col_idx].map(fd_id_map)
966
- elif slate_type_var3 == 'Showdown':
967
- map_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']
968
- for col_idx in map_columns:
969
- data_export[col_idx] = data_export[col_idx].map(fd_sd_id_map)
970
- reg_opt_col, pm_opt_col = st.columns(2)
971
- with reg_opt_col:
972
- st.download_button(
973
- label="Export optimals set (IDs)",
974
- data=convert_df(data_export),
975
- file_name='NFL_optimals_export.csv',
976
- mime='text/csv',
977
- key='export_optimals_ids_button'
978
- )
979
- st.download_button(
980
- label="Export optimals set (Names)",
981
- data=convert_df(name_export),
982
- file_name='NFL_optimals_export.csv',
983
- mime='text/csv',
984
- key='export_optimals_names_button'
985
- )
986
- with pm_opt_col:
987
  if site_var == 'Draftkings':
988
  if slate_type_var3 == 'Regular':
989
- data_export = data_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
 
 
990
  elif slate_type_var3 == 'Showdown':
991
- data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
 
 
992
  elif site_var == 'Fanduel':
993
  if slate_type_var3 == 'Regular':
994
- data_export = data_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
 
 
995
  elif slate_type_var3 == 'Showdown':
996
- data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
997
- st.download_button(
998
- label="Portfolio Manager Export (IDs)",
999
- data=convert_pm_df(data_export),
1000
- file_name='NFL_optimals_export.csv',
1001
- mime='text/csv',
1002
- key='export_pm_ids_button'
1003
- )
1004
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1005
  if site_var == 'Draftkings':
1006
  if slate_type_var3 == 'Regular':
1007
- name_export = name_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1008
  elif slate_type_var3 == 'Showdown':
1009
- name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
 
 
1010
  elif site_var == 'Fanduel':
1011
  if slate_type_var3 == 'Regular':
1012
- name_export = name_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1013
  elif slate_type_var3 == 'Showdown':
1014
- name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1015
- st.download_button(
1016
- label="Portfolio Manager Export (Names)",
1017
- data=convert_pm_df(name_export),
1018
- file_name='NFL_optimals_export.csv',
1019
- mime='text/csv',
1020
- key='export_pm_names_button'
1021
- )
1022
- with filtered_dl_col:
1023
- if st.button("Prepare full data export (Filtered)", key='data_export_filtered_button'):
1024
- name_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
1025
- data_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1026
  if site_var == 'Draftkings':
1027
- if slate_type_var3 == 'Regular':
1028
- map_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
1029
- elif slate_type_var3 == 'Showdown':
1030
- map_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']
1031
- for col_idx in map_columns:
1032
- data_export[col_idx] = data_export[col_idx].map(dk_id_map)
1033
  elif site_var == 'Fanduel':
1034
- if slate_type_var3 == 'Regular':
1035
- map_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
1036
- elif slate_type_var3 == 'Showdown':
1037
- map_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']
1038
- for col_idx in map_columns:
1039
- data_export[col_idx] = data_export[col_idx].map(fd_id_map)
1040
- data_export = data_export[data_export['salary'] >= salary_min_var]
1041
- data_export = data_export[data_export['salary'] <= salary_max_var]
1042
- data_export = data_export[data_export['Team_count'] >= min_stacks_var]
1043
- data_export = data_export[data_export['Team_count'] <= max_stacks_var]
1044
-
1045
- name_export = name_export[name_export['salary'] >= salary_min_var]
1046
- name_export = name_export[name_export['salary'] <= salary_max_var]
1047
- name_export = name_export[name_export['Team_count'] >= min_stacks_var]
1048
- name_export = name_export[name_export['Team_count'] <= max_stacks_var]
1049
-
1050
- reg_opt_col, pm_opt_col = st.columns(2)
1051
- with reg_opt_col:
1052
- st.download_button(
1053
- label="Export optimals set (IDs)",
1054
- data=convert_df(data_export),
1055
- file_name='NFL_optimals_export.csv',
1056
- mime='text/csv',
1057
- key='export_filtered_optimals_ids_button'
1058
- )
1059
- st.download_button(
1060
- label="Export optimals set (Names)",
1061
- data=convert_df(name_export),
1062
- file_name='NFL_optimals_export.csv',
1063
- mime='text/csv',
1064
- key='export_filtered_optimals_names_button'
1065
- )
1066
- with pm_opt_col:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1067
  if site_var == 'Draftkings':
1068
  if slate_type_var3 == 'Regular':
1069
- data_export = data_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1070
  elif slate_type_var3 == 'Showdown':
1071
- data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1072
  elif site_var == 'Fanduel':
1073
  if slate_type_var3 == 'Regular':
1074
- data_export = data_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1075
  elif slate_type_var3 == 'Showdown':
1076
- data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1077
  st.download_button(
1078
- label="Portfolio Manager Export (IDs)",
1079
- data=convert_pm_df(data_export),
1080
- file_name='NFL_optimals_export.csv',
1081
  mime='text/csv',
1082
- key='export_filtered_pm_ids_button'
1083
  )
1084
-
 
1085
  if site_var == 'Draftkings':
1086
  if slate_type_var3 == 'Regular':
1087
- name_export = name_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1088
  elif slate_type_var3 == 'Showdown':
1089
- name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1090
  elif site_var == 'Fanduel':
1091
  if slate_type_var3 == 'Regular':
1092
- name_export = name_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1093
  elif slate_type_var3 == 'Showdown':
1094
- name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1095
- st.download_button(
1096
- label="Portfolio Manager Export (Names)",
1097
- data=convert_pm_df(name_export),
1098
- file_name='NFL_optimals_export.csv',
1099
- mime='text/csv',
1100
- key='export_filtered_pm_names_button'
1101
- )
1102
-
1103
- if site_var == 'Draftkings':
1104
- if 'working_seed' in st.session_state:
1105
- st.session_state.working_seed = st.session_state.working_seed
1106
- if player_var1 == 'Specific Players':
1107
- st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]
1108
- elif player_var1 == 'Full Slate':
1109
- st.session_state.working_seed = dk_lineups.copy()
1110
- st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
1111
- elif 'working_seed' not in st.session_state:
1112
- st.session_state.working_seed = dk_lineups.copy()
1113
- st.session_state.working_seed = st.session_state.working_seed
1114
- if player_var1 == 'Specific Players':
1115
- st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]
1116
- elif player_var1 == 'Full Slate':
1117
- st.session_state.working_seed = dk_lineups.copy()
1118
- st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
1119
-
1120
- elif site_var == 'Fanduel':
1121
- if 'working_seed' in st.session_state:
1122
- st.session_state.working_seed = st.session_state.working_seed
1123
- if player_var1 == 'Specific Players':
1124
- st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]
1125
- elif player_var1 == 'Full Slate':
1126
- st.session_state.working_seed = fd_lineups.copy()
1127
- st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
1128
- elif 'working_seed' not in st.session_state:
1129
- st.session_state.working_seed = fd_lineups.copy()
1130
- st.session_state.working_seed = st.session_state.working_seed
1131
- if player_var1 == 'Specific Players':
1132
- st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]
1133
- elif player_var1 == 'Full Slate':
1134
- st.session_state.working_seed = fd_lineups.copy()
1135
- st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
1136
- st.session_state.data_export_display = st.session_state.data_export_display[st.session_state.data_export_display['salary'] >= salary_min_var]
1137
- st.session_state.data_export_display = st.session_state.data_export_display[st.session_state.data_export_display['salary'] <= salary_max_var]
1138
- st.session_state.data_export_display = st.session_state.data_export_display[st.session_state.data_export_display['Team_count'] >= min_stacks_var]
1139
- st.session_state.data_export_display = st.session_state.data_export_display[st.session_state.data_export_display['Team_count'] <= max_stacks_var]
1140
- export_file = st.session_state.data_export_display.copy()
1141
- name_export = st.session_state.data_export_display.copy()
1142
- if site_var == 'Draftkings':
1143
- if slate_type_var3 == 'Regular':
1144
- map_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
1145
- elif slate_type_var3 == 'Showdown':
1146
- map_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']
1147
- for col_idx in map_columns:
1148
- export_file[col_idx] = export_file[col_idx].map(dk_id_map)
1149
- elif site_var == 'Fanduel':
1150
- if slate_type_var3 == 'Regular':
1151
- map_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
1152
- elif slate_type_var3 == 'Showdown':
1153
- map_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']
1154
- for col_idx in map_columns:
1155
- export_file[col_idx] = export_file[col_idx].map(fd_id_map)
1156
-
1157
- with st.container():
1158
- if st.button("Reset Optimals", key='reset_optimals_button'):
1159
- for key in st.session_state.keys():
1160
- del st.session_state[key]
1161
- if site_var == 'Draftkings':
1162
- st.session_state.working_seed = dk_lineups.copy()
1163
- elif site_var == 'Fanduel':
1164
- st.session_state.working_seed = fd_lineups.copy()
1165
- if 'data_export_display' in st.session_state:
1166
- st.dataframe(st.session_state.data_export_display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), height=500, use_container_width = True, key='optimals_dataframe')
1167
- st.download_button(
1168
- label="Export display optimals (IDs)",
1169
- data=convert_df(export_file),
1170
- file_name='NFL_display_optimals.csv',
1171
- mime='text/csv',
1172
- key='export_display_optimals_ids_button'
1173
- )
1174
- st.download_button(
1175
- label="Export display optimals (Names)",
1176
- data=convert_df(name_export),
1177
- file_name='NFL_display_optimals.csv',
1178
- mime='text/csv',
1179
- key='export_display_optimals_names_button'
1180
- )
1181
-
1182
- with st.container():
1183
- if slate_type_var3 == 'Regular':
1184
- if 'working_seed' in st.session_state:
1185
- # Create a new dataframe with summary statistics
1186
- if site_var == 'Draftkings':
1187
- summary_df = pd.DataFrame({
1188
- 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
1189
- 'Salary': [
1190
- np.min(st.session_state.working_seed[:,9]),
1191
- np.mean(st.session_state.working_seed[:,9]),
1192
- np.max(st.session_state.working_seed[:,9]),
1193
- np.std(st.session_state.working_seed[:,9])
1194
- ],
1195
- 'Proj': [
1196
- np.min(st.session_state.working_seed[:,10]),
1197
- np.mean(st.session_state.working_seed[:,10]),
1198
- np.max(st.session_state.working_seed[:,10]),
1199
- np.std(st.session_state.working_seed[:,10])
1200
- ],
1201
- 'Own': [
1202
- np.min(st.session_state.working_seed[:,15]),
1203
- np.mean(st.session_state.working_seed[:,15]),
1204
- np.max(st.session_state.working_seed[:,15]),
1205
- np.std(st.session_state.working_seed[:,15])
1206
- ]
1207
- })
1208
- elif site_var == 'Fanduel':
1209
- summary_df = pd.DataFrame({
1210
- 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
1211
- 'Salary': [
1212
- np.min(st.session_state.working_seed[:,9]),
1213
- np.mean(st.session_state.working_seed[:,9]),
1214
- np.max(st.session_state.working_seed[:,9]),
1215
- np.std(st.session_state.working_seed[:,9])
1216
- ],
1217
- 'Proj': [
1218
- np.min(st.session_state.working_seed[:,10]),
1219
- np.mean(st.session_state.working_seed[:,10]),
1220
- np.max(st.session_state.working_seed[:,10]),
1221
- np.std(st.session_state.working_seed[:,10])
1222
- ],
1223
- 'Own': [
1224
- np.min(st.session_state.working_seed[:,15]),
1225
- np.mean(st.session_state.working_seed[:,15]),
1226
- np.max(st.session_state.working_seed[:,15]),
1227
- np.std(st.session_state.working_seed[:,15])
1228
- ]
1229
- })
1230
- elif slate_type_var3 == 'Showdown':
1231
- if 'working_seed' in st.session_state:
1232
- # Create a new dataframe with summary statistics
1233
- if site_var == 'Draftkings':
1234
- summary_df = pd.DataFrame({
1235
- 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
1236
- 'Salary': [
1237
- np.min(st.session_state.working_seed[:,6]),
1238
- np.mean(st.session_state.working_seed[:,6]),
1239
- np.max(st.session_state.working_seed[:,6]),
1240
- np.std(st.session_state.working_seed[:,6])
1241
- ],
1242
- 'Proj': [
1243
- np.min(st.session_state.working_seed[:,7]),
1244
- np.mean(st.session_state.working_seed[:,7]),
1245
- np.max(st.session_state.working_seed[:,7]),
1246
- np.std(st.session_state.working_seed[:,7])
1247
- ],
1248
- 'Own': [
1249
- np.min(st.session_state.working_seed[:,12]),
1250
- np.mean(st.session_state.working_seed[:,12]),
1251
- np.max(st.session_state.working_seed[:,12]),
1252
- np.std(st.session_state.working_seed[:,12])
1253
- ]
1254
- })
1255
- elif site_var == 'Fanduel':
1256
  summary_df = pd.DataFrame({
1257
- 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
1258
- 'Salary': [
1259
- np.min(st.session_state.working_seed[:,6]),
1260
- np.mean(st.session_state.working_seed[:,6]),
1261
- np.max(st.session_state.working_seed[:,6]),
1262
- np.std(st.session_state.working_seed[:,6])
1263
- ],
1264
- 'Proj': [
1265
- np.min(st.session_state.working_seed[:,7]),
1266
- np.mean(st.session_state.working_seed[:,7]),
1267
- np.max(st.session_state.working_seed[:,7]),
1268
- np.std(st.session_state.working_seed[:,7])
1269
- ],
1270
- 'Own': [
1271
- np.min(st.session_state.working_seed[:,12]),
1272
- np.mean(st.session_state.working_seed[:,12]),
1273
- np.max(st.session_state.working_seed[:,12]),
1274
- np.std(st.session_state.working_seed[:,12])
1275
- ]
1276
  })
1277
-
1278
- # Set the index of the summary dataframe as the "Metric" column
1279
- summary_df = summary_df.set_index('Metric')
1280
-
1281
- # Display the summary dataframe
1282
- st.subheader("Optimal Statistics")
1283
- st.dataframe(summary_df.style.format({
1284
- 'Salary': '{:.2f}',
1285
- 'Proj': '{:.2f}',
1286
- 'Own': '{:.2f}'
1287
- }).background_gradient(cmap='RdYlGn', axis=0, subset=['Salary', 'Proj', 'Own']), use_container_width=True, key='optimal_stats_dataframe')
1288
-
1289
- with st.container():
1290
- display_freq_tab, seed_frame_freq_tab = st.tabs(["Display Frequency", "Seed Frame Frequency"])
1291
- with display_freq_tab:
1292
- if 'data_export_display' in st.session_state:
1293
- if site_var == 'Draftkings':
1294
- if slate_type_var3 == 'Regular':
1295
- player_columns = st.session_state.data_export_display.iloc[:, :9]
1296
- elif slate_type_var3 == 'Showdown':
1297
- player_columns = st.session_state.data_export_display.iloc[:, :6]
1298
- elif site_var == 'Fanduel':
1299
- if slate_type_var3 == 'Regular':
1300
- player_columns = st.session_state.data_export_display.iloc[:, :9]
1301
- elif slate_type_var3 == 'Showdown':
1302
- player_columns = st.session_state.data_export_display.iloc[:, :6]
1303
-
1304
- # Flatten the DataFrame and count unique values
1305
- value_counts = player_columns.values.flatten().tolist()
1306
- value_counts = pd.Series(value_counts).value_counts()
1307
-
1308
- percentages = (value_counts / lineup_num_var * 100).round(2)
1309
-
1310
- # Create a DataFrame with the results
1311
- summary_df = pd.DataFrame({
1312
- 'Player': value_counts.index,
1313
- 'Frequency': value_counts.values,
1314
- 'Percentage': percentages.values
1315
- })
1316
-
1317
- # Sort by frequency in descending order
1318
- summary_df['Salary'] = summary_df['Player'].map(player_salaries)
1319
- summary_df = summary_df[['Player', 'Salary', 'Frequency', 'Percentage']]
1320
- summary_df = summary_df.sort_values('Frequency', ascending=False)
1321
- summary_df = summary_df.set_index('Player')
1322
-
1323
- # Display the table
1324
- st.write("Player Frequency Table:")
1325
- st.dataframe(summary_df.style.format({'Percentage': '{:.2f}%'}), height=500, use_container_width=True, key='player_frequency_dataframe')
1326
-
1327
- st.download_button(
1328
- label="Export player frequency",
1329
- data=convert_df_to_csv(summary_df),
1330
- file_name='NFL_player_frequency.csv',
1331
- mime='text/csv',
1332
- key='export_player_frequency_button'
1333
- )
1334
- with seed_frame_freq_tab:
1335
- if 'working_seed' in st.session_state:
1336
- if site_var == 'Draftkings':
1337
- if slate_type_var3 == 'Regular':
1338
- player_columns = st.session_state.working_seed[:, :9]
1339
- elif slate_type_var3 == 'Showdown':
1340
- player_columns = st.session_state.working_seed[:, :6]
1341
- elif site_var == 'Fanduel':
1342
- if slate_type_var3 == 'Regular':
1343
- player_columns = st.session_state.working_seed[:, :9]
1344
- elif slate_type_var3 == 'Showdown':
1345
- player_columns = st.session_state.working_seed[:, :6]
1346
-
1347
- # Flatten the DataFrame and count unique values
1348
- value_counts = player_columns.flatten().tolist()
1349
- value_counts = pd.Series(value_counts).value_counts()
1350
-
1351
- percentages = (value_counts / len(st.session_state.working_seed) * 100).round(2)
1352
- # Create a DataFrame with the results
1353
- summary_df = pd.DataFrame({
1354
- 'Player': value_counts.index,
1355
- 'Frequency': value_counts.values,
1356
- 'Percentage': percentages.values
1357
- })
1358
-
1359
- # Sort by frequency in descending order
1360
- summary_df['Salary'] = summary_df['Player'].map(player_salaries)
1361
- summary_df = summary_df[['Player', 'Salary', 'Frequency', 'Percentage']]
1362
- summary_df = summary_df.sort_values('Frequency', ascending=False)
1363
- summary_df = summary_df.set_index('Player')
1364
 
1365
- # Display the table
1366
- st.write("Seed Frame Frequency Table:")
1367
- st.dataframe(summary_df.style.format({'Percentage': '{:.2f}%'}), height=500, use_container_width=True, key='seed_frame_frequency_dataframe')
1368
-
1369
- st.download_button(
1370
- label="Export seed frame frequency",
1371
- data=convert_df_to_csv(summary_df),
1372
- file_name='NFL_seed_frame_frequency.csv',
1373
- mime='text/csv',
1374
- key='export_seed_frame_frequency_button'
1375
- )
 
773
 
774
  with stacks_tab:
775
  st.session_state['current_tab'] = 'Stacks ROO'
776
+ if st.session_state['current_tab'] == 'Stacks ROO':
777
+ with st.expander("Info and Filters"):
778
+ st.info(t_stamp)
779
+ with st.container():
780
+ slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'Late Slate', 'Thurs-Mon Slate'), key='slate_var1_radio')
781
+ split_var1 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var1_radio')
782
+ if site_var == 'Draftkings':
783
+ raw_baselines = dk_stacks_raw[dk_stacks_raw['slate'] == str(slate_var1)]
784
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'overall']
785
+ raw_baselines = raw_baselines.iloc[:,:-2]
786
+ elif site_var == 'Fanduel':
787
+ raw_baselines = fd_stacks_raw[fd_stacks_raw['slate'] == str(slate_var1)]
788
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'overall']
789
+ raw_baselines = raw_baselines.iloc[:,:-2]
790
+ if split_var1 == 'Specific Games':
791
+ team_var1 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var1_multiselect')
792
+ elif split_var1 == 'Full Slate Run':
793
+ team_var1 = raw_baselines.Team.values.tolist()
794
+
795
+ final_stacks = raw_baselines[raw_baselines['Team'].isin(team_var1)]
796
+ if view_var == 'Simple':
797
+ final_stacks = final_stacks[['Team', 'QB', 'WR1_TE', 'WR2_TE', 'Salary', 'Median', '60+%', '4x%']]
798
+ elif view_var == 'Advanced':
799
+ final_stacks = final_stacks[['Team', 'QB', 'WR1_TE', 'WR2_TE', 'Total', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish',
800
+ 'Top_10_finish', '60+%', '2x%', '3x%', '4x%', 'Own', 'LevX']]
801
  with st.container():
802
+ st.dataframe(final_stacks.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), height=750, use_container_width = True, key='stacks_dataframe')
803
+ st.download_button(
804
+ label="Export Tables",
805
+ data=convert_df_to_csv(final_stacks),
806
+ file_name='NFL_stacks_export.csv',
807
+ mime='text/csv',
808
+ key='stacks_export_button'
809
+ )
810
+
811
+ with player_tab:
812
+ st.session_state['current_tab'] = 'Player ROO'
813
+ if st.session_state['current_tab'] == 'Player ROO':
814
+ with st.expander("Info and Filters"):
815
+ st.info(t_stamp)
816
+ slate_var2 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'Late Slate', 'Thurs-Mon Slate'), key='slate_var2_radio')
817
  if site_var == 'Draftkings':
818
+ raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var2)]
819
+
820
  raw_baselines = raw_baselines.iloc[:,:-2]
821
  elif site_var == 'Fanduel':
822
+ raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var2)]
 
823
  raw_baselines = raw_baselines.iloc[:,:-2]
824
+ split_var2 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var2_radio')
825
+ if split_var2 == 'Specific Games':
826
+ team_var2 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var2_multiselect')
827
+ elif split_var2 == 'Full Slate Run':
828
+ team_var2 = raw_baselines.Team.values.tolist()
829
+ pos_split2 = st.selectbox('What Position table would you like to view?', options = ['Overall', 'QB', 'RB', 'WR', 'TE'], key='pos_split2_selectbox')
830
+ pos_combos2 = st.multiselect('If Overall, specific positions?', options = ['QB', 'RB', 'WR', 'TE', 'DST'], default = ['QB', 'RB', 'WR', 'TE', 'DST'], key='pos_combos2_multiselect')
831
+ sal_var2 = st.slider("Is there a certain price range you want to view?", 2000, 15000, (2000, 15000), key='sal_var2_slider')
832
+
833
+ if pos_split2 == 'Overall':
834
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'overall']
835
+ elif pos_split2 == 'QB':
836
+ if site_var == 'Draftkings':
837
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_qbs']
838
+ elif site_var == 'Fanduel':
839
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_qbs']
840
+ elif pos_split2 == 'RB':
841
+ if site_var == 'Draftkings':
842
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_rbs']
843
+ elif site_var == 'Fanduel':
844
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_rbs']
845
+ elif pos_split2 == 'WR':
846
+ if site_var == 'Draftkings':
847
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_wrs']
848
+ elif site_var == 'Fanduel':
849
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_wrs']
850
+ elif pos_split2 == 'TE':
851
+ if site_var == 'Draftkings':
852
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_tes']
853
+ elif site_var == 'Fanduel':
854
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_tes']
855
+ raw_baselines = raw_baselines[raw_baselines['Position'].str.contains('|'.join(pos_combos2))]
856
+ final_Proj = raw_baselines[raw_baselines['Team'].isin(team_var2)]
857
+ final_Proj = final_Proj[final_Proj['Salary'] >= sal_var2[0]]
858
+ final_Proj = final_Proj[final_Proj['Salary'] <= sal_var2[1]]
859
+
860
+ if view_var == 'Simple':
861
+ final_Proj = final_Proj[['Player', 'Position', 'Team', 'Salary', 'Median', 'Top_5_finish', '4x%']]
862
+ disp_proj = final_Proj.set_index('Player')
863
+ elif view_var == 'Advanced':
864
+ final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX']]
865
+ disp_proj = final_Proj.set_index('Player')
866
+ with st.container():
867
+ st.dataframe(disp_proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), height=750, use_container_width = True, key='player_dataframe')
868
+ st.download_button(
869
  label="Export Tables",
870
+ data=convert_df_to_csv(final_Proj),
871
+ file_name='NFL_ROO_export.csv',
872
  mime='text/csv',
873
+ key='player_export_button'
874
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
875
 
876
  with optimals_tab:
877
  st.session_state['current_tab'] = 'Optimals'
878
+ if st.session_state['current_tab'] == 'Optimals':
879
+ st.header("Optimals")
880
+ with st.expander("Info and Filters"):
881
+ st.info("These filters will display various optimals in the table below to pick from. If you want to export the entire set of 10,000 optimals, hit the 'Prepare full data export' button. If you would like to apply the filters here to the 10,000 optimals before you export, use the 'Prepare full data export (Filter)' button.")
882
+ optimals_site_col, optimals_macro_col, optimals_salary_col, optimals_stacks_col = st.columns(4)
883
+ with optimals_site_col:
884
+ slate_type_var3 = st.radio("Which slate type are you loading?", ('Regular', 'Showdown'), key='slate_type_var3_radio')
885
+ if slate_type_var3 == 'Regular':
886
+ if site_var == 'Draftkings':
887
+ raw_baselines = dk_roo_raw
888
+ elif site_var == 'Fanduel':
889
+ raw_baselines = fd_roo_raw
890
+ elif slate_type_var3 == 'Showdown':
891
+ if site_var == 'Draftkings':
892
+ raw_baselines = dk_sd_roo_raw
893
+ elif site_var == 'Fanduel':
894
+ raw_baselines = fd_sd_roo_raw
895
+ slate_var3 = st.radio("Which slate data are you loading?", ('Main', 'Secondary', 'Auxiliary'), key='slate_var3_radio')
896
+ if slate_type_var3 == 'Regular':
897
+ if site_var == 'Draftkings':
898
+ dk_lineups = init_DK_lineups(slate_type_var3, slate_var3)
899
+ elif site_var == 'Fanduel':
900
+ fd_lineups = init_FD_lineups(slate_type_var3, slate_var3)
901
+ elif slate_type_var3 == 'Showdown':
902
+ if site_var == 'Draftkings':
903
+ dk_lineups = init_DK_lineups(slate_type_var3, slate_var3)
904
+ elif site_var == 'Fanduel':
905
+ fd_lineups = init_FD_lineups(slate_type_var3, slate_var3)
906
+ with optimals_macro_col:
907
+ lineup_num_var = st.number_input("How many lineups do you want to display?", min_value=1, max_value=1000, value=150, step=1, key='lineup_num_var_input')
908
+ player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1_radio')
909
+ if player_var1 == 'Specific Players':
910
+ player_var2 = st.multiselect('Which players do you want?', options = raw_baselines['Player'].unique(), key='player_var2_multiselect')
911
+ elif player_var1 == 'Full Slate':
912
+ player_var2 = raw_baselines.Player.values.tolist()
913
+ with optimals_salary_col:
914
  if site_var == 'Draftkings':
915
+ salary_min_var = st.number_input("Minimum salary used", min_value = 0, max_value = 50000, value = 49000, step = 100, key = 'salary_min_var_dk')
916
+ salary_max_var = st.number_input("Maximum salary used", min_value = 0, max_value = 50000, value = 50000, step = 100, key = 'salary_max_var_dk')
917
  elif site_var == 'Fanduel':
918
+ salary_min_var = st.number_input("Minimum salary used", min_value = 0, max_value = 60000, value = 59000, step = 100, key = 'salary_min_var_fd')
919
+ salary_max_var = st.number_input("Maximum salary used", min_value = 0, max_value = 60000, value = 60000, step = 100, key = 'salary_max_var_fd')
920
+ with optimals_stacks_col:
921
  if site_var == 'Draftkings':
922
+ min_stacks_var = st.number_input("Minimum stacks used", min_value = 0, max_value = 5, value = 1, step = 1, key = 'min_stacks_var_dk')
923
+ max_stacks_var = st.number_input("Maximum stacks used", min_value = 0, max_value = 5, value = 5, step = 1, key = 'max_stacks_var_dk')
924
  elif site_var == 'Fanduel':
925
+ min_stacks_var = st.number_input("Minimum stacks used", min_value = 0, max_value = 4, value = 1, step = 1, key = 'min_stacks_var_fd')
926
+ max_stacks_var = st.number_input("Maximum stacks used", min_value = 0, max_value = 4, value = 4, step = 1, key = 'max_stacks_var_fd')
927
+
928
+
 
 
 
 
 
 
 
 
 
 
 
 
929
  if site_var == 'Draftkings':
930
+ raw_baselines = dk_roo_raw
931
+ if slate_type_var3 == 'Regular':
932
+ ROO_slice = raw_baselines
933
+ player_salaries = dict(zip(ROO_slice['Player'], ROO_slice['Salary']))
934
+ column_names = dk_columns
935
+ elif slate_type_var3 == 'Showdown':
936
+ player_salaries = dict(zip(raw_baselines['Player'], raw_baselines['Salary']))
937
+ column_names = dk_sd_columns
938
+
939
+
940
  elif site_var == 'Fanduel':
941
+ raw_baselines = fd_roo_raw
942
+ if slate_type_var3 == 'Regular':
943
+ ROO_slice = raw_baselines
944
+ player_salaries = dict(zip(ROO_slice['Player'], ROO_slice['Salary']))
945
+ column_names = fd_columns
946
+ elif slate_type_var3 == 'Showdown':
947
+ player_salaries = dict(zip(raw_baselines['Player'], raw_baselines['Salary']))
948
+ column_names = fd_sd_columns
949
+
950
+ reg_dl_col, filtered_dl_col, blank_dl_col = st.columns([2, 2, 6])
951
+ with reg_dl_col:
952
+ if st.button("Prepare full data export", key='data_export_button'):
953
+ name_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
954
+ data_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
955
  if site_var == 'Draftkings':
956
  if slate_type_var3 == 'Regular':
957
+ map_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
958
+ for col_idx in map_columns:
959
+ data_export[col_idx] = data_export[col_idx].map(dk_id_map)
960
  elif slate_type_var3 == 'Showdown':
961
+ map_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']
962
+ for col_idx in map_columns:
963
+ data_export[col_idx] = data_export[col_idx].map(dk_sd_id_map)
964
  elif site_var == 'Fanduel':
965
  if slate_type_var3 == 'Regular':
966
+ map_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
967
+ for col_idx in map_columns:
968
+ data_export[col_idx] = data_export[col_idx].map(fd_id_map)
969
  elif slate_type_var3 == 'Showdown':
970
+ map_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']
971
+ for col_idx in map_columns:
972
+ data_export[col_idx] = data_export[col_idx].map(fd_sd_id_map)
973
+ reg_opt_col, pm_opt_col = st.columns(2)
974
+ with reg_opt_col:
975
+ st.download_button(
976
+ label="Export optimals set (IDs)",
977
+ data=convert_df(data_export),
978
+ file_name='NFL_optimals_export.csv',
979
+ mime='text/csv',
980
+ key='export_optimals_ids_button'
981
+ )
982
+ st.download_button(
983
+ label="Export optimals set (Names)",
984
+ data=convert_df(name_export),
985
+ file_name='NFL_optimals_export.csv',
986
+ mime='text/csv',
987
+ key='export_optimals_names_button'
988
+ )
989
+ with pm_opt_col:
990
+ if site_var == 'Draftkings':
991
+ if slate_type_var3 == 'Regular':
992
+ data_export = data_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
993
+ elif slate_type_var3 == 'Showdown':
994
+ data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
995
+ elif site_var == 'Fanduel':
996
+ if slate_type_var3 == 'Regular':
997
+ data_export = data_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
998
+ elif slate_type_var3 == 'Showdown':
999
+ data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1000
+ st.download_button(
1001
+ label="Portfolio Manager Export (IDs)",
1002
+ data=convert_pm_df(data_export),
1003
+ file_name='NFL_optimals_export.csv',
1004
+ mime='text/csv',
1005
+ key='export_pm_ids_button'
1006
+ )
1007
+
1008
+ if site_var == 'Draftkings':
1009
+ if slate_type_var3 == 'Regular':
1010
+ name_export = name_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1011
+ elif slate_type_var3 == 'Showdown':
1012
+ name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1013
+ elif site_var == 'Fanduel':
1014
+ if slate_type_var3 == 'Regular':
1015
+ name_export = name_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1016
+ elif slate_type_var3 == 'Showdown':
1017
+ name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1018
+ st.download_button(
1019
+ label="Portfolio Manager Export (Names)",
1020
+ data=convert_pm_df(name_export),
1021
+ file_name='NFL_optimals_export.csv',
1022
+ mime='text/csv',
1023
+ key='export_pm_names_button'
1024
+ )
1025
+ with filtered_dl_col:
1026
+ if st.button("Prepare full data export (Filtered)", key='data_export_filtered_button'):
1027
+ name_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
1028
+ data_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
1029
  if site_var == 'Draftkings':
1030
  if slate_type_var3 == 'Regular':
1031
+ map_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
1032
  elif slate_type_var3 == 'Showdown':
1033
+ map_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']
1034
+ for col_idx in map_columns:
1035
+ data_export[col_idx] = data_export[col_idx].map(dk_id_map)
1036
  elif site_var == 'Fanduel':
1037
  if slate_type_var3 == 'Regular':
1038
+ map_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
1039
  elif slate_type_var3 == 'Showdown':
1040
+ map_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']
1041
+ for col_idx in map_columns:
1042
+ data_export[col_idx] = data_export[col_idx].map(fd_id_map)
1043
+ data_export = data_export[data_export['salary'] >= salary_min_var]
1044
+ data_export = data_export[data_export['salary'] <= salary_max_var]
1045
+ data_export = data_export[data_export['Team_count'] >= min_stacks_var]
1046
+ data_export = data_export[data_export['Team_count'] <= max_stacks_var]
1047
+
1048
+ name_export = name_export[name_export['salary'] >= salary_min_var]
1049
+ name_export = name_export[name_export['salary'] <= salary_max_var]
1050
+ name_export = name_export[name_export['Team_count'] >= min_stacks_var]
1051
+ name_export = name_export[name_export['Team_count'] <= max_stacks_var]
1052
+
1053
+ reg_opt_col, pm_opt_col = st.columns(2)
1054
+ with reg_opt_col:
1055
+ st.download_button(
1056
+ label="Export optimals set (IDs)",
1057
+ data=convert_df(data_export),
1058
+ file_name='NFL_optimals_export.csv',
1059
+ mime='text/csv',
1060
+ key='export_filtered_optimals_ids_button'
1061
+ )
1062
+ st.download_button(
1063
+ label="Export optimals set (Names)",
1064
+ data=convert_df(name_export),
1065
+ file_name='NFL_optimals_export.csv',
1066
+ mime='text/csv',
1067
+ key='export_filtered_optimals_names_button'
1068
+ )
1069
+ with pm_opt_col:
1070
+ if site_var == 'Draftkings':
1071
+ if slate_type_var3 == 'Regular':
1072
+ data_export = data_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1073
+ elif slate_type_var3 == 'Showdown':
1074
+ data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1075
+ elif site_var == 'Fanduel':
1076
+ if slate_type_var3 == 'Regular':
1077
+ data_export = data_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1078
+ elif slate_type_var3 == 'Showdown':
1079
+ data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1080
+ st.download_button(
1081
+ label="Portfolio Manager Export (IDs)",
1082
+ data=convert_pm_df(data_export),
1083
+ file_name='NFL_optimals_export.csv',
1084
+ mime='text/csv',
1085
+ key='export_filtered_pm_ids_button'
1086
+ )
1087
+
1088
+ if site_var == 'Draftkings':
1089
+ if slate_type_var3 == 'Regular':
1090
+ name_export = name_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1091
+ elif slate_type_var3 == 'Showdown':
1092
+ name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1093
+ elif site_var == 'Fanduel':
1094
+ if slate_type_var3 == 'Regular':
1095
+ name_export = name_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1096
+ elif slate_type_var3 == 'Showdown':
1097
+ name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1098
+ st.download_button(
1099
+ label="Portfolio Manager Export (Names)",
1100
+ data=convert_pm_df(name_export),
1101
+ file_name='NFL_optimals_export.csv',
1102
+ mime='text/csv',
1103
+ key='export_filtered_pm_names_button'
1104
+ )
1105
+
1106
+ if site_var == 'Draftkings':
1107
+ if 'working_seed' in st.session_state:
1108
+ st.session_state.working_seed = st.session_state.working_seed
1109
+ if player_var1 == 'Specific Players':
1110
+ st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]
1111
+ elif player_var1 == 'Full Slate':
1112
+ st.session_state.working_seed = dk_lineups.copy()
1113
+ st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
1114
+ elif 'working_seed' not in st.session_state:
1115
+ st.session_state.working_seed = dk_lineups.copy()
1116
+ st.session_state.working_seed = st.session_state.working_seed
1117
+ if player_var1 == 'Specific Players':
1118
+ st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]
1119
+ elif player_var1 == 'Full Slate':
1120
+ st.session_state.working_seed = dk_lineups.copy()
1121
+ st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
1122
+
1123
+ elif site_var == 'Fanduel':
1124
+ if 'working_seed' in st.session_state:
1125
+ st.session_state.working_seed = st.session_state.working_seed
1126
+ if player_var1 == 'Specific Players':
1127
+ st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]
1128
+ elif player_var1 == 'Full Slate':
1129
+ st.session_state.working_seed = fd_lineups.copy()
1130
+ st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
1131
+ elif 'working_seed' not in st.session_state:
1132
+ st.session_state.working_seed = fd_lineups.copy()
1133
+ st.session_state.working_seed = st.session_state.working_seed
1134
+ if player_var1 == 'Specific Players':
1135
+ st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]
1136
+ elif player_var1 == 'Full Slate':
1137
+ st.session_state.working_seed = fd_lineups.copy()
1138
+ st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
1139
+ st.session_state.data_export_display = st.session_state.data_export_display[st.session_state.data_export_display['salary'] >= salary_min_var]
1140
+ st.session_state.data_export_display = st.session_state.data_export_display[st.session_state.data_export_display['salary'] <= salary_max_var]
1141
+ st.session_state.data_export_display = st.session_state.data_export_display[st.session_state.data_export_display['Team_count'] >= min_stacks_var]
1142
+ st.session_state.data_export_display = st.session_state.data_export_display[st.session_state.data_export_display['Team_count'] <= max_stacks_var]
1143
+ export_file = st.session_state.data_export_display.copy()
1144
+ name_export = st.session_state.data_export_display.copy()
1145
+ if site_var == 'Draftkings':
1146
+ if slate_type_var3 == 'Regular':
1147
+ map_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
1148
+ elif slate_type_var3 == 'Showdown':
1149
+ map_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']
1150
+ for col_idx in map_columns:
1151
+ export_file[col_idx] = export_file[col_idx].map(dk_id_map)
1152
+ elif site_var == 'Fanduel':
1153
+ if slate_type_var3 == 'Regular':
1154
+ map_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
1155
+ elif slate_type_var3 == 'Showdown':
1156
+ map_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']
1157
+ for col_idx in map_columns:
1158
+ export_file[col_idx] = export_file[col_idx].map(fd_id_map)
1159
+
1160
+ with st.container():
1161
+ if st.button("Reset Optimals", key='reset_optimals_button'):
1162
+ for key in st.session_state.keys():
1163
+ del st.session_state[key]
1164
  if site_var == 'Draftkings':
1165
+ st.session_state.working_seed = dk_lineups.copy()
 
 
 
 
 
1166
  elif site_var == 'Fanduel':
1167
+ st.session_state.working_seed = fd_lineups.copy()
1168
+ if 'data_export_display' in st.session_state:
1169
+ st.dataframe(st.session_state.data_export_display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), height=500, use_container_width = True, key='optimals_dataframe')
1170
+ st.download_button(
1171
+ label="Export display optimals (IDs)",
1172
+ data=convert_df(export_file),
1173
+ file_name='NFL_display_optimals.csv',
1174
+ mime='text/csv',
1175
+ key='export_display_optimals_ids_button'
1176
+ )
1177
+ st.download_button(
1178
+ label="Export display optimals (Names)",
1179
+ data=convert_df(name_export),
1180
+ file_name='NFL_display_optimals.csv',
1181
+ mime='text/csv',
1182
+ key='export_display_optimals_names_button'
1183
+ )
1184
+
1185
+ with st.container():
1186
+ if slate_type_var3 == 'Regular':
1187
+ if 'working_seed' in st.session_state:
1188
+ # Create a new dataframe with summary statistics
1189
+ if site_var == 'Draftkings':
1190
+ summary_df = pd.DataFrame({
1191
+ 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
1192
+ 'Salary': [
1193
+ np.min(st.session_state.working_seed[:,9]),
1194
+ np.mean(st.session_state.working_seed[:,9]),
1195
+ np.max(st.session_state.working_seed[:,9]),
1196
+ np.std(st.session_state.working_seed[:,9])
1197
+ ],
1198
+ 'Proj': [
1199
+ np.min(st.session_state.working_seed[:,10]),
1200
+ np.mean(st.session_state.working_seed[:,10]),
1201
+ np.max(st.session_state.working_seed[:,10]),
1202
+ np.std(st.session_state.working_seed[:,10])
1203
+ ],
1204
+ 'Own': [
1205
+ np.min(st.session_state.working_seed[:,15]),
1206
+ np.mean(st.session_state.working_seed[:,15]),
1207
+ np.max(st.session_state.working_seed[:,15]),
1208
+ np.std(st.session_state.working_seed[:,15])
1209
+ ]
1210
+ })
1211
+ elif site_var == 'Fanduel':
1212
+ summary_df = pd.DataFrame({
1213
+ 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
1214
+ 'Salary': [
1215
+ np.min(st.session_state.working_seed[:,9]),
1216
+ np.mean(st.session_state.working_seed[:,9]),
1217
+ np.max(st.session_state.working_seed[:,9]),
1218
+ np.std(st.session_state.working_seed[:,9])
1219
+ ],
1220
+ 'Proj': [
1221
+ np.min(st.session_state.working_seed[:,10]),
1222
+ np.mean(st.session_state.working_seed[:,10]),
1223
+ np.max(st.session_state.working_seed[:,10]),
1224
+ np.std(st.session_state.working_seed[:,10])
1225
+ ],
1226
+ 'Own': [
1227
+ np.min(st.session_state.working_seed[:,15]),
1228
+ np.mean(st.session_state.working_seed[:,15]),
1229
+ np.max(st.session_state.working_seed[:,15]),
1230
+ np.std(st.session_state.working_seed[:,15])
1231
+ ]
1232
+ })
1233
+ elif slate_type_var3 == 'Showdown':
1234
+ if 'working_seed' in st.session_state:
1235
+ # Create a new dataframe with summary statistics
1236
+ if site_var == 'Draftkings':
1237
+ summary_df = pd.DataFrame({
1238
+ 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
1239
+ 'Salary': [
1240
+ np.min(st.session_state.working_seed[:,6]),
1241
+ np.mean(st.session_state.working_seed[:,6]),
1242
+ np.max(st.session_state.working_seed[:,6]),
1243
+ np.std(st.session_state.working_seed[:,6])
1244
+ ],
1245
+ 'Proj': [
1246
+ np.min(st.session_state.working_seed[:,7]),
1247
+ np.mean(st.session_state.working_seed[:,7]),
1248
+ np.max(st.session_state.working_seed[:,7]),
1249
+ np.std(st.session_state.working_seed[:,7])
1250
+ ],
1251
+ 'Own': [
1252
+ np.min(st.session_state.working_seed[:,12]),
1253
+ np.mean(st.session_state.working_seed[:,12]),
1254
+ np.max(st.session_state.working_seed[:,12]),
1255
+ np.std(st.session_state.working_seed[:,12])
1256
+ ]
1257
+ })
1258
+ elif site_var == 'Fanduel':
1259
+ summary_df = pd.DataFrame({
1260
+ 'Metric': ['Min', 'Average', 'Max', 'STDdev'],
1261
+ 'Salary': [
1262
+ np.min(st.session_state.working_seed[:,6]),
1263
+ np.mean(st.session_state.working_seed[:,6]),
1264
+ np.max(st.session_state.working_seed[:,6]),
1265
+ np.std(st.session_state.working_seed[:,6])
1266
+ ],
1267
+ 'Proj': [
1268
+ np.min(st.session_state.working_seed[:,7]),
1269
+ np.mean(st.session_state.working_seed[:,7]),
1270
+ np.max(st.session_state.working_seed[:,7]),
1271
+ np.std(st.session_state.working_seed[:,7])
1272
+ ],
1273
+ 'Own': [
1274
+ np.min(st.session_state.working_seed[:,12]),
1275
+ np.mean(st.session_state.working_seed[:,12]),
1276
+ np.max(st.session_state.working_seed[:,12]),
1277
+ np.std(st.session_state.working_seed[:,12])
1278
+ ]
1279
+ })
1280
+
1281
+ # Set the index of the summary dataframe as the "Metric" column
1282
+ summary_df = summary_df.set_index('Metric')
1283
+
1284
+ # Display the summary dataframe
1285
+ st.subheader("Optimal Statistics")
1286
+ st.dataframe(summary_df.style.format({
1287
+ 'Salary': '{:.2f}',
1288
+ 'Proj': '{:.2f}',
1289
+ 'Own': '{:.2f}'
1290
+ }).background_gradient(cmap='RdYlGn', axis=0, subset=['Salary', 'Proj', 'Own']), use_container_width=True, key='optimal_stats_dataframe')
1291
+
1292
+ with st.container():
1293
+ display_freq_tab, seed_frame_freq_tab = st.tabs(["Display Frequency", "Seed Frame Frequency"])
1294
+ with display_freq_tab:
1295
+ if 'data_export_display' in st.session_state:
1296
  if site_var == 'Draftkings':
1297
  if slate_type_var3 == 'Regular':
1298
+ player_columns = st.session_state.data_export_display.iloc[:, :9]
1299
  elif slate_type_var3 == 'Showdown':
1300
+ player_columns = st.session_state.data_export_display.iloc[:, :6]
1301
  elif site_var == 'Fanduel':
1302
  if slate_type_var3 == 'Regular':
1303
+ player_columns = st.session_state.data_export_display.iloc[:, :9]
1304
  elif slate_type_var3 == 'Showdown':
1305
+ player_columns = st.session_state.data_export_display.iloc[:, :6]
1306
+
1307
+ # Flatten the DataFrame and count unique values
1308
+ value_counts = player_columns.values.flatten().tolist()
1309
+ value_counts = pd.Series(value_counts).value_counts()
1310
+
1311
+ percentages = (value_counts / lineup_num_var * 100).round(2)
1312
+
1313
+ # Create a DataFrame with the results
1314
+ summary_df = pd.DataFrame({
1315
+ 'Player': value_counts.index,
1316
+ 'Frequency': value_counts.values,
1317
+ 'Percentage': percentages.values
1318
+ })
1319
+
1320
+ # Sort by frequency in descending order
1321
+ summary_df['Salary'] = summary_df['Player'].map(player_salaries)
1322
+ summary_df = summary_df[['Player', 'Salary', 'Frequency', 'Percentage']]
1323
+ summary_df = summary_df.sort_values('Frequency', ascending=False)
1324
+ summary_df = summary_df.set_index('Player')
1325
+
1326
+ # Display the table
1327
+ st.write("Player Frequency Table:")
1328
+ st.dataframe(summary_df.style.format({'Percentage': '{:.2f}%'}), height=500, use_container_width=True, key='player_frequency_dataframe')
1329
+
1330
  st.download_button(
1331
+ label="Export player frequency",
1332
+ data=convert_df_to_csv(summary_df),
1333
+ file_name='NFL_player_frequency.csv',
1334
  mime='text/csv',
1335
+ key='export_player_frequency_button'
1336
  )
1337
+ with seed_frame_freq_tab:
1338
+ if 'working_seed' in st.session_state:
1339
  if site_var == 'Draftkings':
1340
  if slate_type_var3 == 'Regular':
1341
+ player_columns = st.session_state.working_seed[:, :9]
1342
  elif slate_type_var3 == 'Showdown':
1343
+ player_columns = st.session_state.working_seed[:, :6]
1344
  elif site_var == 'Fanduel':
1345
  if slate_type_var3 == 'Regular':
1346
+ player_columns = st.session_state.working_seed[:, :9]
1347
  elif slate_type_var3 == 'Showdown':
1348
+ player_columns = st.session_state.working_seed[:, :6]
1349
+
1350
+ # Flatten the DataFrame and count unique values
1351
+ value_counts = player_columns.flatten().tolist()
1352
+ value_counts = pd.Series(value_counts).value_counts()
1353
+
1354
+ percentages = (value_counts / len(st.session_state.working_seed) * 100).round(2)
1355
+ # Create a DataFrame with the results
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1356
  summary_df = pd.DataFrame({
1357
+ 'Player': value_counts.index,
1358
+ 'Frequency': value_counts.values,
1359
+ 'Percentage': percentages.values
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1360
  })
1361
+
1362
+ # Sort by frequency in descending order
1363
+ summary_df['Salary'] = summary_df['Player'].map(player_salaries)
1364
+ summary_df = summary_df[['Player', 'Salary', 'Frequency', 'Percentage']]
1365
+ summary_df = summary_df.sort_values('Frequency', ascending=False)
1366
+ summary_df = summary_df.set_index('Player')
1367
+
1368
+ # Display the table
1369
+ st.write("Seed Frame Frequency Table:")
1370
+ st.dataframe(summary_df.style.format({'Percentage': '{:.2f}%'}), height=500, use_container_width=True, key='seed_frame_frequency_dataframe')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1371
 
1372
+ st.download_button(
1373
+ label="Export seed frame frequency",
1374
+ data=convert_df_to_csv(summary_df),
1375
+ file_name='NFL_seed_frame_frequency.csv',
1376
+ mime='text/csv',
1377
+ key='export_seed_frame_frequency_button'
1378
+ )