James McCool commited on
Commit
f2485b1
·
1 Parent(s): 55ce9cc

Refactor seed frame initialization to support multiple slate types in NHL DFS app; enhance data loading and export functionality in Streamlit interface.

Browse files
Files changed (1) hide show
  1. app.py +333 -315
app.py CHANGED
@@ -21,28 +21,40 @@ dk_columns = ['C1', 'C2', 'W1', 'W2', 'W3', 'D1', 'D2', 'G', 'FLEX', 'salary', '
21
  fd_columns = ['C1', 'C2', 'W1', 'W2', 'D1', 'D2', 'FLEX1', 'FLEX2', 'G', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
22
 
23
  @st.cache_data(ttl = 600)
24
- def init_DK_seed_frames(sharp_split):
25
-
26
- collection = db["DK_NHL_seed_frame"]
27
- cursor = collection.find().limit(sharp_split)
28
-
29
- raw_display = pd.DataFrame(list(cursor))
30
- raw_display = raw_display[['C1', 'C2', 'W1', 'W2', 'W3', 'D1', 'D2', 'G', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
31
- DK_seed = raw_display.to_numpy()
32
 
33
- return DK_seed
 
 
 
 
 
 
 
 
 
 
 
 
 
34
 
35
  @st.cache_data(ttl = 599)
36
- def init_FD_seed_frames(sharp_split):
37
-
38
- collection = db["FD_NHL_seed_frame"]
39
- cursor = collection.find().limit(sharp_split)
40
 
41
- raw_display = pd.DataFrame(list(cursor))
42
- raw_display = raw_display[['C1', 'C2', 'W1', 'W2', 'D1', 'D2', 'FLEX1', 'FLEX2', 'G', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
43
- FD_seed = raw_display.to_numpy()
 
 
 
44
 
45
- return FD_seed
 
 
 
 
 
 
46
 
47
  @st.cache_data(ttl = 599)
48
  def init_baselines():
@@ -129,133 +141,20 @@ dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))
129
  fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))
130
 
131
  tab1, tab2 = st.tabs(['Contest Sims', 'Data Export'])
132
- with tab2:
133
- col1, col2 = st.columns([1, 7])
134
- with col1:
135
- if st.button("Load/Reset Data", key='reset1'):
136
- st.cache_data.clear()
137
- for key in st.session_state.keys():
138
- del st.session_state[key]
139
- DK_seed = init_DK_seed_frames(10000)
140
- FD_seed = init_FD_seed_frames(10000)
141
- dk_raw, fd_raw, teams_playing_count = init_baselines()
142
- dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))
143
- fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))
144
-
145
- slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Other Main Slate'))
146
- site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'))
147
- sharp_split_var = st.number_input("How many lineups do you want?", value=10000, max_value=500000, min_value=10000, step=10000)
148
-
149
- if site_var1 == 'Draftkings':
150
-
151
- team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
152
- if team_var1 == 'Specific Teams':
153
- team_var2 = st.multiselect('Which teams do you want?', options = dk_raw['Team'].unique())
154
- elif team_var1 == 'Full Slate':
155
- team_var2 = dk_raw.Team.values.tolist()
156
-
157
- stack_var1 = st.radio("Do you want a frame with specific stack sizes?", ('Full Slate', 'Specific Stack Sizes'), key='stack_var1')
158
- if stack_var1 == 'Specific Stack Sizes':
159
- stack_var2 = st.multiselect('Which stack sizes do you want?', options = [5, 4, 3, 2, 1, 0])
160
- elif stack_var1 == 'Full Slate':
161
- stack_var2 = [5, 4, 3, 2, 1, 0]
162
-
163
- elif site_var1 == 'Fanduel':
164
-
165
- team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
166
- if team_var1 == 'Specific Teams':
167
- team_var2 = st.multiselect('Which teams do you want?', options = fd_raw['Team'].unique())
168
- elif team_var1 == 'Full Slate':
169
- team_var2 = fd_raw.Team.values.tolist()
170
-
171
- stack_var1 = st.radio("Do you want a frame with specific stack sizes?", ('Full Slate', 'Specific Stack Sizes'), key='stack_var1')
172
- if stack_var1 == 'Specific Stack Sizes':
173
- stack_var2 = st.multiselect('Which stack sizes do you want?', options = [5, 4, 3, 2, 1, 0])
174
- elif stack_var1 == 'Full Slate':
175
- stack_var2 = [5, 4, 3, 2, 1, 0]
176
-
177
-
178
- if st.button("Prepare data export", key='data_export'):
179
- if 'working_seed' in st.session_state:
180
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
181
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
182
- elif 'working_seed' not in st.session_state:
183
- if site_var1 == 'Draftkings':
184
- if slate_var1 == 'Main Slate':
185
- st.session_state.working_seed = init_DK_seed_frames(sharp_split_var)
186
-
187
- raw_baselines = dk_raw
188
- column_names = dk_columns
189
-
190
- elif site_var1 == 'Fanduel':
191
- if slate_var1 == 'Main Slate':
192
- st.session_state.working_seed = init_FD_seed_frames(sharp_split_var)
193
-
194
- raw_baselines = fd_raw
195
- column_names = fd_columns
196
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
197
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
198
- data_export = st.session_state.working_seed.copy()
199
- st.download_button(
200
- label="Export optimals set",
201
- data=convert_df(data_export),
202
- file_name='NHL_optimals_export.csv',
203
- mime='text/csv',
204
- )
205
- for key in st.session_state.keys():
206
- del st.session_state[key]
207
-
208
- with col2:
209
- if st.button("Load Data", key='load_data'):
210
- if site_var1 == 'Draftkings':
211
- if 'working_seed' in st.session_state:
212
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
213
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
214
- st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
215
- elif 'working_seed' not in st.session_state:
216
- if slate_var1 == 'Main Slate':
217
- st.session_state.working_seed = init_DK_seed_frames(sharp_split_var)
218
-
219
- raw_baselines = dk_raw
220
- column_names = dk_columns
221
-
222
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
223
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
224
- st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
225
-
226
- elif site_var1 == 'Fanduel':
227
- if 'working_seed' in st.session_state:
228
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
229
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
230
- st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
231
- elif 'working_seed' not in st.session_state:
232
- if slate_var1 == 'Main Slate':
233
- st.session_state.working_seed = init_FD_seed_frames(sharp_split_var)
234
-
235
- raw_baselines = fd_raw
236
- column_names = fd_columns
237
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
238
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
239
- st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
240
-
241
- with st.container():
242
- if 'data_export_display' in st.session_state:
243
- st.dataframe(st.session_state.data_export_display.style.format(freq_format, precision=2), use_container_width = True)
244
 
