Multichem commited on
Commit
fb646ac
·
1 Parent(s): c9cda4a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +493 -492
app.py CHANGED
@@ -889,517 +889,518 @@ with tab2:
889
  scaling_var = 15
890
 
891
  with col2:
892
- if st.button("Simulate Contest"):
893
- try:
894
- del dst_freq
895
- del flex_freq
896
- del te_freq
897
- del wr_freq
898
- del rb_freq
899
- del qb_freq
900
- del player_freq
901
- del Sim_Winner_Export
902
- del Sim_Winner_Frame
903
- except:
904
- pass
905
- with st.container():
906
- st.write('Contest Simulation Starting')
907
- seed_depth1 = 10
908
- Total_Runs = 1000000
909
- if Contest_Size <= 1000:
910
- strength_grow = .01
911
- elif Contest_Size > 1000 and Contest_Size <= 2500:
912
- strength_grow = .025
913
- elif Contest_Size > 2500 and Contest_Size <= 5000:
914
- strength_grow = .05
915
- elif Contest_Size > 5000 and Contest_Size <= 20000:
916
- strength_grow = .075
917
- elif Contest_Size > 20000:
918
- strength_grow = .1
919
-
920
- field_growth = 100 * strength_grow
921
-
922
- Sort_function = 'Median'
923
- if Sort_function == 'Median':
924
- Sim_function = 'Projection'
925
- elif Sort_function == 'Own':
926
- Sim_function = 'Own'
927
-
928
- if slate_var1 == 'User':
929
- OwnFrame = proj_dataframe
930
- if contest_var1 == 'Small':
931
- 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'])
932
- 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%'])
933
- OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
934
- OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
935
- if contest_var1 == 'Medium':
936
- 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'])
937
- 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%'])
938
- OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
939
- OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
940
- if contest_var1 == 'Large':
941
- 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'])
942
- 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%'])
943
- OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
944
- OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
945
- Overall_Proj = OwnFrame[['Player', 'Team', 'Position', 'Median', 'Own', 'Salary']]
946
-
947
- del OwnFrame
948
-
949
- elif slate_var1 != 'User':
950
- initial_proj = raw_baselines
951
- drop_frame = initial_proj.drop_duplicates(subset = 'Player',keep = 'first')
952
- OwnFrame = drop_frame[['Player', 'Team', 'Position', 'Median', 'Own', 'Floor', 'Ceiling', 'Salary']]
953
- if contest_var1 == 'Small':
954
- 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'])
955
- 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%'])
956
- OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
957
- OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
958
- if contest_var1 == 'Medium':
959
- 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'])
960
- 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%'])
961
- OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
962
- OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
963
- if contest_var1 == 'Large':
964
- 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'])
965
- 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%'])
966
- OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
967
- OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
968
- Overall_Proj = OwnFrame[['Player', 'Team', 'Position', 'Median', 'Own', 'Salary']]
969
-
970
- del initial_proj
971
- del drop_frame
972
- del OwnFrame
973
-
974
- if insert_port == 1:
975
- UserPortfolio = portfolio_dataframe[['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']]
976
- elif insert_port == 0:
977
- UserPortfolio = pd.DataFrame(columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST'])
978
-
979
- Overall_Proj.replace('', np.nan, inplace=True)
980
- Overall_Proj = Overall_Proj.dropna(subset=['Median'])
981
- Overall_Proj = Overall_Proj.assign(Value=lambda x: (x.Median / (x.Salary / 1000)))
982
- Overall_Proj['Sort_var'] = (Overall_Proj['Median'].rank(ascending=False) + Overall_Proj['Value'].rank(ascending=False)) / 2
983
- Overall_Proj = Overall_Proj.sort_values(by='Sort_var', ascending=False)
984
- Overall_Proj['Own'] = np.where((Overall_Proj['Median'] > 0) & (Overall_Proj['Own'] == 0), 1, Overall_Proj['Own'])
985
- Overall_Proj = Overall_Proj.loc[Overall_Proj['Own'] > 0]
986
-
987
- Overall_Proj['Floor'] = np.where(Overall_Proj['Position'] == 'QB', Overall_Proj['Median'] * .5, Overall_Proj['Median'] * .25)
988
- Overall_Proj['Ceiling'] = np.where(Overall_Proj['Position'] == 'WR', Overall_Proj['Median'] + Overall_Proj['Median'], Overall_Proj['Median'] + Overall_Proj['Floor'])
989
- Overall_Proj['STDev'] = Overall_Proj['Median'] / 4
990
-
991
- Teams_used = Overall_Proj['Team'].drop_duplicates().reset_index(drop=True)
992
- Teams_used = Teams_used.reset_index()
993
- Teams_used['team_item'] = Teams_used['index'] + 1
994
- Teams_used = Teams_used.drop(columns=['index'])
995
- Teams_used_dictraw = Teams_used.drop(columns=['team_item'])
996
- Teams_used_dict = Teams_used_dictraw.to_dict()
997
-
998
- del Teams_used_dictraw
999
-
1000
- team_list = Teams_used['Team'].to_list()
1001
- item_list = Teams_used['team_item'].to_list()
1002
-
1003
- FieldStrength_raw = Strength_var + ((30 - len(Teams_used)) * .01)
1004
- FieldStrength = FieldStrength_raw - (FieldStrength_raw * (20000 / Contest_Size))
1005
-
1006
- del FieldStrength_raw
1007
-
1008
- if FieldStrength < 0:
1009
- FieldStrength = Strength_var
1010
- field_split = Strength_var
1011
-
1012
- for checkVar in range(len(team_list)):
1013
- Overall_Proj['Team'] = Overall_Proj['Team'].replace(team_list, item_list)
1014
-
1015
- qbs_raw = Overall_Proj[Overall_Proj.Position == 'QB']
1016
- qbs_raw.dropna(subset=['Median']).reset_index(drop=True)
1017
- qbs_raw = qbs_raw.reset_index(drop=True)
1018
- qbs_raw = qbs_raw.sort_values(by=['Median'], ascending=False)
1019
-
1020
- qbs = qbs_raw.head(round(len(qbs_raw)))
1021
- qbs = qbs.assign(Var = range(0,len(qbs)))
1022
- qb_dict = pd.Series(qbs.Player.values, index=qbs.Var).to_dict()
1023
-
1024
- defs_raw = Overall_Proj[Overall_Proj.Position.str.contains("D")]
1025
- defs_raw.dropna(subset=['Median']).reset_index(drop=True)
1026
- defs_raw = defs_raw.reset_index(drop=True)
1027
- defs_raw = defs_raw.sort_values(by=['Own', 'Value'], ascending=False)
1028
-
1029
- defs = defs_raw.head(round(len(defs_raw)))
1030
- defs = defs.assign(Var = range(0,len(defs)))
1031
- def_dict = pd.Series(defs.Player.values, index=defs.Var).to_dict()
1032
-
1033
- rbs_raw = Overall_Proj[Overall_Proj.Position == 'RB']
1034
- rbs_raw.dropna(subset=['Median']).reset_index(drop=True)
1035
- rbs_raw = rbs_raw.reset_index(drop=True)
1036
- rbs_raw = rbs_raw.sort_values(by=['Own', 'Value'], ascending=False)
1037
-
1038
- wrs_raw = Overall_Proj[Overall_Proj.Position == 'WR']
1039
- wrs_raw.dropna(subset=['Median']).reset_index(drop=True)
1040
- wrs_raw = wrs_raw.reset_index(drop=True)
1041
- wrs_raw = wrs_raw.sort_values(by=['Own', 'Median'], ascending=False)
1042
-
1043
- tes_raw = Overall_Proj[Overall_Proj.Position == 'TE']
1044
- tes_raw.dropna(subset=['Median']).reset_index(drop=True)
1045
- tes_raw = tes_raw.reset_index(drop=True)
1046
- tes_raw = tes_raw.sort_values(by=['Own', 'Value'], ascending=False)
1047
-
1048
- pos_players = pd.concat([rbs_raw, wrs_raw, tes_raw])
1049
- pos_players.dropna(subset=['Median']).reset_index(drop=True)
1050
- pos_players = pos_players.reset_index(drop=True)
1051
-
1052
- del qbs_raw
1053
- del defs_raw
1054
- del rbs_raw
1055
- del wrs_raw
1056
- del tes_raw
1057
-
1058
- if insert_port == 1:
1059
- try:
1060
- # Initialize an empty DataFrame for Raw Portfolio
1061
- Raw_Portfolio = pd.DataFrame()
1062
-
1063
- # Loop through each position and split the data accordingly
1064
- positions = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
1065
- for pos in positions:
1066
- temp_df = UserPortfolio[pos].str.split("(", n=1, expand=True)
1067
- temp_df.columns = [pos, 'Drop']
1068
- Raw_Portfolio = pd.concat([Raw_Portfolio, temp_df], axis=1)
1069
 
1070
- # Select only necessary columns and strip white spaces
1071
- CleanPortfolio = Raw_Portfolio[positions].apply(lambda x: x.str.strip())
1072
- CleanPortfolio.reset_index(inplace=True)
1073
- CleanPortfolio['User/Field'] = CleanPortfolio['index'] + 1
1074
- CleanPortfolio.drop(columns=['index'], inplace=True)
1075
-
1076
- CleanPortfolio.replace('', np.nan, inplace=True)
1077
- CleanPortfolio.dropna(subset=['QB'], inplace=True)
1078
-
1079
- # Create frequency table for players
1080
- cleaport_players = pd.DataFrame(
1081
- np.column_stack(np.unique(CleanPortfolio.iloc[:, 0:9].values, return_counts=True)),
1082
- columns=['Player', 'Freq']
1083
- ).sort_values('Freq', ascending=False).reset_index(drop=True)
1084
- cleaport_players['Freq'] = cleaport_players['Freq'].astype(int)
1085
-
1086
- # Merge and update nerf_frame
1087
- nerf_frame = pd.merge(cleaport_players, Overall_Proj, on='Player', how='left')
1088
- for col in ['Median', 'Floor', 'Ceiling', 'STDev']:
1089
- nerf_frame[col] *= 0.90
1090
- del Raw_Portfolio
1091
- except:
1092
- CleanPortfolio = UserPortfolio.reset_index()
1093
- CleanPortfolio['User/Field'] = CleanPortfolio['index'] + 1
1094
- CleanPortfolio.drop(columns=['index'], inplace=True)
 
1095
 
1096
- # Replace empty strings and drop rows with NaN in 'QB' column
1097
- CleanPortfolio.replace('', np.nan, inplace=True)
1098
- CleanPortfolio.dropna(subset=['QB'], inplace=True)
1099
 
1100
- # Create frequency table for players
1101
- cleaport_players = pd.DataFrame(
1102
- np.column_stack(np.unique(CleanPortfolio.iloc[:, 0:9].values, return_counts=True)),
1103
- columns=['Player', 'Freq']
1104
- ).sort_values('Freq', ascending=False).reset_index(drop=True)
1105
- cleaport_players['Freq'] = cleaport_players['Freq'].astype(int)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1106
 
1107
- # Merge and update nerf_frame
1108
- nerf_frame = pd.merge(cleaport_players, Overall_Proj, on='Player', how='left')
1109
- for col in ['Median', 'Floor', 'Ceiling', 'STDev']:
1110
- nerf_frame[col] *= 0.90
1111
-
1112
- elif insert_port == 0:
1113
- CleanPortfolio = UserPortfolio
1114
- cleaport_players = pd.DataFrame(np.column_stack(np.unique(CleanPortfolio.iloc[:,0:9].values, return_counts=True)),
1115
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1116
- cleaport_players['Freq'] = cleaport_players['Freq'].astype(int)
1117
- nerf_frame = Overall_Proj
1118
 
1119
- ref_dict = {
1120
- 'pos':['RB', 'WR', 'TE', 'FLEX'],
1121
- 'pos_dfs':['RB_Table', 'WR_Table', 'TE_Table', 'FLEX_Table'],
1122
- 'pos_dicts':['rb_dict', 'wr_dict', 'te_dict', 'flex_dict']
1123
- }
1124
-
1125
- maps_dict = {
1126
- 'Floor_map':dict(zip(Overall_Proj.Player,Overall_Proj.Floor)),
1127
- 'Projection_map':dict(zip(Overall_Proj.Player,Overall_Proj.Median)),
1128
- 'Ceiling_map':dict(zip(Overall_Proj.Player,Overall_Proj.Ceiling)),
1129
- 'Salary_map':dict(zip(Overall_Proj.Player,Overall_Proj.Salary)),
1130
- 'Pos_map':dict(zip(Overall_Proj.Player,Overall_Proj.Position)),
1131
- 'Own_map':dict(zip(Overall_Proj.Player,Overall_Proj.Own)),
1132
- 'Team_map':dict(zip(Overall_Proj.Player,Overall_Proj.Team)),
1133
- 'STDev_map':dict(zip(Overall_Proj.Player,Overall_Proj.STDev)),
1134
- 'team_check_map':dict(zip(Overall_Proj.Player,Overall_Proj.Team))
1135
- }
1136
-
1137
- up_dict = {
1138
- 'Floor_map':dict(zip(cleaport_players.Player,nerf_frame.Floor)),
1139
- 'Projection_map':dict(zip(cleaport_players.Player,nerf_frame.Median)),
1140
- 'Ceiling_map':dict(zip(cleaport_players.Player,nerf_frame.Ceiling)),
1141
- 'Salary_map':dict(zip(cleaport_players.Player,nerf_frame.Salary)),
1142
- 'Pos_map':dict(zip(cleaport_players.Player,nerf_frame.Position)),
1143
- 'Own_map':dict(zip(cleaport_players.Player,nerf_frame.Own)),
1144
- 'Team_map':dict(zip(cleaport_players.Player,nerf_frame.Team)),
1145
- 'STDev_map':dict(zip(cleaport_players.Player,nerf_frame.STDev)),
1146
- 'team_check_map':dict(zip(cleaport_players.Player,nerf_frame.Team))
1147
- }
1148
-
1149
- del cleaport_players
1150
- del Overall_Proj
1151
- del nerf_frame
1152
-
1153
- st.write('Seed frame creation')
1154
- FinalPortfolio, maps_dict = run_seed_frame(seed_depth1, Strength_var, strength_grow, Teams_used, Total_Runs)
1155
-
1156
- Sim_size = linenum_var1
1157
- SimVar = 1
1158
- Sim_Winners = []
1159
- fp_array = FinalPortfolio.values
1160
-
1161
- if insert_port == 1:
1162
- up_array = CleanPortfolio.values
1163
-
1164
- # Pre-vectorize functions
1165
- vec_projection_map = np.vectorize(maps_dict['Projection_map'].__getitem__)
1166
- vec_stdev_map = np.vectorize(maps_dict['STDev_map'].__getitem__)
1167
-
1168
- if insert_port == 1:
1169
- vec_up_projection_map = np.vectorize(up_dict['Projection_map'].__getitem__)
1170
- vec_up_stdev_map = np.vectorize(up_dict['STDev_map'].__getitem__)
1171
-
1172
- st.write('Simulating contest on frames')
1173
-
1174
- while SimVar <= Sim_size:
1175
  if insert_port == 1:
1176
- fp_random = fp_array[np.random.choice(fp_array.shape[0], Contest_Size-len(CleanPortfolio))]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1177
  elif insert_port == 0:
1178
- fp_random = fp_array[np.random.choice(fp_array.shape[0], Contest_Size)]
 
 
 
 
1179
 
1180
- sample_arrays1 = np.c_[
1181
- fp_random,
1182
- np.sum(np.random.normal(
1183
- loc=vec_projection_map(fp_random[:, :-5]),
1184
- scale=vec_stdev_map(fp_random[:, :-5])),
1185
- axis=1)
1186
- ]
1187
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1188
  if insert_port == 1:
1189
- sample_arrays2 = np.c_[
1190
- up_array,
 
 
 
 
 
 
 
 
 
 
 
1191
  np.sum(np.random.normal(
1192
- loc=vec_up_projection_map(up_array[:, :-5]),
1193
- scale=vec_up_stdev_map(up_array[:, :-5])),
1194
  axis=1)
1195
  ]
1196
- sample_arrays = np.vstack((sample_arrays1, sample_arrays2))
1197
- else:
1198
- sample_arrays = sample_arrays1
1199
-
1200
- final_array = sample_arrays[sample_arrays[:, 10].argsort()[::-1]]
1201
- best_lineup = final_array[final_array[:, -1].argsort(kind='stable')[::-1][:1]]
1202
- Sim_Winners.append(best_lineup)
1203
- SimVar += 1
1204
-
1205
-
1206
- # del smple_arrays
1207
- # del smple_arrays1
1208
- # del smple_arrays2
1209
- # del final_array
1210
- # del best_lineup
1211
- st.write('Contest simulation complete')
1212
- # Initial setup
1213
- Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=FinalPortfolio.columns.tolist() + ['Fantasy'])
1214
- Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['Projection'] + Sim_Winner_Frame['Fantasy']) / 2
1215
-
1216
- # Type Casting
1217
- type_cast_dict = {'Salary': int, 'Projection': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float16}
1218
- Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)
1219
-
1220
- # Sorting
1221
- Sim_Winner_Frame = Sim_Winner_Frame.sort_values(by='GPP_Proj', ascending=False)
1222
-
1223
- # Data Copying
1224
- Sim_Winner_Export = Sim_Winner_Frame.copy()
1225
-
1226
- # Conditional Replacement
1227
- columns_to_replace = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
1228
-
1229
- if site_var1 == 'Draftkings':
1230
- replace_dict = dkid_dict
1231
- elif site_var1 == 'Fanduel':
1232
- replace_dict = fdid_dict
1233
-
1234
- for col in columns_to_replace:
1235
- Sim_Winner_Export[col].replace(replace_dict, inplace=True)
1236
-
1237
 
