Update src/streamlit_app.py
Browse files- src/streamlit_app.py +31 -5
src/streamlit_app.py
CHANGED
|
@@ -72,14 +72,32 @@ def get_player_index_brscraper():
|
|
| 72 |
|
| 73 |
@st.cache_data(ttl=300)
|
| 74 |
def get_player_career_stats_brscraper(player_name):
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
if not BRSCRAPER_AVAILABLE:
|
| 76 |
return pd.DataFrame()
|
|
|
|
| 77 |
try:
|
| 78 |
df = nba.get_player_stats(player_name)
|
| 79 |
if df.empty:
|
| 80 |
return df
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 81 |
mapping = {
|
| 82 |
-
'
|
| 83 |
'FG%':'FG_PCT','3P%':'FG3_PCT','FT%':'FT_PCT',
|
| 84 |
'TRB':'REB','AST':'AST','STL':'STL','BLK':'BLK','TOV':'TO',
|
| 85 |
'PF':'PF','PTS':'PTS','Age':'AGE','Tm':'TEAM_ABBREVIATION',
|
|
@@ -89,13 +107,21 @@ def get_player_career_stats_brscraper(player_name):
|
|
| 89 |
'FT':'FTM','FTA':'FTA','ORB':'OREB','DRB':'DREB'
|
| 90 |
}
|
| 91 |
df = df.rename(columns={o:n for o,n in mapping.items() if o in df.columns})
|
|
|
|
|
|
|
| 92 |
df['Season'] = df['Season'].astype(str).str.replace('-', '–')
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 97 |
df['Player'] = player_name
|
|
|
|
| 98 |
return df
|
|
|
|
| 99 |
except Exception as e:
|
| 100 |
st.error(f"Error fetching stats for {player_name}: {e}")
|
| 101 |
return pd.DataFrame()
|
|
|
|
| 72 |
|
| 73 |
@st.cache_data(ttl=300)
|
| 74 |
def get_player_career_stats_brscraper(player_name):
|
| 75 |
+
"""
|
| 76 |
+
Uses BRScraper to get a player's career stats.
|
| 77 |
+
Detects and renames the season column, applies mapping and numeric conversion.
|
| 78 |
+
"""
|
| 79 |
if not BRSCRAPER_AVAILABLE:
|
| 80 |
return pd.DataFrame()
|
| 81 |
+
|
| 82 |
try:
|
| 83 |
df = nba.get_player_stats(player_name)
|
| 84 |
if df.empty:
|
| 85 |
return df
|
| 86 |
+
|
| 87 |
+
# 1) Detect whatever BRScraper calls its season column, rename to 'Season'
|
| 88 |
+
season_renamed = False
|
| 89 |
+
for col in df.columns:
|
| 90 |
+
if 'season' in col.lower() or 'year' in col.lower():
|
| 91 |
+
df = df.rename(columns={col: 'Season'})
|
| 92 |
+
season_renamed = True
|
| 93 |
+
break
|
| 94 |
+
if not season_renamed:
|
| 95 |
+
st.error(f"Could not find a season column for {player_name}.")
|
| 96 |
+
return pd.DataFrame()
|
| 97 |
+
|
| 98 |
+
# 2) Standardize column names
|
| 99 |
mapping = {
|
| 100 |
+
'G':'GP','GS':'GS','MP':'MIN',
|
| 101 |
'FG%':'FG_PCT','3P%':'FG3_PCT','FT%':'FT_PCT',
|
| 102 |
'TRB':'REB','AST':'AST','STL':'STL','BLK':'BLK','TOV':'TO',
|
| 103 |
'PF':'PF','PTS':'PTS','Age':'AGE','Tm':'TEAM_ABBREVIATION',
|
|
|
|
| 107 |
'FT':'FTM','FTA':'FTA','ORB':'OREB','DRB':'DREB'
|
| 108 |
}
|
| 109 |
df = df.rename(columns={o:n for o,n in mapping.items() if o in df.columns})
|
| 110 |
+
|
| 111 |
+
# 3) Clean up season formatting
|
| 112 |
df['Season'] = df['Season'].astype(str).str.replace('-', '–')
|
| 113 |
+
|
| 114 |
+
# 4) Convert all other columns to numeric where possible
|
| 115 |
+
non_numeric = {'Season', 'TEAM_ABBREVIATION', 'LEAGUE_ID', 'POSITION'}
|
| 116 |
+
for c in df.columns:
|
| 117 |
+
if c not in non_numeric:
|
| 118 |
+
df[c] = pd.to_numeric(df[c], errors='coerce')
|
| 119 |
+
|
| 120 |
+
# 5) Tag with player name
|
| 121 |
df['Player'] = player_name
|
| 122 |
+
|
| 123 |
return df
|
| 124 |
+
|
| 125 |
except Exception as e:
|
| 126 |
st.error(f"Error fetching stats for {player_name}: {e}")
|
| 127 |
return pd.DataFrame()
|