245
  with tab1:
246
- col1, col2 = st.columns([1, 7])
247
- with col1:
248
  if st.button("Load/Reset Data", key='reset2'):
249
  st.cache_data.clear()
250
  for key in st.session_state.keys():
251
  del st.session_state[key]
252
- DK_seed = init_DK_seed_frames(10000)
253
- FD_seed = init_FD_seed_frames(10000)
254
  dk_raw, fd_raw, teams_playing_count = init_baselines()
255
  dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))
256
  fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))
257
 
258
- sim_slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Other Main Slate'), key='sim_slate_var1')
259
  sim_site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='sim_site_var1')
260
 
261
  contest_var1 = st.selectbox("What contest size are you simulating?", ('Small', 'Medium', 'Large', 'Custom'))
@@ -279,195 +178,192 @@ with tab1:
279
  elif strength_var1 == 'Very':
280
  sharp_split = 10000
281
 
282
-
283
- with col2:
284
- if st.button("Run Contest Sim"):
285
- if 'working_seed' in st.session_state:
286
- st.session_state.maps_dict = {
287
- 'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
288
- 'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),
289
- 'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),
290
- 'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])),
291
- 'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),
292
- 'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev))
293
- }
294
- Sim_Winners = sim_contest(1000, st.session_state.working_seed, st.session_state.maps_dict, Contest_Size, teams_playing_count)
295
- Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
296
-
297
- #st.table(Sim_Winner_Frame)
298
-
299
- # Initial setup
300
- Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])
301
- Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['proj'] + Sim_Winner_Frame['Fantasy']) / 2
302
- 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)
303
- Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts()))
304
-
305
- # Type Casting
306
- type_cast_dict = {'salary': int, 'proj': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float32, 'Own': np.float32}
307
- Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)
308
-
309
- # Sorting
310
- 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)
311
- st.session_state.Sim_Winner_Frame.drop(columns='unique_id', inplace=True)
312
-
313
- # Data Copying
314
- st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()
315
- for col in st.session_state.Sim_Winner_Export.iloc[:, 0:9].columns:
316
- st.session_state.Sim_Winner_Export[col] = st.session_state.Sim_Winner_Export[col].map(dk_id_dict)
317
- st.session_state.Sim_Winner_Export = st.session_state.Sim_Winner_Export.drop_duplicates(subset=['Team', 'Secondary', 'salary', 'unique_id'])
318
-
319
- # Data Copying
320
- st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()
321
-
322
- else:
323
- if sim_site_var1 == 'Draftkings':
324
- if sim_slate_var1 == 'Main Slate':
325
- st.session_state.working_seed = init_DK_seed_frames(sharp_split)
326
-
327
- raw_baselines = dk_raw
328
- column_names = dk_columns
329
- elif sim_site_var1 == 'Fanduel':
330
- if sim_slate_var1 == 'Main Slate':
331
- st.session_state.working_seed = init_FD_seed_frames(sharp_split)
332
 