1238
- player_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,0:9].values, return_counts=True)),
1239
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1240
- player_freq['Freq'] = player_freq['Freq'].astype(int)
1241
- player_freq['Position'] = player_freq['Player'].map(maps_dict['Pos_map'])
1242
- player_freq['Salary'] = player_freq['Player'].map(maps_dict['Salary_map'])
1243
- player_freq['Proj Own'] = player_freq['Player'].map(maps_dict['Own_map']) / 100
1244
- player_freq['Exposure'] = player_freq['Freq']/(Sim_size)
1245
- player_freq['Edge'] = player_freq['Exposure'] - player_freq['Proj Own']
1246
- player_freq['Team'] = player_freq['Player'].map(maps_dict['Team_map'])
1247
- for checkVar in range(len(team_list)):
1248
- player_freq['Team'] = player_freq['Team'].replace(item_list, team_list)
1249
-
1250
- player_freq = player_freq[['Player', 'Position', 'Team', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1251
-
1252
- qb_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,0:1].values, return_counts=True)),
1253
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1254
- qb_freq['Freq'] = qb_freq['Freq'].astype(int)
1255
- qb_freq['Position'] = qb_freq['Player'].map(maps_dict['Pos_map'])
1256
- qb_freq['Salary'] = qb_freq['Player'].map(maps_dict['Salary_map'])
1257
- qb_freq['Proj Own'] = qb_freq['Player'].map(maps_dict['Own_map']) / 100
1258
- qb_freq['Exposure'] = qb_freq['Freq']/(Sim_size)
1259
- qb_freq['Edge'] = qb_freq['Exposure'] - qb_freq['Proj Own']
1260
- qb_freq['Team'] = qb_freq['Player'].map(maps_dict['Team_map'])
1261
- for checkVar in range(len(team_list)):
1262
- qb_freq['Team'] = qb_freq['Team'].replace(item_list, team_list)
1263
-
1264
- qb_freq = qb_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1265
-
1266
- rb_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,[1, 2]].values, return_counts=True)),
1267
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1268
- rb_freq['Freq'] = rb_freq['Freq'].astype(int)
1269
- rb_freq['Position'] = rb_freq['Player'].map(maps_dict['Pos_map'])
1270
- rb_freq['Salary'] = rb_freq['Player'].map(maps_dict['Salary_map'])
1271
- rb_freq['Proj Own'] = rb_freq['Player'].map(maps_dict['Own_map']) / 100
1272
- rb_freq['Exposure'] = rb_freq['Freq']/Sim_size
1273
- rb_freq['Edge'] = rb_freq['Exposure'] - rb_freq['Proj Own']
1274
- rb_freq['Team'] = rb_freq['Player'].map(maps_dict['Team_map'])
1275
- for checkVar in range(len(team_list)):
1276
- rb_freq['Team'] = rb_freq['Team'].replace(item_list, team_list)
1277
-
1278
- rb_freq = rb_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1279
-
1280
- wr_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,[3, 4, 5]].values, return_counts=True)),
1281
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1282
- wr_freq['Freq'] = wr_freq['Freq'].astype(int)
1283
- wr_freq['Position'] = wr_freq['Player'].map(maps_dict['Pos_map'])
1284
- wr_freq['Salary'] = wr_freq['Player'].map(maps_dict['Salary_map'])
1285
- wr_freq['Proj Own'] = wr_freq['Player'].map(maps_dict['Own_map']) / 100
1286
- wr_freq['Exposure'] = wr_freq['Freq']/Sim_size
1287
- wr_freq['Edge'] = wr_freq['Exposure'] - wr_freq['Proj Own']
1288
- wr_freq['Team'] = wr_freq['Player'].map(maps_dict['Team_map'])
1289
- for checkVar in range(len(team_list)):
1290
- wr_freq['Team'] = wr_freq['Team'].replace(item_list, team_list)
1291
-
1292
- wr_freq = wr_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1293
-
1294
- te_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,[6]].values, return_counts=True)),
1295
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1296
- te_freq['Freq'] = te_freq['Freq'].astype(int)
1297
- te_freq['Position'] = te_freq['Player'].map(maps_dict['Pos_map'])
1298
- te_freq['Salary'] = te_freq['Player'].map(maps_dict['Salary_map'])
1299
- te_freq['Proj Own'] = te_freq['Player'].map(maps_dict['Own_map']) / 100
1300
- te_freq['Exposure'] = te_freq['Freq']/Sim_size
1301
- te_freq['Edge'] = te_freq['Exposure'] - te_freq['Proj Own']
1302
- te_freq['Team'] = te_freq['Player'].map(maps_dict['Team_map'])
1303
- for checkVar in range(len(team_list)):
1304
- te_freq['Team'] = te_freq['Team'].replace(item_list, team_list)
1305
-
1306
- te_freq = te_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1307
 
