Spaces:
Running
Running
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
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)
|