333
- raw_baselines = fd_raw
334
- column_names = fd_columns
335
- st.session_state.maps_dict = {
336
- 'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
337
- 'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),
338
- 'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),
339
- 'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])),
340
- 'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),
341
- 'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev))
342
- }
343
- Sim_Winners = sim_contest(1000, st.session_state.working_seed, st.session_state.maps_dict, Contest_Size, teams_playing_count)
344
- Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
345
-
346
- #st.table(Sim_Winner_Frame)
347
-
348
- # Initial setup
349
- Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])
350
- Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['proj'] + Sim_Winner_Frame['Fantasy']) / 2
351
- 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)
352
- Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts()))
353
-
354
- # Type Casting
355
- type_cast_dict = {'salary': int, 'proj': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float32, 'Own': np.float32}
356
- Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)
357
-
358
- # Sorting
359
- 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)
360
- st.session_state.Sim_Winner_Frame.drop(columns='unique_id', inplace=True)
361
-
362
- # Data Copying
363
- st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()
364
- for col in st.session_state.Sim_Winner_Export.iloc[:, 0:9].columns:
365
- st.session_state.Sim_Winner_Export[col] = st.session_state.Sim_Winner_Export[col].map(dk_id_dict)
366
- st.session_state.Sim_Winner_Export = st.session_state.Sim_Winner_Export.drop_duplicates(subset=['Team', 'Secondary', 'salary', 'unique_id'])
367
-
368
- # Data Copying
369
- st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()
370
- st.session_state.freq_copy = st.session_state.Sim_Winner_Display
371
-
372
  if sim_site_var1 == 'Draftkings':
373
- freq_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:9].values, return_counts=True)),
374
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
 
 
375
  elif sim_site_var1 == 'Fanduel':
376
- freq_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:9].values, return_counts=True)),
377
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
378
- freq_working['Freq'] = freq_working['Freq'].astype(int)
379
- freq_working['Position'] = freq_working['Player'].map(st.session_state.maps_dict['Pos_map'])
380
- freq_working['Salary'] = freq_working['Player'].map(st.session_state.maps_dict['Salary_map'])
381
- freq_working['Proj Own'] = freq_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
382
- freq_working['Exposure'] = freq_working['Freq']/(1000)
383
- freq_working['Edge'] = freq_working['Exposure'] - freq_working['Proj Own']
384
- freq_working['Team'] = freq_working['Player'].map(st.session_state.maps_dict['Team_map'])
385
- st.session_state.player_freq = freq_working.copy()
386
 
387
- if sim_site_var1 == 'Draftkings':
388
- center_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:2].values, return_counts=True)),
389
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
390
- elif sim_site_var1 == 'Fanduel':
391
- center_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:2].values, return_counts=True)),
392
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
393
- center_working['Freq'] = center_working['Freq'].astype(int)
394
- center_working['Position'] = center_working['Player'].map(st.session_state.maps_dict['Pos_map'])
395
- center_working['Salary'] = center_working['Player'].map(st.session_state.maps_dict['Salary_map'])
396
- center_working['Proj Own'] = center_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
397
- center_working['Exposure'] = center_working['Freq']/(1000)
398
- center_working['Edge'] = center_working['Exposure'] - center_working['Proj Own']
399
- center_working['Team'] = center_working['Player'].map(st.session_state.maps_dict['Team_map'])
400
- st.session_state.center_freq = center_working.copy()
401
 
402
- if sim_site_var1 == 'Draftkings':
403
- wing_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,2:5].values, return_counts=True)),
404
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
405
- elif sim_site_var1 == 'Fanduel':
406
- wing_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,2:4].values, return_counts=True)),
407
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
408
- wing_working['Freq'] = wing_working['Freq'].astype(int)
409
- wing_working['Position'] = wing_working['Player'].map(st.session_state.maps_dict['Pos_map'])
410
- wing_working['Salary'] = wing_working['Player'].map(st.session_state.maps_dict['Salary_map'])
411
- wing_working['Proj Own'] = wing_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
412
- wing_working['Exposure'] = wing_working['Freq']/(1000)
413
- wing_working['Edge'] = wing_working['Exposure'] - wing_working['Proj Own']
414
- wing_working['Team'] = wing_working['Player'].map(st.session_state.maps_dict['Team_map'])
415
- st.session_state.wing_freq = wing_working.copy()
416
 