1308
- flex_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,[7]].values, return_counts=True)),
1309
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1310
- flex_freq['Freq'] = flex_freq['Freq'].astype(int)
1311
- flex_freq['Position'] = flex_freq['Player'].map(maps_dict['Pos_map'])
1312
- flex_freq['Salary'] = flex_freq['Player'].map(maps_dict['Salary_map'])
1313
- flex_freq['Proj Own'] = flex_freq['Player'].map(maps_dict['Own_map']) / 100
1314
- flex_freq['Exposure'] = flex_freq['Freq']/Sim_size
1315
- flex_freq['Edge'] = flex_freq['Exposure'] - flex_freq['Proj Own']
1316
- flex_freq['Team'] = flex_freq['Player'].map(maps_dict['Team_map'])
1317
- for checkVar in range(len(team_list)):
1318
- flex_freq['Team'] = flex_freq['Team'].replace(item_list, team_list)
1319
-
1320
- flex_freq = flex_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1321
-
1322
- dst_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,8:9].values, return_counts=True)),
1323
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1324
- dst_freq['Freq'] = dst_freq['Freq'].astype(int)
1325
- dst_freq['Position'] = dst_freq['Player'].map(maps_dict['Pos_map'])
1326
- dst_freq['Salary'] = dst_freq['Player'].map(maps_dict['Salary_map'])
1327
- dst_freq['Proj Own'] = dst_freq['Player'].map(maps_dict['Own_map']) / 100
1328
- dst_freq['Exposure'] = dst_freq['Freq']/Sim_size
1329
- dst_freq['Edge'] = dst_freq['Exposure'] - dst_freq['Proj Own']
1330
- dst_freq['Team'] = dst_freq['Player'].map(maps_dict['Team_map'])
1331
- for checkVar in range(len(team_list)):
1332
- dst_freq['Team'] = dst_freq['Team'].replace(item_list, team_list)
1333
-
1334
- dst_freq = dst_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1335
 
