James McCool
Fix sorting logic in streamlit_app.py to ensure dataframes are sorted correctly based on filtered data for improved accuracy in displayed metrics.
7fb8561
| import streamlit as st | |
| st.set_page_config(layout="wide") | |
| import numpy as np | |
| import pandas as pd | |
| from database import gcservice_account | |
| import os | |
| NBAGetGameData = os.getenv('NBAGetGameData') | |
| NBABettingModel = os.getenv('NBABettingModel') | |
| def init_baselines(): | |
| sh = gcservice_account.open_by_url(NBAGetGameData) | |
| worksheet = sh.worksheet('MinPublic') | |
| raw_display = pd.DataFrame(worksheet.get_values()) | |
| raw_display.columns = raw_display.iloc[0] | |
| raw_display = raw_display[1:] | |
| raw_display = raw_display.reset_index(drop=True) | |
| raw_display.replace('', np.nan, inplace=True) | |
| raw_display = raw_display[['NBAID', 'PID', 'Player', 'TC', 'MP (Today)', 'Next Game', 'H/R', 'Injury Notes', 'Player Impact per 48', 'Player Impact', | |
| 'Team PM', 'Last Updated']] | |
| raw_display = raw_display.apply(pd.to_numeric, errors='coerce').fillna(raw_display) | |
| public_minutes = raw_display[raw_display['NBAID'] != ""] | |
| sh = gcservice_account.open_by_url(NBABettingModel) | |
| worksheet = sh.worksheet('PlayerImpactByTeam') | |
| raw_display = pd.DataFrame(worksheet.get_values()) | |
| raw_display.columns = raw_display.iloc[0] | |
| raw_display = raw_display[1:] | |
| raw_display = raw_display.reset_index(drop=True) | |
| raw_display.replace('', 0, inplace=True) | |
| raw_display = raw_display[['PID', 'Player', 'Team', 'Avg Minutes last 30 days for team', 'Minutes Projection', 'Rotation Impact (versus last 30 days)', | |
| 'Injury Notes', 'Minute Change', 'Baseline Team PM', 'Net Rotation PM +/- for Team', 'Projected PM for Game', 'Offset', 'Rank']] | |
| raw_display['Minute Change'].replace('+', '', inplace=True) | |
| raw_display = raw_display.apply(pd.to_numeric, errors='coerce').fillna(raw_display) | |
| player_impact = raw_display[raw_display['PID'] != ""] | |
| return public_minutes, player_impact | |
| def convert_df_to_csv(df): | |
| return df.to_csv().encode('utf-8') | |
| public_minutes, player_impact = init_baselines() | |
| tab1, tab2 = st.tabs(["Minutes Baselines", "Player Impacts"]) | |
| with tab1: | |
| if st.button("Reset Data", key='reset1'): | |
| st.cache_data.clear() | |
| public_minutes, player_impact = init_baselines() | |
| split_var1 = st.radio("Would you like to view all teams or specific ones?", ('All', 'Specific Teams'), key='split_var1') | |
| if split_var1 == 'Specific Teams': | |
| team_var1 = st.multiselect('Which teams would you like to include in the tables?', options = public_minutes['TC'].unique(), key='team_var1') | |
| elif split_var1 == 'All': | |
| team_var1 = public_minutes.TC.values.tolist() | |
| public_minutes = public_minutes[public_minutes['TC'].isin(team_var1)] | |
| player_min_disp = public_minutes.sort_values(by=['TC', 'MP (Today)'], ascending=[True, False]) | |
| st.dataframe(player_min_disp.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True, hide_index=True) | |
| st.download_button( | |
| label="Export Minutes Baselines", | |
| data=convert_df_to_csv(public_minutes), | |
| file_name='AmericanNumbers_Min_Baseline_export.csv', | |
| mime='text/csv', | |
| ) | |
| with tab2: | |
| if st.button("Reset Data", key='reset2'): | |
| st.cache_data.clear() | |
| public_minutes, player_impact = init_baselines() | |
| split_var2 = st.radio("Would you like to view all teams or specific ones?", ('All', 'Specific Teams'), key='split_var2') | |
| if split_var2 == 'Specific Teams': | |
| team_var2 = st.multiselect('Which teams would you like to include in the tables?', options = player_impact['Team'].unique(), key='team_var2') | |
| elif split_var2 == 'All': | |
| team_var2 = player_impact.Team.values.tolist() | |
| player_impact = player_impact[player_impact['Team'].isin(team_var2)] | |
| player_impact_disp = player_impact.sort_values(by=['Team', 'Rotation Impact (versus last 30 days)'], ascending=[True, False]) | |
| st.dataframe(player_impact_disp.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True, hide_index=True) | |
| st.download_button( | |
| label="Export Player Impacts", | |
| data=convert_df_to_csv(player_impact), | |
| file_name='AmericanNumbers_Impact_export.csv', | |
| mime='text/csv', | |
| ) |