417
- if sim_site_var1 == 'Draftkings':
418
- dmen_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,5:7].values, return_counts=True)),
419
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
420
- elif sim_site_var1 == 'Fanduel':
421
- dmen_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,4:6].values, return_counts=True)),
422
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
423
- dmen_working['Freq'] = dmen_working['Freq'].astype(int)
424
- dmen_working['Position'] = dmen_working['Player'].map(st.session_state.maps_dict['Pos_map'])
425
- dmen_working['Salary'] = dmen_working['Player'].map(st.session_state.maps_dict['Salary_map'])
426
- dmen_working['Proj Own'] = dmen_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
427
- dmen_working['Exposure'] = dmen_working['Freq']/(1000)
428
- dmen_working['Edge'] = dmen_working['Exposure'] - dmen_working['Proj Own']
429
- dmen_working['Team'] = dmen_working['Player'].map(st.session_state.maps_dict['Team_map'])
430
- st.session_state.dmen_freq = dmen_working.copy()
431
 
432
- if sim_site_var1 == 'Draftkings':
433
- flex_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,8:9].values, return_counts=True)),
434
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
435
- elif sim_site_var1 == 'Fanduel':
436
- flex_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,6:8].values, return_counts=True)),
437
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
438
- flex_working['Freq'] = flex_working['Freq'].astype(int)
439
- flex_working['Position'] = flex_working['Player'].map(st.session_state.maps_dict['Pos_map'])
440
- flex_working['Salary'] = flex_working['Player'].map(st.session_state.maps_dict['Salary_map'])
441
- flex_working['Proj Own'] = flex_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
442
- flex_working['Exposure'] = flex_working['Freq']/(1000)
443
- flex_working['Edge'] = flex_working['Exposure'] - flex_working['Proj Own']
444
- flex_working['Team'] = flex_working['Player'].map(st.session_state.maps_dict['Team_map'])
445
- st.session_state.flex_freq = flex_working.copy()
446
 
447
- if sim_site_var1 == 'Draftkings':
448
- goalie_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,7:8].values, return_counts=True)),
449
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
450
- elif sim_site_var1 == 'Fanduel':
451
- goalie_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,8:9].values, return_counts=True)),
452
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
453
- goalie_working['Freq'] = goalie_working['Freq'].astype(int)
454
- goalie_working['Position'] = goalie_working['Player'].map(st.session_state.maps_dict['Pos_map'])
455
- goalie_working['Salary'] = goalie_working['Player'].map(st.session_state.maps_dict['Salary_map'])
456
- goalie_working['Proj Own'] = goalie_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
457
- goalie_working['Exposure'] = goalie_working['Freq']/(1000)
458
- goalie_working['Edge'] = goalie_working['Exposure'] - goalie_working['Proj Own']
459
- goalie_working['Team'] = goalie_working['Player'].map(st.session_state.maps_dict['Team_map'])
460
- st.session_state.goalie_freq = goalie_working.copy()
 
 
 
 
 
 
 
 
 
 
461
 
462
- if sim_site_var1 == 'Draftkings':
463
- team_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,11:12].values, return_counts=True)),
464
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
465
- elif sim_site_var1 == 'Fanduel':
466
- team_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,11:12].values, return_counts=True)),
467
- columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
468
- team_working['Freq'] = team_working['Freq'].astype(int)
469
- team_working['Exposure'] = team_working['Freq']/(1000)
470
- st.session_state.team_freq = team_working.copy()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
471
 
472
  with st.container():
473
  if st.button("Reset Sim", key='reset_sim'):
@@ -697,4 +593,126 @@ with tab1:
697
  file_name='team_freq.csv',
698
  mime='text/csv',
699
  key='team'
