TrueDFS/NBA_DFS_Contest_Sims_Origin
0
1import streamlit as st2st.set_page_config(layout="wide")3import numpy as np4import pandas as pd5import pymongo6import time7 8@st.cache_resource9def init_conn():10 11 uri = st.secrets['mongo_uri']12 client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000)13 db = client["NBA_DFS"]14 15 return db16 17db = init_conn()18 19percentages_format = {'Exposure': '{:.2%}'}20freq_format = {'Proj Own': '{:.2%}', 'Exposure': '{:.2%}', 'Edge': '{:.2%}'}21dk_columns = ['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']22fd_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']23 24@st.cache_data(ttl = 60)25def init_DK_seed_frames(load_size): 26 27 collection = db['DK_NBA_name_map']28 cursor = collection.find()29 raw_data = pd.DataFrame(list(cursor))30 names_dict = dict(zip(raw_data['key'], raw_data['value']))31 32 collection = db["DK_NBA_seed_frame"] 33 cursor = collection.find().limit(load_size)34 35 raw_display = pd.DataFrame(list(cursor))36 raw_display = raw_display[['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]37 dict_columns = ['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX']38 st.write("converting names")39 for col in dict_columns:40 raw_display[col] = raw_display[col].map(names_dict)41 DK_seed = raw_display.to_numpy()42 43 return DK_seed44 45@st.cache_data(ttl = 60)46def init_DK_secondary_seed_frames(load_size): 47 48 collection = db['DK_NBA_Secondary_name_map']49 cursor = collection.find()50 raw_data = pd.DataFrame(list(cursor))51 names_dict = dict(zip(raw_data['key'], raw_data['value']))52 53 collection = db["DK_NBA_Secondary_seed_frame"] 54 cursor = collection.find().limit(load_size)55 56 raw_display = pd.DataFrame(list(cursor))57 raw_display = raw_display[['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]58 dict_columns = ['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX']59 st.write("converting names")60 for col in dict_columns:61 raw_display[col] = raw_display[col].map(names_dict)62 DK_seed = raw_display.to_numpy()63 64 return DK_seed65 66@st.cache_data(ttl = 60)67def init_FD_seed_frames(load_size): 68 69 collection = db['FD_NBA_name_map']70 cursor = collection.find()71 raw_data = pd.DataFrame(list(cursor))72 names_dict = dict(zip(raw_data['key'], raw_data['value']))73 74 collection = db["FD_NBA_seed_frame"] 75 cursor = collection.find().limit(load_size)76 77 raw_display = pd.DataFrame(list(cursor))78 raw_display = raw_display[['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]79 dict_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1']80 st.write("converting names")81 for col in dict_columns:82 raw_display[col] = raw_display[col].map(names_dict)83 FD_seed = raw_display.to_numpy()84 85 return FD_seed86 87@st.cache_data(ttl = 60)88def init_FD_secondary_seed_frames(load_size): 89 90 collection = db['FD_NBA_Secondary_name_map']91 cursor = collection.find()92 raw_data = pd.DataFrame(list(cursor))93 names_dict = dict(zip(raw_data['key'], raw_data['value']))94 95 collection = db["FD_NBA_Secondary_seed_frame"] 96 cursor = collection.find().limit(load_size)97 98 raw_display = pd.DataFrame(list(cursor))99 raw_display = raw_display[['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]100 dict_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1']101 st.write("converting names")102 for col in dict_columns:103 raw_display[col] = raw_display[col].map(names_dict)104 FD_seed = raw_display.to_numpy()105 106 return FD_seed107 108@st.cache_resource(ttl = 60)109def init_baselines():110 collection = db["Player_Range_Of_Outcomes"] 111 cursor = collection.find()112 113 load_display = pd.DataFrame(list(cursor))114 115 load_display.replace('', np.nan, inplace=True)116 load_display.rename(columns={"Fantasy": "Median", 'Name': 'Player', 'player_ID': 'player_id'}, inplace = True)117 load_display = load_display[load_display['Median'] > 0]118 119 dk_roo_raw = load_display[load_display['site'] == 'Draftkings']120 dk_roo_raw = dk_roo_raw[dk_roo_raw['slate'] == 'Main Slate']121 dk_roo_raw['STDev'] = dk_roo_raw['Median'] / 4122 dk_raw = dk_roo_raw.dropna(subset=['Median'])123 124 fd_roo_raw = load_display[load_display['site'] == 'Fanduel']125 fd_roo_raw = fd_roo_raw[fd_roo_raw['slate'] == 'Main Slate']126 fd_roo_raw['STDev'] = fd_roo_raw['Median'] / 4127 fd_raw = fd_roo_raw.dropna(subset=['Median'])128 129 dk_secondary_roo_raw = load_display[load_display['site'] == 'Draftkings']130 dk_secondary_roo_raw = dk_secondary_roo_raw[dk_secondary_roo_raw['slate'] == 'Secondary Slate']131 dk_secondary_roo_raw['STDev'] = dk_secondary_roo_raw['Median'] / 4132 dk_secondary = dk_secondary_roo_raw.dropna(subset=['Median'])133 134 fd_secondary_roo_raw = load_display[load_display['site'] == 'Fanduel']135 fd_secondary_roo_raw = fd_secondary_roo_raw[fd_secondary_roo_raw['slate'] == 'Secondary Slate']136 fd_secondary_roo_raw['STDev'] = fd_secondary_roo_raw['Median'] / 4137 fd_secondary = fd_secondary_roo_raw.dropna(subset=['Median'])138 139 return dk_raw, fd_raw, dk_secondary, fd_secondary140 141@st.cache_data142def convert_df(array):143 array = pd.DataFrame(array, columns=column_names)144 return array.to_csv().encode('utf-8')145 146@st.cache_data147def calculate_DK_value_frequencies(np_array):148 unique, counts = np.unique(np_array[:, :8], return_counts=True)149 frequencies = counts / len(np_array) # Normalize by the number of rows 150 combined_array = np.column_stack((unique, frequencies)) 151 return combined_array 152 153@st.cache_data154def calculate_FD_value_frequencies(np_array):155 unique, counts = np.unique(np_array[:, :9], return_counts=True)156 frequencies = counts / len(np_array) # Normalize by the number of rows 157 combined_array = np.column_stack((unique, frequencies)) 158 return combined_array159 160@st.cache_data161def sim_contest(Sim_size, seed_frame, maps_dict, Contest_Size):162 SimVar = 1163 Sim_Winners = []164 165 # Pre-vectorize functions166 vec_projection_map = np.vectorize(maps_dict['Projection_map'].__getitem__)167 vec_stdev_map = np.vectorize(maps_dict['STDev_map'].__getitem__)168 169 st.write('Simulating contest on frames')170 171 while SimVar <= Sim_size:172 fp_random = seed_frame[np.random.choice(seed_frame.shape[0], Contest_Size)]173 174 sample_arrays1 = np.c_[175 fp_random, 176 np.sum(np.random.normal(177 loc=vec_projection_map(fp_random[:, :-7]),178 scale=vec_stdev_map(fp_random[:, :-7])),179 axis=1)180 ]181 182 sample_arrays = sample_arrays1183 if sim_site_var1 == 'Draftkings':184 final_array = sample_arrays[sample_arrays[:, 9].argsort()[::-1]]185 elif sim_site_var1 == 'Fanduel':186 final_array = sample_arrays[sample_arrays[:, 10].argsort()[::-1]]187 best_lineup = final_array[final_array[:, -1].argsort(kind='stable')[::-1][:1]]188 Sim_Winners.append(best_lineup)189 SimVar += 1190 191 return Sim_Winners192 193dk_raw, fd_raw, dk_secondary, fd_secondary = init_baselines()194dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))195fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))196 197tab1, tab2 = st.tabs(['Contest Sims', 'Data Export'])198 199with tab2:200 col1, col2 = st.columns([1, 7])201 with col1:202 if st.button("Load/Reset Data", key='reset1'):203 st.cache_data.clear()204 for key in st.session_state.keys():205 del st.session_state[key]206 DK_seed = init_DK_seed_frames(10000)207 FD_seed = init_FD_seed_frames(10000)208 DK_secondary = init_DK_secondary_seed_frames(10000)209 FD_secondary = init_FD_secondary_seed_frames(10000)210 dk_raw, fd_raw, dk_secondary, fd_secondary = init_baselines()211 dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))212 fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))213 214 slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate'), key='slate_var1')215 site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='site_var1')216 sharp_split_var = st.number_input("How many lineups do you want?", value=10000, max_value=500000, min_value=10000, step=10000)217 lineup_num_var = st.number_input("How many lineups do you want to display?", min_value=1, max_value=500, value=10, step=1)218 219 if site_var1 == 'Draftkings':220 221 player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1')222 if player_var1 == 'Specific Players':223 player_var2 = st.multiselect('Which players do you want?', options = dk_raw['Player'].unique())224 elif player_var1 == 'Full Slate':225 player_var2 = dk_raw.Player.values.tolist()226 227 raw_baselines = dk_raw228 column_names = dk_columns229 230 elif site_var1 == 'Fanduel':231 232 player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1')233 if player_var1 == 'Specific Players':234 player_var2 = st.multiselect('Which players do you want?', options = fd_raw['Player'].unique())235 elif player_var1 == 'Full Slate':236 player_var2 = fd_raw.Player.values.tolist()237 238 raw_baselines = fd_raw239 column_names = fd_columns240 241 if st.button("Prepare data export", key='data_export'):242 if site_var1 == 'Draftkings':243 if 'working_seed' in st.session_state:244 st.session_state.working_seed = st.session_state.working_seed245 if player_var1 == 'Specific Players':246 st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]247 st.session_state.data_export_display = st.session_state.working_seed[0:lineup_num_var]248 export_column_var = 8249 elif 'working_seed' not in st.session_state:250 if slate_var1 == 'Main Slate':251 st.session_state.working_seed = init_DK_seed_frames(sharp_split_var)252 dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))253 254 raw_baselines = dk_raw255 column_names = dk_columns256 elif slate_var1 == 'Secondary Slate':257 st.session_state.working_seed = init_DK_secondary_seed_frames(sharp_split_var)258 dk_id_dict = dict(zip(dk_secondary.Player, dk_secondary.player_id))259 260 raw_baselines = dk_secondary261 column_names = dk_columns262 263 if player_var1 == 'Specific Players':264 st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]265 st.session_state.data_export_display = st.session_state.working_seed[0:lineup_num_var]266 export_column_var = 8267 data_export = st.session_state.data_export_display.copy()268 for col in range(export_column_var):269 data_export[:, col] = np.array([dk_id_dict.get(x, x) for x in data_export[:, col]])270 271 elif site_var1 == 'Fanduel':272 if 'working_seed' in st.session_state:273 st.session_state.working_seed = st.session_state.working_seed274 if player_var1 == 'Specific Players':275 st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]276 st.session_state.data_export_display = st.session_state.working_seed[0:lineup_num_var]277 export_column_var = 9278 elif 'working_seed' not in st.session_state:279 if slate_var1 == 'Main Slate':280 st.session_state.working_seed = init_FD_seed_frames(sharp_split_var)281 fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))282 283 raw_baselines = fd_raw284 column_names = fd_columns285 elif slate_var1 == 'Secondary Slate':286 st.session_state.working_seed = init_FD_secondary_seed_frames(sharp_split_var)287 fd_id_dict = dict(zip(fd_secondary.Player, fd_secondary.player_id))288 289 raw_baselines = fd_secondary290 column_names = fd_columns291 292 if player_var1 == 'Specific Players':293 st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]294 st.session_state.data_export_display = st.session_state.working_seed[0:lineup_num_var]295 export_column_var = 9296 data_export = st.session_state.data_export_display.copy()297 for col in range(export_column_var):298 data_export[:, col] = np.array([fd_id_dict.get(x, x) for x in fd_id_dict[:, col]])299 st.download_button(300 label="Export optimals set",301 data=convert_df(data_export),302 file_name='NBA_optimals_export.csv',303 mime='text/csv',304 )305 306 with col2:307 if st.button("Load Data", key='load_data'):308 if site_var1 == 'Draftkings':309 if 'working_seed' in st.session_state:310 st.session_state.working_seed = st.session_state.working_seed311 if player_var1 == 'Specific Players':312 st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]313 st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)314 elif 'working_seed' not in st.session_state:315 if slate_var1 == 'Main Slate':316 st.session_state.working_seed = init_DK_seed_frames(sharp_split_var)317 dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))318 319 raw_baselines = dk_raw320 column_names = dk_columns321 elif slate_var1 == 'Secondary Slate':322 st.session_state.working_seed = init_DK_secondary_seed_frames(sharp_split_var)323 dk_id_dict = dict(zip(dk_secondary.Player, dk_secondary.player_id))324 325 raw_baselines = dk_secondary326 column_names = dk_columns327 328 if player_var1 == 'Specific Players':329 st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]330 st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)331 332 elif site_var1 == 'Fanduel':333 if 'working_seed' in st.session_state:334 st.session_state.working_seed = st.session_state.working_seed335 if player_var1 == 'Specific Players':336 st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]337 st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)338 elif 'working_seed' not in st.session_state:339 if slate_var1 == 'Main Slate':340 st.session_state.working_seed = init_FD_seed_frames(sharp_split_var)341 fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))342 343 raw_baselines = fd_raw344 column_names = fd_columns345 elif slate_var1 == 'Secondary Slate':346 st.session_state.working_seed = init_FD_secondary_seed_frames(sharp_split_var)347 fd_id_dict = dict(zip(fd_secondary.Player, fd_secondary.player_id))348 349 raw_baselines = fd_secondary350 column_names = fd_columns351 352 if player_var1 == 'Specific Players':353 st.session_state.working_seed = st.session_state.working_seed[np.equal.outer(st.session_state.working_seed, player_var2).any(axis=1).all(axis=1)]354 st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)355 356 if 'data_export_display' in st.session_state:357 st.dataframe(st.session_state.data_export_display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), height=500, use_container_width = True)358 359with tab1:360 col1, col2 = st.columns([1, 7])361 with col1:362 if st.button("Load/Reset Data", key='reset2'):363 st.cache_data.clear()364 for key in st.session_state.keys():365 del st.session_state[key]366 DK_seed = init_DK_seed_frames(10000)367 FD_seed = init_FD_seed_frames(10000)368 DK_secondary = init_DK_secondary_seed_frames(10000)369 FD_secondary = init_FD_secondary_seed_frames(10000)370 dk_raw, fd_raw, dk_secondary, fd_secondary = init_baselines()371 dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))372 fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))373 374 sim_slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate'), key='sim_slate_var1')375 sim_site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='sim_site_var1')376 377 contest_var1 = st.selectbox("What contest size are you simulating?", ('Small', 'Medium', 'Large', 'Custom'))378 if contest_var1 == 'Small':379 Contest_Size = 1000380 elif contest_var1 == 'Medium':381 Contest_Size = 5000382 elif contest_var1 == 'Large':383 Contest_Size = 10000384 elif contest_var1 == 'Custom':385 Contest_Size = st.number_input("Insert contest size", value=100, min_value=100, max_value=100000, step=50)386 strength_var1 = st.selectbox("How sharp is the field in the contest?", ('Very', 'Above Average', 'Average', 'Below Average', 'Not Very'))387 if strength_var1 == 'Not Very':388 sharp_split = 5000000389 elif strength_var1 == 'Below Average':390 sharp_split = 2500000391 elif strength_var1 == 'Average':392 sharp_split = 100000393 elif strength_var1 == 'Above Average':394 sharp_split = 50000395 elif strength_var1 == 'Very':396 sharp_split = 10000397 398 399 with col2:400 if st.button("Run Contest Sim"):401 if 'working_seed' in st.session_state:402 st.session_state.maps_dict = {403 'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),404 'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),405 'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),406 'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])),407 'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),408 'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev))409 }410 Sim_Winners = sim_contest(1000, st.session_state.working_seed, st.session_state.maps_dict, Contest_Size)411 Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))412 413 # Initial setup414 Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])415 Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['proj'] + Sim_Winner_Frame['Fantasy']) / 2416 Sim_Winner_Frame['unique_id'] = Sim_Winner_Frame['proj'].astype(str) + Sim_Winner_Frame['salary'].astype(str) + Sim_Winner_Frame['Team'].astype(str) + Sim_Winner_Frame['Secondary'].astype(str)417 Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts()))418 419 # Type Casting420 type_cast_dict = {'salary': int, 'proj': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float32, 'Own': np.float32}421 Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)422 423 # Sorting424 st.session_state.Sim_Winner_Frame = Sim_Winner_Frame.sort_values(by=['win_count', 'GPP_Proj'], ascending= [False, False]).copy().drop_duplicates(subset='unique_id').head(100)425 st.session_state.Sim_Winner_Frame.drop(columns='unique_id', inplace=True)426 427 # Data Copying428 st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()429 430 # Data Copying431 st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()432 433 else:434 if sim_site_var1 == 'Draftkings':435 if sim_slate_var1 == 'Main Slate':436 st.session_state.working_seed = init_DK_seed_frames(sharp_split)437 dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))438 raw_baselines = dk_raw439 column_names = dk_columns440 elif sim_slate_var1 == 'Secondary Slate':441 st.session_state.working_seed = init_DK_secondary_seed_frames(sharp_split)442 dk_id_dict = dict(zip(dk_secondary.Player, dk_secondary.player_id))443 raw_baselines = dk_secondary444 column_names = dk_columns445 446 elif sim_site_var1 == 'Fanduel':447 if sim_slate_var1 == 'Main Slate':448 st.session_state.working_seed = init_FD_seed_frames(sharp_split)449 fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))450 raw_baselines = fd_raw451 column_names = fd_columns452 elif sim_slate_var1 == 'Secondary Slate':453 st.session_state.working_seed = init_FD_secondary_seed_frames(sharp_split)454 fd_id_dict = dict(zip(fd_secondary.Player, fd_secondary.player_id))455 raw_baselines = fd_secondary456 column_names = fd_columns457 458 st.session_state.maps_dict = {459 'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),460 'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),461 'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),462 'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])),463 'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),464 'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev))465 }466 Sim_Winners = sim_contest(1000, st.session_state.working_seed, st.session_state.maps_dict, Contest_Size)467 Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))468 469 # Initial setup470 Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])471 Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['proj'] + Sim_Winner_Frame['Fantasy']) / 2472 Sim_Winner_Frame['unique_id'] = Sim_Winner_Frame['proj'].astype(str) + Sim_Winner_Frame['salary'].astype(str) + Sim_Winner_Frame['Team'].astype(str) + Sim_Winner_Frame['Secondary'].astype(str)473 Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts()))474 475 # Type Casting476 type_cast_dict = {'salary': int, 'proj': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float32, 'Own': np.float32}477 Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)478 479 # Sorting480 st.session_state.Sim_Winner_Frame = Sim_Winner_Frame.sort_values(by=['win_count', 'GPP_Proj'], ascending= [False, False]).copy().drop_duplicates(subset='unique_id').head(100)481 st.session_state.Sim_Winner_Frame.drop(columns='unique_id', inplace=True)482 483 # Data Copying484 st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()485 486 # Data Copying487 st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()488 st.session_state.freq_copy = st.session_state.Sim_Winner_Display489 490 if sim_site_var1 == 'Draftkings':491 freq_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:8].values, return_counts=True)),492 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)493 elif sim_site_var1 == 'Fanduel':494 freq_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:9].values, return_counts=True)),495 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)496 freq_working['Freq'] = freq_working['Freq'].astype(int)497 freq_working['Position'] = freq_working['Player'].map(st.session_state.maps_dict['Pos_map'])498 freq_working['Salary'] = freq_working['Player'].map(st.session_state.maps_dict['Salary_map'])499 freq_working['Proj Own'] = freq_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100500 freq_working['Exposure'] = freq_working['Freq']/(1000)501 freq_working['Edge'] = freq_working['Exposure'] - freq_working['Proj Own']502 freq_working['Team'] = freq_working['Player'].map(st.session_state.maps_dict['Team_map'])503 st.session_state.player_freq = freq_working.copy()504 505 if sim_site_var1 == 'Draftkings':506 pg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:1].values, return_counts=True)),507 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)508 elif sim_site_var1 == 'Fanduel':509 pg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:2].values, return_counts=True)),510 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)511 pg_working['Freq'] = pg_working['Freq'].astype(int)512 pg_working['Position'] = pg_working['Player'].map(st.session_state.maps_dict['Pos_map'])513 pg_working['Salary'] = pg_working['Player'].map(st.session_state.maps_dict['Salary_map'])514 pg_working['Proj Own'] = pg_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100515 pg_working['Exposure'] = pg_working['Freq']/(1000)516 pg_working['Edge'] = pg_working['Exposure'] - pg_working['Proj Own']517 pg_working['Team'] = pg_working['Player'].map(st.session_state.maps_dict['Team_map'])518 st.session_state.pg_freq = pg_working.copy()519 520 if sim_site_var1 == 'Draftkings':521 sg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,1:2].values, return_counts=True)),522 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)523 elif sim_site_var1 == 'Fanduel':524 sg_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,2:4].values, return_counts=True)),525 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)526 sg_working['Freq'] = sg_working['Freq'].astype(int)527 sg_working['Position'] = sg_working['Player'].map(st.session_state.maps_dict['Pos_map'])528 sg_working['Salary'] = sg_working['Player'].map(st.session_state.maps_dict['Salary_map'])529 sg_working['Proj Own'] = sg_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100530 sg_working['Exposure'] = sg_working['Freq']/(1000)531 sg_working['Edge'] = sg_working['Exposure'] - sg_working['Proj Own']532 sg_working['Team'] = sg_working['Player'].map(st.session_state.maps_dict['Team_map'])533 st.session_state.sg_freq = sg_working.copy()534 535 if sim_site_var1 == 'Draftkings':536 sf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,2:3].values, return_counts=True)),537 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)538 elif sim_site_var1 == 'Fanduel':539 sf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,4:6].values, return_counts=True)),540 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)541 sf_working['Freq'] = sf_working['Freq'].astype(int)542 sf_working['Position'] = sf_working['Player'].map(st.session_state.maps_dict['Pos_map'])543 sf_working['Salary'] = sf_working['Player'].map(st.session_state.maps_dict['Salary_map'])544 sf_working['Proj Own'] = sf_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100545 sf_working['Exposure'] = sf_working['Freq']/(1000)546 sf_working['Edge'] = sf_working['Exposure'] - sf_working['Proj Own']547 sf_working['Team'] = sf_working['Player'].map(st.session_state.maps_dict['Team_map'])548 st.session_state.sf_freq = sf_working.copy()549 550 if sim_site_var1 == 'Draftkings':551 pf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,3:4].values, return_counts=True)),552 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)553 elif sim_site_var1 == 'Fanduel':554 pf_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,6:8].values, return_counts=True)),555 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)556 pf_working['Freq'] = pf_working['Freq'].astype(int)557 pf_working['Position'] = pf_working['Player'].map(st.session_state.maps_dict['Pos_map'])558 pf_working['Salary'] = pf_working['Player'].map(st.session_state.maps_dict['Salary_map'])559 pf_working['Proj Own'] = pf_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100560 pf_working['Exposure'] = pf_working['Freq']/(1000)561 pf_working['Edge'] = pf_working['Exposure'] - pf_working['Proj Own']562 pf_working['Team'] = pf_working['Player'].map(st.session_state.maps_dict['Team_map'])563 st.session_state.pf_freq = pf_working.copy()564 565 if sim_site_var1 == 'Draftkings':566 c_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,4:5].values, return_counts=True)),567 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)568 elif sim_site_var1 == 'Fanduel':569 c_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,8:9].values, return_counts=True)),570 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)571 c_working['Freq'] = c_working['Freq'].astype(int)572 c_working['Position'] = c_working['Player'].map(st.session_state.maps_dict['Pos_map'])573 c_working['Salary'] = c_working['Player'].map(st.session_state.maps_dict['Salary_map'])574 c_working['Proj Own'] = c_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100575 c_working['Exposure'] = c_working['Freq']/(1000)576 c_working['Edge'] = c_working['Exposure'] - c_working['Proj Own']577 c_working['Team'] = c_working['Player'].map(st.session_state.maps_dict['Team_map'])578 st.session_state.c_freq = c_working.copy()579 580 if sim_site_var1 == 'Draftkings':581 g_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,5:6].values, return_counts=True)),582 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)583 elif sim_site_var1 == 'Fanduel':584 g_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:4].values, return_counts=True)),585 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)586 g_working['Freq'] = g_working['Freq'].astype(int)587 g_working['Position'] = g_working['Player'].map(st.session_state.maps_dict['Pos_map'])588 g_working['Salary'] = g_working['Player'].map(st.session_state.maps_dict['Salary_map'])589 g_working['Proj Own'] = g_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100590 g_working['Exposure'] = g_working['Freq']/(1000)591 g_working['Edge'] = g_working['Exposure'] - g_working['Proj Own']592 g_working['Team'] = g_working['Player'].map(st.session_state.maps_dict['Team_map'])593 st.session_state.g_freq = g_working.copy()594 595 if sim_site_var1 == 'Draftkings':596 f_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,6:7].values, return_counts=True)),597 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)598 elif sim_site_var1 == 'Fanduel':599 f_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,4:8].values, return_counts=True)),600 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)601 f_working['Freq'] = f_working['Freq'].astype(int)602 f_working['Position'] = f_working['Player'].map(st.session_state.maps_dict['Pos_map'])603 f_working['Salary'] = f_working['Player'].map(st.session_state.maps_dict['Salary_map'])604 f_working['Proj Own'] = f_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100605 f_working['Exposure'] = f_working['Freq']/(1000)606 f_working['Edge'] = f_working['Exposure'] - f_working['Proj Own']607 f_working['Team'] = f_working['Player'].map(st.session_state.maps_dict['Team_map'])608 st.session_state.f_freq = f_working.copy()609 610 if sim_site_var1 == 'Draftkings':611 flex_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,7:8].values, return_counts=True)),612 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)613 elif sim_site_var1 == 'Fanduel':614 flex_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:9].values, return_counts=True)),615 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)616 flex_working['Freq'] = flex_working['Freq'].astype(int)617 flex_working['Position'] = flex_working['Player'].map(st.session_state.maps_dict['Pos_map'])618 flex_working['Salary'] = flex_working['Player'].map(st.session_state.maps_dict['Salary_map'])619 flex_working['Proj Own'] = flex_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100620 flex_working['Exposure'] = flex_working['Freq']/(1000)621 flex_working['Edge'] = flex_working['Exposure'] - flex_working['Proj Own']622 flex_working['Team'] = flex_working['Player'].map(st.session_state.maps_dict['Team_map'])623 st.session_state.flex_freq = flex_working.copy()624 625 if sim_site_var1 == 'Draftkings':626 team_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,10:11].values, return_counts=True)),627 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)628 elif sim_site_var1 == 'Fanduel':629 team_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,11:12].values, return_counts=True)),630 columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)631 team_working['Freq'] = team_working['Freq'].astype(int)632 team_working['Exposure'] = team_working['Freq']/(1000)633 st.session_state.team_freq = team_working.copy()634 635 with st.container():636 if st.button("Reset Sim", key='reset_sim'):637 for key in st.session_state.keys():638 del st.session_state[key]639 if 'player_freq' in st.session_state: 640 player_split_var2 = st.radio("Are you wanting to isolate any lineups with specific players?", ('Full Players', 'Specific Players'), key='player_split_var2')641 if player_split_var2 == 'Specific Players':642 find_var2 = st.multiselect('Which players must be included in the lineups?', options = st.session_state.player_freq['Player'].unique())643 elif player_split_var2 == 'Full Players':644 find_var2 = st.session_state.player_freq.Player.values.tolist()645 646 if player_split_var2 == 'Specific Players':647 st.session_state.Sim_Winner_Display = st.session_state.Sim_Winner_Frame[np.equal.outer(st.session_state.Sim_Winner_Frame.to_numpy(), find_var2).any(axis=1).all(axis=1)]648 if player_split_var2 == 'Full Players':649 st.session_state.Sim_Winner_Display = st.session_state.Sim_Winner_Frame650 if 'Sim_Winner_Display' in st.session_state:651 st.dataframe(st.session_state.Sim_Winner_Display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True)652 if 'Sim_Winner_Export' in st.session_state:653 st.download_button(654 label="Export Full Frame",655 data=st.session_state.Sim_Winner_Export.to_csv().encode('utf-8'),656 file_name='MLB_consim_export.csv',657 mime='text/csv',658 ) 659 tab1, tab2 = st.tabs(['Winning Frame Statistics', 'Flex Exposure Statistics'])660 661 with tab1:662 if 'Sim_Winner_Display' in st.session_state:663 # Create a new dataframe with summary statistics664 summary_df = pd.DataFrame({665 'Metric': ['Min', 'Average', 'Max', 'STDdev'],666 'Salary': [667 st.session_state.Sim_Winner_Display['salary'].min(),668 st.session_state.Sim_Winner_Display['salary'].mean(),669 st.session_state.Sim_Winner_Display['salary'].max(),670 st.session_state.Sim_Winner_Display['salary'].std()671 ],672 'Proj': [673 st.session_state.Sim_Winner_Display['proj'].min(),674 st.session_state.Sim_Winner_Display['proj'].mean(),675 st.session_state.Sim_Winner_Display['proj'].max(),676 st.session_state.Sim_Winner_Display['proj'].std()677 ],678 'Own': [679 st.session_state.Sim_Winner_Display['Own'].min(),680 st.session_state.Sim_Winner_Display['Own'].mean(),681 st.session_state.Sim_Winner_Display['Own'].max(),682 st.session_state.Sim_Winner_Display['Own'].std()683 ],684 'Fantasy': [685 st.session_state.Sim_Winner_Display['Fantasy'].min(),686 st.session_state.Sim_Winner_Display['Fantasy'].mean(),687 st.session_state.Sim_Winner_Display['Fantasy'].max(),688 st.session_state.Sim_Winner_Display['Fantasy'].std()689 ],690 'GPP_Proj': [691 st.session_state.Sim_Winner_Display['GPP_Proj'].min(),692 st.session_state.Sim_Winner_Display['GPP_Proj'].mean(),693 st.session_state.Sim_Winner_Display['GPP_Proj'].max(),694 st.session_state.Sim_Winner_Display['GPP_Proj'].std()695 ]696 })697 698 # Set the index of the summary dataframe as the "Metric" column699 summary_df = summary_df.set_index('Metric')700 701 # Display the summary dataframe702 st.subheader("Winning Frame Statistics")703 st.dataframe(summary_df.style.format({704 'Salary': '{:.2f}',705 'Proj': '{:.2f}',706 'Fantasy': '{:.2f}',707 'GPP_Proj': '{:.2f}'708 }).background_gradient(cmap='RdYlGn', axis=0, subset=['Salary', 'Proj', 'Own', 'Fantasy', 'GPP_Proj']), use_container_width=True)709 710 with tab2:711 if 'Sim_Winner_Display' in st.session_state:712 st.write("Yeah man that's crazy")713 714 else:715 st.write("Simulation data or position mapping not available.")716 with st.container():717 tab1, tab2 = st.tabs(['Overall Exposures', 'Team Exposures'])718 with tab1:719 if 'player_freq' in st.session_state:720 721 st.dataframe(st.session_state.player_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)722 st.download_button(723 label="Export Exposures",724 data=st.session_state.player_freq.to_csv().encode('utf-8'),725 file_name='player_freq_export.csv',726 mime='text/csv',727 key='overall'728 )729 730 with tab2:731 if 'team_freq' in st.session_state:732 733 st.dataframe(st.session_state.team_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)734 st.download_button(735 label="Export Exposures",736 data=st.session_state.team_freq.to_csv().encode('utf-8'),737 file_name='team_freq.csv',738 mime='text/csv',739 key='team'740 )