Spaces:
Running
Running
James McCool
commited on
Commit
·
1234db6
1
Parent(s):
b8564ea
Add Portfolio Manager export functionality and enhance data filtering options in the UI. Introduce new download buttons for filtered and unfiltered optimals, allowing users to export data based on selected criteria. Update player display logic to include additional input fields for stack limits and improve clarity in export options.
Browse files
app.py
CHANGED
@@ -27,7 +27,6 @@ fd_columns = ['P', 'C_1B', '2B', '3B', 'SS', 'OF1', 'OF2', 'OF3', 'UTIL', 'salar
|
|
27 |
dk_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
|
28 |
fd_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
|
29 |
|
30 |
-
|
31 |
@st.cache_resource(ttl = 61)
|
32 |
def init_baselines():
|
33 |
|
@@ -283,6 +282,11 @@ def convert_df(array):
|
|
283 |
array = pd.DataFrame(array, columns=column_names)
|
284 |
return array.to_csv().encode('utf-8')
|
285 |
|
|
|
|
|
|
|
|
|
|
|
286 |
col1, col2 = st.columns([1, 9])
|
287 |
with col1:
|
288 |
if st.button("Load/Reset Data", key='reset'):
|
@@ -477,6 +481,29 @@ with tab2:
|
|
477 |
player_roo_disp = player_roo_disp.drop(columns=['site', 'slate', 'version', 'timestamp'])
|
478 |
|
479 |
player_roo_disp = player_roo_disp.drop_duplicates(subset=['Player'])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
480 |
|
481 |
if view_var == "Simple":
|
482 |
try:
|
@@ -498,7 +525,8 @@ with tab2:
|
|
498 |
with tab3:
|
499 |
st.header("Optimals")
|
500 |
with st.expander("Info and Filters"):
|
501 |
-
|
|
|
502 |
with col1:
|
503 |
slate_type_var3 = st.radio("Which slate type are you loading?", ('Regular', 'Showdown'), key='slate_type_var3')
|
504 |
if slate_type_var3 == 'Regular':
|
@@ -530,6 +558,13 @@ with tab3:
|
|
530 |
elif site_var == 'Fanduel':
|
531 |
salary_min_var = st.number_input("Minimum salary used", min_value = 0, max_value = 35000, value = 34000, step = 100, key = 'salary_min_var')
|
532 |
salary_max_var = st.number_input("Maximum salary used", min_value = 0, max_value = 35000, value = 35000, step = 100, key = 'salary_max_var')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
533 |
|
534 |
|
535 |
if site_var == 'Draftkings':
|
@@ -558,35 +593,149 @@ with tab3:
|
|
558 |
min_own = np.min(fd_lineups[:,11])
|
559 |
max_own = np.max(fd_lineups[:,11])
|
560 |
|
561 |
-
|
562 |
-
|
563 |
-
|
564 |
-
|
565 |
-
|
566 |
-
|
567 |
-
|
568 |
-
|
569 |
-
|
570 |
-
|
571 |
-
|
572 |
-
|
573 |
-
|
574 |
-
|
575 |
-
|
576 |
-
|
577 |
-
|
578 |
-
|
579 |
-
|
580 |
-
|
581 |
-
|
582 |
-
|
583 |
-
|
584 |
-
|
585 |
-
|
586 |
-
|
587 |
-
|
588 |
-
|
589 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
590 |
|
591 |
if site_var == 'Draftkings':
|
592 |
if 'working_seed' in st.session_state:
|
|
|
27 |
dk_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
|
28 |
fd_sd_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
|
29 |
|
|
|
30 |
@st.cache_resource(ttl = 61)
|
31 |
def init_baselines():
|
32 |
|
|
|
282 |
array = pd.DataFrame(array, columns=column_names)
|
283 |
return array.to_csv().encode('utf-8')
|
284 |
|
285 |
+
@st.cache_data
|
286 |
+
def convert_pm_df(array):
|
287 |
+
array = pd.DataFrame(array)
|
288 |
+
return array.to_csv().encode('utf-8')
|
289 |
+
|
290 |
col1, col2 = st.columns([1, 9])
|
291 |
with col1:
|
292 |
if st.button("Load/Reset Data", key='reset'):
|
|
|
481 |
player_roo_disp = player_roo_disp.drop(columns=['site', 'slate', 'version', 'timestamp'])
|
482 |
|
483 |
player_roo_disp = player_roo_disp.drop_duplicates(subset=['Player'])
|
484 |
+
if slate_type_var2 == 'Regular':
|
485 |
+
pm_export = player_roo_disp[['Player', 'Position', 'Team', 'Salary', 'Median', 'Own%']]
|
486 |
+
pm_export['captain ownership'] = pm_export['Own%'] / 6
|
487 |
+
pm_export = pm_export.rename(columns={'Own%': 'ownership', 'Median': 'median', 'Player': 'player_names', 'Position': 'position', 'Team': 'team', 'Salary': 'salary'})
|
488 |
+
elif slate_type_var2 == 'Showdown':
|
489 |
+
pm_export = player_roo_disp[['Player', 'Position', 'Team', 'Salary', 'Median', 'Own%', 'CPT_Own']]
|
490 |
+
pm_export = pm_export.rename(columns={'Own%': 'ownership', 'Median': 'median', 'Player': 'player_names', 'Position': 'position', 'Team': 'team', 'Salary': 'salary', 'CPT_Own': 'captain ownership'})
|
491 |
+
|
492 |
+
reg_dl_col, pm_dl_col, blank_col = st.columns([2, 2, 6])
|
493 |
+
with reg_dl_col:
|
494 |
+
st.download_button(
|
495 |
+
label="Export ROO (Regular)",
|
496 |
+
data=convert_df_to_csv(player_roo_disp),
|
497 |
+
file_name='MLB_ROO_export.csv',
|
498 |
+
mime='text/csv',
|
499 |
+
)
|
500 |
+
with pm_dl_col:
|
501 |
+
st.download_button(
|
502 |
+
label="Export ROO (Portfolio Manager)",
|
503 |
+
data=convert_df_to_csv(pm_export),
|
504 |
+
file_name='MLB_ROO_export.csv',
|
505 |
+
mime='text/csv',
|
506 |
+
)
|
507 |
|
508 |
if view_var == "Simple":
|
509 |
try:
|
|
|
525 |
with tab3:
|
526 |
st.header("Optimals")
|
527 |
with st.expander("Info and Filters"):
|
528 |
+
st.info("These filters will display various optimals in the table below to pick from. If you want to export the entire set of 10,000 optimals, hit the 'Prepare full data export' button. If you would like to apply the filters here to the 10,000 optimals before you export, use the 'Prepare full data export (Filter)' button.")
|
529 |
+
col1, col2, col3, col4 = st.columns(4)
|
530 |
with col1:
|
531 |
slate_type_var3 = st.radio("Which slate type are you loading?", ('Regular', 'Showdown'), key='slate_type_var3')
|
532 |
if slate_type_var3 == 'Regular':
|
|
|
558 |
elif site_var == 'Fanduel':
|
559 |
salary_min_var = st.number_input("Minimum salary used", min_value = 0, max_value = 35000, value = 34000, step = 100, key = 'salary_min_var')
|
560 |
salary_max_var = st.number_input("Maximum salary used", min_value = 0, max_value = 35000, value = 35000, step = 100, key = 'salary_max_var')
|
561 |
+
with col4:
|
562 |
+
if site_var == 'Draftkings':
|
563 |
+
min_stacks_var = st.number_input("Minimum stacks used", min_value = 0, max_value = 5, value = 3, step = 1, key = 'min_stacks_var')
|
564 |
+
max_stacks_var = st.number_input("Maximum stacks used", min_value = 0, max_value = 5, value = 5, step = 1, key = 'max_stacks_var')
|
565 |
+
elif site_var == 'Fanduel':
|
566 |
+
min_stacks_var = st.number_input("Minimum stacks used", min_value = 0, max_value = 4, value = 3, step = 1, key = 'min_stacks_var')
|
567 |
+
max_stacks_var = st.number_input("Maximum stacks used", min_value = 0, max_value = 4, value = 4, step = 1, key = 'max_stacks_var')
|
568 |
|
569 |
|
570 |
if site_var == 'Draftkings':
|
|
|
593 |
min_own = np.min(fd_lineups[:,11])
|
594 |
max_own = np.max(fd_lineups[:,11])
|
595 |
|
596 |
+
reg_dl_col, filtered_dl_col, blank_dl_col = st.columns([2, 2, 6])
|
597 |
+
with reg_dl_col:
|
598 |
+
if st.button("Prepare full data export", key='data_export'):
|
599 |
+
name_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
|
600 |
+
data_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
|
601 |
+
if site_var == 'Draftkings':
|
602 |
+
if slate_type_var3 == 'Regular':
|
603 |
+
map_columns = ['SP1', 'SP2', 'C', '1B', '2B', '3B', 'SS', 'OF1', 'OF2', 'OF3']
|
604 |
+
elif slate_type_var3 == 'Showdown':
|
605 |
+
map_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']
|
606 |
+
for col_idx in map_columns:
|
607 |
+
data_export[col_idx] = data_export[col_idx].map(dk_id_map)
|
608 |
+
elif site_var == 'Fanduel':
|
609 |
+
if slate_type_var3 == 'Regular':
|
610 |
+
map_columns = ['P', 'C_1B', '2B', '3B', 'SS', 'OF1', 'OF2', 'OF3', 'UTIL']
|
611 |
+
elif slate_type_var3 == 'Showdown':
|
612 |
+
map_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4']
|
613 |
+
for col_idx in map_columns:
|
614 |
+
data_export[col_idx] = data_export[col_idx].map(fd_id_map)
|
615 |
+
reg_opt_col, pm_opt_col = st.columns(2)
|
616 |
+
with reg_opt_col:
|
617 |
+
st.download_button(
|
618 |
+
label="Export optimals set (IDs)",
|
619 |
+
data=convert_df(data_export),
|
620 |
+
file_name='MLB_optimals_export.csv',
|
621 |
+
mime='text/csv',
|
622 |
+
)
|
623 |
+
st.download_button(
|
624 |
+
label="Export optimals set (Names)",
|
625 |
+
data=convert_df(name_export),
|
626 |
+
file_name='MLB_optimals_export.csv',
|
627 |
+
mime='text/csv',
|
628 |
+
)
|
629 |
+
with pm_opt_col:
|
630 |
+
if site_var == 'Draftkings':
|
631 |
+
if slate_type_var3 == 'Regular':
|
632 |
+
data_export = data_export.set_index('SP1').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
|
633 |
+
elif slate_type_var3 == 'Showdown':
|
634 |
+
data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
|
635 |
+
elif site_var == 'Fanduel':
|
636 |
+
if slate_type_var3 == 'Regular':
|
637 |
+
data_export = data_export.set_index('P').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
|
638 |
+
elif slate_type_var3 == 'Showdown':
|
639 |
+
data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
|
640 |
+
st.download_button(
|
641 |
+
label="Portfolio Manager Export (IDs)",
|
642 |
+
data=convert_pm_df(data_export),
|
643 |
+
file_name='MLB_optimals_export.csv',
|
644 |
+
mime='text/csv',
|
645 |
+
)
|
646 |
+
|
647 |
+
if site_var == 'Draftkings':
|
648 |
+
if slate_type_var3 == 'Regular':
|
649 |
+
name_export = name_export.set_index('SP1').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
|
650 |
+
elif slate_type_var3 == 'Showdown':
|
651 |
+
name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
|
652 |
+
elif site_var == 'Fanduel':
|
653 |
+
if slate_type_var3 == 'Regular':
|
654 |
+
name_export = name_export.set_index('P').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
|
655 |
+
elif slate_type_var3 == 'Showdown':
|
656 |
+
name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
|
657 |
+
st.download_button(
|
658 |
+
label="Portfolio Manager Export (Names)",
|
659 |
+
data=convert_pm_df(name_export),
|
660 |
+
file_name='MLB_optimals_export.csv',
|
661 |
+
mime='text/csv',
|
662 |
+
)
|
663 |
+
with filtered_dl_col:
|
664 |
+
if st.button("Prepare full data export (Filtered)", key='data_export_filtered'):
|
665 |
+
name_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
|
666 |
+
data_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
|
667 |
+
if site_var == 'Draftkings':
|
668 |
+
if slate_type_var3 == 'Regular':
|
669 |
+
map_columns = ['SP1', 'SP2', 'C', '1B', '2B', '3B', 'SS', 'OF1', 'OF2', 'OF3']
|
670 |
+
elif slate_type_var3 == 'Showdown':
|
671 |
+
map_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']
|
672 |
+
for col_idx in map_columns:
|
673 |
+
data_export[col_idx] = data_export[col_idx].map(dk_id_map)
|
674 |
+
elif site_var == 'Fanduel':
|
675 |
+
if slate_type_var3 == 'Regular':
|
676 |
+
map_columns = ['P', 'C_1B', '2B', '3B', 'SS', 'OF1', 'OF2', 'OF3', 'UTIL']
|
677 |
+
elif slate_type_var3 == 'Showdown':
|
678 |
+
map_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4']
|
679 |
+
for col_idx in map_columns:
|
680 |
+
data_export[col_idx] = data_export[col_idx].map(fd_id_map)
|
681 |
+
data_export = data_export[data_export['salary'] >= salary_min_var]
|
682 |
+
data_export = data_export[data_export['salary'] <= salary_max_var]
|
683 |
+
data_export = data_export[data_export['Team_count'] >= min_stacks_var]
|
684 |
+
data_export = data_export[data_export['Team_count'] <= max_stacks_var]
|
685 |
+
|
686 |
+
name_export = name_export[name_export['salary'] >= salary_min_var]
|
687 |
+
name_export = name_export[name_export['salary'] <= salary_max_var]
|
688 |
+
name_export = name_export[name_export['Team_count'] >= min_stacks_var]
|
689 |
+
name_export = name_export[name_export['Team_count'] <= max_stacks_var]
|
690 |
+
|
691 |
+
reg_opt_col, pm_opt_col = st.columns(2)
|
692 |
+
with reg_opt_col:
|
693 |
+
st.download_button(
|
694 |
+
label="Export optimals set (IDs)",
|
695 |
+
data=convert_df(data_export),
|
696 |
+
file_name='MLB_optimals_export.csv',
|
697 |
+
mime='text/csv',
|
698 |
+
)
|
699 |
+
st.download_button(
|
700 |
+
label="Export optimals set (Names)",
|
701 |
+
data=convert_df(name_export),
|
702 |
+
file_name='MLB_optimals_export.csv',
|
703 |
+
mime='text/csv',
|
704 |
+
)
|
705 |
+
with pm_opt_col:
|
706 |
+
if site_var == 'Draftkings':
|
707 |
+
if slate_type_var3 == 'Regular':
|
708 |
+
data_export = data_export.set_index('SP1').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
|
709 |
+
elif slate_type_var3 == 'Showdown':
|
710 |
+
data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
|
711 |
+
elif site_var == 'Fanduel':
|
712 |
+
if slate_type_var3 == 'Regular':
|
713 |
+
data_export = data_export.set_index('P').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
|
714 |
+
elif slate_type_var3 == 'Showdown':
|
715 |
+
data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
|
716 |
+
st.download_button(
|
717 |
+
label="Portfolio Manager Export (IDs)",
|
718 |
+
data=convert_pm_df(data_export),
|
719 |
+
file_name='MLB_optimals_export.csv',
|
720 |
+
mime='text/csv',
|
721 |
+
)
|
722 |
+
|
723 |
+
if site_var == 'Draftkings':
|
724 |
+
if slate_type_var3 == 'Regular':
|
725 |
+
name_export = name_export.set_index('SP1').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
|
726 |
+
elif slate_type_var3 == 'Showdown':
|
727 |
+
name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
|
728 |
+
elif site_var == 'Fanduel':
|
729 |
+
if slate_type_var3 == 'Regular':
|
730 |
+
name_export = name_export.set_index('P').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
|
731 |
+
elif slate_type_var3 == 'Showdown':
|
732 |
+
name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
|
733 |
+
st.download_button(
|
734 |
+
label="Portfolio Manager Export (Names)",
|
735 |
+
data=convert_pm_df(name_export),
|
736 |
+
file_name='MLB_optimals_export.csv',
|
737 |
+
mime='text/csv',
|
738 |
+
)
|
739 |
|
740 |
if site_var == 'Draftkings':
|
741 |
if 'working_seed' in st.session_state:
|