700
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  fd_columns = ['C1', 'C2', 'W1', 'W2', 'D1', 'D2', 'FLEX1', 'FLEX2', 'G', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
22
 
23
  @st.cache_data(ttl = 600)
24
+ def init_DK_seed_frames(sharp_split, slate_var):
 
 
 
 
 
 
 
25
 
26
+ if slate_var == 'Main Slate':
27
+ collection = db['DK_NHL_seed_frame_Main Slate']
28
+ elif slate_var == 'Secondary Slate':
29
+ collection = db['DK_NHL_seed_frame_Secondary Slate']
30
+ elif slate_var == 'Auxiliary Slate':
31
+ collection = db['DK_NHL_seed_frame_Auxiliary Slate']
32
+
33
+ cursor = collection.find().limit(sharp_split)
34
+
35
+ raw_display = pd.DataFrame(list(cursor))
36
+ raw_display = raw_display[['C1', 'C2', 'W1', 'W2', 'W3', 'D1', 'D2', 'G', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
37
+ DK_seed = raw_display.to_numpy()
38
+
39
+ return DK_seed
40
 
41
  @st.cache_data(ttl = 599)
42
+ def init_FD_seed_frames(sharp_split, slate_var):
 
 
 
43
 
44
+ if slate_var == 'Main Slate':
45
+ collection = db['FD_NHL_seed_frame_Main Slate']
46
+ elif slate_var == 'Secondary Slate':
47
+ collection = db['FD_NHL_seed_frame_Secondary Slate']
48
+ elif slate_var == 'Auxiliary Slate':
49
+ collection = db['FD_NHL_seed_frame_Auxiliary Slate']
50
 
51
+ cursor = collection.find().limit(sharp_split)
52
+
53
+ raw_display = pd.DataFrame(list(cursor))
54
+ raw_display = raw_display[['C1', 'C2', 'W1', 'W2', 'D1', 'D2', 'FLEX1', 'FLEX2', 'G', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
55
+ FD_seed = raw_display.to_numpy()
56
+
57
+ return FD_seed
58
 
59
  @st.cache_data(ttl = 599)
60
  def init_baselines():
 
141
  fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))
142
 
143
  tab1, tab2 = st.tabs(['Contest Sims', 'Data Export'])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
 
145
  with tab1:
146
+ with st.expander("Info and Filters"):
 
147
  if st.button("Load/Reset Data", key='reset2'):
148
  st.cache_data.clear()
149
  for key in st.session_state.keys():
150
  del st.session_state[key]
151
+ DK_seed = init_DK_seed_frames(10000, 'Main Slate')
152
+ FD_seed = init_FD_seed_frames(10000, 'Main Slate')
153
  dk_raw, fd_raw, teams_playing_count = init_baselines()
154
  dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))
155
  fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))
156
 
157
+ sim_slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'Auxiliary Slate'), key='sim_slate_var1')
158
  sim_site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='sim_site_var1')
159
 
160
  contest_var1 = st.selectbox("What contest size are you simulating?", ('Small', 'Medium', 'Large', 'Custom'))
 
178
  elif strength_var1 == 'Very':
179
  sharp_split = 10000
180
 
181
+ if st.button("Run Contest Sim"):
182
+ if 'working_seed' in st.session_state:
183
+ st.session_state.maps_dict = {
184
+ 'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
185
+ 'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),
186
+ 'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),
187
+ 'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])),
188
+ 'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),
189
+ 'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev))
190
+ }
191
+ Sim_Winners = sim_contest(1000, st.session_state.working_seed, st.session_state.maps_dict, Contest_Size, teams_playing_count)
192
+ Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
193
+
194
+ #st.table(Sim_Winner_Frame)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
195
 
196
+ # Initial setup
197
+ Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])
198
+ Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['proj'] + Sim_Winner_Frame['Fantasy']) / 2
199
+ 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)
200
+ Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts()))
201
+
202
+ # Type Casting
203
+ type_cast_dict = {'salary': int, 'proj': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float32, 'Own': np.float32}
204
+ Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)
205
+
206
+ # Sorting
207
+ 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)
208
+ st.session_state.Sim_Winner_Frame.drop(columns='unique_id', inplace=True)
209
+
210
+ # Data Copying
211
+ st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()
212
+ for col in st.session_state.Sim_Winner_Export.iloc[:, 0:9].columns:
213
+ st.session_state.Sim_Winner_Export[col] = st.session_state.Sim_Winner_Export[col].map(dk_id_dict)
214
+ st.session_state.Sim_Winner_Export = st.session_state.Sim_Winner_Export.drop_duplicates(subset=['Team', 'Secondary', 'salary', 'unique_id'])
215
+
216
+ # Data Copying
217
+ st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()
218
+
219
+ else:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
220
  if sim_site_var1 == 'Draftkings':
221
+ st.session_state.working_seed = init_DK_seed_frames(sharp_split, sim_slate_var1)
222
+ dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))
223
+ raw_baselines = dk_raw
224
+ column_names = dk_columns
225
  elif sim_site_var1 == 'Fanduel':
226
+ st.session_state.working_seed = init_FD_seed_frames(sharp_split, sim_slate_var1)
227
+ fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))
228
+ raw_baselines = fd_raw
229
+ column_names = fd_columns
 
 
 
 
 
 
230
 