1336
- with st.container():
1337
- simulate_container = st.empty()
1338
- 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)
1339
-
1340
  st.download_button(
1341
  label="Export Tables",
1342
  data=convert_df_to_csv(Sim_Winner_Export),
1343
  file_name='NFL_consim_export.csv',
1344
  mime='text/csv',
1345
  )
1346
-
1347
- with st.container():
1348
- freq_container = st.empty()
1349
- tab1, tab2, tab3, tab4, tab5, tab6, tab7 = st.tabs(['Overall Exposures', 'QB Exposures', 'RB Exposures', 'WR Exposures', 'TE Exposures', 'FLEX Exposures', 'DST Exposures'])
1350
- with tab1:
1351
- st.dataframe(player_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1352
- st.download_button(
1353
- label="Export Exposures",
1354
- data=convert_df_to_csv(player_freq),
1355
- file_name='player_freq_export.csv',
1356
- mime='text/csv',
1357
- )
1358
- with tab2:
1359
- st.dataframe(qb_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1360
- st.download_button(
1361
- label="Export Exposures",
1362
- data=convert_df_to_csv(qb_freq),
1363
- file_name='qb_freq_export.csv',
1364
- mime='text/csv',
1365
- )
1366
- with tab3:
1367
- st.dataframe(rb_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1368
- st.download_button(
1369
- label="Export Exposures",
1370
- data=convert_df_to_csv(rb_freq),
1371
- file_name='rb_freq_export.csv',
1372
- mime='text/csv',
1373
- )
1374
- with tab4:
1375
- st.dataframe(wr_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1376
- st.download_button(
1377
- label="Export Exposures",
1378
- data=convert_df_to_csv(wr_freq),
1379
- file_name='wr_freq_export.csv',
1380
- mime='text/csv',
1381
- )
1382
- with tab5:
1383
- st.dataframe(te_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(te_freq),
1387
- file_name='te_freq_export.csv',
1388
- mime='text/csv',
1389
- )
1390
- with tab6:
1391
- st.dataframe(flex_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(flex_freq),
1395
- file_name='flex_freq_export.csv',
1396
- mime='text/csv',
1397
- )
1398
- with tab7:
1399
- st.dataframe(dst_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(dst_freq),
1403
- file_name='dst_freq_export.csv',
1404
- mime='text/csv',
1405
- )
 
889
  scaling_var = 15
890
 
891
  with col2:
892
+ with st.conatainer():
893
+ if st.button("Simulate Contest"):
894
+ try:
895
+ del dst_freq
896
+ del flex_freq
897
+ del te_freq
898
+ del wr_freq
899
+ del rb_freq
900
+ del qb_freq
901
+ del player_freq
902
+ del Sim_Winner_Export
903
+ del Sim_Winner_Frame
904
+ except:
905
+ pass
906
+ with st.container():
907
+ st.write('Contest Simulation Starting')
908
+ seed_depth1 = 10
909
+ Total_Runs = 1000000
910
+ if Contest_Size <= 1000:
911
+ strength_grow = .01
912
+ elif Contest_Size > 1000 and Contest_Size <= 2500:
913
+ strength_grow = .025
914
+ elif Contest_Size > 2500 and Contest_Size <= 5000:
915
+ strength_grow = .05
916
+ elif Contest_Size > 5000 and Contest_Size <= 20000:
917
+ strength_grow = .075
918
+ elif Contest_Size > 20000:
919
+ strength_grow = .1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
920
 
921
+ field_growth = 100 * strength_grow
922
+
923
+ Sort_function = 'Median'
924
+ if Sort_function == 'Median':
925
+ Sim_function = 'Projection'
926
+ elif Sort_function == 'Own':
927
+ Sim_function = 'Own'
928
+
929
+ if slate_var1 == 'User':
930
+ OwnFrame = proj_dataframe
931
+ if contest_var1 == 'Small':
932
+ 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'])
933
+ 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%'])
934
+ OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
935
+ OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
936
+ if contest_var1 == 'Medium':
937
+ 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'])
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['Own%'] > 75, 75, OwnFrame['Own%'])
940
+ OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
941
+ if contest_var1 == 'Large':
942
+ 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'])
943
+ 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%'])
944
+ OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
945
+ OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
946
+ Overall_Proj = OwnFrame[['Player', 'Team', 'Position', 'Median', 'Own', 'Salary']]
947
 
948
+ del OwnFrame
 
 
949
 
950
+ elif slate_var1 != 'User':
951
+ initial_proj = raw_baselines
952
+ drop_frame = initial_proj.drop_duplicates(subset = 'Player',keep = 'first')
953
+ OwnFrame = drop_frame[['Player', 'Team', 'Position', 'Median', 'Own', 'Floor', 'Ceiling', 'Salary']]
954
+ if contest_var1 == 'Small':
955
+ 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'])
956
+ 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%'])
957
+ OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
958
+ OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
959
+ if contest_var1 == 'Medium':
960
+ 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'])
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['Own%'] > 75, 75, OwnFrame['Own%'])
963
+ OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
964
+ if contest_var1 == 'Large':
965
+ 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'])
966
+ 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%'])
967
+ OwnFrame['Own%'] = np.where(OwnFrame['Own%'] > 75, 75, OwnFrame['Own%'])
968
+ OwnFrame['Own'] = OwnFrame['Own%'] * (900 / OwnFrame['Own%'].sum())
969
+ Overall_Proj = OwnFrame[['Player', 'Team', 'Position', 'Median', 'Own', 'Salary']]
970
 
971
+ del initial_proj
972
+ del drop_frame
973
+ del OwnFrame
 
 
 
 
 
 
 
 
974
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
975
  if insert_port == 1:
976
+ UserPortfolio = portfolio_dataframe[['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']]
977
+ elif insert_port == 0:
978
+ UserPortfolio = pd.DataFrame(columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST'])
979
+
980
+ Overall_Proj.replace('', np.nan, inplace=True)
981
+ Overall_Proj = Overall_Proj.dropna(subset=['Median'])
982
+ Overall_Proj = Overall_Proj.assign(Value=lambda x: (x.Median / (x.Salary / 1000)))
983
+ Overall_Proj['Sort_var'] = (Overall_Proj['Median'].rank(ascending=False) + Overall_Proj['Value'].rank(ascending=False)) / 2
984
+ Overall_Proj = Overall_Proj.sort_values(by='Sort_var', ascending=False)
985
+ Overall_Proj['Own'] = np.where((Overall_Proj['Median'] > 0) & (Overall_Proj['Own'] == 0), 1, Overall_Proj['Own'])
986
+ Overall_Proj = Overall_Proj.loc[Overall_Proj['Own'] > 0]
987
+
988
+ Overall_Proj['Floor'] = np.where(Overall_Proj['Position'] == 'QB', Overall_Proj['Median'] * .5, Overall_Proj['Median'] * .25)
989
+ Overall_Proj['Ceiling'] = np.where(Overall_Proj['Position'] == 'WR', Overall_Proj['Median'] + Overall_Proj['Median'], Overall_Proj['Median'] + Overall_Proj['Floor'])
990
+ Overall_Proj['STDev'] = Overall_Proj['Median'] / 4
991
+
992
+ Teams_used = Overall_Proj['Team'].drop_duplicates().reset_index(drop=True)
993
+ Teams_used = Teams_used.reset_index()
994
+ Teams_used['team_item'] = Teams_used['index'] + 1
995
+ Teams_used = Teams_used.drop(columns=['index'])
996
+ Teams_used_dictraw = Teams_used.drop(columns=['team_item'])
997
+ Teams_used_dict = Teams_used_dictraw.to_dict()
998
+
999
+ del Teams_used_dictraw
1000
+
1001
+ team_list = Teams_used['Team'].to_list()
1002
+ item_list = Teams_used['team_item'].to_list()
1003
+
1004
+ FieldStrength_raw = Strength_var + ((30 - len(Teams_used)) * .01)
1005
+ FieldStrength = FieldStrength_raw - (FieldStrength_raw * (20000 / Contest_Size))
1006
+
1007
+ del FieldStrength_raw
1008
+
1009
+ if FieldStrength < 0:
1010
+ FieldStrength = Strength_var
1011
+ field_split = Strength_var
1012
+
1013
+ for checkVar in range(len(team_list)):
1014
+ Overall_Proj['Team'] = Overall_Proj['Team'].replace(team_list, item_list)
1015
+
1016
+ qbs_raw = Overall_Proj[Overall_Proj.Position == 'QB']
1017
+ qbs_raw.dropna(subset=['Median']).reset_index(drop=True)
1018
+ qbs_raw = qbs_raw.reset_index(drop=True)
1019
+ qbs_raw = qbs_raw.sort_values(by=['Median'], ascending=False)
1020
+
1021
+ qbs = qbs_raw.head(round(len(qbs_raw)))
1022
+ qbs = qbs.assign(Var = range(0,len(qbs)))
1023
+ qb_dict = pd.Series(qbs.Player.values, index=qbs.Var).to_dict()
1024
+
1025
+ defs_raw = Overall_Proj[Overall_Proj.Position.str.contains("D")]
1026
+ defs_raw.dropna(subset=['Median']).reset_index(drop=True)
1027
+ defs_raw = defs_raw.reset_index(drop=True)
1028
+ defs_raw = defs_raw.sort_values(by=['Own', 'Value'], ascending=False)
1029
+
1030
+ defs = defs_raw.head(round(len(defs_raw)))
1031
+ defs = defs.assign(Var = range(0,len(defs)))
1032
+ def_dict = pd.Series(defs.Player.values, index=defs.Var).to_dict()
1033
+
1034
+ rbs_raw = Overall_Proj[Overall_Proj.Position == 'RB']
1035
+ rbs_raw.dropna(subset=['Median']).reset_index(drop=True)
1036
+ rbs_raw = rbs_raw.reset_index(drop=True)
1037
+ rbs_raw = rbs_raw.sort_values(by=['Own', 'Value'], ascending=False)
1038
+
1039
+ wrs_raw = Overall_Proj[Overall_Proj.Position == 'WR']
1040
+ wrs_raw.dropna(subset=['Median']).reset_index(drop=True)
1041
+ wrs_raw = wrs_raw.reset_index(drop=True)
1042
+ wrs_raw = wrs_raw.sort_values(by=['Own', 'Median'], ascending=False)
1043
+
1044
+ tes_raw = Overall_Proj[Overall_Proj.Position == 'TE']
1045
+ tes_raw.dropna(subset=['Median']).reset_index(drop=True)
1046
+ tes_raw = tes_raw.reset_index(drop=True)
1047
+ tes_raw = tes_raw.sort_values(by=['Own', 'Value'], ascending=False)
1048
+
1049
+ pos_players = pd.concat([rbs_raw, wrs_raw, tes_raw])
1050
+ pos_players.dropna(subset=['Median']).reset_index(drop=True)
1051
+ pos_players = pos_players.reset_index(drop=True)
1052
+
1053
+ del qbs_raw
1054
+ del defs_raw
1055
+ del rbs_raw
1056
+ del wrs_raw
1057
+ del tes_raw
1058
+
1059
+ if insert_port == 1:
1060
+ try:
1061
+ # Initialize an empty DataFrame for Raw Portfolio
1062
+ Raw_Portfolio = pd.DataFrame()
1063
+
1064
+ # Loop through each position and split the data accordingly
1065
+ positions = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
1066
+ for pos in positions:
1067
+ temp_df = UserPortfolio[pos].str.split("(", n=1, expand=True)
1068
+ temp_df.columns = [pos, 'Drop']
1069
+ Raw_Portfolio = pd.concat([Raw_Portfolio, temp_df], axis=1)
1070
+
1071
+ # Select only necessary columns and strip white spaces
1072
+ CleanPortfolio = Raw_Portfolio[positions].apply(lambda x: x.str.strip())
1073
+ CleanPortfolio.reset_index(inplace=True)
1074
+ CleanPortfolio['User/Field'] = CleanPortfolio['index'] + 1
1075
+ CleanPortfolio.drop(columns=['index'], inplace=True)
1076
+
1077
+ CleanPortfolio.replace('', np.nan, inplace=True)
1078
+ CleanPortfolio.dropna(subset=['QB'], inplace=True)
1079
+
1080
+ # Create frequency table for players
1081
+ cleaport_players = pd.DataFrame(
1082
+ np.column_stack(np.unique(CleanPortfolio.iloc[:, 0:9].values, return_counts=True)),
1083
+ columns=['Player', 'Freq']
1084
+ ).sort_values('Freq', ascending=False).reset_index(drop=True)
1085
+ cleaport_players['Freq'] = cleaport_players['Freq'].astype(int)
1086
+
1087
+ # Merge and update nerf_frame
1088
+ nerf_frame = pd.merge(cleaport_players, Overall_Proj, on='Player', how='left')
1089
+ for col in ['Median', 'Floor', 'Ceiling', 'STDev']:
1090
+ nerf_frame[col] *= 0.90
1091
+ del Raw_Portfolio
1092
+ except:
1093
+ CleanPortfolio = UserPortfolio.reset_index()
1094
+ CleanPortfolio['User/Field'] = CleanPortfolio['index'] + 1
1095
+ CleanPortfolio.drop(columns=['index'], inplace=True)
1096
+
1097
+ # Replace empty strings and drop rows with NaN in 'QB' column
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
+
1113
  elif insert_port == 0:
1114
+ CleanPortfolio = UserPortfolio
1115
+ cleaport_players = pd.DataFrame(np.column_stack(np.unique(CleanPortfolio.iloc[:,0:9].values, return_counts=True)),
1116
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1117
+ cleaport_players['Freq'] = cleaport_players['Freq'].astype(int)
1118
+ nerf_frame = Overall_Proj
1119
 
1120
+ ref_dict = {
1121
+ 'pos':['RB', 'WR', 'TE', 'FLEX'],
1122
+ 'pos_dfs':['RB_Table', 'WR_Table', 'TE_Table', 'FLEX_Table'],
1123
+ 'pos_dicts':['rb_dict', 'wr_dict', 'te_dict', 'flex_dict']
1124
+ }
 
 
1125
 
1126
+ maps_dict = {
1127
+ 'Floor_map':dict(zip(Overall_Proj.Player,Overall_Proj.Floor)),
1128
+ 'Projection_map':dict(zip(Overall_Proj.Player,Overall_Proj.Median)),
1129
+ 'Ceiling_map':dict(zip(Overall_Proj.Player,Overall_Proj.Ceiling)),
1130
+ 'Salary_map':dict(zip(Overall_Proj.Player,Overall_Proj.Salary)),
1131
+ 'Pos_map':dict(zip(Overall_Proj.Player,Overall_Proj.Position)),
1132
+ 'Own_map':dict(zip(Overall_Proj.Player,Overall_Proj.Own)),
1133
+ 'Team_map':dict(zip(Overall_Proj.Player,Overall_Proj.Team)),
1134
+ 'STDev_map':dict(zip(Overall_Proj.Player,Overall_Proj.STDev)),
1135
+ 'team_check_map':dict(zip(Overall_Proj.Player,Overall_Proj.Team))
1136
+ }
1137
+
1138
+ up_dict = {
1139
+ 'Floor_map':dict(zip(cleaport_players.Player,nerf_frame.Floor)),
1140
+ 'Projection_map':dict(zip(cleaport_players.Player,nerf_frame.Median)),
1141
+ 'Ceiling_map':dict(zip(cleaport_players.Player,nerf_frame.Ceiling)),
1142
+ 'Salary_map':dict(zip(cleaport_players.Player,nerf_frame.Salary)),
1143
+ 'Pos_map':dict(zip(cleaport_players.Player,nerf_frame.Position)),
1144
+ 'Own_map':dict(zip(cleaport_players.Player,nerf_frame.Own)),
1145
+ 'Team_map':dict(zip(cleaport_players.Player,nerf_frame.Team)),
1146
+ 'STDev_map':dict(zip(cleaport_players.Player,nerf_frame.STDev)),
1147
+ 'team_check_map':dict(zip(cleaport_players.Player,nerf_frame.Team))
1148
+ }
1149
+
1150
+ del cleaport_players
1151
+ del Overall_Proj
1152
+ del nerf_frame
1153
+
1154
+ st.write('Seed frame creation')
1155
+ FinalPortfolio, maps_dict = run_seed_frame(seed_depth1, Strength_var, strength_grow, Teams_used, Total_Runs)
1156
+
1157
+ Sim_size = linenum_var1
1158
+ SimVar = 1
1159
+ Sim_Winners = []
1160
+ fp_array = FinalPortfolio.values
1161
+
1162
+ if insert_port == 1:
1163
+ up_array = CleanPortfolio.values
1164
+
1165
+ # Pre-vectorize functions
1166
+ vec_projection_map = np.vectorize(maps_dict['Projection_map'].__getitem__)
1167
+ vec_stdev_map = np.vectorize(maps_dict['STDev_map'].__getitem__)
1168
+
1169
  if insert_port == 1:
1170
+ vec_up_projection_map = np.vectorize(up_dict['Projection_map'].__getitem__)
1171
+ vec_up_stdev_map = np.vectorize(up_dict['STDev_map'].__getitem__)
1172
+
1173
+ st.write('Simulating contest on frames')
1174
+
1175
+ while SimVar <= Sim_size:
1176
+ if insert_port == 1:
1177
+ fp_random = fp_array[np.random.choice(fp_array.shape[0], Contest_Size-len(CleanPortfolio))]
1178
+ elif insert_port == 0:
1179
+ fp_random = fp_array[np.random.choice(fp_array.shape[0], Contest_Size)]
1180
+
1181
+ sample_arrays1 = np.c_[
1182
+ fp_random,
1183
  np.sum(np.random.normal(
1184
+ loc=vec_projection_map(fp_random[:, :-5]),
1185
+ scale=vec_stdev_map(fp_random[:, :-5])),
1186
  axis=1)
1187
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1188
 
1189
+ if insert_port == 1:
1190
+ sample_arrays2 = np.c_[
1191
+ up_array,
1192
+ np.sum(np.random.normal(
1193
+ loc=vec_up_projection_map(up_array[:, :-5]),
1194
+ scale=vec_up_stdev_map(up_array[:, :-5])),
1195
+ axis=1)
1196
+ ]
1197
+ sample_arrays = np.vstack((sample_arrays1, sample_arrays2))
1198
+ else:
1199
+ sample_arrays = sample_arrays1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1200
 
1201
+ final_array = sample_arrays[sample_arrays[:, 10].argsort()[::-1]]
1202
+ best_lineup = final_array[final_array[:, -1].argsort(kind='stable')[::-1][:1]]
1203
+ Sim_Winners.append(best_lineup)
1204
+ SimVar += 1
1205
+
1206
+
1207
+ # del smple_arrays
1208
+ # del smple_arrays1
1209
+ # del smple_arrays2
1210
+ # del final_array
1211
+ # del best_lineup
1212
+ st.write('Contest simulation complete')
1213
+ # Initial setup
1214
+ Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=FinalPortfolio.columns.tolist() + ['Fantasy'])
1215
+ Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['Projection'] + Sim_Winner_Frame['Fantasy']) / 2
1216
+
1217
+ # Type Casting
1218
+ type_cast_dict = {'Salary': int, 'Projection': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float16}
1219
+ Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)
1220
+
1221
+ # Sorting
1222
+ Sim_Winner_Frame = Sim_Winner_Frame.sort_values(by='GPP_Proj', ascending=False)
1223
+
1224
+ # Data Copying
1225
+ Sim_Winner_Export = Sim_Winner_Frame.copy()
1226
+
1227
+ # Conditional Replacement
1228
+ columns_to_replace = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
1229
+
1230
+ if site_var1 == 'Draftkings':
1231
+ replace_dict = dkid_dict
1232
+ elif site_var1 == 'Fanduel':
1233
+ replace_dict = fdid_dict
1234
+
1235
+ for col in columns_to_replace:
1236
+ Sim_Winner_Export[col].replace(replace_dict, inplace=True)
1237
+
1238
+
1239
+ player_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,0:9].values, return_counts=True)),
1240
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1241
+ player_freq['Freq'] = player_freq['Freq'].astype(int)
1242
+ player_freq['Position'] = player_freq['Player'].map(maps_dict['Pos_map'])
1243
+ player_freq['Salary'] = player_freq['Player'].map(maps_dict['Salary_map'])
1244
+ player_freq['Proj Own'] = player_freq['Player'].map(maps_dict['Own_map']) / 100
1245
+ player_freq['Exposure'] = player_freq['Freq']/(Sim_size)
1246
+ player_freq['Edge'] = player_freq['Exposure'] - player_freq['Proj Own']
1247
+ player_freq['Team'] = player_freq['Player'].map(maps_dict['Team_map'])
1248
+ for checkVar in range(len(team_list)):
1249
+ player_freq['Team'] = player_freq['Team'].replace(item_list, team_list)
1250
+
1251
+ player_freq = player_freq[['Player', 'Position', 'Team', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1252
+
1253
+ qb_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,0:1].values, return_counts=True)),
1254
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1255
+ qb_freq['Freq'] = qb_freq['Freq'].astype(int)
1256
+ qb_freq['Position'] = qb_freq['Player'].map(maps_dict['Pos_map'])
1257
+ qb_freq['Salary'] = qb_freq['Player'].map(maps_dict['Salary_map'])
1258
+ qb_freq['Proj Own'] = qb_freq['Player'].map(maps_dict['Own_map']) / 100
1259
+ qb_freq['Exposure'] = qb_freq['Freq']/(Sim_size)
1260
+ qb_freq['Edge'] = qb_freq['Exposure'] - qb_freq['Proj Own']
1261
+ qb_freq['Team'] = qb_freq['Player'].map(maps_dict['Team_map'])
1262
+ for checkVar in range(len(team_list)):
1263
+ qb_freq['Team'] = qb_freq['Team'].replace(item_list, team_list)
1264
+
1265
+ qb_freq = qb_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1266
+
1267
+ rb_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,[1, 2]].values, return_counts=True)),
1268
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1269
+ rb_freq['Freq'] = rb_freq['Freq'].astype(int)
1270
+ rb_freq['Position'] = rb_freq['Player'].map(maps_dict['Pos_map'])
1271
+ rb_freq['Salary'] = rb_freq['Player'].map(maps_dict['Salary_map'])
1272
+ rb_freq['Proj Own'] = rb_freq['Player'].map(maps_dict['Own_map']) / 100
1273
+ rb_freq['Exposure'] = rb_freq['Freq']/Sim_size
1274
+ rb_freq['Edge'] = rb_freq['Exposure'] - rb_freq['Proj Own']
1275
+ rb_freq['Team'] = rb_freq['Player'].map(maps_dict['Team_map'])
1276
+ for checkVar in range(len(team_list)):
1277
+ rb_freq['Team'] = rb_freq['Team'].replace(item_list, team_list)
1278
+
1279
+ rb_freq = rb_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1280
+
1281
+ wr_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,[3, 4, 5]].values, return_counts=True)),
1282
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1283
+ wr_freq['Freq'] = wr_freq['Freq'].astype(int)
1284
+ wr_freq['Position'] = wr_freq['Player'].map(maps_dict['Pos_map'])
1285
+ wr_freq['Salary'] = wr_freq['Player'].map(maps_dict['Salary_map'])
1286
+ wr_freq['Proj Own'] = wr_freq['Player'].map(maps_dict['Own_map']) / 100
1287
+ wr_freq['Exposure'] = wr_freq['Freq']/Sim_size
1288
+ wr_freq['Edge'] = wr_freq['Exposure'] - wr_freq['Proj Own']
1289
+ wr_freq['Team'] = wr_freq['Player'].map(maps_dict['Team_map'])
1290
+ for checkVar in range(len(team_list)):
1291
+ wr_freq['Team'] = wr_freq['Team'].replace(item_list, team_list)
1292
+
1293
+ wr_freq = wr_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1294
+
1295
+ te_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,[6]].values, return_counts=True)),
1296
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1297
+ te_freq['Freq'] = te_freq['Freq'].astype(int)
1298
+ te_freq['Position'] = te_freq['Player'].map(maps_dict['Pos_map'])
1299
+ te_freq['Salary'] = te_freq['Player'].map(maps_dict['Salary_map'])
1300
+ te_freq['Proj Own'] = te_freq['Player'].map(maps_dict['Own_map']) / 100
1301
+ te_freq['Exposure'] = te_freq['Freq']/Sim_size
1302
+ te_freq['Edge'] = te_freq['Exposure'] - te_freq['Proj Own']
1303
+ te_freq['Team'] = te_freq['Player'].map(maps_dict['Team_map'])
1304
+ for checkVar in range(len(team_list)):
1305
+ te_freq['Team'] = te_freq['Team'].replace(item_list, team_list)
1306
+
1307
+ te_freq = te_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1308
+
1309
+ flex_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,[7]].values, return_counts=True)),
1310
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1311
+ flex_freq['Freq'] = flex_freq['Freq'].astype(int)
1312
+ flex_freq['Position'] = flex_freq['Player'].map(maps_dict['Pos_map'])
1313
+ flex_freq['Salary'] = flex_freq['Player'].map(maps_dict['Salary_map'])
1314
+ flex_freq['Proj Own'] = flex_freq['Player'].map(maps_dict['Own_map']) / 100
1315
+ flex_freq['Exposure'] = flex_freq['Freq']/Sim_size
1316
+ flex_freq['Edge'] = flex_freq['Exposure'] - flex_freq['Proj Own']
1317
+ flex_freq['Team'] = flex_freq['Player'].map(maps_dict['Team_map'])
1318
+ for checkVar in range(len(team_list)):
1319
+ flex_freq['Team'] = flex_freq['Team'].replace(item_list, team_list)
1320
+
1321
+ flex_freq = flex_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1322
+
1323
+ dst_freq = pd.DataFrame(np.column_stack(np.unique(Sim_Winner_Frame.iloc[:,8:9].values, return_counts=True)),
1324
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
1325
+ dst_freq['Freq'] = dst_freq['Freq'].astype(int)
1326
+ dst_freq['Position'] = dst_freq['Player'].map(maps_dict['Pos_map'])
1327
+ dst_freq['Salary'] = dst_freq['Player'].map(maps_dict['Salary_map'])
1328
+ dst_freq['Proj Own'] = dst_freq['Player'].map(maps_dict['Own_map']) / 100
1329
+ dst_freq['Exposure'] = dst_freq['Freq']/Sim_size
1330
+ dst_freq['Edge'] = dst_freq['Exposure'] - dst_freq['Proj Own']
1331
+ dst_freq['Team'] = dst_freq['Player'].map(maps_dict['Team_map'])
1332
+ for checkVar in range(len(team_list)):
1333
+ dst_freq['Team'] = dst_freq['Team'].replace(item_list, team_list)
1334
+
1335
+ dst_freq = dst_freq[['Player', 'Team', 'Position', 'Salary', 'Proj Own', 'Exposure', 'Edge']]
1336
 
1337
+ with st.container():
1338
+ simulate_container = st.empty()
1339
+ 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)
1340
+
1341
  st.download_button(
1342
  label="Export Tables",
1343
  data=convert_df_to_csv(Sim_Winner_Export),
1344
  file_name='NFL_consim_export.csv',
1345
  mime='text/csv',
1346
  )
