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', )