James McCool commited on
Commit
392cd38
·
1 Parent(s): b93377d

Refactor app.py to utilize session state for storing team and player data during simulations. This change enhances data management by ensuring consistent access to initialized data across different parts of the application, improving overall performance and user experience.

Browse files
Files changed (1) hide show
  1. app.py +33 -32
app.py CHANGED
@@ -607,32 +607,33 @@ if st.button("Load/Reset Data", key='reset1'):
607
 
608
  if st.button("Run"):
609
  if data_type == "Team":
610
- team_data, opp_boost, results_dict = init_team_data(game_count, selected_team, selected_opponent, win_loss_settings, kill_predictions, death_predictions, start_date, end_date)
611
  else:
612
- team_data, opp_boost, results_dict = init_player_data(game_count, selected_players, selected_opponent, win_loss_settings, kill_predictions, death_predictions, start_date, end_date)
613
 
614
- player_summary = pd.DataFrame()
 
615
  for game_num in range(game_count):
616
- game_df = results_dict[f'game {game_num + 1}'] # Use correct dictionary key format
617
  # Remove 'game X' from playernames if present
618
  clean_df = game_df.copy()
619
  clean_df['playername'] = clean_df['playername'].str.split(' game ').str[0]
620
 
621
- if player_summary.empty:
622
- player_summary = clean_df
623
  else:
624
  # Add the stats to existing players
625
  for col in ['Kill_Proj', 'Death_Proj', 'Assist_Proj', 'CS_Proj']:
626
- player_summary[col] += clean_df[col]
627
  # Update teamname and position if needed
628
- player_summary['teamname'].update(clean_df['teamname'])
629
- player_summary['position'].update(clean_df['position'])
630
 
631
- player_summary = player_summary.set_index('playername')
632
 
633
  # Create simulated percentiles
634
  individual_sim_results = []
635
- for idx, row in team_data.iterrows():
636
  percentiles = simulate_stats(row)
637
  individual_sim_results.append({
638
  'Player': idx,
@@ -657,11 +658,11 @@ if st.button("Run"):
657
  '90%': percentiles[stat][4]
658
  })
659
 
660
- sim_df = pd.DataFrame(individual_sim_results)
661
 
662
  # Create simulated percentiles
663
  overall_sim_results = []
664
- for idx, row in player_summary.iterrows():
665
  percentiles = simulate_stats(row)
666
  overall_sim_results.append({
667
  'Player': idx,
@@ -686,23 +687,23 @@ if st.button("Run"):
686
  '90%': percentiles[stat][4]
687
  })
688
 
689
- overall_sim_df = pd.DataFrame(overall_sim_results)
690
- overall_sim_df = overall_sim_df.drop_duplicates(subset = ['Player', 'Stat'])
691
 
692
  tab1, tab2, tab3 = st.tabs(["Overall Data", "Individual Game Data", "Opponent Data"])
693
  with tab1:
694
  st.subheader("Full Match Data")
695
- st.dataframe(player_summary.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(display_formats, precision=2), use_container_width = True)
696
 
697
  st.subheader("Overall Simulations")
698
  stat_tabs = st.tabs(["Kills", "Deaths", "Assists", "CS"])
699
 
700
  for stat, tab in zip(["Kills", "Deaths", "Assists", "CS"], stat_tabs):
701
  with tab:
702
- stat_data = overall_sim_df[overall_sim_df['Stat'] == stat].copy()
703
- stat_data = stat_data.set_index('Player')[['Position', '10%', '25%', '50%', '75%', '90%']]
704
  st.dataframe(
705
- stat_data.style.format(precision=2).background_gradient(axis=0).background_gradient(cmap='RdYlGn'),
706
  use_container_width=True
707
  )
708
 
@@ -713,31 +714,31 @@ if st.button("Run"):
713
  stat_choice = st.selectbox("Select Stat", ["Kills", "Deaths", "Assists", "CS"])
714
  with col2:
715
  # Filter data for selected stat
716
- stat_data = overall_sim_df[overall_sim_df['Stat'] == stat_choice].copy()
717
 
718
  # Calculate mean and standard deviation using percentiles
719
  # Using the fact that in a normal distribution:
720
  # 10th percentile is -1.28 SD from mean
721
  # 90th percentile is 1.28 SD from mean
