Spaces:
Running
Running
James McCool
commited on
Commit
·
b5abcc5
1
Parent(s):
2675c26
Enhance app.py: add support for secondary slate data retrieval and processing, update overall stats function to include new data, and improve data export functionality for both Draftkings and Fanduel
Browse files
app.py
CHANGED
@@ -19,7 +19,9 @@ def init_conn():
|
|
19 |
db = init_conn()
|
20 |
|
21 |
dk_columns = ['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
|
|
|
22 |
fd_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
|
|
|
23 |
|
24 |
roo_format = {'Top_finish': '{:.2%}', 'Top_5_finish': '{:.2%}', 'Top_10_finish': '{:.2%}', '20+%': '{:.2%}', '4x%': '{:.2%}', '5x%': '{:.2%}', '6x%': '{:.2%}', 'GPP%': '{:.2%}'}
|
25 |
|
@@ -101,6 +103,16 @@ def load_overall_stats():
|
|
101 |
raw_display = raw_display.apply(pd.to_numeric, errors='ignore')
|
102 |
fd_raw_sec = raw_display.sort_values(by='Median', ascending=False)
|
103 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
104 |
collection = db["Player_Range_Of_Outcomes"]
|
105 |
cursor = collection.find()
|
106 |
|
@@ -113,7 +125,7 @@ def load_overall_stats():
|
|
113 |
|
114 |
timestamp = raw_display['timestamp'].values[0]
|
115 |
|
116 |
-
return dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, timestamp
|
117 |
|
118 |
@st.cache_data(ttl = 60)
|
119 |
def init_DK_lineups(slate_desig: str):
|
@@ -233,8 +245,11 @@ def convert_df(array):
|
|
233 |
array = pd.DataFrame(array, columns=column_names)
|
234 |
return array.to_csv().encode('utf-8')
|
235 |
|
236 |
-
dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, timestamp = load_overall_stats()
|
237 |
salary_dict = dict(zip(roo_raw.Player, roo_raw.Salary))
|
|
|
|
|
|
|
238 |
|
239 |
try:
|
240 |
dk_lineups = init_DK_lineups('Main Slate')
|
@@ -259,10 +274,18 @@ with tab1:
|
|
259 |
with col2:
|
260 |
if st.button("Load/Reset Data", key='reset1'):
|
261 |
st.cache_data.clear()
|
262 |
-
dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, timestamp = load_overall_stats()
|
|
|
263 |
id_dict = dict(zip(roo_raw.Player, roo_raw.player_ID))
|
264 |
-
|
265 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
266 |
t_stamp = f"Last Update: " + str(timestamp) + f" CST"
|
267 |
for key in st.session_state.keys():
|
268 |
del st.session_state[key]
|
@@ -338,28 +361,33 @@ with tab2:
|
|
338 |
with st.expander("Info and Filters"):
|
339 |
if st.button("Load/Reset Data", key='reset2'):
|
340 |
st.cache_data.clear()
|
341 |
-
dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, timestamp = load_overall_stats()
|
342 |
-
|
343 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
344 |
t_stamp = f"Last Update: " + str(timestamp) + f" CST"
|
345 |
for key in st.session_state.keys():
|
346 |
del st.session_state[key]
|
347 |
|
348 |
col1, col2, col3, col4, col5 = st.columns(5)
|
349 |
with col1:
|
350 |
-
slate_var1 = st.radio("Which data are you loading?", ('Main Slate', '
|
351 |
with col2:
|
352 |
site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'))
|
353 |
with col3:
|
354 |
-
|
355 |
with col4:
|
|
|
|
|
356 |
if site_var1 == 'Draftkings':
|
357 |
-
raw_baselines = dk_raw
|
358 |
-
ROO_slice = roo_raw[roo_raw['site'] == 'Draftkings']
|
359 |
-
id_dict = dict(zip(ROO_slice.Player, ROO_slice.player_ID))
|
360 |
-
# Get the minimum and maximum ownership values from dk_lineups
|
361 |
-
min_own = np.min(dk_lineups[:,14])
|
362 |
-
max_own = np.max(dk_lineups[:,14])
|
363 |
column_names = dk_columns
|
364 |
|
365 |
player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1')
|
@@ -369,11 +397,6 @@ with tab2:
|
|
369 |
player_var2 = dk_raw.Player.values.tolist()
|
370 |
|
371 |
elif site_var1 == 'Fanduel':
|
372 |
-
raw_baselines = fd_raw
|
373 |
-
ROO_slice = roo_raw[roo_raw['site'] == 'Fanduel']
|
374 |
-
id_dict = dict(zip(ROO_slice.Player, ROO_slice.player_ID))
|
375 |
-
min_own = np.min(fd_lineups[:,15])
|
376 |
-
max_own = np.max(fd_lineups[:,15])
|
377 |
column_names = fd_columns
|
378 |
|
379 |
player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1')
|
@@ -381,21 +404,21 @@ with tab2:
|
|
381 |
player_var2 = st.multiselect('Which players do you want?', options = fd_raw['Player'].unique())
|
382 |
elif player_var1 == 'Full Slate':
|
383 |
player_var2 = fd_raw.Player.values.tolist()
|
384 |
-
|
385 |
-
|
386 |
-
|
387 |
-
|
388 |
-
|
389 |
-
|
390 |
-
|
391 |
-
|
392 |
-
|
393 |
-
|
394 |
-
|
395 |
-
|
396 |
-
|
397 |
-
|
398 |
-
|
399 |
|
400 |
if site_var1 == 'Draftkings':
|
401 |
if 'working_seed' in st.session_state:
|
|
|
19 |
db = init_conn()
|
20 |
|
21 |
dk_columns = ['PG', 'SG', 'SF', 'PF', 'C', 'G', 'F', 'FLEX', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
|
22 |
+
dk_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
|
23 |
fd_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C1', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
|
24 |
+
fd_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
|
25 |
|
26 |
roo_format = {'Top_finish': '{:.2%}', 'Top_5_finish': '{:.2%}', 'Top_10_finish': '{:.2%}', '20+%': '{:.2%}', '4x%': '{:.2%}', '5x%': '{:.2%}', '6x%': '{:.2%}', 'GPP%': '{:.2%}'}
|
27 |
|
|
|
103 |
raw_display = raw_display.apply(pd.to_numeric, errors='ignore')
|
104 |
fd_raw_sec = raw_display.sort_values(by='Median', ascending=False)
|
105 |
|
106 |
+
collection = db["Player_SD_Range_Of_Outcomes"]
|
107 |
+
cursor = collection.find()
|
108 |
+
|
109 |
+
raw_display = pd.DataFrame(list(cursor))
|
110 |
+
raw_display = raw_display[['Player', 'Minutes Proj', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '4x%', '5x%', '6x%', 'GPP%',
|
111 |
+
'Own', 'Small_Own', 'Large_Own', 'Cash_Own', 'CPT_Own', 'LevX', 'ValX', 'site', 'version', 'slate', 'timestamp', 'player_ID']]
|
112 |
+
raw_display = raw_display.loc[raw_display['Median'] > 0]
|
113 |
+
raw_display = raw_display.apply(pd.to_numeric, errors='ignore')
|
114 |
+
sd_raw = raw_display.sort_values(by='Median', ascending=False)
|
115 |
+
|
116 |
collection = db["Player_Range_Of_Outcomes"]
|
117 |
cursor = collection.find()
|
118 |
|
|
|
125 |
|
126 |
timestamp = raw_display['timestamp'].values[0]
|
127 |
|
128 |
+
return dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, sd_raw, timestamp
|
129 |
|
130 |
@st.cache_data(ttl = 60)
|
131 |
def init_DK_lineups(slate_desig: str):
|
|
|
245 |
array = pd.DataFrame(array, columns=column_names)
|
246 |
return array.to_csv().encode('utf-8')
|
247 |
|
248 |
+
dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, sd_raw, timestamp = load_overall_stats()
|
249 |
salary_dict = dict(zip(roo_raw.Player, roo_raw.Salary))
|
250 |
+
id_dict = dict(zip(roo_raw.Player, roo_raw.player_ID))
|
251 |
+
salary_dict_sd = dict(zip(sd_raw.Player, sd_raw.Salary))
|
252 |
+
id_dict_sd = dict(zip(sd_raw.Player, sd_raw.player_ID))
|
253 |
|
254 |
try:
|
255 |
dk_lineups = init_DK_lineups('Main Slate')
|
|
|
274 |
with col2:
|
275 |
if st.button("Load/Reset Data", key='reset1'):
|
276 |
st.cache_data.clear()
|
277 |
+
dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, sd_raw, timestamp = load_overall_stats()
|
278 |
+
salary_dict = dict(zip(roo_raw.Player, roo_raw.Salary))
|
279 |
id_dict = dict(zip(roo_raw.Player, roo_raw.player_ID))
|
280 |
+
salary_dict_sd = dict(zip(sd_raw.Player, sd_raw.Salary))
|
281 |
+
id_dict_sd = dict(zip(sd_raw.Player, sd_raw.player_ID))
|
282 |
+
|
283 |
+
try:
|
284 |
+
dk_lineups = init_DK_lineups('Main Slate')
|
285 |
+
fd_lineups = init_FD_lineups('Main Slate')
|
286 |
+
except:
|
287 |
+
dk_lineups = pd.DataFrame(columns=dk_columns)
|
288 |
+
fd_lineups = pd.DataFrame(columns=fd_columns)
|
289 |
t_stamp = f"Last Update: " + str(timestamp) + f" CST"
|
290 |
for key in st.session_state.keys():
|
291 |
del st.session_state[key]
|
|
|
361 |
with st.expander("Info and Filters"):
|
362 |
if st.button("Load/Reset Data", key='reset2'):
|
363 |
st.cache_data.clear()
|
364 |
+
dk_raw, fd_raw, dk_raw_sec, fd_raw_sec, roo_raw, sd_raw, timestamp = load_overall_stats()
|
365 |
+
salary_dict = dict(zip(roo_raw.Player, roo_raw.Salary))
|
366 |
+
id_dict = dict(zip(roo_raw.Player, roo_raw.player_ID))
|
367 |
+
salary_dict_sd = dict(zip(sd_raw.Player, sd_raw.Salary))
|
368 |
+
id_dict_sd = dict(zip(sd_raw.Player, sd_raw.player_ID))
|
369 |
+
|
370 |
+
try:
|
371 |
+
dk_lineups = init_DK_lineups('Main Slate')
|
372 |
+
fd_lineups = init_FD_lineups('Main Slate')
|
373 |
+
except:
|
374 |
+
dk_lineups = pd.DataFrame(columns=dk_columns)
|
375 |
+
fd_lineups = pd.DataFrame(columns=fd_columns)
|
376 |
t_stamp = f"Last Update: " + str(timestamp) + f" CST"
|
377 |
for key in st.session_state.keys():
|
378 |
del st.session_state[key]
|
379 |
|
380 |
col1, col2, col3, col4, col5 = st.columns(5)
|
381 |
with col1:
|
382 |
+
slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary'))
|
383 |
with col2:
|
384 |
site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'))
|
385 |
with col3:
|
386 |
+
slate_type_var1 = st.radio("What slate type are you working with?", ('Regular', 'Showdown'))
|
387 |
with col4:
|
388 |
+
lineup_num_var = st.number_input("How many lineups do you want to display?", min_value=1, max_value=1000, value=150, step=1)
|
389 |
+
with col5:
|
390 |
if site_var1 == 'Draftkings':
|
|
|
|
|
|
|
|
|
|
|
|
|
391 |
column_names = dk_columns
|
392 |
|
393 |
player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1')
|
|
|
397 |
player_var2 = dk_raw.Player.values.tolist()
|
398 |
|
399 |
elif site_var1 == 'Fanduel':
|
|
|
|
|
|
|
|
|
|
|
400 |
column_names = fd_columns
|
401 |
|
402 |
player_var1 = st.radio("Do you want a frame with specific Players?", ('Full Slate', 'Specific Players'), key='player_var1')
|
|
|
404 |
player_var2 = st.multiselect('Which players do you want?', options = fd_raw['Player'].unique())
|
405 |
elif player_var1 == 'Full Slate':
|
406 |
player_var2 = fd_raw.Player.values.tolist()
|
407 |
+
if st.button("Prepare data export", key='data_export'):
|
408 |
+
data_export = st.session_state.working_seed.copy()
|
409 |
+
if site_var1 == 'Draftkings':
|
410 |
+
for col_idx in range(8):
|
411 |
+
data_export[:, col_idx] = np.array([id_dict.get(player, player) for player in data_export[:, col_idx]])
|
412 |
+
elif site_var1 == 'Fanduel':
|
413 |
+
for col_idx in range(9):
|
414 |
+
data_export[:, col_idx] = np.array([id_dict.get(player, player) for player in data_export[:, col_idx]])
|
415 |
+
st.download_button(
|
416 |
+
label="Export optimals set",
|
417 |
+
data=convert_df(data_export),
|
418 |
+
file_name='NBA_optimals_export.csv',
|
419 |
+
mime='text/csv',
|
420 |
+
)
|
421 |
+
|
422 |
|
423 |
if site_var1 == 'Draftkings':
|
424 |
if 'working_seed' in st.session_state:
|