Spaces:
Running
Running
James McCool
commited on
Commit
·
1e8363d
1
Parent(s):
d077a00
Refactor app.py to implement a unified selection interface for view, site, and model across all tabs, enhancing user experience and maintaining consistent data handling. Introduce caching for data conversion function to optimize performance.
Browse files
app.py
CHANGED
@@ -104,6 +104,7 @@ def init_FD_lineups():
|
|
104 |
|
105 |
return FD_seed
|
106 |
|
|
|
107 |
def convert_df_to_csv(df):
|
108 |
return df.to_csv().encode('utf-8')
|
109 |
|
@@ -115,17 +116,17 @@ def convert_df(array):
|
|
115 |
roo_data, sd_roo_data, scoring_percentages = init_baselines()
|
116 |
hold_display = roo_data
|
117 |
|
118 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
119 |
|
120 |
-
|
121 |
st.header("Scoring Percentages")
|
122 |
-
|
123 |
-
with st.container():
|
124 |
-
col1, col2 = st.columns([3, 3])
|
125 |
-
with col1:
|
126 |
-
view_var1 = st.selectbox("Select view", ["Simple", "Advanced"], key='view_var1')
|
127 |
-
with col2:
|
128 |
-
site_var1 = st.selectbox("What site do you want to view?", ('Draftkings', 'Fanduel'), key='site_var1')
|
129 |
|
130 |
with st.expander("Info and Filters"):
|
131 |
col1, col2, col3 = st.columns([3, 3, 3])
|
@@ -143,21 +144,14 @@ with tab1:
|
|
143 |
with col3:
|
144 |
own_var1 = st.radio("How would you like to display team ownership?", ('Sum', 'Average'))
|
145 |
st.title("Scoring Percentages")
|
146 |
-
if
|
147 |
scoring_percentages = scoring_percentages[['Names', 'Avg Score', '8+ runs', 'Win Percentage']]
|
148 |
st.dataframe(scoring_percentages.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(game_format, precision=2), height=750, use_container_width = True, hide_index=True)
|
149 |
-
elif
|
150 |
st.dataframe(scoring_percentages.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(game_format, precision=2), height=750, use_container_width = True, hide_index=True)
|
151 |
|
152 |
-
|
153 |
st.header("Player ROO")
|
154 |
-
|
155 |
-
with st.container():
|
156 |
-
col1, col2 = st.columns([3, 3])
|
157 |
-
with col1:
|
158 |
-
view_var2 = st.selectbox("Select view", ["Simple", "Advanced"], key='view_var2')
|
159 |
-
with col2:
|
160 |
-
site_var2 = st.selectbox("What site do you want to view?", ('Draftkings', 'Fanduel'), key='site_var2')
|
161 |
|
162 |
with st.expander("Info and Filters"):
|
163 |
col1, col2, col3, col4 = st.columns([3, 3, 3, 3])
|
@@ -179,7 +173,7 @@ with tab2:
|
|
179 |
|
180 |
if slate_type_var2 == 'Regular':
|
181 |
player_roo_raw = roo_data.copy()
|
182 |
-
if
|
183 |
player_roo_raw['Site'] = 'Draftkings'
|
184 |
|
185 |
if pos_var2 == 'All':
|
@@ -188,7 +182,7 @@ with tab2:
|
|
188 |
player_roo_raw = player_roo_raw[player_roo_raw['Position'] == 'SP']
|
189 |
elif pos_var2 == 'Hitters':
|
190 |
player_roo_raw = player_roo_raw[player_roo_raw['Position'] != 'SP']
|
191 |
-
elif
|
192 |
player_roo_raw['Site'] = 'Fanduel'
|
193 |
|
194 |
if pos_var2 == 'All':
|
@@ -207,26 +201,19 @@ with tab2:
|
|
207 |
|
208 |
elif slate_type_var2 == 'Showdown':
|
209 |
player_roo_raw = sd_roo_data.copy()
|
210 |
-
if
|
211 |
player_roo_raw['Site'] = 'Draftkings'
|
212 |
-
elif
|
213 |
player_roo_raw['Site'] = 'Fanduel'
|
214 |
st.session_state['player_roo'] = player_roo_raw.drop(columns=['site', 'slate', 'version', 'timestamp'])
|
215 |
-
if
|
216 |
st.session_state['player_roo'] = st.session_state['player_roo'][['Player', 'Position', 'Salary', 'Median', 'Ceiling', 'Own']]
|
217 |
st.dataframe(st.session_state['player_roo'].style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), height=750, use_container_width = True, hide_index=True)
|
218 |
-
elif
|
219 |
st.dataframe(st.session_state['player_roo'].style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), height=750, use_container_width = True, hide_index=True)
|
220 |
|
221 |
-
|
222 |
st.header("Optimals")
|
223 |
-
|
224 |
-
with st.container():
|
225 |
-
col1, col2 = st.columns([3, 3])
|
226 |
-
with col1:
|
227 |
-
site_var3 = st.selectbox("What site do you want to view?", ('Draftkings', 'Fanduel'), key='site_var3')
|
228 |
-
with col2:
|
229 |
-
view_var3 = st.selectbox("Select view", ["Simple", "Advanced"], key='view_var3')
|
230 |
|
231 |
with st.expander("Info and Filters"):
|
232 |
if st.button("Load/Reset Data", key='reset3'):
|
@@ -242,14 +229,14 @@ with tab3:
|
|
242 |
slate_var3 = st.radio("Which slate data are you loading?", ('Main', 'Secondary', 'Auxiliary'))
|
243 |
|
244 |
if slate_type_var3 == 'Regular':
|
245 |
-
if
|
246 |
dk_lineups = init_DK_lineups(slate_var3)
|
247 |
-
elif
|
248 |
fd_lineups = init_FD_lineups(slate_var3)
|
249 |
elif slate_type_var3 == 'Showdown':
|
250 |
-
if
|
251 |
dk_lineups = init_DK_lineups(slate_var3)
|
252 |
-
elif
|
253 |
fd_lineups = init_FD_lineups(slate_var3)
|
254 |
lineup_num_var = st.number_input("How many lineups do you want to display?", min_value=1, max_value=1000, value=150, step=1)
|
255 |
|
@@ -258,7 +245,7 @@ with tab3:
|
|
258 |
elif slate_type_var3 == 'Showdown':
|
259 |
raw_baselines = sd_roo_data
|
260 |
|
261 |
-
if
|
262 |
if slate_type_var3 == 'Regular':
|
263 |
ROO_slice = raw_baselines[raw_baselines['Site'] == 'Draftkings']
|
264 |
player_salaries = dict(zip(ROO_slice['Player'], ROO_slice['Salary']))
|
@@ -275,7 +262,7 @@ with tab3:
|
|
275 |
elif player_var1 == 'Full Slate':
|
276 |
player_var2 = raw_baselines.Player.values.tolist()
|
277 |
|
278 |
-
elif
|
279 |
raw_baselines = hold_display
|
280 |
if slate_type_var3 == 'Regular':
|
281 |
ROO_slice = raw_baselines[raw_baselines['Site'] == 'Fanduel']
|
@@ -294,10 +281,10 @@ with tab3:
|
|
294 |
|
295 |
if st.button("Prepare data export", key='data_export'):
|
296 |
data_export = st.session_state.working_seed.copy()
|
297 |
-
# if
|
298 |
# for col_idx in range(6):
|
299 |
# data_export[:, col_idx] = np.array([id_dict.get(player, player) for player in data_export[:, col_idx]])
|
300 |
-
# elif
|
301 |
# for col_idx in range(6):
|
302 |
# data_export[:, col_idx] = np.array([id_dict.get(player, player) for player in data_export[:, col_idx]])
|
303 |
st.download_button(
|
@@ -307,7 +294,7 @@ with tab3:
|
|
307 |
mime='text/csv',
|
308 |
)
|
309 |
|
310 |
-
if
|
311 |
if 'working_seed' in st.session_state:
|
312 |
st.session_state.working_seed = st.session_state.working_seed
|
313 |
if player_var1 == 'Specific Players':
|
@@ -324,7 +311,7 @@ with tab3:
|
|
324 |
st.session_state.working_seed = dk_lineups.copy()
|
325 |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
|
326 |
|
327 |
-
elif
|
328 |
if 'working_seed' in st.session_state:
|
329 |
st.session_state.working_seed = st.session_state.working_seed
|
330 |
if player_var1 == 'Specific Players':
|
@@ -342,10 +329,10 @@ with tab3:
|
|
342 |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
|
343 |
|
344 |
export_file = st.session_state.data_export_display.copy()
|
345 |
-
# if
|
346 |
# for col_idx in range(6):
|
347 |
# export_file.iloc[:, col_idx] = export_file.iloc[:, col_idx].map(id_dict)
|
348 |
-
# elif
|
349 |
# for col_idx in range(6):
|
350 |
# export_file.iloc[:, col_idx] = export_file.iloc[:, col_idx].map(id_dict)
|
351 |
|
@@ -353,9 +340,9 @@ with tab3:
|
|
353 |
if st.button("Reset Optimals", key='reset3'):
|
354 |
for key in st.session_state.keys():
|
355 |
del st.session_state[key]
|
356 |
-
if
|
357 |
st.session_state.working_seed = dk_lineups.copy()
|
358 |
-
elif
|
359 |
st.session_state.working_seed = fd_lineups.copy()
|
360 |
if 'data_export_display' in st.session_state:
|
361 |
st.dataframe(st.session_state.data_export_display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), height=500, use_container_width = True)
|
@@ -369,7 +356,7 @@ with tab3:
|
|
369 |
with st.container():
|
370 |
if 'working_seed' in st.session_state:
|
371 |
# Create a new dataframe with summary statistics
|
372 |
-
if
|
373 |
summary_df = pd.DataFrame({
|
374 |
'Metric': ['Min', 'Average', 'Max', 'STDdev'],
|
375 |
'Salary': [
|
@@ -391,7 +378,7 @@ with tab3:
|
|
391 |
np.std(st.session_state.working_seed[:,8])
|
392 |
]
|
393 |
})
|
394 |
-
elif
|
395 |
summary_df = pd.DataFrame({
|
396 |
'Metric': ['Min', 'Average', 'Max', 'STDdev'],
|
397 |
'Salary': [
|
@@ -429,9 +416,9 @@ with tab3:
|
|
429 |
tab1, tab2 = st.tabs(["Display Frequency", "Seed Frame Frequency"])
|
430 |
with tab1:
|
431 |
if 'data_export_display' in st.session_state:
|
432 |
-
if
|
433 |
player_columns = st.session_state.data_export_display.iloc[:, :6]
|
434 |
-
elif
|
435 |
player_columns = st.session_state.data_export_display.iloc[:, :6]
|
436 |
|
437 |
# Flatten the DataFrame and count unique values
|
@@ -465,9 +452,9 @@ with tab3:
|
|
465 |
)
|
466 |
with tab2:
|
467 |
if 'working_seed' in st.session_state:
|
468 |
-
if
|
469 |
player_columns = st.session_state.working_seed[:, :6]
|
470 |
-
elif
|
471 |
player_columns = st.session_state.working_seed[:, :6]
|
472 |
|
473 |
# Flatten the DataFrame and count unique values
|
|
|
104 |
|
105 |
return FD_seed
|
106 |
|
107 |
+
@st.cache_data
|
108 |
def convert_df_to_csv(df):
|
109 |
return df.to_csv().encode('utf-8')
|
110 |
|
|
|
116 |
roo_data, sd_roo_data, scoring_percentages = init_baselines()
|
117 |
hold_display = roo_data
|
118 |
|
119 |
+
with st.container():
|
120 |
+
col1, col2, col3 = st.columns([3, 3, 3])
|
121 |
+
with col1:
|
122 |
+
view_var = st.selectbox("Select view", ["Simple", "Advanced"], key='view_var')
|
123 |
+
with col2:
|
124 |
+
site_var = st.selectbox("What site do you want to view?", ('Draftkings', 'Fanduel'), key='site_var')
|
125 |
+
with col3:
|
126 |
+
model_var = st.radio("What do you want to view?", ('Scoring Percentages', 'Player ROO', 'Optimals'), key='model_var')
|
127 |
|
128 |
+
if model_var == 'Scoring Percentages':
|
129 |
st.header("Scoring Percentages")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
130 |
|
131 |
with st.expander("Info and Filters"):
|
132 |
col1, col2, col3 = st.columns([3, 3, 3])
|
|
|
144 |
with col3:
|
145 |
own_var1 = st.radio("How would you like to display team ownership?", ('Sum', 'Average'))
|
146 |
st.title("Scoring Percentages")
|
147 |
+
if view_var == "Simple":
|
148 |
scoring_percentages = scoring_percentages[['Names', 'Avg Score', '8+ runs', 'Win Percentage']]
|
149 |
st.dataframe(scoring_percentages.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(game_format, precision=2), height=750, use_container_width = True, hide_index=True)
|
150 |
+
elif view_var == "Advanced":
|
151 |
st.dataframe(scoring_percentages.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(game_format, precision=2), height=750, use_container_width = True, hide_index=True)
|
152 |
|
153 |
+
if model_var == 'Player ROO':
|
154 |
st.header("Player ROO")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
155 |
|
156 |
with st.expander("Info and Filters"):
|
157 |
col1, col2, col3, col4 = st.columns([3, 3, 3, 3])
|
|
|
173 |
|
174 |
if slate_type_var2 == 'Regular':
|
175 |
player_roo_raw = roo_data.copy()
|
176 |
+
if site_var == 'Draftkings':
|
177 |
player_roo_raw['Site'] = 'Draftkings'
|
178 |
|
179 |
if pos_var2 == 'All':
|
|
|
182 |
player_roo_raw = player_roo_raw[player_roo_raw['Position'] == 'SP']
|
183 |
elif pos_var2 == 'Hitters':
|
184 |
player_roo_raw = player_roo_raw[player_roo_raw['Position'] != 'SP']
|
185 |
+
elif site_var == 'Fanduel':
|
186 |
player_roo_raw['Site'] = 'Fanduel'
|
187 |
|
188 |
if pos_var2 == 'All':
|
|
|
201 |
|
202 |
elif slate_type_var2 == 'Showdown':
|
203 |
player_roo_raw = sd_roo_data.copy()
|
204 |
+
if site_var == 'Draftkings':
|
205 |
player_roo_raw['Site'] = 'Draftkings'
|
206 |
+
elif site_var == 'Fanduel':
|
207 |
player_roo_raw['Site'] = 'Fanduel'
|
208 |
st.session_state['player_roo'] = player_roo_raw.drop(columns=['site', 'slate', 'version', 'timestamp'])
|
209 |
+
if view_var == "Simple":
|
210 |
st.session_state['player_roo'] = st.session_state['player_roo'][['Player', 'Position', 'Salary', 'Median', 'Ceiling', 'Own']]
|
211 |
st.dataframe(st.session_state['player_roo'].style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), height=750, use_container_width = True, hide_index=True)
|
212 |
+
elif view_var == "Advanced":
|
213 |
st.dataframe(st.session_state['player_roo'].style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), height=750, use_container_width = True, hide_index=True)
|
214 |
|
215 |
+
if model_var == 'Optimals':
|
216 |
st.header("Optimals")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
217 |
|
218 |
with st.expander("Info and Filters"):
|
219 |
if st.button("Load/Reset Data", key='reset3'):
|
|
|
229 |
slate_var3 = st.radio("Which slate data are you loading?", ('Main', 'Secondary', 'Auxiliary'))
|
230 |
|
231 |
if slate_type_var3 == 'Regular':
|
232 |
+
if site_var == 'Draftkings':
|
233 |
dk_lineups = init_DK_lineups(slate_var3)
|
234 |
+
elif site_var == 'Fanduel':
|
235 |
fd_lineups = init_FD_lineups(slate_var3)
|
236 |
elif slate_type_var3 == 'Showdown':
|
237 |
+
if site_var == 'Draftkings':
|
238 |
dk_lineups = init_DK_lineups(slate_var3)
|
239 |
+
elif site_var == 'Fanduel':
|
240 |
fd_lineups = init_FD_lineups(slate_var3)
|
241 |
lineup_num_var = st.number_input("How many lineups do you want to display?", min_value=1, max_value=1000, value=150, step=1)
|
242 |
|
|
|
245 |
elif slate_type_var3 == 'Showdown':
|
246 |
raw_baselines = sd_roo_data
|
247 |
|
248 |
+
if site_var == 'Draftkings':
|
249 |
if slate_type_var3 == 'Regular':
|
250 |
ROO_slice = raw_baselines[raw_baselines['Site'] == 'Draftkings']
|
251 |
player_salaries = dict(zip(ROO_slice['Player'], ROO_slice['Salary']))
|
|
|
262 |
elif player_var1 == 'Full Slate':
|
263 |
player_var2 = raw_baselines.Player.values.tolist()
|
264 |
|
265 |
+
elif site_var == 'Fanduel':
|
266 |
raw_baselines = hold_display
|
267 |
if slate_type_var3 == 'Regular':
|
268 |
ROO_slice = raw_baselines[raw_baselines['Site'] == 'Fanduel']
|
|
|
281 |
|
282 |
if st.button("Prepare data export", key='data_export'):
|
283 |
data_export = st.session_state.working_seed.copy()
|
284 |
+
# if site_var == 'Draftkings':
|
285 |
# for col_idx in range(6):
|
286 |
# data_export[:, col_idx] = np.array([id_dict.get(player, player) for player in data_export[:, col_idx]])
|
287 |
+
# elif site_var == 'Fanduel':
|
288 |
# for col_idx in range(6):
|
289 |
# data_export[:, col_idx] = np.array([id_dict.get(player, player) for player in data_export[:, col_idx]])
|
290 |
st.download_button(
|
|
|
294 |
mime='text/csv',
|
295 |
)
|
296 |
|
297 |
+
if site_var == 'Draftkings':
|
298 |
if 'working_seed' in st.session_state:
|
299 |
st.session_state.working_seed = st.session_state.working_seed
|
300 |
if player_var1 == 'Specific Players':
|
|
|
311 |
st.session_state.working_seed = dk_lineups.copy()
|
312 |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
|
313 |
|
314 |
+
elif site_var == 'Fanduel':
|
315 |
if 'working_seed' in st.session_state:
|
316 |
st.session_state.working_seed = st.session_state.working_seed
|
317 |
if player_var1 == 'Specific Players':
|
|
|
329 |
st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:lineup_num_var], columns=column_names)
|
330 |
|
331 |
export_file = st.session_state.data_export_display.copy()
|
332 |
+
# if site_var == 'Draftkings':
|
333 |
# for col_idx in range(6):
|
334 |
# export_file.iloc[:, col_idx] = export_file.iloc[:, col_idx].map(id_dict)
|
335 |
+
# elif site_var == 'Fanduel':
|
336 |
# for col_idx in range(6):
|
337 |
# export_file.iloc[:, col_idx] = export_file.iloc[:, col_idx].map(id_dict)
|
338 |
|
|
|
340 |
if st.button("Reset Optimals", key='reset3'):
|
341 |
for key in st.session_state.keys():
|
342 |
del st.session_state[key]
|
343 |
+
if site_var == 'Draftkings':
|
344 |
st.session_state.working_seed = dk_lineups.copy()
|
345 |
+
elif site_var == 'Fanduel':
|
346 |
st.session_state.working_seed = fd_lineups.copy()
|
347 |
if 'data_export_display' in st.session_state:
|
348 |
st.dataframe(st.session_state.data_export_display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), height=500, use_container_width = True)
|
|
|
356 |
with st.container():
|
357 |
if 'working_seed' in st.session_state:
|
358 |
# Create a new dataframe with summary statistics
|
359 |
+
if site_var == 'Draftkings':
|
360 |
summary_df = pd.DataFrame({
|
361 |
'Metric': ['Min', 'Average', 'Max', 'STDdev'],
|
362 |
'Salary': [
|
|
|
378 |
np.std(st.session_state.working_seed[:,8])
|
379 |
]
|
380 |
})
|
381 |
+
elif site_var == 'Fanduel':
|
382 |
summary_df = pd.DataFrame({
|
383 |
'Metric': ['Min', 'Average', 'Max', 'STDdev'],
|
384 |
'Salary': [
|
|
|
416 |
tab1, tab2 = st.tabs(["Display Frequency", "Seed Frame Frequency"])
|
417 |
with tab1:
|
418 |
if 'data_export_display' in st.session_state:
|
419 |
+
if site_var == 'Draftkings':
|
420 |
player_columns = st.session_state.data_export_display.iloc[:, :6]
|
421 |
+
elif site_var == 'Fanduel':
|
422 |
player_columns = st.session_state.data_export_display.iloc[:, :6]
|
423 |
|
424 |
# Flatten the DataFrame and count unique values
|
|
|
452 |
)
|
453 |
with tab2:
|
454 |
if 'working_seed' in st.session_state:
|
455 |
+
if site_var == 'Draftkings':
|
456 |
player_columns = st.session_state.working_seed[:, :6]
|
457 |
+
elif site_var == 'Fanduel':
|
458 |
player_columns = st.session_state.working_seed[:, :6]
|
459 |
|
460 |
# Flatten the DataFrame and count unique values
|