James McCool commited on
Commit
4263647
·
1 Parent(s): 88a871a

Refactor player selection display in Handbuilder tab of app.py to utilize a dataframe for selected players, improving selection accuracy and user experience. Update summary row calculation to align with new selection method, ensuring accurate display of total salary, median, and ownership percentage.

Browse files
Files changed (1) hide show
  1. app.py +16 -46
app.py CHANGED
@@ -802,20 +802,17 @@ with tab3:
802
  with tab4:
803
  st.header("Handbuilder")
804
 
805
- # Use a variable to control the key
806
  if 'handbuilder_editor_key' not in st.session_state:
807
  st.session_state.handbuilder_editor_key = 0
808
 
809
  if st.button("Clear Data", key='clear_handbuild'):
810
- st.session_state.handbuilder_editor_key += 1 # Change the key to force reset
811
- # Reset all selections
812
- st.session_state.handbuilder_editor_df = None
813
  st.rerun()
814
 
815
  # --- TEAM FILTER UI ---
816
  all_teams = sorted(dk_roo['Team'].unique())
817
  st.markdown("**Toggle teams to include:**")
818
- team_cols = st.columns(len(all_teams) // 2 + 1) # Spread switches across columns
819
 
820
  selected_teams = []
821
  for idx, team in enumerate(all_teams):
@@ -826,46 +823,27 @@ with tab4:
826
  if checked:
827
  selected_teams.append(team)
828
 
829
- # --- PLAYER SELECTION STATE ---
830
- # Initialize or update the session state DataFrame
831
- if 'handbuilder_editor_df' not in st.session_state or st.session_state.handbuilder_editor_df is None:
832
- # Start with all players, all unchecked
833
- base_df = dk_roo[['Player', 'Position', 'Team', 'Salary', 'Median', 'Order', 'Hand', 'Own%']].copy()
834
- base_df['Select'] = False
835
- st.session_state.handbuilder_editor_df = base_df
836
- else:
837
- # Make sure all players are present (in case teams change)
838
- base_df = st.session_state.handbuilder_editor_df
839
-
840
- # Filter by selected teams (or all if none selected)
841
  if selected_teams:
842
- filtered_df = base_df[base_df['Team'].isin(selected_teams)].copy()
 
 
843
  else:
844
- filtered_df = base_df.copy()
845
 
846
  col1, col2 = st.columns([1, 2])
847
  with col2:
848
  st.subheader("Player Select")
849
- edited_df = st.data_editor(
850
- filtered_df,
851
- column_config={
852
- "Select": st.column_config.CheckboxColumn(
853
- "Select",
854
- help="Check to add player to lineup",
855
- default=False
856
- )
857
- },
858
- use_container_width=True,
859
- hide_index=True,
860
- key=f"handbuilder_editor_{st.session_state.handbuilder_editor_key}"
861
  )
862
- # Update the session state DataFrame with the new selections
863
- # (merge back into the full base_df)
864
- st.session_state.handbuilder_editor_df.update(edited_df)
865
 
866
- # Filter selected players for the lineup
867
- selected_players = st.session_state.handbuilder_editor_df[st.session_state.handbuilder_editor_df['Select'] == True]
868
- select_players_disp = selected_players[['Player', 'Team', 'Salary', 'Median', 'Own%']]
869
 
870
  with col1:
871
  st.subheader("Lineup")
@@ -878,14 +856,11 @@ with tab4:
878
 
879
  # --- SUMMARY ROW ---
880
  if not select_players_disp.empty:
881
- # Calculate sums
882
  total_salary = select_players_disp['Salary'].sum()
883
  total_median = select_players_disp['Median'].sum()
884
  total_own = select_players_disp['Own%'].sum()
885
- # Most common team
886
  most_common_team = select_players_disp['Team'].mode()[0] if not select_players_disp['Team'].mode().empty else ""
887
 
888
- # Create a summary row as a DataFrame
889
  summary_row = pd.DataFrame({
890
  'Player': ['TOTAL'],
891
  'Team': [most_common_team],
@@ -893,16 +868,11 @@ with tab4:
893
  'Median': [total_median],
894
  'Own%': [total_own]
895
  })
896
-
897
- # Align columns with select_players_disp
898
  summary_row = summary_row[select_players_disp.columns]
899
 
900
- # Display the summary row
901
  st.dataframe(
902
  summary_row,
903
  use_container_width=True,
904
  height=50,
905
  hide_index=True
906
- )
907
-
908
-
 
802
  with tab4:
803
  st.header("Handbuilder")
804
 
 
805
  if 'handbuilder_editor_key' not in st.session_state:
806
  st.session_state.handbuilder_editor_key = 0
807
 
808
  if st.button("Clear Data", key='clear_handbuild'):
809
+ st.session_state.handbuilder_editor_key += 1
 
 
810
  st.rerun()
811
 
812
  # --- TEAM FILTER UI ---
813
  all_teams = sorted(dk_roo['Team'].unique())
814
  st.markdown("**Toggle teams to include:**")
815
+ team_cols = st.columns(len(all_teams) // 2 + 1)
816
 
817
  selected_teams = []
818
  for idx, team in enumerate(all_teams):
 
823
  if checked:
824
  selected_teams.append(team)
825
 
826
+ # If no teams selected, show all teams
 
 
 
 
 
 
 
 
 
 
 
827
  if selected_teams:
828
+ player_select_df = dk_roo[
829
+ dk_roo['Team'].isin(selected_teams)
830
+ ][['Player', 'Position', 'Team', 'Salary', 'Median', 'Order', 'Hand', 'Own%']].copy()
831
  else:
832
+ player_select_df = dk_roo[['Player', 'Position', 'Team', 'Salary', 'Median', 'Order', 'Hand', 'Own%']].copy()
833
 
834
  col1, col2 = st.columns([1, 2])
835
  with col2:
836
  st.subheader("Player Select")
837
+ event = st.dataframe(
838
+ player_select_df,
839
+ key=f"handbuilder_editor_{st.session_state.handbuilder_editor_key}",
840
+ on_select="rerun",
841
+ selection_mode=["multi-row"]
 
 
 
 
 
 
 
842
  )
 
 
 
843
 
844
+ # Get selected rows
845
+ selected_indices = event.selection["rows"] if event and "rows" in event.selection else []
846
+ select_players_disp = player_select_df.iloc[selected_indices][['Player', 'Team', 'Salary', 'Median', 'Own%']]
847
 
848
  with col1:
849
  st.subheader("Lineup")
 
856
 
857
  # --- SUMMARY ROW ---
858
  if not select_players_disp.empty:
 
859
  total_salary = select_players_disp['Salary'].sum()
860
  total_median = select_players_disp['Median'].sum()
861
  total_own = select_players_disp['Own%'].sum()
 
862
  most_common_team = select_players_disp['Team'].mode()[0] if not select_players_disp['Team'].mode().empty else ""
863
 
 
864
  summary_row = pd.DataFrame({
865
  'Player': ['TOTAL'],
866
  'Team': [most_common_team],
 
868
  'Median': [total_median],
869
  'Own%': [total_own]
870
  })
 
 
871
  summary_row = summary_row[select_players_disp.columns]
872
 
 
873
  st.dataframe(
874
  summary_row,
875
  use_container_width=True,
876
  height=50,
877
  hide_index=True
878
+ )