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
Files changed (1) hide show
  1. app.py +180 -31
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
- col1, col2, col3 = st.columns(3)
 
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
- if st.button("Prepare full data export", key='data_export'):
562
- name_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
563
- data_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
564
- if site_var == 'Draftkings':
565
- if slate_type_var3 == 'Regular':
566
- map_columns = ['SP1', 'SP2', 'C', '1B', '2B', '3B', 'SS', 'OF1', 'OF2', 'OF3']
567
- elif slate_type_var3 == 'Showdown':
568
- map_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'FLEX5']
569
- for col_idx in map_columns:
570
- data_export[col_idx] = data_export[col_idx].map(dk_id_map)
571
- elif site_var == 'Fanduel':
572
- if slate_type_var3 == 'Regular':
573
- map_columns = ['P', 'C_1B', '2B', '3B', 'SS', 'OF1', 'OF2', 'OF3', 'UTIL']
574
- elif slate_type_var3 == 'Showdown':
575
- map_columns = ['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4']
576
- for col_idx in map_columns:
577
- data_export[col_idx] = data_export[col_idx].map(fd_id_map)
578
- st.download_button(
579
- label="Export optimals set (IDs)",
580
- data=convert_df(data_export),
581
- file_name='MLB_optimals_export.csv',
582
- mime='text/csv',
583
- )
584
- st.download_button(
585
- label="Export optimals set (Names)",
586
- data=convert_df(name_export),
587
- file_name='MLB_optimals_export.csv',
588
- mime='text/csv',
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: