Multichem commited on
Commit
4417fca
·
1 Parent(s): 35d3640

Update app.py

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