722
- stat_data['mean'] = (stat_data['90%'] + stat_data['10%']) / 2
723
- stat_data['std'] = (stat_data['90%'] - stat_data['10%']) / (2 * 1.28)
724
 
725
  # Calculate probabilities
726
- stat_data['over_prob'] = stat_data.apply(
727
  lambda x: 1 - stats.norm.cdf(prop_var, x['mean'], x['std']), axis=1
728
  )
729
- stat_data['under_prob'] = stat_data.apply(
730
  lambda x: stats.norm.cdf(prop_var, x['mean'], x['std']), axis=1
731
  )
732
 
733
  # Prepare display dataframe
734
- display_df = stat_data[['Player', 'Position', 'over_prob', 'under_prob']].copy()
735
- display_df['Over %'] = (display_df['over_prob'] * 100).round(1)
736
- display_df['Under %'] = (display_df['under_prob'] * 100).round(1)
737
 
738
  # Display results
739
  st.dataframe(
740
- display_df[['Player', 'Position', 'Over %', 'Under %']]
741
  .set_index('Player')
742
  .style.background_gradient(subset=['Over %', 'Under %'], cmap='RdYlGn'),
743
  use_container_width=True
@@ -745,15 +746,15 @@ if st.button("Run"):
745
 
746
  with tab2:
747
  st.subheader("Individual Game Data")
748
- st.dataframe(team_data.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(display_formats, precision=2), use_container_width = True)
749
 
750
  st.subheader("Individual Game Simulations")
751
- unique_players = sim_df['Player'].unique().tolist()
752
  player_tabs = st.tabs(unique_players)
753
 
754
  for player, tab in zip(unique_players, player_tabs):
755
  with tab:
756
- player_data = sim_df[sim_df['Player'] == player]
757
  player_data = player_data.set_index('Stat')
758
  st.dataframe(
759
  player_data[['10%', '25%', '50%', '75%', '90%']]
@@ -762,4 +763,4 @@ if st.button("Run"):
762
  )
763
 
764
  with tab3:
765
- st.dataframe(opp_boost.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True)
 
607
 
608
  if st.button("Run"):
609
  if data_type == "Team":
610
+ st.session_state.team_data, st.session_state.opp_boost, st.session_state.results_dict = init_team_data(game_count, selected_team, selected_opponent, win_loss_settings, kill_predictions, death_predictions, start_date, end_date)
611
  else:
612
+ st.session_state.team_data, st.session_state.opp_boost, st.session_state.results_dict = init_player_data(game_count, selected_players, selected_opponent, win_loss_settings, kill_predictions, death_predictions, start_date, end_date)
613
 
614
+ st.session_state.player_summary = pd.DataFrame()
615
+
616
  for game_num in range(game_count):
617
+ game_df = st.session_state.results_dict[f'game {game_num + 1}'] # Use correct dictionary key format
618
  # Remove 'game X' from playernames if present
619
  clean_df = game_df.copy()
620
  clean_df['playername'] = clean_df['playername'].str.split(' game ').str[0]
621
 
622
+ if st.session_state.player_summary.empty:
623
+ st.session_state.player_summary = clean_df
624
  else:
625
  # Add the stats to existing players
626
  for col in ['Kill_Proj', 'Death_Proj', 'Assist_Proj', 'CS_Proj']:
627
+ st.session_state.player_summary[col] += clean_df[col]
628
  # Update teamname and position if needed
629
+ st.session_state.player_summary['teamname'].update(clean_df['teamname'])
630
+ st.session_state.player_summary['position'].update(clean_df['position'])
631
 
632
+ st.session_state.player_summary = st.session_state.player_summary.set_index('playername')
633
 
634
  # Create simulated percentiles
635
  individual_sim_results = []
636
+ for idx, row in st.session_state.team_data.iterrows():
637
  percentiles = simulate_stats(row)
638
  individual_sim_results.append({
639
  'Player': idx,
 
658
  '90%': percentiles[stat][4]
659
  })
660
 
661
+ st.session_state.sim_df = pd.DataFrame(individual_sim_results)
662
 
663
  # Create simulated percentiles
664
  overall_sim_results = []
665
+ for idx, row in st.session_state.player_summary.iterrows():
666
  percentiles = simulate_stats(row)
667
  overall_sim_results.append({
668
  'Player': idx,
 
687
  '90%': percentiles[stat][4]
688
  })
689
 
690
+ st.session_state.overall_sim_df = pd.DataFrame(overall_sim_results)
691
+ st.session_state.overall_sim_df = st.session_state.overall_sim_df.drop_duplicates(subset = ['Player', 'Stat'])
692
 
693
  tab1, tab2, tab3 = st.tabs(["Overall Data", "Individual Game Data", "Opponent Data"])
694
  with tab1:
695
  st.subheader("Full Match Data")
696
+ st.dataframe(st.session_state.player_summary.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(display_formats, precision=2), use_container_width = True)
697
 
698
  st.subheader("Overall Simulations")
699
  stat_tabs = st.tabs(["Kills", "Deaths", "Assists", "CS"])
700
 
701
  for stat, tab in zip(["Kills", "Deaths", "Assists", "CS"], stat_tabs):
702
  with tab:
703
+ st.session_state.stat_data = st.session_state.overall_sim_df[st.session_state.overall_sim_df['Stat'] == stat].copy()
704
+ st.session_state.stat_data = st.session_state.stat_data.set_index('Player')[['Position', '10%', '25%', '50%', '75%', '90%']]
705
  st.dataframe(
706
+ st.session_state.stat_data.style.format(precision=2).background_gradient(axis=0).background_gradient(cmap='RdYlGn'),
707
  use_container_width=True
708
  )
709
 
 
714
  stat_choice = st.selectbox("Select Stat", ["Kills", "Deaths", "Assists", "CS"])
715
  with col2:
716
  # Filter data for selected stat
717
+ st.session_state.stat_data = st.session_state.overall_sim_df[st.session_state.overall_sim_df['Stat'] == stat_choice].copy()
718
 
719
  # Calculate mean and standard deviation using percentiles
720
  # Using the fact that in a normal distribution:
721
  # 10th percentile is -1.28 SD from mean
722
  # 90th percentile is 1.28 SD from mean
723
+ st.session_state.stat_data['mean'] = (st.session_state.stat_data['90%'] + st.session_state.stat_data['10%']) / 2
724
+ st.session_state.stat_data['std'] = (st.session_state.stat_data['90%'] - st.session_state.stat_data['10%']) / (2 * 1.28)
725
 
726
  # Calculate probabilities
727
+ st.session_state.stat_data['over_prob'] = st.session_state.stat_data.apply(
728
  lambda x: 1 - stats.norm.cdf(prop_var, x['mean'], x['std']), axis=1
729
  )
730
+ st.session_state.stat_data['under_prob'] = st.session_state.stat_data.apply(
731
  lambda x: stats.norm.cdf(prop_var, x['mean'], x['std']), axis=1
732
  )
733
 
734
  # Prepare display dataframe
735
+ st.session_state.display_df = st.session_state.stat_data[['Player', 'Position', 'over_prob', 'under_prob']].copy()
736
+ st.session_state.display_df['Over %'] = (st.session_state.display_df['over_prob'] * 100).round(1)
737
+ st.session_state.display_df['Under %'] = (st.session_state.display_df['under_prob'] * 100).round(1)
738
 
739
  # Display results
740
  st.dataframe(
741
+ st.session_state.display_df[['Player', 'Position', 'Over %', 'Under %']]
742
  .set_index('Player')
743
  .style.background_gradient(subset=['Over %', 'Under %'], cmap='RdYlGn'),
744
  use_container_width=True
 
746
 
747
  with tab2:
748
  st.subheader("Individual Game Data")
749
+ st.dataframe(st.session_state.team_data.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(display_formats, precision=2), use_container_width = True)
750
 
751
  st.subheader("Individual Game Simulations")
752
+ unique_players = st.session_state.sim_df['Player'].unique().tolist()
753
  player_tabs = st.tabs(unique_players)
754
 
755
  for player, tab in zip(unique_players, player_tabs):
756
  with tab:
757
+ player_data = st.session_state.sim_df[st.session_state.sim_df['Player'] == player]
758
  player_data = player_data.set_index('Stat')
759
  st.dataframe(
760
  player_data[['10%', '25%', '50%', '75%', '90%']]
 
763
  )
764
 
765
  with tab3:
766
+ st.dataframe(st.session_state.opp_boost.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True)