Spaces:
Sleeping
Sleeping
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- 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 |
-
|
| 777 |
-
st.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 778 |
with st.container():
|
| 779 |
-
|
| 780 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 781 |
if site_var == 'Draftkings':
|
| 782 |
-
raw_baselines =
|
| 783 |
-
|
| 784 |
raw_baselines = raw_baselines.iloc[:,:-2]
|
| 785 |
elif site_var == 'Fanduel':
|
| 786 |
-
raw_baselines =
|
| 787 |
-
raw_baselines = raw_baselines[raw_baselines['version'] == 'overall']
|
| 788 |
raw_baselines = raw_baselines.iloc[:,:-2]
|
| 789 |
-
|
| 790 |
-
|
| 791 |
-
|
| 792 |
-
|
| 793 |
-
|
| 794 |
-
|
| 795 |
-
|
| 796 |
-
|
| 797 |
-
|
| 798 |
-
|
| 799 |
-
|
| 800 |
-
|
| 801 |
-
|
| 802 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 803 |
label="Export Tables",
|
| 804 |
-
data=convert_df_to_csv(
|
| 805 |
-
file_name='
|
| 806 |
mime='text/csv',
|
| 807 |
-
key='
|
| 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.
|
| 877 |
-
|
| 878 |
-
st.
|
| 879 |
-
|
| 880 |
-
|
| 881 |
-
|
| 882 |
-
|
| 883 |
-
if
|
| 884 |
-
|
| 885 |
-
|
| 886 |
-
|
| 887 |
-
|
| 888 |
-
|
| 889 |
-
|
| 890 |
-
|
| 891 |
-
|
| 892 |
-
|
| 893 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 894 |
if site_var == 'Draftkings':
|
| 895 |
-
|
|
|
|
| 896 |
elif site_var == 'Fanduel':
|
| 897 |
-
|
| 898 |
-
|
|
|
|
| 899 |
if site_var == 'Draftkings':
|
| 900 |
-
|
|
|
|
| 901 |
elif site_var == 'Fanduel':
|
| 902 |
-
|
| 903 |
-
|
| 904 |
-
|
| 905 |
-
|
| 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 |
-
|
| 920 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 921 |
elif site_var == 'Fanduel':
|
| 922 |
-
|
| 923 |
-
|
| 924 |
-
|
| 925 |
-
|
| 926 |
-
|
| 927 |
-
|
| 928 |
-
|
| 929 |
-
|
| 930 |
-
|
| 931 |
-
|
| 932 |
-
|
| 933 |
-
|
| 934 |
-
|
| 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 |
-
|
|
|
|
|
|
|
| 990 |
elif slate_type_var3 == 'Showdown':
|
| 991 |
-
|
|
|
|
|
|
|
| 992 |
elif site_var == 'Fanduel':
|
| 993 |
if slate_type_var3 == 'Regular':
|
| 994 |
-
|
|
|
|
|
|
|
| 995 |
elif slate_type_var3 == 'Showdown':
|
| 996 |
-
|
| 997 |
-
|
| 998 |
-
|
| 999 |
-
|
| 1000 |
-
|
| 1001 |
-
|
| 1002 |
-
|
| 1003 |
-
|
| 1004 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1005 |
if site_var == 'Draftkings':
|
| 1006 |
if slate_type_var3 == 'Regular':
|
| 1007 |
-
|
| 1008 |
elif slate_type_var3 == 'Showdown':
|
| 1009 |
-
|
|
|
|
|
|
|
| 1010 |
elif site_var == 'Fanduel':
|
| 1011 |
if slate_type_var3 == 'Regular':
|
| 1012 |
-
|
| 1013 |
elif slate_type_var3 == 'Showdown':
|
| 1014 |
-
|
| 1015 |
-
|
| 1016 |
-
|
| 1017 |
-
|
| 1018 |
-
|
| 1019 |
-
|
| 1020 |
-
|
| 1021 |
-
|
| 1022 |
-
|
| 1023 |
-
|
| 1024 |
-
|
| 1025 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1026 |
if site_var == 'Draftkings':
|
| 1027 |
-
|
| 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 |
-
|
| 1035 |
-
|
| 1036 |
-
|
| 1037 |
-
|
| 1038 |
-
|
| 1039 |
-
|
| 1040 |
-
|
| 1041 |
-
|
| 1042 |
-
|
| 1043 |
-
|
| 1044 |
-
|
| 1045 |
-
|
| 1046 |
-
|
| 1047 |
-
|
| 1048 |
-
|
| 1049 |
-
|
| 1050 |
-
|
| 1051 |
-
|
| 1052 |
-
|
| 1053 |
-
|
| 1054 |
-
|
| 1055 |
-
|
| 1056 |
-
|
| 1057 |
-
|
| 1058 |
-
|
| 1059 |
-
|
| 1060 |
-
|
| 1061 |
-
|
| 1062 |
-
|
| 1063 |
-
|
| 1064 |
-
|
| 1065 |
-
|
| 1066 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1067 |
if site_var == 'Draftkings':
|
| 1068 |
if slate_type_var3 == 'Regular':
|
| 1069 |
-
|
| 1070 |
elif slate_type_var3 == 'Showdown':
|
| 1071 |
-
|
| 1072 |
elif site_var == 'Fanduel':
|
| 1073 |
if slate_type_var3 == 'Regular':
|
| 1074 |
-
|
| 1075 |
elif slate_type_var3 == 'Showdown':
|
| 1076 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1077 |
st.download_button(
|
| 1078 |
-
label="
|
| 1079 |
-
data=
|
| 1080 |
-
file_name='
|
| 1081 |
mime='text/csv',
|
| 1082 |
-
key='
|
| 1083 |
)
|
| 1084 |
-
|
|
|
|
| 1085 |
if site_var == 'Draftkings':
|
| 1086 |
if slate_type_var3 == 'Regular':
|
| 1087 |
-
|
| 1088 |
elif slate_type_var3 == 'Showdown':
|
| 1089 |
-
|
| 1090 |
elif site_var == 'Fanduel':
|
| 1091 |
if slate_type_var3 == 'Regular':
|
| 1092 |
-
|
| 1093 |
elif slate_type_var3 == 'Showdown':
|
| 1094 |
-
|
| 1095 |
-
|
| 1096 |
-
|
| 1097 |
-
|
| 1098 |
-
|
| 1099 |
-
|
| 1100 |
-
|
| 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 |
-
'
|
| 1258 |
-
'
|
| 1259 |
-
|
| 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 |
-
|
| 1279 |
-
|
| 1280 |
-
|
| 1281 |
-
|
| 1282 |
-
|
| 1283 |
-
|
| 1284 |
-
|
| 1285 |
-
|
| 1286 |
-
|
| 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 |
-
|
| 1366 |
-
|
| 1367 |
-
|
| 1368 |
-
|
| 1369 |
-
|
| 1370 |
-
|
| 1371 |
-
|
| 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 |
+
)
|
|
|
|
|
|
|
|
|
|
|
|