James McCool commited on
Commit
7fd11fc
·
1 Parent(s): a325276

aiming to fix missing players in mappings

Browse files
Files changed (1) hide show
  1. app.py +177 -1
app.py CHANGED
@@ -666,6 +666,175 @@ def create_memory_efficient_mappings(projections_df, site_var, type_var, sport_v
666
 
667
  return base_mappings
668
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
669
  def calculate_salary_vectorized(df, player_columns, map_dict, type_var, sport_var):
670
  """Vectorized salary calculation to replace expensive apply operations"""
671
  def safe_map_and_fill(series, mapping, fill_value=0):
@@ -1471,7 +1640,14 @@ if selected_tab == 'Data Load':
1471
 
1472
  # Create memory-efficient mappings
1473
  if 'map_dict' not in st.session_state:
1474
- st.session_state['map_dict'] = create_memory_efficient_mappings(st.session_state['projections_df'], site_var, type_var, sport_var)
 
 
 
 
 
 
 
1475
 
1476
  # Store portfolio in compressed format and clean up
1477
  st.session_state['portfolio'] = st.session_state['portfolio'].astype(str)
 
666
 
667
  return base_mappings
668
 
669
+ def create_comprehensive_mappings(projections_df, portfolio_df, csv_file, site_var, type_var, sport_var):
670
+ """Create mappings that include all portfolio players, using projections first and csv_file as fallback"""
671
+
672
+ # Get all unique players from portfolio
673
+ portfolio_players = get_portfolio_names(portfolio_df)
674
+
675
+ # Optimize projections data types first (existing logic)
676
+ projections_df = projections_df.copy()
677
+ if 'position' in projections_df.columns:
678
+ projections_df['position'] = projections_df['position'].astype('category')
679
+ if 'team' in projections_df.columns:
680
+ projections_df['team'] = projections_df['team'].astype('category')
681
+ if 'salary' in projections_df.columns:
682
+ projections_df['salary'] = projections_df['salary'].astype('int32')
683
+ if 'median' in projections_df.columns:
684
+ projections_df['median'] = projections_df['median'].astype('float32')
685
+ if 'ownership' in projections_df.columns:
686
+ projections_df['ownership'] = projections_df['ownership'].astype('float32')
687
+ if 'captain ownership' in projections_df.columns:
688
+ projections_df['captain ownership'] = projections_df['captain ownership'].astype('float32')
689
+
690
+ # Create sets for efficient lookup
691
+ projection_players = set(projections_df['player_names'].tolist())
692
+ missing_players = set(portfolio_players) - projection_players
693
+
694
+ # Prepare csv_file fallback data
695
+ csv_fallback = {}
696
+ if not missing_players:
697
+ # No missing players, use existing logic
698
+ return create_memory_efficient_mappings(projections_df, site_var, type_var, sport_var)
699
+
700
+ # Create fallback mappings from csv_file for missing players
701
+ try:
702
+ csv_name_col = 'Name' if 'Name' in csv_file.columns else 'Nickname'
703
+ csv_salary_col = 'Salary'
704
+ csv_position_col = 'Position' if 'Position' in csv_file.columns else 'Roster Position'
705
+ csv_team_col = 'Team' if 'Team' in csv_file.columns else None
706
+
707
+ # Create efficient lookup dictionaries from csv_file
708
+ csv_salary_map = dict(zip(csv_file[csv_name_col], csv_file[csv_salary_col]))
709
+ csv_position_map = dict(zip(csv_file[csv_name_col], csv_file[csv_position_col]))
710
+ csv_team_map = dict(zip(csv_file[csv_name_col], csv_file.get(csv_team_col, 'Unknown'))) if csv_team_col else {}
711
+
712
+ except Exception as e:
713
+ st.warning(f"Could not create csv fallback mappings: {e}")
714
+ # Fall back to original function if csv_file structure is unexpected
715
+ return create_memory_efficient_mappings(projections_df, site_var, type_var, sport_var)
716
+
717
+ # Start with projections-based mappings
718
+ base_mappings = {
719
+ 'pos_map': dict(zip(projections_df['player_names'], projections_df['position'])),
720
+ 'team_map': dict(zip(projections_df['player_names'], projections_df['team'])),
721
+ 'salary_map': dict(zip(projections_df['player_names'], projections_df['salary'])),
722
+ 'proj_map': dict(zip(projections_df['player_names'], projections_df['median'])),
723
+ 'own_map': dict(zip(projections_df['player_names'], projections_df['ownership'])),
724
+ 'own_percent_rank': dict(zip(projections_df['player_names'], projections_df['ownership'].rank(pct=True).astype('float32')))
725
+ }
726
+
727
+ # Add missing players with csv_file data and 0 projections/ownership
728
+ for player in missing_players:
729
+ if player in csv_salary_map:
730
+ base_mappings['pos_map'][player] = csv_position_map.get(player, 'FLEX')
731
+ base_mappings['team_map'][player] = csv_team_map.get(player, 'Unknown') if csv_team_map else 'Unknown'
732
+ base_mappings['salary_map'][player] = csv_salary_map[player]
733
+ base_mappings['proj_map'][player] = 0.0 # No projection available
734
+ base_mappings['own_map'][player] = 0.0 # No ownership available
735
+ base_mappings['own_percent_rank'][player] = 0.0 # Lowest rank for missing players
736
+ else:
737
+ st.warning(f"Player '{player}' not found in projections or csv_file")
738
+ # Add with default values to prevent KeyError
739
+ base_mappings['pos_map'][player] = 'FLEX'
740
+ base_mappings['team_map'][player] = 'Unknown'
741
+ base_mappings['salary_map'][player] = 0
742
+ base_mappings['proj_map'][player] = 0.0
743
+ base_mappings['own_map'][player] = 0.0
744
+ base_mappings['own_percent_rank'][player] = 0.0
745
+
746
+ # Add site/type specific mappings (existing logic)
747
+ if site_var == 'Draftkings':
748
+ if type_var == 'Classic':
749
+ if sport_var == 'CS2' or sport_var == 'LOL':
750
+ cpt_salary_map = dict(zip(projections_df['player_names'], projections_df['salary'] * 1.5))
751
+ cpt_proj_map = dict(zip(projections_df['player_names'], projections_df['median'] * 1.5))
752
+ cpt_own_map = dict(zip(projections_df['player_names'], projections_df['captain ownership']))
753
+
754
+ # Add missing players to captain mappings
755
+ for player in missing_players:
756
+ if player in csv_salary_map:
757
+ cpt_salary_map[player] = csv_salary_map[player] * 1.5
758
+ cpt_proj_map[player] = 0.0 # No captain projection
759
+ cpt_own_map[player] = 0.0 # No captain ownership
760
+
761
+ base_mappings.update({
762
+ 'cpt_salary_map': cpt_salary_map,
763
+ 'cpt_proj_map': cpt_proj_map,
764
+ 'cpt_own_map': cpt_own_map
765
+ })
766
+ else:
767
+ cpt_salary_map = dict(zip(projections_df['player_names'], projections_df['salary']))
768
+ cpt_proj_map = dict(zip(projections_df['player_names'], projections_df['median'] * 1.5))
769
+ cpt_own_map = dict(zip(projections_df['player_names'], projections_df['captain ownership']))
770
+
771
+ # Add missing players to captain mappings
772
+ for player in missing_players:
773
+ if player in csv_salary_map:
774
+ cpt_salary_map[player] = csv_salary_map[player]
775
+ cpt_proj_map[player] = 0.0
776
+ cpt_own_map[player] = 0.0
777
+
778
+ base_mappings.update({
779
+ 'cpt_salary_map': cpt_salary_map,
780
+ 'cpt_proj_map': cpt_proj_map,
781
+ 'cpt_own_map': cpt_own_map
782
+ })
783
+ elif type_var == 'Showdown':
784
+ if sport_var == 'GOLF':
785
+ cpt_salary_map = dict(zip(projections_df['player_names'], projections_df['salary']))
786
+ cpt_proj_map = dict(zip(projections_df['player_names'], projections_df['median']))
787
+ cpt_own_map = dict(zip(projections_df['player_names'], projections_df['ownership']))
788
+
789
+ # Add missing players
790
+ for player in missing_players:
791
+ if player in csv_salary_map:
792
+ cpt_salary_map[player] = csv_salary_map[player]
793
+ cpt_proj_map[player] = 0.0
794
+ cpt_own_map[player] = 0.0
795
+
796
+ base_mappings.update({
797
+ 'cpt_salary_map': cpt_salary_map,
798
+ 'cpt_proj_map': cpt_proj_map,
799
+ 'cpt_own_map': cpt_own_map
800
+ })
801
+ else:
802
+ cpt_salary_map = dict(zip(projections_df['player_names'], projections_df['salary'] * 1.5))
803
+ cpt_proj_map = dict(zip(projections_df['player_names'], projections_df['median'] * 1.5))
804
+ cpt_own_map = dict(zip(projections_df['player_names'], projections_df['captain ownership']))
805
+
806
+ # Add missing players
807
+ for player in missing_players:
808
+ if player in csv_salary_map:
809
+ cpt_salary_map[player] = csv_salary_map[player] * 1.5
810
+ cpt_proj_map[player] = 0.0
811
+ cpt_own_map[player] = 0.0
812
+
813
+ base_mappings.update({
814
+ 'cpt_salary_map': cpt_salary_map,
815
+ 'cpt_proj_map': cpt_proj_map,
816
+ 'cpt_own_map': cpt_own_map
817
+ })
818
+ elif site_var == 'Fanduel':
819
+ cpt_salary_map = dict(zip(projections_df['player_names'], projections_df['salary'] * 1.5))
820
+ cpt_proj_map = dict(zip(projections_df['player_names'], projections_df['median'] * 1.5))
821
+ cpt_own_map = dict(zip(projections_df['player_names'], projections_df['captain ownership']))
822
+
823
+ # Add missing players
824
+ for player in missing_players:
825
+ if player in csv_salary_map:
826
+ cpt_salary_map[player] = csv_salary_map[player] * 1.5
827
+ cpt_proj_map[player] = 0.0
828
+ cpt_own_map[player] = 0.0
829
+
830
+ base_mappings.update({
831
+ 'cpt_salary_map': cpt_salary_map,
832
+ 'cpt_proj_map': cpt_proj_map,
833
+ 'cpt_own_map': cpt_own_map
834
+ })
835
+
836
+ return base_mappings
837
+
838
  def calculate_salary_vectorized(df, player_columns, map_dict, type_var, sport_var):
839
  """Vectorized salary calculation to replace expensive apply operations"""
840
  def safe_map_and_fill(series, mapping, fill_value=0):
 
1640
 
1641
  # Create memory-efficient mappings
1642
  if 'map_dict' not in st.session_state:
1643
+ st.session_state['map_dict'] = create_comprehensive_mappings(
1644
+ projections,
1645
+ st.session_state['portfolio'],
1646
+ st.session_state['csv_file'],
1647
+ site_var,
1648
+ type_var,
1649
+ sport_var
1650
+ )
1651
 
1652
  # Store portfolio in compressed format and clean up
1653
  st.session_state['portfolio'] = st.session_state['portfolio'].astype(str)