Multichem commited on
Commit
1344aff
·
1 Parent(s): d6fc974

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +537 -502
app.py CHANGED
@@ -46,7 +46,7 @@ player_roo_format = {'Top_finish': '{:.2%}','Top_5_finish': '{:.2%}', 'Top_10_fi
46
 
47
  freq_format = {'Proj Own': '{:.2%}', 'Exposure': '{:.2%}', 'Edge': '{:.2%}'}
48
 
49
- @st.cache_resource(ttl = 3600)
50
  def set_slate_teams():
51
  sh = gc.open_by_url('https://docs.google.com/spreadsheets/d/1I_1Ve3F4tftgfLQQoRKOJ351XfEG48s36OxXUKxmgS8/edit#gid=1391856348')
52
  worksheet = sh.worksheet('Site_Info')
@@ -54,7 +54,7 @@ def set_slate_teams():
54
 
55
  return raw_display
56
 
57
- @st.cache_resource(ttl = 600)
58
  def player_stat_table():
59
  sh = gc.open_by_url('https://docs.google.com/spreadsheets/d/1I_1Ve3F4tftgfLQQoRKOJ351XfEG48s36OxXUKxmgS8/edit#gid=1391856348')
60
  worksheet = sh.worksheet('Player_Projections')
@@ -62,7 +62,7 @@ def player_stat_table():
62
 
63
  return raw_display
64
 
65
- @st.cache_resource(ttl = 600)
66
  def load_dk_player_projections():
67
  sh = gc.open_by_url('https://docs.google.com/spreadsheets/d/1I_1Ve3F4tftgfLQQoRKOJ351XfEG48s36OxXUKxmgS8/edit#gid=1391856348')
68
  worksheet = sh.worksheet('DK_ROO')
@@ -73,7 +73,7 @@ def load_dk_player_projections():
73
 
74
  return raw_display
75
 
76
- @st.cache_resource(ttl = 600)
77
  def load_fd_player_projections():
78
  sh = gc.open_by_url('https://docs.google.com/spreadsheets/d/1I_1Ve3F4tftgfLQQoRKOJ351XfEG48s36OxXUKxmgS8/edit#gid=1391856348')
79
  worksheet = sh.worksheet('FD_ROO')
@@ -84,7 +84,7 @@ def load_fd_player_projections():
84
 
85
  return raw_display
86
 
87
- @st.cache_resource(ttl = 3600)
88
  def set_export_ids():
89
  sh = gc.open_by_url('https://docs.google.com/spreadsheets/d/1I_1Ve3F4tftgfLQQoRKOJ351XfEG48s36OxXUKxmgS8/edit#gid=1391856348')
90
  worksheet = sh.worksheet('DK_ROO')
@@ -226,7 +226,7 @@ def create_random_portfolio(Total_Sample_Size, raw_baselines):
226
  ranges_dict = {}
227
 
228
  # Calculate ranges
229
- for df, dict_val, min_val, key in zip(ref_dict['pos_dfs'], ref_dict['pos_dicts'], [10, 20, 30, 10], ['RB', 'WR', 'TE', 'FLEX']):
230
  count = create_overall_dfs(pos_players, df, dict_val, key)
231
  ranges_dict[f"{key.lower()}_range"] = calculate_range_var(count, min_val, FieldStrength, field_growth_rounded)
232
  if max_var <= 10:
@@ -525,11 +525,11 @@ overall_exposure = pd.DataFrame(columns=['Player', 'count'])
525
  tab1, tab2 = st.tabs(['Uploads', 'Contest Sim'])
526
 
527
  with tab1:
528
- with st.container():
529
- st.info("The Projections file can have any columns in any order, but must contain columns explicitly named: 'Player', 'Salary', 'Position', 'Team', 'Opp', 'Median', and 'Own'. Upload your projections first to avoid an error message.")
530
  col1, col2 = st.columns([3, 3])
531
 
532
  with col1:
 
533
  proj_file = st.file_uploader("Upload Projections File", key = 'proj_uploader')
534
 
535
  if proj_file is not None:
@@ -557,6 +557,7 @@ with tab1:
557
  player_team_dict = dict(zip(proj_dataframe.Player, proj_dataframe.Team))
558
 
559
  with col2:
 
560
  portfolio_file = st.file_uploader("Upload Portfolio File", key = 'portfolio_uploader')
561
 
562
  if portfolio_file is not None:
@@ -589,6 +590,8 @@ with tab1:
589
  split_portfolio['TE'] = split_portfolio['TE'].str.strip()
590
  split_portfolio['FLEX'] = split_portfolio['FLEX'].str.strip()
591
  split_portfolio['DST'] = split_portfolio['DST'].str.strip()
 
 
592
 
593
  split_portfolio['Salary'] = sum([split_portfolio['QB'].map(player_salary_dict),
594
  split_portfolio['RB1'].map(player_salary_dict),
@@ -837,6 +840,8 @@ with tab2:
837
  st.info(t_stamp)
838
  if st.button("Load/Reset Data", key='reset1'):
839
  st.cache_data.clear()
 
 
840
  dk_roo_raw = load_dk_player_projections()
841
  fd_roo_raw = load_fd_player_projections()
842
  t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST"
@@ -870,7 +875,7 @@ with tab2:
870
  Contest_Size = 5000
871
  elif contest_var1 == 'Large':
872
  Contest_Size = 10000
873
- linenum_var1 = 1000
874
  strength_var1 = st.selectbox("How sharp is the field in the contest?", ('Not Very', 'Average', 'Very'))
875
  if strength_var1 == 'Not Very':
876
  sharp_split = .33
@@ -884,519 +889,549 @@ with tab2:
884
  sharp_split = .75
885
  Strength_var = .01
886
  scaling_var = 15
887
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
888
  with col2:
889
- if st.button("Simulate Contest"):
890
- try:
891
- del dst_freq
892
- del flex_freq
893
- del te_freq
894
- del wr_freq
895
- del rb_freq
896
- del qb_freq
897
- del player_freq
898
- del Sim_Winner_Export
899
- del Sim_Winner_Frame
900
- except:
901
- pass
902
- with st.container():
903
- st.write('Contest Simulation Starting')
904
- seed_depth1 = 10
905
- Total_Runs = 1000000
906
- if Contest_Size <= 1000:
907
- strength_grow = .01
908
- elif Contest_Size > 1000 and Contest_Size <= 2500:
909
- strength_grow = .025
910
- elif Contest_Size > 2500 and Contest_Size <= 5000:
911
- strength_grow = .05
912
- elif Contest_Size > 5000 and Contest_Size <= 20000:
913
- strength_grow = .075
914
- elif Contest_Size > 20000:
915
- strength_grow = .1
916
-
917
- field_growth = 100 * strength_grow
918
-
919
- Sort_function = 'Median'
920
- if Sort_function == 'Median':
921
- Sim_function = 'Projection'
922
- elif Sort_function == 'Own':
923
- Sim_function = 'Own'
924
-
925
- if slate_var1 == 'User':
926
- OwnFrame = proj_dataframe
927
- if contest_var1 == 'Small':
928
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (10 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
929
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (5 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
930
- OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
931
- OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
932
- if contest_var1 == 'Medium':
933
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (6 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
934
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (3 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
935
- OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
936
- OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
937
- if contest_var1 == 'Large':
938
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (3 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
939
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (1.5 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
940
- OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
941
- OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
942
- Overall_Proj = OwnFrame[['Player', 'Team', 'Position', 'Median', 'Own', 'Salary']]
943
-
944
- del OwnFrame
945
-
946
- elif slate_var1 != 'User':
947
- initial_proj = raw_baselines
948
- drop_frame = initial_proj.drop_duplicates(subset = 'Player',keep = 'first')
949
- OwnFrame = drop_frame[['Player', 'Team', 'Position', 'Median', 'Own', 'Floor', 'Ceiling', 'Salary']]
950
- if contest_var1 == 'Small':
951
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (10 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
952
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (5 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
953
- OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
954
- OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
955
- if contest_var1 == 'Medium':
956
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (6 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
957
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (3 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
958
- OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
959
- OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
960
- if contest_var1 == 'Large':
961
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (3 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
962
- OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (1.5 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
963
- OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
964
- OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
965
- Overall_Proj = OwnFrame[['Player', 'Team', 'Position', 'Median', 'Own', 'Salary']]
966
-
967
- del initial_proj
968
- del drop_frame
969
- del OwnFrame
970
-
971
- if insert_port == 1:
972
- UserPortfolio = portfolio_dataframe[['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']]
973
- elif insert_port == 0:
974
- UserPortfolio = pd.DataFrame(columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST'])
975
-
976
- Overall_Proj.replace('', np.nan, inplace=True)
977
- Overall_Proj = Overall_Proj.dropna(subset=['Median'])
978
- Overall_Proj = Overall_Proj.assign(Value=lambda x: (x.Median / (x.Salary / 1000)))
979
- Overall_Proj['Sort_var'] = (Overall_Proj['Median'].rank(ascending=False) + Overall_Proj['Value'].rank(ascending=False)) / 2
980
- Overall_Proj = Overall_Proj.sort_values(by='Sort_var', ascending=False)
981
- Overall_Proj['Own'] = np.where((Overall_Proj['Median'] > 0) & (Overall_Proj['Own'] == 0), 1, Overall_Proj['Own'])
982
- Overall_Proj = Overall_Proj.loc[Overall_Proj['Own'] > 0]
983
-
984
- Overall_Proj['Floor'] = np.where(Overall_Proj['Position'] == 'QB', Overall_Proj['Median'] * .5, Overall_Proj['Median'] * .25)
985
- Overall_Proj['Ceiling'] = np.where(Overall_Proj['Position'] == 'WR', Overall_Proj['Median'] + Overall_Proj['Median'], Overall_Proj['Median'] + Overall_Proj['Floor'])
986
- Overall_Proj['STDev'] = Overall_Proj['Median'] / 4
987
-
988
- Teams_used = Overall_Proj['Team'].drop_duplicates().reset_index(drop=True)
989
- Teams_used = Teams_used.reset_index()
990
- Teams_used['team_item'] = Teams_used['index'] + 1
991
- Teams_used = Teams_used.drop(columns=['index'])
992
- Teams_used_dictraw = Teams_used.drop(columns=['team_item'])
993
- Teams_used_dict = Teams_used_dictraw.to_dict()
994
-
995
- del Teams_used_dictraw
996
-
997
- team_list = Teams_used['Team'].to_list()
998
- item_list = Teams_used['team_item'].to_list()
999
-
1000
- FieldStrength_raw = Strength_var + ((30 - len(Teams_used)) * .01)
1001
- FieldStrength = FieldStrength_raw - (FieldStrength_raw * (20000 / Contest_Size))
1002
-
1003
- del FieldStrength_raw
1004
-
1005
- if FieldStrength < 0:
1006
- FieldStrength = Strength_var
1007
- field_split = Strength_var
1008
-
1009
- for checkVar in range(len(team_list)):
1010
- Overall_Proj['Team'] = Overall_Proj['Team'].replace(team_list, item_list)
1011
-
1012
- qbs_raw = Overall_Proj[Overall_Proj.Position == 'QB']
1013
- qbs_raw.dropna(subset=['Median']).reset_index(drop=True)
1014
- qbs_raw = qbs_raw.reset_index(drop=True)
1015
- qbs_raw = qbs_raw.sort_values(by=['Median'], ascending=False)
1016
-
1017
- qbs = qbs_raw.head(round(len(qbs_raw)))
1018
- qbs = qbs.assign(Var = range(0,len(qbs)))
1019
- qb_dict = pd.Series(qbs.Player.values, index=qbs.Var).to_dict()
1020
-
1021
- defs_raw = Overall_Proj[Overall_Proj.Position.str.contains("D")]
1022
- defs_raw.dropna(subset=['Median']).reset_index(drop=True)
1023
- defs_raw = defs_raw.reset_index(drop=True)
1024
- defs_raw = defs_raw.sort_values(by=['Own', 'Value'], ascending=False)
1025
-
1026
- defs = defs_raw.head(round(len(defs_raw)))
1027
- defs = defs.assign(Var = range(0,len(defs)))
1028
- def_dict = pd.Series(defs.Player.values, index=defs.Var).to_dict()
1029
-
1030
- rbs_raw = Overall_Proj[Overall_Proj.Position == 'RB']
1031
- rbs_raw.dropna(subset=['Median']).reset_index(drop=True)
1032
- rbs_raw = rbs_raw.reset_index(drop=True)
1033
- rbs_raw = rbs_raw.sort_values(by=['Own', 'Value'], ascending=False)
1034
-
1035
- wrs_raw = Overall_Proj[Overall_Proj.Position == 'WR']
1036
- wrs_raw.dropna(subset=['Median']).reset_index(drop=True)
1037
- wrs_raw = wrs_raw.reset_index(drop=True)
1038
- wrs_raw = wrs_raw.sort_values(by=['Own', 'Median'], ascending=False)
1039
-
1040
- tes_raw = Overall_Proj[Overall_Proj.Position == 'TE']
1041
- tes_raw.dropna(subset=['Median']).reset_index(drop=True)
1042
- tes_raw = tes_raw.reset_index(drop=True)
1043
- tes_raw = tes_raw.sort_values(by=['Own', 'Value'], ascending=False)
1044
-
1045
- pos_players = pd.concat([rbs_raw, wrs_raw, tes_raw])
1046
- pos_players.dropna(subset=['Median']).reset_index(drop=True)
1047
- pos_players = pos_players.reset_index(drop=True)
1048
-
1049
- del qbs_raw
1050
- del defs_raw
1051
- del rbs_raw
1052
- del wrs_raw
1053
- del tes_raw
1054
-
1055
- if insert_port == 1:
1056
- try:
1057
- # Initialize an empty DataFrame for Raw Portfolio
1058
- Raw_Portfolio = pd.DataFrame()
1059
-
1060
- # Loop through each position and split the data accordingly
1061
- positions = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
1062
- for pos in positions:
1063
- temp_df = UserPortfolio[pos].str.split("(", n=1, expand=True)
1064
- temp_df.columns = [pos, 'Drop']
1065
- Raw_Portfolio = pd.concat([Raw_Portfolio, temp_df], axis=1)
1066
-
1067
- # Select only necessary columns and strip white spaces
1068
- CleanPortfolio = Raw_Portfolio[positions].apply(lambda x: x.str.strip())
1069
- CleanPortfolio.reset_index(inplace=True)
1070
- CleanPortfolio['User/Field'] = CleanPortfolio['index'] + 1
1071
- CleanPortfolio.drop(columns=['index'], inplace=True)
1072
-
1073
- CleanPortfolio.replace('', np.nan, inplace=True)
1074
- CleanPortfolio.dropna(subset=['QB'], inplace=True)
1075
 
1076
- # Create frequency table for players
1077
- cleaport_players = pd.DataFrame(
1078
- np.column_stack(np.unique(CleanPortfolio.iloc[:, 0:9].values, return_counts=True)),
1079
- columns=['Player', 'Freq']
1080
- ).sort_values('Freq', ascending=False).reset_index(drop=True)
1081
- cleaport_players['Freq'] = cleaport_players['Freq'].astype(int)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1082
 
1083
- # Merge and update nerf_frame
1084
- nerf_frame = pd.merge(cleaport_players, Overall_Proj, on='Player', how='left')
1085
- for col in ['Median', 'Floor', 'Ceiling', 'STDev']:
1086
- nerf_frame[col] *= 0.90
1087
- del Raw_Portfolio
1088
- except:
1089
- CleanPortfolio = UserPortfolio.reset_index()
1090
- CleanPortfolio['User/Field'] = CleanPortfolio['index'] + 1
1091
- CleanPortfolio.drop(columns=['index'], inplace=True)
1092
 
1093
- # Replace empty strings and drop rows with NaN in 'QB' column
1094
- CleanPortfolio.replace('', np.nan, inplace=True)
1095
- CleanPortfolio.dropna(subset=['QB'], inplace=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1096
 
1097
- # Create frequency table for players
1098
- cleaport_players = pd.DataFrame(
1099
- np.column_stack(np.unique(CleanPortfolio.iloc[:, 0:9].values, return_counts=True)),
1100
- columns=['Player', 'Freq']
1101
- ).sort_values('Freq', ascending=False).reset_index(drop=True)
1102
- cleaport_players['Freq'] = cleaport_players['Freq'].astype(int)
1103
-
1104
- # Merge and update nerf_frame
1105
- nerf_frame = pd.merge(cleaport_players, Overall_Proj, on='Player', how='left')
1106
- for col in ['Median', 'Floor', 'Ceiling', 'STDev']:
1107
- nerf_frame[col] *= 0.90
1108
-
1109
- elif insert_port == 0:
1110
- CleanPortfolio = UserPortfolio
1111
- cleaport_players = pd.DataFrame(np.column_stack(np.unique(CleanPortfolio.iloc[:,0:9].values, return_counts=True)),
1112
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1113
- cleaport_players['Freq'] = cleaport_players['Freq'].astype(int)
1114
- nerf_frame = Overall_Proj
1115
 
1116
- ref_dict = {
1117
- 'pos':['RB', 'WR', 'TE', 'FLEX'],
1118
- 'pos_dfs':['RB_Table', 'WR_Table', 'TE_Table', 'FLEX_Table'],
1119
- 'pos_dicts':['rb_dict', 'wr_dict', 'te_dict', 'flex_dict']
1120
- }
1121
-
1122
- maps_dict = {
1123
- 'Floor_map':dict(zip(Overall_Proj.Player,Overall_Proj.Floor)),
1124
- 'Projection_map':dict(zip(Overall_Proj.Player,Overall_Proj.Median)),
1125
- 'Ceiling_map':dict(zip(Overall_Proj.Player,Overall_Proj.Ceiling)),
1126
- 'Salary_map':dict(zip(Overall_Proj.Player,Overall_Proj.Salary)),
1127
- 'Pos_map':dict(zip(Overall_Proj.Player,Overall_Proj.Position)),
1128
- 'Own_map':dict(zip(Overall_Proj.Player,Overall_Proj.Own)),
1129
- 'Team_map':dict(zip(Overall_Proj.Player,Overall_Proj.Team)),
1130
- 'STDev_map':dict(zip(Overall_Proj.Player,Overall_Proj.STDev)),
1131
- 'team_check_map':dict(zip(Overall_Proj.Player,Overall_Proj.Team))
1132
- }
1133
-
1134
- up_dict = {
1135
- 'Floor_map':dict(zip(cleaport_players.Player,nerf_frame.Floor)),
1136
- 'Projection_map':dict(zip(cleaport_players.Player,nerf_frame.Median)),
1137
- 'Ceiling_map':dict(zip(cleaport_players.Player,nerf_frame.Ceiling)),
1138
- 'Salary_map':dict(zip(cleaport_players.Player,nerf_frame.Salary)),
1139
- 'Pos_map':dict(zip(cleaport_players.Player,nerf_frame.Position)),
1140
- 'Own_map':dict(zip(cleaport_players.Player,nerf_frame.Own)),
1141
- 'Team_map':dict(zip(cleaport_players.Player,nerf_frame.Team)),
1142
- 'STDev_map':dict(zip(cleaport_players.Player,nerf_frame.STDev)),
1143
- 'team_check_map':dict(zip(cleaport_players.Player,nerf_frame.Team))
1144
- }
1145
-
1146
- del cleaport_players
1147
- del Overall_Proj
1148
- del nerf_frame
1149
-
1150
- st.write('Seed frame creation')
1151
- FinalPortfolio, maps_dict = run_seed_frame(seed_depth1, Strength_var, strength_grow, Teams_used, Total_Runs)
1152
-
1153
- Sim_size = linenum_var1
1154
- SimVar = 1
1155
- Sim_Winners = []
1156
- fp_array = FinalPortfolio.values
1157
-
1158
- if insert_port == 1:
1159
- up_array = CleanPortfolio.values
1160
-
1161
- # Pre-vectorize functions
1162
- vec_projection_map = np.vectorize(maps_dict['Projection_map'].__getitem__)
1163
- vec_stdev_map = np.vectorize(maps_dict['STDev_map'].__getitem__)
1164
-
1165
- if insert_port == 1:
1166
- vec_up_projection_map = np.vectorize(up_dict['Projection_map'].__getitem__)
1167
- vec_up_stdev_map = np.vectorize(up_dict['STDev_map'].__getitem__)
1168
-
1169
- st.write('Simulating contest on frames')
1170
-
1171
- while SimVar <= Sim_size:
1172
  if insert_port == 1:
1173
- fp_random = fp_array[np.random.choice(fp_array.shape[0], Contest_Size-len(CleanPortfolio))]
1174
  elif insert_port == 0:
1175
- fp_random = fp_array[np.random.choice(fp_array.shape[0], Contest_Size)]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1176
 
1177
- sample_arrays1 = np.c_[
1178
- fp_random,
1179
- np.sum(np.random.normal(
1180
- loc=vec_projection_map(fp_random[:, :-5]),
1181
- scale=vec_stdev_map(fp_random[:, :-5])),
1182
- axis=1)
1183
- ]
1184
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1185
  if insert_port == 1:
1186
- sample_arrays2 = np.c_[
1187
- up_array,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1188
  np.sum(np.random.normal(
1189
- loc=vec_up_projection_map(up_array[:, :-5]),
1190
- scale=vec_up_stdev_map(up_array[:, :-5])),
1191
  axis=1)
1192
  ]
1193
- sample_arrays = np.vstack((sample_arrays1, sample_arrays2))
1194
- else:
1195
- sample_arrays = sample_arrays1
1196
-
1197
- final_array = sample_arrays[sample_arrays[:, 10].argsort()[::-1]]
1198
- best_lineup = final_array[final_array[:, -1].argsort(kind='stable')[::-1][:1]]
1199
- Sim_Winners.append(best_lineup)
1200
- SimVar += 1
1201
-
1202
-
1203
- # del smple_arrays
1204
- # del smple_arrays1
1205
- # del smple_arrays2
1206
- # del final_array
1207
- # del best_lineup
1208
- st.write('Contest simulation complete')
1209
- # Initial setup
1210
- Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=FinalPortfolio.columns.tolist() + ['Fantasy'])
1211
- Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['Projection'] + Sim_Winner_Frame['Fantasy']) / 2
1212
-
1213
- # Type Casting
1214
- type_cast_dict = {'Salary': int, 'Projection': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float16}
1215
- Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)
1216
-
1217
- # Sorting
1218
- Sim_Winner_Frame = Sim_Winner_Frame.sort_values(by='GPP_Proj', ascending=False)
1219
-
1220
- # Data Copying
1221
- Sim_Winner_Export = Sim_Winner_Frame.copy()
1222
-
1223
- # Conditional Replacement
1224
- columns_to_replace = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
1225
-
1226
- if site_var1 == 'Draftkings':
1227
- replace_dict = dkid_dict
1228
- elif site_var1 == 'Fanduel':
1229
- replace_dict = fdid_dict
1230
-
1231
- for col in columns_to_replace:
1232
- Sim_Winner_Export[col].replace(replace_dict, inplace=True)
1233
-
1234
-
1235
- player_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,0:9].values, return_counts=True)),
1236
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1237
- player_freq['Freq'] = player_freq['Freq'].astype(int)
1238
- player_freq['Position'] = player_freq['Player'].map(maps_dict['Pos_map'])
1239
- player_freq['Salary'] = player_freq['Player'].map(maps_dict['Salary_map'])
1240
- player_freq['Proj Own'] = player_freq['Player'].map(maps_dict['Own_map']) / 100
1241
- player_freq['Exposure'] = player_freq['Freq']/(Sim_size)
1242
- player_freq['Edge'] = player_freq['Exposure'] - player_freq['Proj Own']
1243
- player_freq['Team'] = player_freq['Player'].map(maps_dict['Team_map'])
1244
- for checkVar in range(len(team_list)):
1245
- player_freq['Team'] = player_freq['Team'].replace(item_list, team_list)
1246
-
1247
- player_freq = player_freq[['Player', 'Position', 'Team', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1248
-
1249
- qb_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,0:1].values, return_counts=True)),
1250
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1251
- qb_freq['Freq'] = qb_freq['Freq'].astype(int)
1252
- qb_freq['Position'] = qb_freq['Player'].map(maps_dict['Pos_map'])
1253
- qb_freq['Salary'] = qb_freq['Player'].map(maps_dict['Salary_map'])
1254
- qb_freq['Proj Own'] = qb_freq['Player'].map(maps_dict['Own_map']) / 100
1255
- qb_freq['Exposure'] = qb_freq['Freq']/(Sim_size)
1256
- qb_freq['Edge'] = qb_freq['Exposure'] - qb_freq['Proj Own']
1257
- qb_freq['Team'] = qb_freq['Player'].map(maps_dict['Team_map'])
1258
- for checkVar in range(len(team_list)):
1259
- qb_freq['Team'] = qb_freq['Team'].replace(item_list, team_list)
1260
-
1261
- qb_freq = qb_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1262
-
1263
- rb_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,[1, 2]].values, return_counts=True)),
1264
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1265
- rb_freq['Freq'] = rb_freq['Freq'].astype(int)
1266
- rb_freq['Position'] = rb_freq['Player'].map(maps_dict['Pos_map'])
1267
- rb_freq['Salary'] = rb_freq['Player'].map(maps_dict['Salary_map'])
1268
- rb_freq['Proj Own'] = rb_freq['Player'].map(maps_dict['Own_map']) / 100
1269
- rb_freq['Exposure'] = rb_freq['Freq']/Sim_size
1270
- rb_freq['Edge'] = rb_freq['Exposure'] - rb_freq['Proj Own']
1271
- rb_freq['Team'] = rb_freq['Player'].map(maps_dict['Team_map'])
1272
- for checkVar in range(len(team_list)):
1273
- rb_freq['Team'] = rb_freq['Team'].replace(item_list, team_list)
1274
-
1275
- rb_freq = rb_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1276
-
1277
- wr_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,[3, 4, 5]].values, return_counts=True)),
1278
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1279
- wr_freq['Freq'] = wr_freq['Freq'].astype(int)
1280
- wr_freq['Position'] = wr_freq['Player'].map(maps_dict['Pos_map'])
1281
- wr_freq['Salary'] = wr_freq['Player'].map(maps_dict['Salary_map'])
1282
- wr_freq['Proj Own'] = wr_freq['Player'].map(maps_dict['Own_map']) / 100
1283
- wr_freq['Exposure'] = wr_freq['Freq']/Sim_size
1284
- wr_freq['Edge'] = wr_freq['Exposure'] - wr_freq['Proj Own']
1285
- wr_freq['Team'] = wr_freq['Player'].map(maps_dict['Team_map'])
1286
- for checkVar in range(len(team_list)):
1287
- wr_freq['Team'] = wr_freq['Team'].replace(item_list, team_list)
1288
-
1289
- wr_freq = wr_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1290
 
1291
- te_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,[6]].values, return_counts=True)),
1292
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1293
- te_freq['Freq'] = te_freq['Freq'].astype(int)
1294
- te_freq['Position'] = te_freq['Player'].map(maps_dict['Pos_map'])
1295
- te_freq['Salary'] = te_freq['Player'].map(maps_dict['Salary_map'])
1296
- te_freq['Proj Own'] = te_freq['Player'].map(maps_dict['Own_map']) / 100
1297
- te_freq['Exposure'] = te_freq['Freq']/Sim_size
1298
- te_freq['Edge'] = te_freq['Exposure'] - te_freq['Proj Own']
1299
- te_freq['Team'] = te_freq['Player'].map(maps_dict['Team_map'])
1300
- for checkVar in range(len(team_list)):
1301
- te_freq['Team'] = te_freq['Team'].replace(item_list, team_list)
1302
-
1303
- te_freq = te_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1304
 
1305
- flex_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,[7]].values, return_counts=True)),
1306
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1307
- flex_freq['Freq'] = flex_freq['Freq'].astype(int)
1308
- flex_freq['Position'] = flex_freq['Player'].map(maps_dict['Pos_map'])
1309
- flex_freq['Salary'] = flex_freq['Player'].map(maps_dict['Salary_map'])
1310
- flex_freq['Proj Own'] = flex_freq['Player'].map(maps_dict['Own_map']) / 100
1311
- flex_freq['Exposure'] = flex_freq['Freq']/Sim_size
1312
- flex_freq['Edge'] = flex_freq['Exposure'] - flex_freq['Proj Own']
1313
- flex_freq['Team'] = flex_freq['Player'].map(maps_dict['Team_map'])
1314
- for checkVar in range(len(team_list)):
1315
- flex_freq['Team'] = flex_freq['Team'].replace(item_list, team_list)
1316
-
1317
- flex_freq = flex_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1318
 
1319
- dst_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,8:9].values, return_counts=True)),
1320
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1321
- dst_freq['Freq'] = dst_freq['Freq'].astype(int)
1322
- dst_freq['Position'] = dst_freq['Player'].map(maps_dict['Pos_map'])
1323
- dst_freq['Salary'] = dst_freq['Player'].map(maps_dict['Salary_map'])
1324
- dst_freq['Proj Own'] = dst_freq['Player'].map(maps_dict['Own_map']) / 100
1325
- dst_freq['Exposure'] = dst_freq['Freq']/Sim_size
1326
- dst_freq['Edge'] = dst_freq['Exposure'] - dst_freq['Proj Own']
1327
- dst_freq['Team'] = dst_freq['Player'].map(maps_dict['Team_map'])
1328
- for checkVar in range(len(team_list)):
1329
- dst_freq['Team'] = dst_freq['Team'].replace(item_list, team_list)
1330
 
1331
- dst_freq = dst_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1332
-
1333
- with st.container():
1334
- simulate_container = st.empty()
1335
- st.dataframe(Sim_Winner_Frame.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').background_gradient(cmap='RdYlGn_r', subset=['Own']).format(precision=2), use_container_width = True)
1336
-
1337
  st.download_button(
1338
  label="Export Tables",
1339
- data=convert_df_to_csv(Sim_Winner_Export),
1340
  file_name='NFL_consim_export.csv',
1341
  mime='text/csv',
1342
  )
1343
-
1344
- with st.container():
1345
- freq_container = st.empty()
1346
- tab1, tab2, tab3, tab4, tab5, tab6, tab7 = st.tabs(['Overall Exposures', 'QB Exposures', 'RB Exposures', 'WR Exposures', 'TE Exposures', 'FLEX Exposures', 'DST Exposures'])
1347
- with tab1:
1348
- st.dataframe(player_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1349
- st.download_button(
1350
- label="Export Exposures",
1351
- data=convert_df_to_csv(player_freq),
1352
- file_name='player_freq_export.csv',
1353
- mime='text/csv',
1354
- )
1355
- with tab2:
1356
- st.dataframe(qb_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1357
- st.download_button(
1358
- label="Export Exposures",
1359
- data=convert_df_to_csv(qb_freq),
1360
- file_name='qb_freq_export.csv',
1361
- mime='text/csv',
1362
- )
1363
- with tab3:
1364
- st.dataframe(rb_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1365
- st.download_button(
1366
- label="Export Exposures",
1367
- data=convert_df_to_csv(rb_freq),
1368
- file_name='rb_freq_export.csv',
1369
- mime='text/csv',
1370
- )
1371
- with tab4:
1372
- st.dataframe(wr_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1373
- st.download_button(
1374
- label="Export Exposures",
1375
- data=convert_df_to_csv(wr_freq),
1376
- file_name='wr_freq_export.csv',
1377
- mime='text/csv',
1378
- )
1379
- with tab5:
1380
- st.dataframe(te_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1381
- st.download_button(
1382
- label="Export Exposures",
1383
- data=convert_df_to_csv(te_freq),
1384
- file_name='te_freq_export.csv',
1385
- mime='text/csv',
1386
- )
1387
- with tab6:
1388
- st.dataframe(flex_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1389
- st.download_button(
1390
- label="Export Exposures",
1391
- data=convert_df_to_csv(flex_freq),
1392
- file_name='flex_freq_export.csv',
1393
- mime='text/csv',
1394
- )
1395
- with tab7:
1396
- st.dataframe(dst_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1397
- st.download_button(
1398
- label="Export Exposures",
1399
- data=convert_df_to_csv(dst_freq),
1400
- file_name='dst_freq_export.csv',
1401
- mime='text/csv',
1402
- )
 
46
 
47
  freq_format = {'Proj Own': '{:.2%}', 'Exposure': '{:.2%}', 'Edge': '{:.2%}'}
48
 
49
+ @st.cache_resource(ttl = 300)
50
  def set_slate_teams():
51
  sh = gc.open_by_url('https://docs.google.com/spreadsheets/d/1I_1Ve3F4tftgfLQQoRKOJ351XfEG48s36OxXUKxmgS8/edit#gid=1391856348')
52
  worksheet = sh.worksheet('Site_Info')
 
54
 
55
  return raw_display
56
 
57
+ @st.cache_resource(ttl = 300)
58
  def player_stat_table():
59
  sh = gc.open_by_url('https://docs.google.com/spreadsheets/d/1I_1Ve3F4tftgfLQQoRKOJ351XfEG48s36OxXUKxmgS8/edit#gid=1391856348')
60
  worksheet = sh.worksheet('Player_Projections')
 
62
 
63
  return raw_display
64
 
65
+ @st.cache_resource(ttl = 300)
66
  def load_dk_player_projections():
67
  sh = gc.open_by_url('https://docs.google.com/spreadsheets/d/1I_1Ve3F4tftgfLQQoRKOJ351XfEG48s36OxXUKxmgS8/edit#gid=1391856348')
68
  worksheet = sh.worksheet('DK_ROO')
 
73
 
74
  return raw_display
75
 
76
+ @st.cache_resource(ttl = 300)
77
  def load_fd_player_projections():
78
  sh = gc.open_by_url('https://docs.google.com/spreadsheets/d/1I_1Ve3F4tftgfLQQoRKOJ351XfEG48s36OxXUKxmgS8/edit#gid=1391856348')
79
  worksheet = sh.worksheet('FD_ROO')
 
84
 
85
  return raw_display
86
 
87
+ @st.cache_resource(ttl = 300)
88
  def set_export_ids():
89
  sh = gc.open_by_url('https://docs.google.com/spreadsheets/d/1I_1Ve3F4tftgfLQQoRKOJ351XfEG48s36OxXUKxmgS8/edit#gid=1391856348')
90
  worksheet = sh.worksheet('DK_ROO')
 
226
  ranges_dict = {}
227
 
228
  # Calculate ranges
229
+ for df, dict_val, min_val, key in zip(ref_dict['pos_dfs'], ref_dict['pos_dicts'], [10, 20, 10, 30], ['RB', 'WR', 'TE', 'FLEX']):
230
  count = create_overall_dfs(pos_players, df, dict_val, key)
231
  ranges_dict[f"{key.lower()}_range"] = calculate_range_var(count, min_val, FieldStrength, field_growth_rounded)
232
  if max_var <= 10:
 
525
  tab1, tab2 = st.tabs(['Uploads', 'Contest Sim'])
526
 
527
  with tab1:
528
+ with st.container():
 
529
  col1, col2 = st.columns([3, 3])
530
 
531
  with col1:
532
+ st.info("The Projections file can have any columns in any order, but must contain columns explicitly named: 'Player', 'Salary', 'Position', 'Team', 'Opp', 'Median', and 'Own'. Upload your projections first to avoid an error message.")
533
  proj_file = st.file_uploader("Upload Projections File", key = 'proj_uploader')
534
 
535
  if proj_file is not None:
 
557
  player_team_dict = dict(zip(proj_dataframe.Player, proj_dataframe.Team))
558
 
559
  with col2:
560
+ st.info("The Portfolio file must contain only columns in order and explicitly named: 'QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', and 'DST'. Upload your projections first to avoid an error message.")
561
  portfolio_file = st.file_uploader("Upload Portfolio File", key = 'portfolio_uploader')
562
 
563
  if portfolio_file is not None:
 
590
  split_portfolio['TE'] = split_portfolio['TE'].str.strip()
591
  split_portfolio['FLEX'] = split_portfolio['FLEX'].str.strip()
592
  split_portfolio['DST'] = split_portfolio['DST'].str.strip()
593
+
594
+ st.table(split_portfolio.head(10))
595
 
596
  split_portfolio['Salary'] = sum([split_portfolio['QB'].map(player_salary_dict),
597
  split_portfolio['RB1'].map(player_salary_dict),
 
840
  st.info(t_stamp)
841
  if st.button("Load/Reset Data", key='reset1'):
842
  st.cache_data.clear()
843
+ for key in st.session_state.keys():
844
+ del st.session_state[key]
845
  dk_roo_raw = load_dk_player_projections()
846
  fd_roo_raw = load_fd_player_projections()
847
  t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST"
 
875
  Contest_Size = 5000
876
  elif contest_var1 == 'Large':
877
  Contest_Size = 10000
878
+ linenum_var1 = 2500
879
  strength_var1 = st.selectbox("How sharp is the field in the contest?", ('Not Very', 'Average', 'Very'))
880
  if strength_var1 == 'Not Very':
881
  sharp_split = .33
 
889
  sharp_split = .75
890
  Strength_var = .01
891
  scaling_var = 15
892
+ if 'Sim_Winner_Display' not in st.session_state:
893
+ st.session_state.Sim_Winner_Display = pd.DataFrame(columns=['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'User/Field', 'Salary', 'Projection', 'Own', 'Fantasy', 'GPP_Proj'])
894
+ if 'Sim_Winner_Frame' not in st.session_state:
895
+ st.session_state.Sim_Winner_Frame = pd.DataFrame(columns=['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'User/Field', 'Salary', 'Projection', 'Own', 'Fantasy', 'GPP_Proj'])
896
+ if 'Sim_Winner_Export' not in st.session_state:
897
+ st.session_state.Sim_Winner_Export = pd.DataFrame(columns=['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'User/Field', 'Salary', 'Projection', 'Own', 'Fantasy', 'GPP_Proj'])
898
+ if 'player_freq' not in st.session_state:
899
+ st.session_state.player_freq = pd.DataFrame(columns=['Player', 'Position', 'Team', 'Salary', 'Proj Own', 'Exposure', 'Edge'])
900
+ if 'qb_freq' not in st.session_state:
901
+ st.session_state.qb_freq = pd.DataFrame(columns=['Player', 'Position', 'Team', 'Salary', 'Proj Own', 'Exposure', 'Edge'])
902
+ if 'rb_freq' not in st.session_state:
903
+ st.session_state.rb_freq = pd.DataFrame(columns=['Player', 'Position', 'Team', 'Salary', 'Proj Own', 'Exposure', 'Edge'])
904
+ if 'wr_freq' not in st.session_state:
905
+ st.session_state.wr_freq = pd.DataFrame(columns=['Player', 'Position', 'Team', 'Salary', 'Proj Own', 'Exposure', 'Edge'])
906
+ if 'te_freq' not in st.session_state:
907
+ st.session_state.te_freq = pd.DataFrame(columns=['Player', 'Position', 'Team', 'Salary', 'Proj Own', 'Exposure', 'Edge'])
908
+ if 'flex_freq' not in st.session_state:
909
+ st.session_state.flex_freq = pd.DataFrame(columns=['Player', 'Position', 'Team', 'Salary', 'Proj Own', 'Exposure', 'Edge'])
910
+ if 'dst_freq' not in st.session_state:
911
+ st.session_state.dst_freq = pd.DataFrame(columns=['Player', 'Position', 'Team', 'Salary', 'Proj Own', 'Exposure', 'Edge'])
912
  with col2:
913
+ with st.container():
914
+ if st.button("Simulate Contest"):
915
+ try:
916
+ del dst_freq
917
+ del flex_freq
918
+ del te_freq
919
+ del wr_freq
920
+ del rb_freq
921
+ del qb_freq
922
+ del player_freq
923
+ del Sim_Winner_Export
924
+ del Sim_Winner_Frame
925
+ except:
926
+ pass
927
+ with st.container():
928
+ st.write('Contest Simulation Starting')
929
+ seed_depth1 = 10
930
+ Total_Runs = 1000000
931
+ if Contest_Size <= 1000:
932
+ strength_grow = .01
933
+ elif Contest_Size > 1000 and Contest_Size <= 2500:
934
+ strength_grow = .025
935
+ elif Contest_Size > 2500 and Contest_Size <= 5000:
936
+ strength_grow = .05
937
+ elif Contest_Size > 5000 and Contest_Size <= 20000:
938
+ strength_grow = .075
939
+ elif Contest_Size > 20000:
940
+ strength_grow = .1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
941
 
942
+ field_growth = 100 * strength_grow
943
+
944
+ Sort_function = 'Median'
945
+ if Sort_function == 'Median':
946
+ Sim_function = 'Projection'
947
+ elif Sort_function == 'Own':
948
+ Sim_function = 'Own'
949
+
950
+ if slate_var1 == 'User':
951
+ OwnFrame = proj_dataframe
952
+ if contest_var1 == 'Small':
953
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (10 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
954
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (5 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
955
+ OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
956
+ OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
957
+ if contest_var1 == 'Medium':
958
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (6 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
959
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (3 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
960
+ OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
961
+ OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
962
+ if contest_var1 == 'Large':
963
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (3 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
964
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (1.5 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
965
+ OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
966
+ OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
967
+ Overall_Proj = OwnFrame[['Player', 'Team', 'Position', 'Median', 'Own', 'Salary']]
968
 
969
+ del OwnFrame
 
 
 
 
 
 
 
 
970
 
971
+ elif slate_var1 != 'User':
972
+ initial_proj = raw_baselines
973
+ drop_frame = initial_proj.drop_duplicates(subset = 'Player',keep = 'first')
974
+ OwnFrame = drop_frame[['Player', 'Team', 'Position', 'Median', 'Own', 'Floor', 'Ceiling', 'Salary']]
975
+ if contest_var1 == 'Small':
976
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (10 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
977
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (5 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
978
+ OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
979
+ OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
980
+ if contest_var1 == 'Medium':
981
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (6 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
982
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (3 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
983
+ OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
984
+ OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
985
+ if contest_var1 == 'Large':
986
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] == 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (3 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] == 'QB', 'Own'].mean(), OwnFrame['Own'])
987
+ OwnFrame['Own%'] = np.where((OwnFrame['Position'] != 'QB') & (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean() >= 0), OwnFrame['Own'] * (1.5 * (OwnFrame['Own'] - OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean())/100) + OwnFrame.loc[OwnFrame['Position'] != 'QB', 'Own'].mean(), OwnFrame['Own%'])
988
+ OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
989
+ OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
990
+ Overall_Proj = OwnFrame[['Player', 'Team', 'Position', 'Median', 'Own', 'Salary']]
991
 
992
+ del initial_proj
993
+ del drop_frame
994
+ del OwnFrame
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
995
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
996
  if insert_port == 1:
997
+ UserPortfolio = portfolio_dataframe[['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']]
998
  elif insert_port == 0:
999
+ UserPortfolio = pd.DataFrame(columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST'])
1000
+
1001
+ Overall_Proj.replace('', np.nan, inplace=True)
1002
+ Overall_Proj = Overall_Proj.dropna(subset=['Median'])
1003
+ Overall_Proj = Overall_Proj.assign(Value=lambda x: (x.Median / (x.Salary / 1000)))
1004
+ Overall_Proj['Sort_var'] = (Overall_Proj['Median'].rank(ascending=False) + Overall_Proj['Value'].rank(ascending=False)) / 2
1005
+ Overall_Proj = Overall_Proj.sort_values(by='Sort_var', ascending=False)
1006
+ Overall_Proj['Own'] = np.where((Overall_Proj['Median'] > 0) & (Overall_Proj['Own'] == 0), 1, Overall_Proj['Own'])
1007
+ Overall_Proj = Overall_Proj.loc[Overall_Proj['Own'] > 0]
1008
+
1009
+ Overall_Proj['Floor'] = np.where(Overall_Proj['Position'] == 'QB', Overall_Proj['Median'] * .5, Overall_Proj['Median'] * .25)
1010
+ Overall_Proj['Ceiling'] = np.where(Overall_Proj['Position'] == 'WR', Overall_Proj['Median'] + Overall_Proj['Median'], Overall_Proj['Median'] + Overall_Proj['Floor'])
1011
+ Overall_Proj['STDev'] = Overall_Proj['Median'] / 4
1012
+
1013
+ Teams_used = Overall_Proj['Team'].drop_duplicates().reset_index(drop=True)
1014
+ Teams_used = Teams_used.reset_index()
1015
+ Teams_used['team_item'] = Teams_used['index'] + 1
1016
+ Teams_used = Teams_used.drop(columns=['index'])
1017
+ Teams_used_dictraw = Teams_used.drop(columns=['team_item'])
1018
+ Teams_used_dict = Teams_used_dictraw.to_dict()
1019
+
1020
+ del Teams_used_dictraw
1021
+
1022
+ team_list = Teams_used['Team'].to_list()
1023
+ item_list = Teams_used['team_item'].to_list()
1024
+
1025
+ FieldStrength_raw = Strength_var + ((30 - len(Teams_used)) * .01)
1026
+ FieldStrength = FieldStrength_raw - (FieldStrength_raw * (20000 / Contest_Size))
1027
+
1028
+ del FieldStrength_raw
1029
+
1030
+ if FieldStrength < 0:
1031
+ FieldStrength = Strength_var
1032
+ field_split = Strength_var
1033
+
1034
+ for checkVar in range(len(team_list)):
1035
+ Overall_Proj['Team'] = Overall_Proj['Team'].replace(team_list, item_list)
1036
+
1037
+ qbs_raw = Overall_Proj[Overall_Proj.Position == 'QB']
1038
+ qbs_raw.dropna(subset=['Median']).reset_index(drop=True)
1039
+ qbs_raw = qbs_raw.reset_index(drop=True)
1040
+ qbs_raw = qbs_raw.sort_values(by=['Median'], ascending=False)
1041
+
1042
+ qbs = qbs_raw.head(round(len(qbs_raw)))
1043
+ qbs = qbs.assign(Var = range(0,len(qbs)))
1044
+ qb_dict = pd.Series(qbs.Player.values, index=qbs.Var).to_dict()
1045
+
1046
+ defs_raw = Overall_Proj[Overall_Proj.Position.str.contains("D")]
1047
+ defs_raw.dropna(subset=['Median']).reset_index(drop=True)
1048
+ defs_raw = defs_raw.reset_index(drop=True)
1049
+ defs_raw = defs_raw.sort_values(by=['Own', 'Value'], ascending=False)
1050
+
1051
+ defs = defs_raw.head(round(len(defs_raw)))
1052
+ defs = defs.assign(Var = range(0,len(defs)))
1053
+ def_dict = pd.Series(defs.Player.values, index=defs.Var).to_dict()
1054
+
1055
+ rbs_raw = Overall_Proj[Overall_Proj.Position == 'RB']
1056
+ rbs_raw.dropna(subset=['Median']).reset_index(drop=True)
1057
+ rbs_raw = rbs_raw.reset_index(drop=True)
1058
+ rbs_raw = rbs_raw.sort_values(by=['Own', 'Value'], ascending=False)
1059
+
1060
+ wrs_raw = Overall_Proj[Overall_Proj.Position == 'WR']
1061
+ wrs_raw.dropna(subset=['Median']).reset_index(drop=True)
1062
+ wrs_raw = wrs_raw.reset_index(drop=True)
1063
+ wrs_raw = wrs_raw.sort_values(by=['Own', 'Median'], ascending=False)
1064
+
1065
+ tes_raw = Overall_Proj[Overall_Proj.Position == 'TE']
1066
+ tes_raw.dropna(subset=['Median']).reset_index(drop=True)
1067
+ tes_raw = tes_raw.reset_index(drop=True)
1068
+ tes_raw = tes_raw.sort_values(by=['Own', 'Value'], ascending=False)
1069
+
1070
+ pos_players = pd.concat([rbs_raw, wrs_raw, tes_raw])
1071
+ pos_players.dropna(subset=['Median']).reset_index(drop=True)
1072
+ pos_players = pos_players.reset_index(drop=True)
1073
+
1074
+ del qbs_raw
1075
+ del defs_raw
1076
+ del rbs_raw
1077
+ del wrs_raw
1078
+ del tes_raw
1079
+
1080
+ if insert_port == 1:
1081
+ try:
1082
+ # Initialize an empty DataFrame for Raw Portfolio
1083
+ Raw_Portfolio = pd.DataFrame()
1084
+
1085
+ # Loop through each position and split the data accordingly
1086
+ positions = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
1087
+ for pos in positions:
1088
+ temp_df = UserPortfolio[pos].str.split("(", n=1, expand=True)
1089
+ temp_df.columns = [pos, 'Drop']
1090
+ Raw_Portfolio = pd.concat([Raw_Portfolio, temp_df], axis=1)
1091
+
1092
+ # Select only necessary columns and strip white spaces
1093
+ CleanPortfolio = Raw_Portfolio[positions].apply(lambda x: x.str.strip())
1094
+ CleanPortfolio.reset_index(inplace=True)
1095
+ CleanPortfolio['User/Field'] = CleanPortfolio['index'] + 1
1096
+ CleanPortfolio.drop(columns=['index'], inplace=True)
1097
+
1098
+ CleanPortfolio.replace('', np.nan, inplace=True)
1099
+ CleanPortfolio.dropna(subset=['QB'], inplace=True)
1100
+
1101
+ # Create frequency table for players
1102
+ cleaport_players = pd.DataFrame(
1103
+ np.column_stack(np.unique(CleanPortfolio.iloc[:, 0:9].values, return_counts=True)),
1104
+ columns=['Player', 'Freq']
1105
+ ).sort_values('Freq', ascending=False).reset_index(drop=True)
1106
+ cleaport_players['Freq'] = cleaport_players['Freq'].astype(int)
1107
+
1108
+ # Merge and update nerf_frame
1109
+ nerf_frame = pd.merge(cleaport_players, Overall_Proj, on='Player', how='left')
1110
+ for col in ['Median', 'Floor', 'Ceiling', 'STDev']:
1111
+ nerf_frame[col] *= 0.90
1112
+ del Raw_Portfolio
1113
+ except:
1114
+ CleanPortfolio = UserPortfolio.reset_index()
1115
+ CleanPortfolio['User/Field'] = CleanPortfolio['index'] + 1
1116
+ CleanPortfolio.drop(columns=['index'], inplace=True)
1117
+
1118
+ # Replace empty strings and drop rows with NaN in 'QB' column
1119
+ CleanPortfolio.replace('', np.nan, inplace=True)
1120
+ CleanPortfolio.dropna(subset=['QB'], inplace=True)
1121
+
1122
+ # Create frequency table for players
1123
+ cleaport_players = pd.DataFrame(
1124
+ np.column_stack(np.unique(CleanPortfolio.iloc[:, 0:9].values, return_counts=True)),
1125
+ columns=['Player', 'Freq']
1126
+ ).sort_values('Freq', ascending=False).reset_index(drop=True)
1127
+ cleaport_players['Freq'] = cleaport_players['Freq'].astype(int)
1128
+
1129
+ # Merge and update nerf_frame
1130
+ nerf_frame = pd.merge(cleaport_players, Overall_Proj, on='Player', how='left')
1131
+ for col in ['Median', 'Floor', 'Ceiling', 'STDev']:
1132
+ nerf_frame[col] *= 0.90
1133
+
1134
+ elif insert_port == 0:
1135
+ CleanPortfolio = UserPortfolio
1136
+ cleaport_players = pd.DataFrame(np.column_stack(np.unique(CleanPortfolio.iloc[:,0:9].values, return_counts=True)),
1137
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1138
+ cleaport_players['Freq'] = cleaport_players['Freq'].astype(int)
1139
+ nerf_frame = Overall_Proj
1140
 
1141
+ ref_dict = {
1142
+ 'pos':['RB', 'WR', 'TE', 'FLEX'],
1143
+ 'pos_dfs':['RB_Table', 'WR_Table', 'TE_Table', 'FLEX_Table'],
1144
+ 'pos_dicts':['rb_dict', 'wr_dict', 'te_dict', 'flex_dict']
1145
+ }
 
 
1146
 
1147
+ maps_dict = {
1148
+ 'Floor_map':dict(zip(Overall_Proj.Player,Overall_Proj.Floor)),
1149
+ 'Projection_map':dict(zip(Overall_Proj.Player,Overall_Proj.Median)),
1150
+ 'Ceiling_map':dict(zip(Overall_Proj.Player,Overall_Proj.Ceiling)),
1151
+ 'Salary_map':dict(zip(Overall_Proj.Player,Overall_Proj.Salary)),
1152
+ 'Pos_map':dict(zip(Overall_Proj.Player,Overall_Proj.Position)),
1153
+ 'Own_map':dict(zip(Overall_Proj.Player,Overall_Proj.Own)),
1154
+ 'Team_map':dict(zip(Overall_Proj.Player,Overall_Proj.Team)),
1155
+ 'STDev_map':dict(zip(Overall_Proj.Player,Overall_Proj.STDev)),
1156
+ 'team_check_map':dict(zip(Overall_Proj.Player,Overall_Proj.Team))
1157
+ }
1158
+
1159
+ up_dict = {
1160
+ 'Floor_map':dict(zip(cleaport_players.Player,nerf_frame.Floor)),
1161
+ 'Projection_map':dict(zip(cleaport_players.Player,nerf_frame.Median)),
1162
+ 'Ceiling_map':dict(zip(cleaport_players.Player,nerf_frame.Ceiling)),
1163
+ 'Salary_map':dict(zip(cleaport_players.Player,nerf_frame.Salary)),
1164
+ 'Pos_map':dict(zip(cleaport_players.Player,nerf_frame.Position)),
1165
+ 'Own_map':dict(zip(cleaport_players.Player,nerf_frame.Own)),
1166
+ 'Team_map':dict(zip(cleaport_players.Player,nerf_frame.Team)),
1167
+ 'STDev_map':dict(zip(cleaport_players.Player,nerf_frame.STDev)),
1168
+ 'team_check_map':dict(zip(cleaport_players.Player,nerf_frame.Team))
1169
+ }
1170
+
1171
+ del cleaport_players
1172
+ del Overall_Proj
1173
+ del nerf_frame
1174
+
1175
+ st.write('Seed frame creation')
1176
+ FinalPortfolio, maps_dict = run_seed_frame(seed_depth1, Strength_var, strength_grow, Teams_used, Total_Runs)
1177
+
1178
+ Sim_size = linenum_var1
1179
+ SimVar = 1
1180
+ Sim_Winners = []
1181
+ fp_array = FinalPortfolio.values
1182
+
1183
  if insert_port == 1:
1184
+ up_array = CleanPortfolio.values
1185
+
1186
+ # Pre-vectorize functions
1187
+ vec_projection_map = np.vectorize(maps_dict['Projection_map'].__getitem__)
1188
+ vec_stdev_map = np.vectorize(maps_dict['STDev_map'].__getitem__)
1189
+
1190
+ if insert_port == 1:
1191
+ vec_up_projection_map = np.vectorize(up_dict['Projection_map'].__getitem__)
1192
+ vec_up_stdev_map = np.vectorize(up_dict['STDev_map'].__getitem__)
1193
+
1194
+ st.write('Simulating contest on frames')
1195
+
1196
+ while SimVar <= Sim_size:
1197
+ if insert_port == 1:
1198
+ fp_random = fp_array[np.random.choice(fp_array.shape[0], Contest_Size-len(CleanPortfolio))]
1199
+ elif insert_port == 0:
1200
+ fp_random = fp_array[np.random.choice(fp_array.shape[0], Contest_Size)]
1201
+
1202
+ sample_arrays1 = np.c_[
1203
+ fp_random,
1204
  np.sum(np.random.normal(
1205
+ loc=vec_projection_map(fp_random[:, :-5]),
1206
+ scale=vec_stdev_map(fp_random[:, :-5])),
1207
  axis=1)
1208
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1209
 
1210
+ if insert_port == 1:
1211
+ sample_arrays2 = np.c_[
1212
+ up_array,
1213
+ np.sum(np.random.normal(
1214
+ loc=vec_up_projection_map(up_array[:, :-5]),
1215
+ scale=vec_up_stdev_map(up_array[:, :-5])),
1216
+ axis=1)
1217
+ ]
1218
+ sample_arrays = np.vstack((sample_arrays1, sample_arrays2))
1219
+ else:
1220
+ sample_arrays = sample_arrays1
 
 
1221
 
1222
+ final_array = sample_arrays[sample_arrays[:, 10].argsort()[::-1]]
1223
+ best_lineup = final_array[final_array[:, -1].argsort(kind='stable')[::-1][:1]]
1224
+ Sim_Winners.append(best_lineup)
1225
+ SimVar += 1
1226
+
1227
+
1228
+ # del smple_arrays
1229
+ # del smple_arrays1
1230
+ # del smple_arrays2
1231
+ # del final_array
1232
+ # del best_lineup
1233
+ st.write('Contest simulation complete')
1234
+ # Initial setup
1235
+ Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=FinalPortfolio.columns.tolist() + ['Fantasy'])
1236
+ Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['Projection'] + Sim_Winner_Frame['Fantasy']) / 2
1237
+
1238
+ # Type Casting
1239
+ type_cast_dict = {'Salary': int, 'Projection': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float16}
1240
+ Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)
1241
+
1242
+ # Sorting
1243
+ st.session_state.Sim_Winner_Frame = Sim_Winner_Frame.sort_values(by='GPP_Proj', ascending=False)
1244
+
1245
+ # Data Copying
1246
+ st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()
1247
+
1248
+ # Conditional Replacement
1249
+ columns_to_replace = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
1250
+
1251
+ if site_var1 == 'Draftkings':
1252
+ replace_dict = dkid_dict
1253
+ elif site_var1 == 'Fanduel':
1254
+ replace_dict = fdid_dict
1255
+
1256
+ for col in columns_to_replace:
1257
+ st.session_state.Sim_Winner_Export[col].replace(replace_dict, inplace=True)
1258
+
1259
+
1260
+ player_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,0:9].values, return_counts=True)),
1261
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1262
+ player_freq['Freq'] = player_freq['Freq'].astype(int)
1263
+ player_freq['Position'] = player_freq['Player'].map(maps_dict['Pos_map'])
1264
+ player_freq['Salary'] = player_freq['Player'].map(maps_dict['Salary_map'])
1265
+ player_freq['Proj Own'] = player_freq['Player'].map(maps_dict['Own_map']) / 100
1266
+ player_freq['Exposure'] = player_freq['Freq']/(Sim_size)
1267
+ player_freq['Edge'] = player_freq['Exposure'] - player_freq['Proj Own']
1268
+ player_freq['Team'] = player_freq['Player'].map(maps_dict['Team_map'])
1269
+ for checkVar in range(len(team_list)):
1270
+ player_freq['Team'] = player_freq['Team'].replace(item_list, team_list)
1271
+
1272
+ st.session_state.player_freq = player_freq[['Player', 'Position', 'Team', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1273
+
1274
+ qb_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,0:1].values, return_counts=True)),
1275
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1276
+ qb_freq['Freq'] = qb_freq['Freq'].astype(int)
1277
+ qb_freq['Position'] = qb_freq['Player'].map(maps_dict['Pos_map'])
1278
+ qb_freq['Salary'] = qb_freq['Player'].map(maps_dict['Salary_map'])
1279
+ qb_freq['Proj Own'] = qb_freq['Player'].map(maps_dict['Own_map']) / 100
1280
+ qb_freq['Exposure'] = qb_freq['Freq']/(Sim_size)
1281
+ qb_freq['Edge'] = qb_freq['Exposure'] - qb_freq['Proj Own']
1282
+ qb_freq['Team'] = qb_freq['Player'].map(maps_dict['Team_map'])
1283
+ for checkVar in range(len(team_list)):
1284
+ qb_freq['Team'] = qb_freq['Team'].replace(item_list, team_list)
1285
+
1286
+ st.session_state.qb_freq = qb_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1287
+
1288
+ rb_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,[1, 2]].values, return_counts=True)),
1289
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1290
+ rb_freq['Freq'] = rb_freq['Freq'].astype(int)
1291
+ rb_freq['Position'] = rb_freq['Player'].map(maps_dict['Pos_map'])
1292
+ rb_freq['Salary'] = rb_freq['Player'].map(maps_dict['Salary_map'])
1293
+ rb_freq['Proj Own'] = rb_freq['Player'].map(maps_dict['Own_map']) / 100
1294
+ rb_freq['Exposure'] = rb_freq['Freq']/Sim_size
1295
+ rb_freq['Edge'] = rb_freq['Exposure'] - rb_freq['Proj Own']
1296
+ rb_freq['Team'] = rb_freq['Player'].map(maps_dict['Team_map'])
1297
+ for checkVar in range(len(team_list)):
1298
+ rb_freq['Team'] = rb_freq['Team'].replace(item_list, team_list)
1299
+
1300
+ st.session_state.rb_freq = rb_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1301
+
1302
+ wr_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,[3, 4, 5]].values, return_counts=True)),
1303
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1304
+ wr_freq['Freq'] = wr_freq['Freq'].astype(int)
1305
+ wr_freq['Position'] = wr_freq['Player'].map(maps_dict['Pos_map'])
1306
+ wr_freq['Salary'] = wr_freq['Player'].map(maps_dict['Salary_map'])
1307
+ wr_freq['Proj Own'] = wr_freq['Player'].map(maps_dict['Own_map']) / 100
1308
+ wr_freq['Exposure'] = wr_freq['Freq']/Sim_size
1309
+ wr_freq['Edge'] = wr_freq['Exposure'] - wr_freq['Proj Own']
1310
+ wr_freq['Team'] = wr_freq['Player'].map(maps_dict['Team_map'])
1311
+ for checkVar in range(len(team_list)):
1312
+ wr_freq['Team'] = wr_freq['Team'].replace(item_list, team_list)
1313
+
1314
+ st.session_state.wr_freq = wr_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1315
+
1316
+ te_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,[6]].values, return_counts=True)),
1317
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1318
+ te_freq['Freq'] = te_freq['Freq'].astype(int)
1319
+ te_freq['Position'] = te_freq['Player'].map(maps_dict['Pos_map'])
1320
+ te_freq['Salary'] = te_freq['Player'].map(maps_dict['Salary_map'])
1321
+ te_freq['Proj Own'] = te_freq['Player'].map(maps_dict['Own_map']) / 100
1322
+ te_freq['Exposure'] = te_freq['Freq']/Sim_size
1323
+ te_freq['Edge'] = te_freq['Exposure'] - te_freq['Proj Own']
1324
+ te_freq['Team'] = te_freq['Player'].map(maps_dict['Team_map'])
1325
+ for checkVar in range(len(team_list)):
1326
+ te_freq['Team'] = te_freq['Team'].replace(item_list, team_list)
1327
+
1328
+ st.session_state.te_freq = te_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1329
+
1330
+ flex_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,[7]].values, return_counts=True)),
1331
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1332
+ flex_freq['Freq'] = flex_freq['Freq'].astype(int)
1333
+ flex_freq['Position'] = flex_freq['Player'].map(maps_dict['Pos_map'])
1334
+ flex_freq['Salary'] = flex_freq['Player'].map(maps_dict['Salary_map'])
1335
+ flex_freq['Proj Own'] = flex_freq['Player'].map(maps_dict['Own_map']) / 100
1336
+ flex_freq['Exposure'] = flex_freq['Freq']/Sim_size
1337
+ flex_freq['Edge'] = flex_freq['Exposure'] - flex_freq['Proj Own']
1338
+ flex_freq['Team'] = flex_freq['Player'].map(maps_dict['Team_map'])
1339
+ for checkVar in range(len(team_list)):
1340
+ flex_freq['Team'] = flex_freq['Team'].replace(item_list, team_list)
1341
+
1342
+ st.session_state.flex_freq = flex_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1343
+
1344
+ dst_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,8:9].values, return_counts=True)),
1345
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1346
+ dst_freq['Freq'] = dst_freq['Freq'].astype(int)
1347
+ dst_freq['Position'] = dst_freq['Player'].map(maps_dict['Pos_map'])
1348
+ dst_freq['Salary'] = dst_freq['Player'].map(maps_dict['Salary_map'])
1349
+ dst_freq['Proj Own'] = dst_freq['Player'].map(maps_dict['Own_map']) / 100
1350
+ dst_freq['Exposure'] = dst_freq['Freq']/Sim_size
1351
+ dst_freq['Edge'] = dst_freq['Exposure'] - dst_freq['Proj Own']
1352
+ dst_freq['Team'] = dst_freq['Player'].map(maps_dict['Team_map'])
1353
+ for checkVar in range(len(team_list)):
1354
+ dst_freq['Team'] = dst_freq['Team'].replace(item_list, team_list)
1355
+
1356
+ st.session_state.dst_freq = dst_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1357
 
1358
+ with st.container():
1359
+ simulate_container = st.empty()
1360
+ player_split_var2 = st.radio("Are you wanting to isolate any lineups with specific players?", ('Full Players', 'Specific Players'))
1361
+ if player_split_var2 == 'Specific Players':
1362
+ find_var2 = st.multiselect('Which players must be included in the lineups?', options = st.session_state.player_freq['Player'].unique())
1363
+ elif player_split_var2 == 'Full Players':
1364
+ find_var2 = st.session_state.player_freq.Player.values.tolist()
 
 
 
 
1365
 
1366
+ if player_split_var2 == 'Specific Players':
1367
+ st.session_state.Sim_Winner_Display = st.session_state.Sim_Winner_Frame[np.equal.outer(st.session_state.Sim_Winner_Frame.to_numpy(copy=False), find_var2).any(axis=1).all(axis=1)]
1368
+ if player_split_var2 == 'Full Players':
1369
+ st.session_state.Sim_Winner_Display = st.session_state.Sim_Winner_Frame
1370
+ st.dataframe(st.session_state.Sim_Winner_Display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').background_gradient(cmap='RdYlGn_r', subset=['Own']).format(precision=2), use_container_width = True)
1371
+
1372
  st.download_button(
1373
  label="Export Tables",
1374
+ data=convert_df_to_csv(st.session_state.Sim_Winner_Export),
1375
  file_name='NFL_consim_export.csv',
1376
  mime='text/csv',
1377
  )
1378
+
1379
+ with st.container():
1380
+ freq_container = st.empty()
1381
+ tab1, tab2, tab3, tab4, tab5, tab6, tab7 = st.tabs(['Overall Exposures', 'QB Exposures', 'RB Exposures', 'WR Exposures', 'TE Exposures', 'FLEX Exposures', 'DST Exposures'])
1382
+ with tab1:
1383
+ st.dataframe(st.session_state.player_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1384
+ st.download_button(
1385
+ label="Export Exposures",
1386
+ data=convert_df_to_csv(st.session_state.player_freq),
1387
+ file_name='player_freq_export.csv',
1388
+ mime='text/csv',
1389
+ )
1390
+ with tab2:
1391
+ st.dataframe(st.session_state.qb_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1392
+ st.download_button(
1393
+ label="Export Exposures",
1394
+ data=convert_df_to_csv(st.session_state.qb_freq),
1395
+ file_name='qb_freq_export.csv',
1396
+ mime='text/csv',
1397
+ )
1398
+ with tab3:
1399
+ st.dataframe(st.session_state.rb_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1400
+ st.download_button(
1401
+ label="Export Exposures",
1402
+ data=convert_df_to_csv(st.session_state.rb_freq),
1403
+ file_name='rb_freq_export.csv',
1404
+ mime='text/csv',
1405
+ )
1406
+ with tab4:
1407
+ st.dataframe(st.session_state.wr_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1408
+ st.download_button(
1409
+ label="Export Exposures",
1410
+ data=convert_df_to_csv(st.session_state.wr_freq),
1411
+ file_name='wr_freq_export.csv',
1412
+ mime='text/csv',
1413
+ )
1414
+ with tab5:
1415
+ st.dataframe(st.session_state.te_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1416
+ st.download_button(
1417
+ label="Export Exposures",
1418
+ data=convert_df_to_csv(st.session_state.te_freq),
1419
+ file_name='te_freq_export.csv',
1420
+ mime='text/csv',
1421
+ )
1422
+ with tab6:
1423
+ st.dataframe(st.session_state.flex_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1424
+ st.download_button(
1425
+ label="Export Exposures",
1426
+ data=convert_df_to_csv(st.session_state.flex_freq),
1427
+ file_name='flex_freq_export.csv',
1428
+ mime='text/csv',
1429
+ )
1430
+ with tab7:
1431
+ st.dataframe(st.session_state.dst_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1432
+ st.download_button(
1433
+ label="Export Exposures",
1434
+ data=convert_df_to_csv(st.session_state.dst_freq),
1435
+ file_name='dst_freq_export.csv',
1436
+ mime='text/csv',
1437
+ )