Source code for nba_stats_tracking.helpers

from datetime import date
from typing import Dict, List, Tuple

import requests

from nba_stats_tracking import HEADERS, REQUEST_TIMEOUT
from nba_stats_tracking.models import SeasonType
from nba_stats_tracking.models.boxscore import (
    BoxscoreRequestParameters,
    BoxscoreResults,
)
from nba_stats_tracking.models.scoreboard import (
    ScoreboardRequestParameters,
    ScoreboardResults,
)


[docs]def get_json_response(url: str, params: Dict) -> Dict: """ Helper function to get json response for request """ response = requests.get( url, params=params, headers=HEADERS, timeout=REQUEST_TIMEOUT ) if response.status_code == 200: return response.json() else: response.raise_for_status()
[docs]def get_scoreboard_response_json_for_date(game_date: date) -> Dict: """ Gets response data for scoreboard endpoint """ parameters = ScoreboardRequestParameters(GameDate=game_date) response_json = get_json_response( "https://stats.nba.com/stats/scoreboardV2", parameters.dict(by_alias=True) ) # stats will be contained in first item of resultSets return response_json["resultSets"][0]
[docs]def get_game_ids_for_date(game_date: date) -> List[str]: """ Gets game ids for all games played on a given date """ results = get_scoreboard_response_json_for_date(game_date) games = ScoreboardResults(**results) return [game.game_id for game in games]
[docs]def get_season_from_game_id(game_id: str) -> str: """ Gets season from nba.com game id 4th and 5th digits of game id represent year season started ex 0021900001 is for the 2019-20 season """ if game_id[4] == "9": return "20" + game_id[3] + game_id[4] + "-" + str(int(game_id[3]) + 1) + "0" else: return ( "20" + game_id[3] + game_id[4] + "-" + game_id[3] + str(int(game_id[4]) + 1) )
[docs]def get_season_type_from_game_id(game_id: str) -> SeasonType: """ Gets season type from nba.com game id Season type is represented in 3rd digit of game id 2 is Regular Season, 4 is Playoffs """ if game_id[2] == "4": return SeasonType.playoffs elif game_id[2] == "2": return SeasonType.regular_season elif game_id[2] == "5": return SeasonType.play_in return None
[docs]def get_boxscore_response_for_game(game_id: str) -> Dict: """ Gets response data from boxscore endpoint for nba.com game id """ parameters = BoxscoreRequestParameters(GameId=game_id) response_json = get_json_response( "https://stats.nba.com/stats/boxscoretraditionalv2", parameters.dict(by_alias=True), ) # stats will be contained in first item of resultSets return response_json["resultSets"][0]
[docs]def get_team_id_maps_for_date(game_date: date) -> Tuple[Dict, Dict]: """ Creates dicts mapping team id to game id and team id to opponent team id for games on a given date """ results = get_scoreboard_response_json_for_date(game_date) games = ScoreboardResults(**results) team_id_game_id_map = {} team_id_opponent_id_map = {} for game in games: team_id_game_id_map[game.home_team_id] = game.game_id team_id_game_id_map[game.visitor_team_id] = game.game_id team_id_opponent_id_map[game.home_team_id] = game.visitor_team_id team_id_opponent_id_map[game.visitor_team_id] = game.home_team_id return team_id_game_id_map, team_id_opponent_id_map
[docs]def make_player_team_map_for_game(boxscore_data: BoxscoreResults) -> Dict: """ Creates a dict mapping player id to team id for a game """ player_game_team_map = { player.player_id: player.team_id for player in boxscore_data } return player_game_team_map
[docs]def get_player_team_map_for_date(game_date: date) -> Dict: """ Creates a dict mapping player id to team id for all games on a given date """ player_game_team_map = {} game_ids = get_game_ids_for_date(game_date) for game_id in game_ids: results = get_boxscore_response_for_game(game_id) boxscore_data = BoxscoreResults(**results) player_game_team_map_for_game = make_player_team_map_for_game(boxscore_data) player_game_team_map = {**player_game_team_map, **player_game_team_map_for_game} return player_game_team_map