231
+ st.session_state.maps_dict = {
232
+ 'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
233
+ 'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),
234
+ 'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),
235
+ 'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])),
236
+ 'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),
237
+ 'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev))
238
+ }
239
+ Sim_Winners = sim_contest(1000, st.session_state.working_seed, st.session_state.maps_dict, Contest_Size, teams_playing_count)
240
+ Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
 
 
 
 
241
 
242
+ #st.table(Sim_Winner_Frame)
243
+
244
+ # Initial setup
245
+ Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])
246
+ Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['proj'] + Sim_Winner_Frame['Fantasy']) / 2
247
+ 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)
248
+ Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts()))
 
 
 
 
 
 
 
249
 
250
+ # Type Casting
251
+ type_cast_dict = {'salary': int, 'proj': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float32, 'Own': np.float32}
252
+ Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)
 
 
 
 
 
 
 
 
 
 
 
253
 
254
+ # Sorting
255
+ 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)
256
+ st.session_state.Sim_Winner_Frame.drop(columns='unique_id', inplace=True)
 
 
 
 
 
 
 
 
 
 
 
257
 
258
+ # Data Copying
259
+ st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()
260
+ for col in st.session_state.Sim_Winner_Export.iloc[:, 0:9].columns:
261
+ st.session_state.Sim_Winner_Export[col] = st.session_state.Sim_Winner_Export[col].map(dk_id_dict)
262
+ st.session_state.Sim_Winner_Export = st.session_state.Sim_Winner_Export.drop_duplicates(subset=['Team', 'Secondary', 'salary', 'unique_id'])
263
+
264
+ # Data Copying
265
+ st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()
266
+ st.session_state.freq_copy = st.session_state.Sim_Winner_Display
267
+
268
+ if sim_site_var1 == 'Draftkings':
269
+ freq_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:9].values, return_counts=True)),
270
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
271
+ elif sim_site_var1 == 'Fanduel':
272
+ freq_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:9].values, return_counts=True)),
273
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
274
+ freq_working['Freq'] = freq_working['Freq'].astype(int)
275
+ freq_working['Position'] = freq_working['Player'].map(st.session_state.maps_dict['Pos_map'])
276
+ freq_working['Salary'] = freq_working['Player'].map(st.session_state.maps_dict['Salary_map'])
277
+ freq_working['Proj Own'] = freq_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
278
+ freq_working['Exposure'] = freq_working['Freq']/(1000)
279
+ freq_working['Edge'] = freq_working['Exposure'] - freq_working['Proj Own']
280
+ freq_working['Team'] = freq_working['Player'].map(st.session_state.maps_dict['Team_map'])
281
+ st.session_state.player_freq = freq_working.copy()
282
 
