Player stats fix
Browse files
main.py
CHANGED
|
@@ -1204,47 +1204,22 @@ def get_player_stats():
|
|
| 1204 |
all_player_season_data = []
|
| 1205 |
players_with_no_data = []
|
| 1206 |
|
| 1207 |
-
|
| 1208 |
-
|
| 1209 |
-
player_name = selected_players[0]
|
| 1210 |
-
season_str = selected_seasons[0]
|
| 1211 |
-
df_player_data = get_player_career_stats_brscraper(player_name, seasons_to_fetch=[season_str], playoffs=False)
|
| 1212 |
|
| 1213 |
-
if
|
| 1214 |
-
|
| 1215 |
-
logging.info(f"Successfully retrieved data for {player_name} in {season_str}.")
|
| 1216 |
-
else:
|
| 1217 |
players_with_no_data.append(player_name)
|
| 1218 |
-
|
| 1219 |
-
|
| 1220 |
-
# Handle comparison (2 players, 2 seasons)
|
| 1221 |
-
elif len(selected_players) == 2 and len(selected_seasons) == 2:
|
| 1222 |
-
player1_name = selected_players[0]
|
| 1223 |
-
player1_season = selected_seasons[0]
|
| 1224 |
-
player2_name = selected_players[1]
|
| 1225 |
-
player2_season = selected_seasons[1]
|
| 1226 |
-
|
| 1227 |
-
df_player1_data = get_player_career_stats_brscraper(player1_name, seasons_to_fetch=[player1_season], playoffs=False)
|
| 1228 |
-
if not df_player1_data.empty:
|
| 1229 |
-
all_player_season_data.append(df_player1_data)
|
| 1230 |
-
logging.info(f"Successfully retrieved data for {player1_name} in {player1_season}.")
|
| 1231 |
-
else:
|
| 1232 |
-
players_with_no_data.append(player1_name)
|
| 1233 |
-
logging.info(f"No data found for {player1_name} in {player1_season}.")
|
| 1234 |
-
|
| 1235 |
-
# Add a delay between fetching data for player 1 and player 2
|
| 1236 |
-
time.sleep(2) # Introduce a 2-second delay
|
| 1237 |
|
| 1238 |
-
|
| 1239 |
-
|
| 1240 |
-
|
| 1241 |
-
|
|
|
|
| 1242 |
else:
|
| 1243 |
-
|
| 1244 |
-
|
| 1245 |
-
else:
|
| 1246 |
-
return jsonify({'error': 'Invalid combination of players and seasons. Expected 1 player/1 season or 2 players/2 seasons.'}), 400
|
| 1247 |
-
|
| 1248 |
|
| 1249 |
if not all_player_season_data:
|
| 1250 |
logging.warning("After processing all players, 'all_player_season_data' is empty. Returning 404.")
|
|
@@ -1255,15 +1230,15 @@ def get_player_stats():
|
|
| 1255 |
|
| 1256 |
comparison_df_raw = pd.concat(all_player_season_data, ignore_index=True)
|
| 1257 |
|
| 1258 |
-
|
| 1259 |
-
|
|
|
|
|
|
|
|
|
|
| 1260 |
basic_cols = ['Player', 'Season', 'GP', 'MIN', 'PTS', 'REB', 'AST', 'STL', 'BLK', 'FG_PCT', 'FT_PCT', 'FG3_PCT']
|
| 1261 |
-
# Ensure only existing columns are selected and then round
|
| 1262 |
basic_display_df = basic_display_df[[c for c in basic_cols if c in basic_display_df.columns]].round(2)
|
| 1263 |
|
| 1264 |
-
# Advanced stats calculation (e.g., TS%)
|
| 1265 |
advanced_df = comparison_df_raw.copy()
|
| 1266 |
-
# Ensure necessary columns for TS% are numeric and handle potential missing columns
|
| 1267 |
advanced_df['FGA'] = pd.to_numeric(advanced_df.get('FGA', 0), errors='coerce').fillna(0)
|
| 1268 |
advanced_df['FTA'] = pd.to_numeric(advanced_df.get('FTA', 0), errors='coerce').fillna(0)
|
| 1269 |
advanced_df['PTS'] = pd.to_numeric(advanced_df.get('PTS', 0), errors='coerce').fillna(0)
|
|
@@ -1271,8 +1246,13 @@ def get_player_stats():
|
|
| 1271 |
lambda r: r['PTS'] / (2 * (r['FGA'] + 0.44 * r['FTA'])) if (r['FGA'] + 0.44 * r['FTA']) else 0,
|
| 1272 |
axis=1
|
| 1273 |
)
|
| 1274 |
-
|
| 1275 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1276 |
|
| 1277 |
return jsonify({
|
| 1278 |
'basic_stats': basic_display_df.to_dict(orient='records'),
|
|
@@ -1297,46 +1277,21 @@ def get_player_playoff_stats():
|
|
| 1297 |
all_player_season_data = []
|
| 1298 |
players_with_no_data = []
|
| 1299 |
|
| 1300 |
-
|
| 1301 |
-
|
| 1302 |
-
|
| 1303 |
-
|
| 1304 |
-
df_player_data = get_player_career_stats_brscraper(player_name, seasons_to_fetch=[season_str], playoffs=True)
|
| 1305 |
-
|
| 1306 |
-
if not df_player_data.empty:
|
| 1307 |
-
all_player_season_data.append(df_player_data)
|
| 1308 |
-
logging.info(f"Successfully retrieved playoff data for {player_name} in {season_str}.")
|
| 1309 |
-
else:
|
| 1310 |
players_with_no_data.append(player_name)
|
| 1311 |
-
|
| 1312 |
-
|
| 1313 |
-
# Handle comparison (2 players, 2 seasons)
|
| 1314 |
-
elif len(selected_players) == 2 and len(selected_seasons) == 2:
|
| 1315 |
-
player1_name = selected_players[0]
|
| 1316 |
-
player1_season = selected_seasons[0]
|
| 1317 |
-
player2_name = selected_players[1]
|
| 1318 |
-
player2_season = selected_seasons[1]
|
| 1319 |
-
|
| 1320 |
-
df_player1_data = get_player_career_stats_brscraper(player1_name, seasons_to_fetch=[player1_season], playoffs=True)
|
| 1321 |
-
if not df_player1_data.empty:
|
| 1322 |
-
all_player_season_data.append(df_player1_data)
|
| 1323 |
-
logging.info(f"Successfully retrieved playoff data for {player1_name} in {player1_season}.")
|
| 1324 |
-
else:
|
| 1325 |
-
players_with_no_data.append(player1_name)
|
| 1326 |
-
logging.info(f"No playoff data found for {player1_name} in {player1_season}.")
|
| 1327 |
-
|
| 1328 |
-
time.sleep(2) # Introduce a 2-second delay
|
| 1329 |
|
| 1330 |
-
|
| 1331 |
-
|
| 1332 |
-
|
| 1333 |
-
|
|
|
|
| 1334 |
else:
|
| 1335 |
-
|
| 1336 |
-
|
| 1337 |
-
else:
|
| 1338 |
-
return jsonify({'error': 'Invalid combination of players and seasons. Expected 1 player/1 season or 2 players/2 seasons.'}), 400
|
| 1339 |
-
|
| 1340 |
|
| 1341 |
if not all_player_season_data:
|
| 1342 |
logging.warning("After processing all players, 'all_player_season_data' is empty for playoffs. Returning 404.")
|
|
@@ -1347,7 +1302,11 @@ def get_player_playoff_stats():
|
|
| 1347 |
|
| 1348 |
comparison_df_raw = pd.concat(all_player_season_data, ignore_index=True)
|
| 1349 |
|
| 1350 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1351 |
basic_cols = ['Player', 'Season', 'GP', 'MIN', 'PTS', 'REB', 'AST', 'STL', 'BLK', 'FG_PCT', 'FT_PCT', 'FG3_PCT']
|
| 1352 |
basic_display_df = basic_display_df[[c for c in basic_cols if c in basic_display_df.columns]].round(2)
|
| 1353 |
|
|
@@ -1359,8 +1318,13 @@ def get_player_playoff_stats():
|
|
| 1359 |
lambda r: r['PTS'] / (2 * (r['FGA'] + 0.44 * r['FTA'])) if (r['FGA'] + 0.44 * r['FTA']) else 0,
|
| 1360 |
axis=1
|
| 1361 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1362 |
advanced_cols = ['Player', 'Season', 'PTS', 'REB', 'AST', 'FG_PCT', 'TS_PCT']
|
| 1363 |
-
advanced_display_df =
|
| 1364 |
|
| 1365 |
return jsonify({
|
| 1366 |
'basic_stats': basic_display_df.to_dict(orient='records'),
|
|
|
|
| 1204 |
all_player_season_data = []
|
| 1205 |
players_with_no_data = []
|
| 1206 |
|
| 1207 |
+
for player_name in selected_players:
|
| 1208 |
+
df_player_career = get_player_career_stats_brscraper(player_name, playoffs=False)
|
|
|
|
|
|
|
|
|
|
| 1209 |
|
| 1210 |
+
if df_player_career.empty:
|
| 1211 |
+
logging.info(f"No career data found for {player_name}. Adding to no_data list.")
|
|
|
|
|
|
|
| 1212 |
players_with_no_data.append(player_name)
|
| 1213 |
+
continue
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1214 |
|
| 1215 |
+
filtered_df = df_player_career[df_player_career['Season'].isin(selected_seasons)].copy()
|
| 1216 |
+
|
| 1217 |
+
if not filtered_df.empty:
|
| 1218 |
+
all_player_season_data.append(filtered_df)
|
| 1219 |
+
logging.info(f"Successfully filtered data for {player_name} in requested seasons.")
|
| 1220 |
else:
|
| 1221 |
+
logging.info(f"No data found for {player_name} in the specific requested seasons: {selected_seasons}. Adding to no_data list.")
|
| 1222 |
+
players_with_no_data.append(player_name)
|
|
|
|
|
|
|
|
|
|
| 1223 |
|
| 1224 |
if not all_player_season_data:
|
| 1225 |
logging.warning("After processing all players, 'all_player_season_data' is empty. Returning 404.")
|
|
|
|
| 1230 |
|
| 1231 |
comparison_df_raw = pd.concat(all_player_season_data, ignore_index=True)
|
| 1232 |
|
| 1233 |
+
if len(selected_seasons) > 1:
|
| 1234 |
+
basic_display_df = comparison_df_raw.groupby('Player').mean(numeric_only=True).reset_index()
|
| 1235 |
+
else:
|
| 1236 |
+
basic_display_df = comparison_df_raw.copy()
|
| 1237 |
+
|
| 1238 |
basic_cols = ['Player', 'Season', 'GP', 'MIN', 'PTS', 'REB', 'AST', 'STL', 'BLK', 'FG_PCT', 'FT_PCT', 'FG3_PCT']
|
|
|
|
| 1239 |
basic_display_df = basic_display_df[[c for c in basic_cols if c in basic_display_df.columns]].round(2)
|
| 1240 |
|
|
|
|
| 1241 |
advanced_df = comparison_df_raw.copy()
|
|
|
|
| 1242 |
advanced_df['FGA'] = pd.to_numeric(advanced_df.get('FGA', 0), errors='coerce').fillna(0)
|
| 1243 |
advanced_df['FTA'] = pd.to_numeric(advanced_df.get('FTA', 0), errors='coerce').fillna(0)
|
| 1244 |
advanced_df['PTS'] = pd.to_numeric(advanced_df.get('PTS', 0), errors='coerce').fillna(0)
|
|
|
|
| 1246 |
lambda r: r['PTS'] / (2 * (r['FGA'] + 0.44 * r['FTA'])) if (r['FGA'] + 0.44 * r['FTA']) else 0,
|
| 1247 |
axis=1
|
| 1248 |
)
|
| 1249 |
+
if len(selected_seasons) > 1:
|
| 1250 |
+
advanced_display_df = advanced_df.groupby('Player').mean(numeric_only=True).reset_index()
|
| 1251 |
+
else:
|
| 1252 |
+
advanced_display_df = advanced_df.copy()
|
| 1253 |
+
|
| 1254 |
+
advanced_cols = ['Player', 'Season', 'PTS', 'REB', 'AST', 'FG_PCT', 'TS_PCT']
|
| 1255 |
+
advanced_display_df = advanced_display_df[[c for c in advanced_cols if c in advanced_display_df.columns]].round(3)
|
| 1256 |
|
| 1257 |
return jsonify({
|
| 1258 |
'basic_stats': basic_display_df.to_dict(orient='records'),
|
|
|
|
| 1277 |
all_player_season_data = []
|
| 1278 |
players_with_no_data = []
|
| 1279 |
|
| 1280 |
+
for player_name in selected_players:
|
| 1281 |
+
df_player_career = get_player_career_stats_brscraper(player_name, playoffs=True)
|
| 1282 |
+
if df_player_career.empty:
|
| 1283 |
+
logging.info(f"No career playoff data found for {player_name}. Adding to no_data list.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1284 |
players_with_no_data.append(player_name)
|
| 1285 |
+
continue
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1286 |
|
| 1287 |
+
filtered_df = df_player_career[df_player_career['Season'].isin(selected_seasons)].copy()
|
| 1288 |
+
|
| 1289 |
+
if not filtered_df.empty:
|
| 1290 |
+
all_player_season_data.append(filtered_df)
|
| 1291 |
+
logging.info(f"Successfully filtered playoff data for {player_name} in requested seasons.")
|
| 1292 |
else:
|
| 1293 |
+
logging.info(f"No playoff data found for {player_name} in the specific requested seasons: {selected_seasons}. Adding to no_data list.")
|
| 1294 |
+
players_with_no_data.append(player_name)
|
|
|
|
|
|
|
|
|
|
| 1295 |
|
| 1296 |
if not all_player_season_data:
|
| 1297 |
logging.warning("After processing all players, 'all_player_season_data' is empty for playoffs. Returning 404.")
|
|
|
|
| 1302 |
|
| 1303 |
comparison_df_raw = pd.concat(all_player_season_data, ignore_index=True)
|
| 1304 |
|
| 1305 |
+
if len(selected_seasons) > 1:
|
| 1306 |
+
basic_display_df = comparison_df_raw.groupby('Player').mean(numeric_only=True).reset_index()
|
| 1307 |
+
else:
|
| 1308 |
+
basic_display_df = comparison_df_raw.copy()
|
| 1309 |
+
|
| 1310 |
basic_cols = ['Player', 'Season', 'GP', 'MIN', 'PTS', 'REB', 'AST', 'STL', 'BLK', 'FG_PCT', 'FT_PCT', 'FG3_PCT']
|
| 1311 |
basic_display_df = basic_display_df[[c for c in basic_cols if c in basic_display_df.columns]].round(2)
|
| 1312 |
|
|
|
|
| 1318 |
lambda r: r['PTS'] / (2 * (r['FGA'] + 0.44 * r['FTA'])) if (r['FGA'] + 0.44 * r['FTA']) else 0,
|
| 1319 |
axis=1
|
| 1320 |
)
|
| 1321 |
+
if len(selected_seasons) > 1:
|
| 1322 |
+
advanced_display_df = advanced_df.groupby('Player').mean(numeric_only=True).reset_index()
|
| 1323 |
+
else:
|
| 1324 |
+
advanced_display_df = advanced_df.copy()
|
| 1325 |
+
|
| 1326 |
advanced_cols = ['Player', 'Season', 'PTS', 'REB', 'AST', 'FG_PCT', 'TS_PCT']
|
| 1327 |
+
advanced_display_df = advanced_display_df[[c for c in advanced_cols if c in advanced_display_df.columns]].round(3)
|
| 1328 |
|
| 1329 |
return jsonify({
|
| 1330 |
'basic_stats': basic_display_df.to_dict(orient='records'),
|