rairo commited on
Commit
8513a4e
·
verified ·
1 Parent(s): f313cd5

Player stats fix

Browse files
Files changed (1) hide show
  1. main.py +47 -83
main.py CHANGED
@@ -1204,47 +1204,22 @@ def get_player_stats():
1204
  all_player_season_data = []
1205
  players_with_no_data = []
1206
 
1207
- # Handle individual player stats (1 player, 1 season)
1208
- if len(selected_players) == 1 and len(selected_seasons) == 1:
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 not df_player_data.empty:
1214
- all_player_season_data.append(df_player_data)
1215
- logging.info(f"Successfully retrieved data for {player_name} in {season_str}.")
1216
- else:
1217
  players_with_no_data.append(player_name)
1218
- logging.info(f"No data found for {player_name} in {season_str}.")
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
- df_player2_data = get_player_career_stats_brscraper(player2_name, seasons_to_fetch=[player2_season], playoffs=False)
1239
- if not df_player2_data.empty:
1240
- all_player_season_data.append(df_player2_data)
1241
- logging.info(f"Successfully retrieved data for {player2_name} in {player2_season}.")
 
1242
  else:
1243
- players_with_no_data.append(player2_name)
1244
- logging.info(f"No data found for {player2_name} in {player2_season}.")
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
- # Basic stats for display
1259
- basic_display_df = comparison_df_raw.copy()
 
 
 
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
- advanced_cols = ['Player', 'Season', 'PTS', 'REB', 'AST', 'FG_PCT', 'TS_PCT'] # Example advanced stats
1275
- advanced_display_df = advanced_df[[c for c in advanced_cols if c in advanced_df.columns]].round(3)
 
 
 
 
 
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
- # Handle individual player stats (1 player, 1 season)
1301
- if len(selected_players) == 1 and len(selected_seasons) == 1:
1302
- player_name = selected_players[0]
1303
- season_str = selected_seasons[0]
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
- logging.info(f"No playoff data found for {player_name} in {season_str}.")
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
- df_player2_data = get_player_career_stats_brscraper(player2_name, seasons_to_fetch=[player2_season], playoffs=True)
1331
- if not df_player2_data.empty:
1332
- all_player_season_data.append(df_player2_data)
1333
- logging.info(f"Successfully retrieved playoff data for {player2_name} in {player2_season}.")
 
1334
  else:
1335
- players_with_no_data.append(player2_name)
1336
- logging.info(f"No playoff data found for {player2_name} in {player2_season}.")
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
- basic_display_df = comparison_df_raw.copy()
 
 
 
 
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 = advanced_df[[c for c in advanced_cols if c in advanced_df.columns]].round(3)
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'),