NBA_Minutes_Baselines / src /streamlit_app.py
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')
@st.cache_resource(ttl = 300)
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',
)