283
+ if sim_site_var1 == 'Draftkings':
284
+ center_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:2].values, return_counts=True)),
285
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
286
+ elif sim_site_var1 == 'Fanduel':
287
+ center_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,0:2].values, return_counts=True)),
288
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
289
+ center_working['Freq'] = center_working['Freq'].astype(int)
290
+ center_working['Position'] = center_working['Player'].map(st.session_state.maps_dict['Pos_map'])
291
+ center_working['Salary'] = center_working['Player'].map(st.session_state.maps_dict['Salary_map'])
292
+ center_working['Proj Own'] = center_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
293
+ center_working['Exposure'] = center_working['Freq']/(1000)
294
+ center_working['Edge'] = center_working['Exposure'] - center_working['Proj Own']
295
+ center_working['Team'] = center_working['Player'].map(st.session_state.maps_dict['Team_map'])
296
+ st.session_state.center_freq = center_working.copy()
297
+
298
+ if sim_site_var1 == 'Draftkings':
299
+ wing_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,2:5].values, return_counts=True)),
300
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
301
+ elif sim_site_var1 == 'Fanduel':
302
+ wing_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,2:4].values, return_counts=True)),
303
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
304
+ wing_working['Freq'] = wing_working['Freq'].astype(int)
305
+ wing_working['Position'] = wing_working['Player'].map(st.session_state.maps_dict['Pos_map'])
306
+ wing_working['Salary'] = wing_working['Player'].map(st.session_state.maps_dict['Salary_map'])
307
+ wing_working['Proj Own'] = wing_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
308
+ wing_working['Exposure'] = wing_working['Freq']/(1000)
309
+ wing_working['Edge'] = wing_working['Exposure'] - wing_working['Proj Own']
310
+ wing_working['Team'] = wing_working['Player'].map(st.session_state.maps_dict['Team_map'])
311
+ st.session_state.wing_freq = wing_working.copy()
312
+
313
+ if sim_site_var1 == 'Draftkings':
314
+ dmen_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,5:7].values, return_counts=True)),
315
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
316
+ elif sim_site_var1 == 'Fanduel':
317
+ dmen_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,4:6].values, return_counts=True)),
318
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
319
+ dmen_working['Freq'] = dmen_working['Freq'].astype(int)
320
+ dmen_working['Position'] = dmen_working['Player'].map(st.session_state.maps_dict['Pos_map'])
321
+ dmen_working['Salary'] = dmen_working['Player'].map(st.session_state.maps_dict['Salary_map'])
322
+ dmen_working['Proj Own'] = dmen_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
323
+ dmen_working['Exposure'] = dmen_working['Freq']/(1000)
324
+ dmen_working['Edge'] = dmen_working['Exposure'] - dmen_working['Proj Own']
325
+ dmen_working['Team'] = dmen_working['Player'].map(st.session_state.maps_dict['Team_map'])
326
+ st.session_state.dmen_freq = dmen_working.copy()
327
+
328
+ if sim_site_var1 == 'Draftkings':
329
+ flex_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,8:9].values, return_counts=True)),
330
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
331
+ elif sim_site_var1 == 'Fanduel':
332
+ flex_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,6:8].values, return_counts=True)),
333
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
334
+ flex_working['Freq'] = flex_working['Freq'].astype(int)
335
+ flex_working['Position'] = flex_working['Player'].map(st.session_state.maps_dict['Pos_map'])
336
+ flex_working['Salary'] = flex_working['Player'].map(st.session_state.maps_dict['Salary_map'])
337
+ flex_working['Proj Own'] = flex_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
338
+ flex_working['Exposure'] = flex_working['Freq']/(1000)
339
+ flex_working['Edge'] = flex_working['Exposure'] - flex_working['Proj Own']
340
+ flex_working['Team'] = flex_working['Player'].map(st.session_state.maps_dict['Team_map'])
341
+ st.session_state.flex_freq = flex_working.copy()
342
+
343
+ if sim_site_var1 == 'Draftkings':
344
+ goalie_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,7:8].values, return_counts=True)),
345
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
346
+ elif sim_site_var1 == 'Fanduel':
347
+ goalie_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,8:9].values, return_counts=True)),
348
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
349
+ goalie_working['Freq'] = goalie_working['Freq'].astype(int)
350
+ goalie_working['Position'] = goalie_working['Player'].map(st.session_state.maps_dict['Pos_map'])
351
+ goalie_working['Salary'] = goalie_working['Player'].map(st.session_state.maps_dict['Salary_map'])
352
+ goalie_working['Proj Own'] = goalie_working['Player'].map(st.session_state.maps_dict['Own_map']) / 100
353
+ goalie_working['Exposure'] = goalie_working['Freq']/(1000)
354
+ goalie_working['Edge'] = goalie_working['Exposure'] - goalie_working['Proj Own']
355
+ goalie_working['Team'] = goalie_working['Player'].map(st.session_state.maps_dict['Team_map'])
356
+ st.session_state.goalie_freq = goalie_working.copy()
357
+
358
+ if sim_site_var1 == 'Draftkings':
359
+ team_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,11:12].values, return_counts=True)),
360
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
361
+ elif sim_site_var1 == 'Fanduel':
362
+ team_working = pd.DataFrame(np.column_stack(np.unique(st.session_state.freq_copy.iloc[:,11:12].values, return_counts=True)),
363
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
364
+ team_working['Freq'] = team_working['Freq'].astype(int)
365
+ team_working['Exposure'] = team_working['Freq']/(1000)
366
+ st.session_state.team_freq = team_working.copy()
367
 
368
  with st.container():
369
  if st.button("Reset Sim", key='reset_sim'):
 
593
  file_name='team_freq.csv',
594
  mime='text/csv',
595
  key='team'
596
+ )
597
+
598
+ with tab2:
599
+ with st.expander("Info and Filters"):
600
+ if st.button("Load/Reset Data", key='reset1'):
601
+ st.cache_data.clear()
602
+ for key in st.session_state.keys():
603
+ del st.session_state[key]
604
+ DK_seed = init_DK_seed_frames(10000)
605
+ FD_seed = init_FD_seed_frames(10000)
606
+ dk_raw, fd_raw, teams_playing_count = init_baselines()
607
+ dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))
608
+ fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))
609
+
610
+ slate_var2 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'Auxiliary Slate'))
611
+ site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'))
612
+ sharp_split_var = st.number_input("How many lineups do you want?", value=10000, max_value=500000, min_value=10000, step=10000)
613
+ lineup_num_var = st.number_input("How many lineups do you want to display?", min_value=1, max_value=500, value=10, step=1)
614
+
615
+ if site_var1 == 'Draftkings':
616
+
617
+ team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
618
+ if team_var1 == 'Specific Teams':
619
+ team_var2 = st.multiselect('Which teams do you want?', options = dk_raw['Team'].unique())
620
+ elif team_var1 == 'Full Slate':
621
+ team_var2 = dk_raw.Team.values.tolist()
622
+
623
+ stack_var1 = st.radio("Do you want a frame with specific stack sizes?", ('Full Slate', 'Specific Stack Sizes'), key='stack_var1')
624
+ if stack_var1 == 'Specific Stack Sizes':
625
+ stack_var2 = st.multiselect('Which stack sizes do you want?', options = [5, 4, 3, 2, 1, 0])
626
+ elif stack_var1 == 'Full Slate':
627
+ stack_var2 = [5, 4, 3, 2, 1, 0]
628
+
629
+ raw_baselines = dk_raw
630
+ column_names = dk_columns
631
+
632
+ elif site_var1 == 'Fanduel':
633
+
634
+ team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
635
+ if team_var1 == 'Specific Teams':
636
+ team_var2 = st.multiselect('Which teams do you want?', options = fd_raw['Team'].unique())
637
+ elif team_var1 == 'Full Slate':
638
+ team_var2 = fd_raw.Team.values.tolist()
639
+
640
+ stack_var1 = st.radio("Do you want a frame with specific stack sizes?", ('Full Slate', 'Specific Stack Sizes'), key='stack_var1')
641
+ if stack_var1 == 'Specific Stack Sizes':
642
+ stack_var2 = st.multiselect('Which stack sizes do you want?', options = [5, 4, 3, 2, 1, 0])
643
+ elif stack_var1 == 'Full Slate':
644
+ stack_var2 = [5, 4, 3, 2, 1, 0]
645
+
646
+ raw_baselines = fd_raw
647
+ column_names = fd_columns
648
+
649
+
650
+ if st.button("Prepare data export", key='data_export'):
651
+ if 'working_seed' in st.session_state:
652
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
653
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
654
+ st.session_state.data_export_display = st.session_state.working_seed[0:lineup_num_var]
655
+ elif 'working_seed' not in st.session_state:
656
+ if site_var1 == 'Draftkings':
657
+ st.session_state.working_seed = init_DK_seed_frames(sharp_split_var, slate_var2)
658
+
659
+ dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))
660
+ raw_baselines = dk_raw
661
+ column_names = dk_columns
662
+
663
+ elif site_var1 == 'Fanduel':
664
+ st.session_state.working_seed = init_FD_seed_frames(sharp_split_var, slate_var2)
665
+
666
+ fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))
667
+ raw_baselines = fd_raw
668
+ column_names = fd_columns
669
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
670
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
671
+ st.session_state.data_export_display = st.session_state.working_seed[0:lineup_num_var]
672
+ data_export = st.session_state.working_seed.copy()
673
+ st.download_button(
674
+ label="Export optimals set",
675
+ data=convert_df(data_export),
676
+ file_name='NHL_optimals_export.csv',
677
+ mime='text/csv',
678
+ )
679
+ for key in st.session_state.keys():
680
+ del st.session_state[key]
681
+
682
+ if st.button("Load Data", key='load_data'):
683
+ if site_var1 == 'Draftkings':
684
+ if 'working_seed' in st.session_state:
685
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
686
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
687
+ st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
688
+ elif 'working_seed' not in st.session_state:
689
+ if slate_var2 == 'Main Slate':
690
+ st.session_state.working_seed = init_DK_seed_frames(sharp_split_var)
691
+ dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))
692
+
693
+ raw_baselines = dk_raw
694
+ column_names = dk_columns
695
+
696
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
697
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
698
+ st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
699
+
700
+ elif site_var1 == 'Fanduel':
701
+ if 'working_seed' in st.session_state:
702
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
703
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
704
+ st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
705
+ elif 'working_seed' not in st.session_state:
706
+ if slate_var2 == 'Main Slate':
707
+ st.session_state.working_seed = init_FD_seed_frames(sharp_split_var)
708
+ fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))
709
+
710
+ raw_baselines = fd_raw
711
+ column_names = fd_columns
712
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
713
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
714
+ st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
715
+
716
+ with st.container():
717
+ if 'data_export_display' in st.session_state:
718
+ st.dataframe(st.session_state.data_export_display.style.format(freq_format, precision=2), use_container_width = True)