1347
+
1348
+ with st.container():
1349
+ freq_container = st.empty()
1350
+ tab1, tab2, tab3, tab4, tab5, tab6, tab7 = st.tabs(['Overall Exposures', 'QB Exposures', 'RB Exposures', 'WR Exposures', 'TE Exposures', 'FLEX Exposures', 'DST Exposures'])
1351
+ with tab1:
1352
+ st.dataframe(player_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1353
+ st.download_button(
1354
+ label="Export Exposures",
1355
+ data=convert_df_to_csv(player_freq),
1356
+ file_name='player_freq_export.csv',
1357
+ mime='text/csv',
1358
+ )
1359
+ with tab2:
1360
+ st.dataframe(qb_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1361
+ st.download_button(
1362
+ label="Export Exposures",
1363
+ data=convert_df_to_csv(qb_freq),
1364
+ file_name='qb_freq_export.csv',
1365
+ mime='text/csv',
1366
+ )
1367
+ with tab3:
1368
+ st.dataframe(rb_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1369
+ st.download_button(
1370
+ label="Export Exposures",
1371
+ data=convert_df_to_csv(rb_freq),
1372
+ file_name='rb_freq_export.csv',
1373
+ mime='text/csv',
1374
+ )
1375
+ with tab4:
1376
+ st.dataframe(wr_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1377
+ st.download_button(
1378
+ label="Export Exposures",
1379
+ data=convert_df_to_csv(wr_freq),
1380
+ file_name='wr_freq_export.csv',
1381
+ mime='text/csv',
1382
+ )
1383
+ with tab5:
1384
+ st.dataframe(te_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1385
+ st.download_button(
1386
+ label="Export Exposures",
1387
+ data=convert_df_to_csv(te_freq),
1388
+ file_name='te_freq_export.csv',
1389
+ mime='text/csv',
1390
+ )
1391
+ with tab6:
1392
+ st.dataframe(flex_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1393
+ st.download_button(
1394
+ label="Export Exposures",
1395
+ data=convert_df_to_csv(flex_freq),
1396
+ file_name='flex_freq_export.csv',
1397
+ mime='text/csv',
1398
+ )
1399
+ with tab7:
1400
+ st.dataframe(dst_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
1401
+ st.download_button(
1402
+ label="Export Exposures",
1403
+ data=convert_df_to_csv(dst_freq),
1404
+ file_name='dst_freq_export.csv',
1405
+ mime='text/csv',
1406
+ )