Update app.py
Browse files
app.py
CHANGED
@@ -40,68 +40,48 @@ def init_conn():
|
|
40 |
client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000)
|
41 |
db = client["testing_db"]
|
42 |
|
43 |
-
|
44 |
|
45 |
gc = gspread.service_account_from_dict(credentials)
|
46 |
gc2 = gspread.service_account_from_dict(credentials2)
|
47 |
|
48 |
-
return gc, gc2, db,
|
49 |
|
50 |
-
gcservice_account, gcservice_account2, db,
|
51 |
|
52 |
percentages_format = {'Exposure': '{:.2%}'}
|
53 |
freq_format = {'Exposure': '{:.2%}', 'Proj Own': '{:.2%}', 'Edge': '{:.2%}'}
|
54 |
-
dk_columns = ['
|
55 |
-
fd_columns = ['
|
56 |
|
57 |
@st.cache_data(ttl = 599)
|
58 |
def init_DK_seed_frames():
|
59 |
|
60 |
-
collection = db["
|
61 |
cursor = collection.find()
|
62 |
|
63 |
raw_display = pd.DataFrame(list(cursor))
|
64 |
-
raw_display = raw_display[['
|
65 |
DK_seed = raw_display.to_numpy()
|
66 |
|
67 |
return DK_seed
|
68 |
|
69 |
-
@st.cache_data(ttl = 599)
|
70 |
-
def init_FD_seed_frames():
|
71 |
-
|
72 |
-
collection = db["FD_NFL_seed_frame"]
|
73 |
-
cursor = collection.find()
|
74 |
-
|
75 |
-
raw_display = pd.DataFrame(list(cursor))
|
76 |
-
raw_display = raw_display[['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
|
77 |
-
FD_seed = raw_display.to_numpy()
|
78 |
-
|
79 |
-
return FD_seed
|
80 |
-
|
81 |
@st.cache_data(ttl = 599)
|
82 |
def init_baselines():
|
83 |
try:
|
84 |
-
sh = gcservice_account.open_by_url(
|
85 |
except:
|
86 |
-
sh = gcservice_account2.open_by_url(
|
87 |
|
88 |
-
worksheet = sh.worksheet('
|
89 |
load_display = pd.DataFrame(worksheet.get_all_records())
|
90 |
load_display.replace('', np.nan, inplace=True)
|
91 |
load_display['STDev'] = load_display['Median'] / 4
|
92 |
load_display = load_display.drop_duplicates(subset=['Player'], keep='first')
|
93 |
|
94 |
dk_raw = load_display.dropna(subset=['Median'])
|
95 |
-
|
96 |
-
worksheet = sh.worksheet('FD_ROO')
|
97 |
-
load_display = pd.DataFrame(worksheet.get_all_records())
|
98 |
-
load_display.replace('', np.nan, inplace=True)
|
99 |
-
load_display['STDev'] = load_display['Median'] / 4
|
100 |
-
load_display = load_display.drop_duplicates(subset=['Player'], keep='first')
|
101 |
-
|
102 |
-
fd_raw = load_display.dropna(subset=['Median'])
|
103 |
|
104 |
-
return dk_raw
|
105 |
|
106 |
@st.cache_data
|
107 |
def convert_df(array):
|
@@ -110,14 +90,14 @@ def convert_df(array):
|
|
110 |
|
111 |
@st.cache_data
|
112 |
def calculate_DK_value_frequencies(np_array):
|
113 |
-
unique, counts = np.unique(np_array[:, :
|
114 |
frequencies = counts / len(np_array) # Normalize by the number of rows
|
115 |
combined_array = np.column_stack((unique, frequencies))
|
116 |
return combined_array
|
117 |
|
118 |
@st.cache_data
|
119 |
def calculate_FD_value_frequencies(np_array):
|
120 |
-
unique, counts = np.unique(np_array[:, :
|
121 |
frequencies = counts / len(np_array) # Normalize by the number of rows
|
122 |
combined_array = np.column_stack((unique, frequencies))
|
123 |
return combined_array
|
@@ -147,7 +127,7 @@ def sim_contest(Sim_size, seed_frame, maps_dict, sharp_split, Contest_Size):
|
|
147 |
|
148 |
sample_arrays = sample_arrays1
|
149 |
|
150 |
-
final_array = sample_arrays[sample_arrays[:,
|
151 |
best_lineup = final_array[final_array[:, -1].argsort(kind='stable')[::-1][:1]]
|
152 |
Sim_Winners.append(best_lineup)
|
153 |
SimVar += 1
|
@@ -155,8 +135,7 @@ def sim_contest(Sim_size, seed_frame, maps_dict, sharp_split, Contest_Size):
|
|
155 |
return Sim_Winners
|
156 |
|
157 |
DK_seed = init_DK_seed_frames()
|
158 |
-
|
159 |
-
dk_raw, fd_raw = init_baselines()
|
160 |
|
161 |
tab1, tab2 = st.tabs(['Contest Sims', 'Data Export'])
|
162 |
with tab2:
|
@@ -167,11 +146,10 @@ with tab2:
|
|
167 |
for key in st.session_state.keys():
|
168 |
del st.session_state[key]
|
169 |
DK_seed = init_DK_seed_frames()
|
170 |
-
|
171 |
-
dk_raw, fd_raw = init_baselines()
|
172 |
|
173 |
slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Other Main Slate'))
|
174 |
-
site_var1 = st.radio("What site are you working with?", ('Draftkings'
|
175 |
if site_var1 == 'Draftkings':
|
176 |
raw_baselines = dk_raw
|
177 |
column_names = dk_columns
|
@@ -184,33 +162,16 @@ with tab2:
|
|
184 |
|
185 |
stack_var1 = st.radio("Do you want a frame with specific stack sizes?", ('Full Slate', 'Specific Stack Sizes'), key='stack_var1')
|
186 |
if stack_var1 == 'Specific Stack Sizes':
|
187 |
-
stack_var2 = st.multiselect('Which stack sizes do you want?', options = [
|
188 |
elif stack_var1 == 'Full Slate':
|
189 |
-
stack_var2 = [
|
190 |
-
|
191 |
-
elif site_var1 == 'Fanduel':
|
192 |
-
raw_baselines = fd_raw
|
193 |
-
column_names = fd_columns
|
194 |
-
|
195 |
-
team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
|
196 |
-
if team_var1 == 'Specific Teams':
|
197 |
-
team_var2 = st.multiselect('Which teams do you want?', options = fd_raw['Team'].unique())
|
198 |
-
elif team_var1 == 'Full Slate':
|
199 |
-
team_var2 = fd_raw.Team.values.tolist()
|
200 |
-
|
201 |
-
stack_var1 = st.radio("Do you want a frame with specific stack sizes?", ('Full Slate', 'Specific Stack Sizes'), key='stack_var1')
|
202 |
-
if stack_var1 == 'Specific Stack Sizes':
|
203 |
-
stack_var2 = st.multiselect('Which stack sizes do you want?', options = [5, 4, 3, 2, 1, 0])
|
204 |
-
elif stack_var1 == 'Full Slate':
|
205 |
-
stack_var2 = [5, 4, 3, 2, 1, 0]
|
206 |
|
207 |
-
|
208 |
if st.button("Prepare data export", key='data_export'):
|
209 |
data_export = st.session_state.working_seed.copy()
|
210 |
st.download_button(
|
211 |
label="Export optimals set",
|
212 |
data=convert_df(data_export),
|
213 |
-
file_name='
|
214 |
mime='text/csv',
|
215 |
)
|
216 |
|
@@ -218,24 +179,13 @@ with tab2:
|
|
218 |
if st.button("Load Data", key='load_data'):
|
219 |
if site_var1 == 'Draftkings':
|
220 |
if 'working_seed' in st.session_state:
|
221 |
-
st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:,
|
222 |
-
st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:,
|
223 |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
|
224 |
elif 'working_seed' not in st.session_state:
|
225 |
st.session_state.working_seed = DK_seed.copy()
|
226 |
-
st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:,
|
227 |
-
st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:,
|
228 |
-
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
|
229 |
-
|
230 |
-
elif site_var1 == 'Fanduel':
|
231 |
-
if 'working_seed' in st.session_state:
|
232 |
-
st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
|
233 |
-
st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
|
234 |
-
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
|
235 |
-
elif 'working_seed' not in st.session_state:
|
236 |
-
st.session_state.working_seed = FD_seed.copy()
|
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():
|
@@ -250,16 +200,12 @@ with tab1:
|
|
250 |
for key in st.session_state.keys():
|
251 |
del st.session_state[key]
|
252 |
DK_seed = init_DK_seed_frames()
|
253 |
-
|
254 |
-
dk_raw, fd_raw = init_baselines()
|
255 |
sim_slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Other Main Slate'), key='sim_slate_var1')
|
256 |
-
sim_site_var1 = st.radio("What site are you working with?", ('Draftkings'
|
257 |
if sim_site_var1 == 'Draftkings':
|
258 |
raw_baselines = dk_raw
|
259 |
column_names = dk_columns
|
260 |
-
elif sim_site_var1 == 'Fanduel':
|
261 |
-
raw_baselines = fd_raw
|
262 |
-
column_names = fd_columns
|
263 |
|
264 |
contest_var1 = st.selectbox("What contest size are you simulating?", ('Small', 'Medium', 'Large', 'Custom'))
|
265 |
if contest_var1 == 'Small':
|
@@ -296,8 +242,6 @@ with tab1:
|
|
296 |
}
|
297 |
Sim_Winners = sim_contest(1000, st.session_state.working_seed, maps_dict, sharp_split, Contest_Size)
|
298 |
Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
|
299 |
-
|
300 |
-
#st.table(Sim_Winner_Frame)
|
301 |
|
302 |
# Initial setup
|
303 |
Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])
|
@@ -322,8 +266,6 @@ with tab1:
|
|
322 |
else:
|
323 |
if sim_site_var1 == 'Draftkings':
|
324 |
st.session_state.working_seed = DK_seed.copy()
|
325 |
-
elif sim_site_var1 == 'Fanduel':
|
326 |
-
st.session_state.working_seed = FD_seed.copy()
|
327 |
maps_dict = {
|
328 |
'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
|
329 |
'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),
|
@@ -334,8 +276,6 @@ with tab1:
|
|
334 |
}
|
335 |
Sim_Winners = sim_contest(1000, st.session_state.working_seed, maps_dict, sharp_split, Contest_Size)
|
336 |
Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
|
337 |
-
|
338 |
-
#st.table(Sim_Winner_Frame)
|
339 |
|
340 |
# Initial setup
|
341 |
Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])
|
@@ -359,10 +299,7 @@ with tab1:
|
|
359 |
freq_copy = st.session_state.Sim_Winner_Display
|
360 |
|
361 |
if sim_site_var1 == 'Draftkings':
|
362 |
-
freq_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:
|
363 |
-
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
364 |
-
elif sim_site_var1 == 'Fanduel':
|
365 |
-
freq_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:9].values, return_counts=True)),
|
366 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
367 |
freq_working['Freq'] = freq_working['Freq'].astype(int)
|
368 |
freq_working['Position'] = freq_working['Player'].map(maps_dict['Pos_map'])
|
@@ -374,119 +311,95 @@ with tab1:
|
|
374 |
st.session_state.player_freq = freq_working.copy()
|
375 |
|
376 |
if sim_site_var1 == 'Draftkings':
|
377 |
-
|
378 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
379 |
-
|
380 |
-
|
381 |
-
|
382 |
-
|
383 |
-
|
384 |
-
|
385 |
-
|
386 |
-
|
387 |
-
qb_working['Edge'] = qb_working['Exposure'] - qb_working['Proj Own']
|
388 |
-
qb_working['Team'] = qb_working['Player'].map(maps_dict['Team_map'])
|
389 |
-
st.session_state.qb_freq = qb_working.copy()
|
390 |
|
391 |
if sim_site_var1 == 'Draftkings':
|
392 |
-
|
393 |
-
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
394 |
-
elif sim_site_var1 == 'Fanduel':
|
395 |
-
rbwrte_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,1:7].values, return_counts=True)),
|
396 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
397 |
-
|
398 |
-
|
399 |
-
|
400 |
-
|
401 |
-
|
402 |
-
|
403 |
-
|
404 |
-
st.session_state.
|
405 |
|
406 |
if sim_site_var1 == 'Draftkings':
|
407 |
-
|
408 |
-
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
409 |
-
elif sim_site_var1 == 'Fanduel':
|
410 |
-
rb_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,1:3].values, return_counts=True)),
|
411 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
412 |
-
|
413 |
-
|
414 |
-
|
415 |
-
|
416 |
-
|
417 |
-
|
418 |
-
|
419 |
-
st.session_state.
|
420 |
|
421 |
if sim_site_var1 == 'Draftkings':
|
422 |
-
|
423 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
424 |
-
|
425 |
-
|
426 |
-
|
427 |
-
|
428 |
-
|
429 |
-
|
430 |
-
|
431 |
-
|
432 |
-
wr_working['Edge'] = wr_working['Exposure'] - wr_working['Proj Own']
|
433 |
-
wr_working['Team'] = wr_working['Player'].map(maps_dict['Team_map'])
|
434 |
-
st.session_state.wr_freq = wr_working.copy()
|
435 |
|
436 |
if sim_site_var1 == 'Draftkings':
|
437 |
-
|
438 |
-
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
439 |
-
elif sim_site_var1 == 'Fanduel':
|
440 |
-
te_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,6:7].values, return_counts=True)),
|
441 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
442 |
-
|
443 |
-
|
444 |
-
|
445 |
-
|
446 |
-
|
447 |
-
|
448 |
-
|
449 |
-
st.session_state.
|
450 |
|
451 |
if sim_site_var1 == 'Draftkings':
|
452 |
-
|
453 |
-
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
454 |
-
elif sim_site_var1 == 'Fanduel':
|
455 |
-
flex_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,7:8].values, return_counts=True)),
|
456 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
457 |
-
|
458 |
-
|
459 |
-
|
460 |
-
|
461 |
-
|
462 |
-
|
463 |
-
|
464 |
-
st.session_state.
|
465 |
|
466 |
if sim_site_var1 == 'Draftkings':
|
467 |
-
|
468 |
-
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
469 |
-
elif sim_site_var1 == 'Fanduel':
|
470 |
-
dst_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,8:9].values, return_counts=True)),
|
471 |
-
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
472 |
-
dst_working['Freq'] = dst_working['Freq'].astype(int)
|
473 |
-
dst_working['Position'] = dst_working['Player'].map(maps_dict['Pos_map'])
|
474 |
-
dst_working['Salary'] = dst_working['Player'].map(maps_dict['Salary_map'])
|
475 |
-
dst_working['Proj Own'] = dst_working['Player'].map(maps_dict['Own_map']) / 100
|
476 |
-
dst_working['Exposure'] = dst_working['Freq']/(1000)
|
477 |
-
dst_working['Edge'] = dst_working['Exposure'] - dst_working['Proj Own']
|
478 |
-
dst_working['Team'] = dst_working['Player'].map(maps_dict['Team_map'])
|
479 |
-
st.session_state.dst_freq = dst_working.copy()
|
480 |
-
|
481 |
-
if sim_site_var1 == 'Draftkings':
|
482 |
-
team_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,11:12].values, return_counts=True)),
|
483 |
-
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
484 |
-
elif sim_site_var1 == 'Fanduel':
|
485 |
-
team_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,11:12].values, return_counts=True)),
|
486 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
487 |
team_working['Freq'] = team_working['Freq'].astype(int)
|
|
|
|
|
|
|
488 |
team_working['Exposure'] = team_working['Freq']/(1000)
|
|
|
|
|
489 |
st.session_state.team_freq = team_working.copy()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
490 |
|
491 |
with st.container():
|
492 |
if st.button("Reset Sim", key='reset_sim'):
|
@@ -509,12 +422,12 @@ with tab1:
|
|
509 |
st.download_button(
|
510 |
label="Export Full Frame",
|
511 |
data=st.session_state.Sim_Winner_Export.to_csv().encode('utf-8'),
|
512 |
-
file_name='
|
513 |
mime='text/csv',
|
514 |
)
|
515 |
|
516 |
with st.container():
|
517 |
-
tab1, tab2, tab3, tab4, tab5, tab6, tab7, tab8, tab9 = st.tabs(['Overall Exposures', '
|
518 |
with tab1:
|
519 |
if 'player_freq' in st.session_state:
|
520 |
|
@@ -527,90 +440,90 @@ with tab1:
|
|
527 |
key='overall'
|
528 |
)
|
529 |
with tab2:
|
530 |
-
if '
|
531 |
|
532 |
-
st.dataframe(st.session_state.
|
533 |
st.download_button(
|
534 |
label="Export Exposures",
|
535 |
-
data=st.session_state.
|
536 |
-
file_name='
|
537 |
mime='text/csv',
|
538 |
-
key='
|
539 |
)
|
540 |
with tab3:
|
541 |
-
if '
|
542 |
|
543 |
-
st.dataframe(st.session_state.
|
544 |
st.download_button(
|
545 |
label="Export Exposures",
|
546 |
-
data=st.session_state.
|
547 |
-
file_name='
|
548 |
mime='text/csv',
|
549 |
-
key='
|
550 |
)
|
551 |
with tab4:
|
552 |
-
if '
|
553 |
|
554 |
-
st.dataframe(st.session_state.
|
555 |
st.download_button(
|
556 |
label="Export Exposures",
|
557 |
-
data=st.session_state.
|
558 |
-
file_name='
|
559 |
mime='text/csv',
|
560 |
-
key='
|
561 |
)
|
562 |
with tab5:
|
563 |
-
if '
|
564 |
|
565 |
-
st.dataframe(st.session_state.
|
566 |
st.download_button(
|
567 |
label="Export Exposures",
|
568 |
-
data=st.session_state.
|
569 |
-
file_name='
|
570 |
mime='text/csv',
|
571 |
-
key='
|
572 |
)
|
573 |
with tab6:
|
574 |
-
if '
|
575 |
|
576 |
-
st.dataframe(st.session_state.
|
577 |
st.download_button(
|
578 |
label="Export Exposures",
|
579 |
-
data=st.session_state.
|
580 |
-
file_name='
|
581 |
mime='text/csv',
|
582 |
-
key='
|
583 |
)
|
584 |
with tab7:
|
585 |
-
if '
|
586 |
|
587 |
-
st.dataframe(st.session_state.
|
588 |
st.download_button(
|
589 |
label="Export Exposures",
|
590 |
-
data=st.session_state.
|
591 |
-
file_name='
|
592 |
mime='text/csv',
|
593 |
-
key='
|
594 |
)
|
595 |
with tab8:
|
596 |
-
if '
|
597 |
|
598 |
-
st.dataframe(st.session_state.
|
599 |
st.download_button(
|
600 |
label="Export Exposures",
|
601 |
-
data=st.session_state.
|
602 |
-
file_name='
|
603 |
mime='text/csv',
|
604 |
-
key='
|
605 |
)
|
606 |
with tab9:
|
607 |
-
if '
|
608 |
|
609 |
-
st.dataframe(st.session_state.
|
610 |
st.download_button(
|
611 |
label="Export Exposures",
|
612 |
-
data=st.session_state.
|
613 |
-
file_name='
|
614 |
mime='text/csv',
|
615 |
-
key='
|
616 |
)
|
|
|
40 |
client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000)
|
41 |
db = client["testing_db"]
|
42 |
|
43 |
+
LOL_Data = st.secrets['LOL_Data']
|
44 |
|
45 |
gc = gspread.service_account_from_dict(credentials)
|
46 |
gc2 = gspread.service_account_from_dict(credentials2)
|
47 |
|
48 |
+
return gc, gc2, db, LOL_Data
|
49 |
|
50 |
+
gcservice_account, gcservice_account2, db, LOL_Data = init_conn()
|
51 |
|
52 |
percentages_format = {'Exposure': '{:.2%}'}
|
53 |
freq_format = {'Exposure': '{:.2%}', 'Proj Own': '{:.2%}', 'Edge': '{:.2%}'}
|
54 |
+
dk_columns = ['CPT', 'TOP', 'JNG', 'MID', 'ADC', 'SUP', 'TEAM', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
|
55 |
+
fd_columns = ['CPT', 'TOP', 'JNG', 'MID', 'ADC', 'SUP', 'TEAM', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
|
56 |
|
57 |
@st.cache_data(ttl = 599)
|
58 |
def init_DK_seed_frames():
|
59 |
|
60 |
+
collection = db["League_of_Legends_DK_seed_frame"]
|
61 |
cursor = collection.find()
|
62 |
|
63 |
raw_display = pd.DataFrame(list(cursor))
|
64 |
+
raw_display = raw_display[['CPT', 'TOP', 'JNG', 'MID', 'ADC', 'SUP', 'TEAM', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
|
65 |
DK_seed = raw_display.to_numpy()
|
66 |
|
67 |
return DK_seed
|
68 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
69 |
@st.cache_data(ttl = 599)
|
70 |
def init_baselines():
|
71 |
try:
|
72 |
+
sh = gcservice_account.open_by_url(LOL_Data)
|
73 |
except:
|
74 |
+
sh = gcservice_account2.open_by_url(LOL_Data)
|
75 |
|
76 |
+
worksheet = sh.worksheet('ROO')
|
77 |
load_display = pd.DataFrame(worksheet.get_all_records())
|
78 |
load_display.replace('', np.nan, inplace=True)
|
79 |
load_display['STDev'] = load_display['Median'] / 4
|
80 |
load_display = load_display.drop_duplicates(subset=['Player'], keep='first')
|
81 |
|
82 |
dk_raw = load_display.dropna(subset=['Median'])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
83 |
|
84 |
+
return dk_raw
|
85 |
|
86 |
@st.cache_data
|
87 |
def convert_df(array):
|
|
|
90 |
|
91 |
@st.cache_data
|
92 |
def calculate_DK_value_frequencies(np_array):
|
93 |
+
unique, counts = np.unique(np_array[:, :6], return_counts=True)
|
94 |
frequencies = counts / len(np_array) # Normalize by the number of rows
|
95 |
combined_array = np.column_stack((unique, frequencies))
|
96 |
return combined_array
|
97 |
|
98 |
@st.cache_data
|
99 |
def calculate_FD_value_frequencies(np_array):
|
100 |
+
unique, counts = np.unique(np_array[:, :6], return_counts=True)
|
101 |
frequencies = counts / len(np_array) # Normalize by the number of rows
|
102 |
combined_array = np.column_stack((unique, frequencies))
|
103 |
return combined_array
|
|
|
127 |
|
128 |
sample_arrays = sample_arrays1
|
129 |
|
130 |
+
final_array = sample_arrays[sample_arrays[:, 7].argsort()[::-1]]
|
131 |
best_lineup = final_array[final_array[:, -1].argsort(kind='stable')[::-1][:1]]
|
132 |
Sim_Winners.append(best_lineup)
|
133 |
SimVar += 1
|
|
|
135 |
return Sim_Winners
|
136 |
|
137 |
DK_seed = init_DK_seed_frames()
|
138 |
+
dk_raw = init_baselines()
|
|
|
139 |
|
140 |
tab1, tab2 = st.tabs(['Contest Sims', 'Data Export'])
|
141 |
with tab2:
|
|
|
146 |
for key in st.session_state.keys():
|
147 |
del st.session_state[key]
|
148 |
DK_seed = init_DK_seed_frames()
|
149 |
+
dk_raw = init_baselines()
|
|
|
150 |
|
151 |
slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Other Main Slate'))
|
152 |
+
site_var1 = st.radio("What site are you working with?", ('Draftkings'))
|
153 |
if site_var1 == 'Draftkings':
|
154 |
raw_baselines = dk_raw
|
155 |
column_names = dk_columns
|
|
|
162 |
|
163 |
stack_var1 = st.radio("Do you want a frame with specific stack sizes?", ('Full Slate', 'Specific Stack Sizes'), key='stack_var1')
|
164 |
if stack_var1 == 'Specific Stack Sizes':
|
165 |
+
stack_var2 = st.multiselect('Which stack sizes do you want?', options = [4, 3, 2, 1, 0])
|
166 |
elif stack_var1 == 'Full Slate':
|
167 |
+
stack_var2 = [4, 3, 2, 1, 0]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
168 |
|
|
|
169 |
if st.button("Prepare data export", key='data_export'):
|
170 |
data_export = st.session_state.working_seed.copy()
|
171 |
st.download_button(
|
172 |
label="Export optimals set",
|
173 |
data=convert_df(data_export),
|
174 |
+
file_name='LOL_optimals_export.csv',
|
175 |
mime='text/csv',
|
176 |
)
|
177 |
|
|
|
179 |
if st.button("Load Data", key='load_data'):
|
180 |
if site_var1 == 'Draftkings':
|
181 |
if 'working_seed' in st.session_state:
|
182 |
+
st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 8], team_var2)]
|
183 |
+
st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 9], stack_var2)]
|
184 |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
|
185 |
elif 'working_seed' not in st.session_state:
|
186 |
st.session_state.working_seed = DK_seed.copy()
|
187 |
+
st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 8], team_var2)]
|
188 |
+
st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 9], stack_var2)]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
189 |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
|
190 |
|
191 |
with st.container():
|
|
|
200 |
for key in st.session_state.keys():
|
201 |
del st.session_state[key]
|
202 |
DK_seed = init_DK_seed_frames()
|
203 |
+
dk_raw = init_baselines()
|
|
|
204 |
sim_slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Other Main Slate'), key='sim_slate_var1')
|
205 |
+
sim_site_var1 = st.radio("What site are you working with?", ('Draftkings'), key='sim_site_var1')
|
206 |
if sim_site_var1 == 'Draftkings':
|
207 |
raw_baselines = dk_raw
|
208 |
column_names = dk_columns
|
|
|
|
|
|
|
209 |
|
210 |
contest_var1 = st.selectbox("What contest size are you simulating?", ('Small', 'Medium', 'Large', 'Custom'))
|
211 |
if contest_var1 == 'Small':
|
|
|
242 |
}
|
243 |
Sim_Winners = sim_contest(1000, st.session_state.working_seed, maps_dict, sharp_split, Contest_Size)
|
244 |
Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
|
|
|
|
|
245 |
|
246 |
# Initial setup
|
247 |
Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])
|
|
|
266 |
else:
|
267 |
if sim_site_var1 == 'Draftkings':
|
268 |
st.session_state.working_seed = DK_seed.copy()
|
|
|
|
|
269 |
maps_dict = {
|
270 |
'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
|
271 |
'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),
|
|
|
276 |
}
|
277 |
Sim_Winners = sim_contest(1000, st.session_state.working_seed, maps_dict, sharp_split, Contest_Size)
|
278 |
Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
|
|
|
|
|
279 |
|
280 |
# Initial setup
|
281 |
Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])
|
|
|
299 |
freq_copy = st.session_state.Sim_Winner_Display
|
300 |
|
301 |
if sim_site_var1 == 'Draftkings':
|
302 |
+
freq_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:6].values, return_counts=True)),
|
|
|
|
|
|
|
303 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
304 |
freq_working['Freq'] = freq_working['Freq'].astype(int)
|
305 |
freq_working['Position'] = freq_working['Player'].map(maps_dict['Pos_map'])
|
|
|
311 |
st.session_state.player_freq = freq_working.copy()
|
312 |
|
313 |
if sim_site_var1 == 'Draftkings':
|
314 |
+
cpt_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:1].values, return_counts=True)),
|
315 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
316 |
+
cpt_working['Freq'] = cpt_working['Freq'].astype(int)
|
317 |
+
cpt_working['Position'] = cpt_working['Player'].map(maps_dict['Pos_map'])
|
318 |
+
cpt_working['Salary'] = cpt_working['Player'].map(maps_dict['Salary_map'])
|
319 |
+
cpt_working['Proj Own'] = cpt_working['Player'].map(maps_dict['Own_map']) / 100
|
320 |
+
cpt_working['Exposure'] = cpt_working['Freq']/(1000)
|
321 |
+
cpt_working['Edge'] = cpt_working['Exposure'] - cpt_working['Proj Own']
|
322 |
+
cpt_working['Team'] = cpt_working['Player'].map(maps_dict['Team_map'])
|
323 |
+
st.session_state.cpt_freq = cpt_working.copy()
|
|
|
|
|
|
|
324 |
|
325 |
if sim_site_var1 == 'Draftkings':
|
326 |
+
top_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,1:2].values, return_counts=True)),
|
|
|
|
|
|
|
327 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
328 |
+
top_working['Freq'] = top_working['Freq'].astype(int)
|
329 |
+
top_working['Position'] = top_working['Player'].map(maps_dict['Pos_map'])
|
330 |
+
top_working['Salary'] = top_working['Player'].map(maps_dict['Salary_map'])
|
331 |
+
top_working['Proj Own'] = top_working['Player'].map(maps_dict['Own_map']) / 100
|
332 |
+
top_working['Exposure'] = top_working['Freq']/(1000)
|
333 |
+
top_working['Edge'] = top_working['Exposure'] - top_working['Proj Own']
|
334 |
+
top_working['Team'] = top_working['Player'].map(maps_dict['Team_map'])
|
335 |
+
st.session_state.top_freq = top_working.copy()
|
336 |
|
337 |
if sim_site_var1 == 'Draftkings':
|
338 |
+
jng_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,2:3].values, return_counts=True)),
|
|
|
|
|
|
|
339 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
340 |
+
jng_working['Freq'] = jng_working['Freq'].astype(int)
|
341 |
+
jng_working['Position'] = jng_working['Player'].map(maps_dict['Pos_map'])
|
342 |
+
jng_working['Salary'] = jng_working['Player'].map(maps_dict['Salary_map'])
|
343 |
+
jng_working['Proj Own'] = jng_working['Player'].map(maps_dict['Own_map']) / 100
|
344 |
+
jng_working['Exposure'] = jng_working['Freq']/(1000)
|
345 |
+
jng_working['Edge'] = jng_working['Exposure'] - jng_working['Proj Own']
|
346 |
+
jng_working['Team'] = jng_working['Player'].map(maps_dict['Team_map'])
|
347 |
+
st.session_state.jng_freq = jng_working.copy()
|
348 |
|
349 |
if sim_site_var1 == 'Draftkings':
|
350 |
+
mid_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,3:4].values, return_counts=True)),
|
351 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
352 |
+
mid_working['Freq'] = mid_working['Freq'].astype(int)
|
353 |
+
mid_working['Position'] = mid_working['Player'].map(maps_dict['Pos_map'])
|
354 |
+
mid_working['Salary'] = mid_working['Player'].map(maps_dict['Salary_map'])
|
355 |
+
mid_working['Proj Own'] = mid_working['Player'].map(maps_dict['Own_map']) / 100
|
356 |
+
mid_working['Exposure'] = mid_working['Freq']/(1000)
|
357 |
+
mid_working['Edge'] = mid_working['Exposure'] - mid_working['Proj Own']
|
358 |
+
mid_working['Team'] = mid_working['Player'].map(maps_dict['Team_map'])
|
359 |
+
st.session_state.mid_freq = mid_working.copy()
|
|
|
|
|
|
|
360 |
|
361 |
if sim_site_var1 == 'Draftkings':
|
362 |
+
adc_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,4:5].values, return_counts=True)),
|
|
|
|
|
|
|
363 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
364 |
+
adc_working['Freq'] = adc_working['Freq'].astype(int)
|
365 |
+
adc_working['Position'] = adc_working['Player'].map(maps_dict['Pos_map'])
|
366 |
+
adc_working['Salary'] = adc_working['Player'].map(maps_dict['Salary_map'])
|
367 |
+
adc_working['Proj Own'] = adc_working['Player'].map(maps_dict['Own_map']) / 100
|
368 |
+
adc_working['Exposure'] = adc_working['Freq']/(1000)
|
369 |
+
adc_working['Edge'] = adc_working['Exposure'] - adc_working['Proj Own']
|
370 |
+
adc_working['Team'] = adc_working['Player'].map(maps_dict['Team_map'])
|
371 |
+
st.session_state.adc_freq = adc_working.copy()
|
372 |
|
373 |
if sim_site_var1 == 'Draftkings':
|
374 |
+
sup_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,5:6].values, return_counts=True)),
|
|
|
|
|
|
|
375 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
376 |
+
sup_working['Freq'] = sup_working['Freq'].astype(int)
|
377 |
+
sup_working['Position'] = sup_working['Player'].map(maps_dict['Pos_map'])
|
378 |
+
sup_working['Salary'] = sup_working['Player'].map(maps_dict['Salary_map'])
|
379 |
+
sup_working['Proj Own'] = sup_working['Player'].map(maps_dict['Own_map']) / 100
|
380 |
+
sup_working['Exposure'] = sup_working['Freq']/(1000)
|
381 |
+
sup_working['Edge'] = sup_working['Exposure'] - sup_working['Proj Own']
|
382 |
+
sup_working['Team'] = sup_working['Player'].map(maps_dict['Team_map'])
|
383 |
+
st.session_state.sup_freq = sup_working.copy()
|
384 |
|
385 |
if sim_site_var1 == 'Draftkings':
|
386 |
+
team_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,6:7].values, return_counts=True)),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
387 |
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
388 |
team_working['Freq'] = team_working['Freq'].astype(int)
|
389 |
+
team_working['Position'] = team_working['Player'].map(maps_dict['Pos_map'])
|
390 |
+
team_working['Salary'] = team_working['Player'].map(maps_dict['Salary_map'])
|
391 |
+
team_working['Proj Own'] = team_working['Player'].map(maps_dict['Own_map']) / 100
|
392 |
team_working['Exposure'] = team_working['Freq']/(1000)
|
393 |
+
team_working['Edge'] = team_working['Exposure'] - team_working['Proj Own']
|
394 |
+
team_working['Team'] = team_working['Player'].map(maps_dict['Team_map'])
|
395 |
st.session_state.team_freq = team_working.copy()
|
396 |
+
|
397 |
+
if sim_site_var1 == 'Draftkings':
|
398 |
+
stack_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,7:8].values, return_counts=True)),
|
399 |
+
columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
|
400 |
+
stack_working['Freq'] = stack_working['Freq'].astype(int)
|
401 |
+
stack_working['Exposure'] = stack_working['Freq']/(1000)
|
402 |
+
st.session_state.stack_freq = stack_working.copy()
|
403 |
|
404 |
with st.container():
|
405 |
if st.button("Reset Sim", key='reset_sim'):
|
|
|
422 |
st.download_button(
|
423 |
label="Export Full Frame",
|
424 |
data=st.session_state.Sim_Winner_Export.to_csv().encode('utf-8'),
|
425 |
+
file_name='LOL_consim_export.csv',
|
426 |
mime='text/csv',
|
427 |
)
|
428 |
|
429 |
with st.container():
|
430 |
+
tab1, tab2, tab3, tab4, tab5, tab6, tab7, tab8, tab9 = st.tabs(['Overall Exposures', 'CPT Exposures', 'TOP Exposures', 'JNG Exposures', 'MID Exposures', 'ADC Exposures', 'SUP Exposures', 'Team Exposures', 'Stack Exposures'])
|
431 |
with tab1:
|
432 |
if 'player_freq' in st.session_state:
|
433 |
|
|
|
440 |
key='overall'
|
441 |
)
|
442 |
with tab2:
|
443 |
+
if 'cpt_freq' in st.session_state:
|
444 |
|
445 |
+
st.dataframe(st.session_state.cpt_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
|
446 |
st.download_button(
|
447 |
label="Export Exposures",
|
448 |
+
data=st.session_state.cpt_freq.to_csv().encode('utf-8'),
|
449 |
+
file_name='cpt_freq.csv',
|
450 |
mime='text/csv',
|
451 |
+
key='cpt'
|
452 |
)
|
453 |
with tab3:
|
454 |
+
if 'top_freq' in st.session_state:
|
455 |
|
456 |
+
st.dataframe(st.session_state.top_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
|
457 |
st.download_button(
|
458 |
label="Export Exposures",
|
459 |
+
data=st.session_state.top_freq.to_csv().encode('utf-8'),
|
460 |
+
file_name='top_freq.csv',
|
461 |
mime='text/csv',
|
462 |
+
key='top'
|
463 |
)
|
464 |
with tab4:
|
465 |
+
if 'jng_freq' in st.session_state:
|
466 |
|
467 |
+
st.dataframe(st.session_state.jng_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
|
468 |
st.download_button(
|
469 |
label="Export Exposures",
|
470 |
+
data=st.session_state.jng_freq.to_csv().encode('utf-8'),
|
471 |
+
file_name='jng_freq.csv',
|
472 |
mime='text/csv',
|
473 |
+
key='jng'
|
474 |
)
|
475 |
with tab5:
|
476 |
+
if 'mid_freq' in st.session_state:
|
477 |
|
478 |
+
st.dataframe(st.session_state.mid_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
|
479 |
st.download_button(
|
480 |
label="Export Exposures",
|
481 |
+
data=st.session_state.mid_freq.to_csv().encode('utf-8'),
|
482 |
+
file_name='mid_freq.csv',
|
483 |
mime='text/csv',
|
484 |
+
key='mid'
|
485 |
)
|
486 |
with tab6:
|
487 |
+
if 'adc_freq' in st.session_state:
|
488 |
|
489 |
+
st.dataframe(st.session_state.adc_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
|
490 |
st.download_button(
|
491 |
label="Export Exposures",
|
492 |
+
data=st.session_state.adc_freq.to_csv().encode('utf-8'),
|
493 |
+
file_name='adc_freq.csv',
|
494 |
mime='text/csv',
|
495 |
+
key='adc'
|
496 |
)
|
497 |
with tab7:
|
498 |
+
if 'sup_freq' in st.session_state:
|
499 |
|
500 |
+
st.dataframe(st.session_state.sup_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
|
501 |
st.download_button(
|
502 |
label="Export Exposures",
|
503 |
+
data=st.session_state.sup_freq.to_csv().encode('utf-8'),
|
504 |
+
file_name='sup_freq.csv',
|
505 |
mime='text/csv',
|
506 |
+
key='sup'
|
507 |
)
|
508 |
with tab8:
|
509 |
+
if 'team_freq' in st.session_state:
|
510 |
|
511 |
+
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)
|
512 |
st.download_button(
|
513 |
label="Export Exposures",
|
514 |
+
data=st.session_state.team_freq.to_csv().encode('utf-8'),
|
515 |
+
file_name='team_freq.csv',
|
516 |
mime='text/csv',
|
517 |
+
key='team'
|
518 |
)
|
519 |
with tab9:
|
520 |
+
if 'stack_freq' in st.session_state:
|
521 |
|
522 |
+
st.dataframe(st.session_state.stack_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(percentages_format, precision=2), use_container_width = True)
|
523 |
st.download_button(
|
524 |
label="Export Exposures",
|
525 |
+
data=st.session_state.stack_freq.to_csv().encode('utf-8'),
|
526 |
+
file_name='stack_freq.csv',
|
527 |
mime='text/csv',
|
528 |
+
key='stack'
|
529 |
)
|