Source code for nba_stats_tracking.utils

from nba_stats_tracking import (
    HEADERS,
    REQUEST_TIMEOUT,
    PLAYOFFS_STRING,
    REGULAR_SEASON_STRING,
    PLAY_IN_STRING,
)

import requests


[docs]def make_array_of_dicts_from_response_json(response_json, index): """ Makes array of dicts from stats.nba.com response json :param dict response_json: dict with response from request :param int index: index that holds results in resultSets array :return: list of dicts with data for each row :rtype: list[dict] """ headers = response_json["resultSets"][index]["headers"] rows = response_json["resultSets"][index]["rowSet"] return [dict(zip(headers, row)) for row in rows]
[docs]def get_json_response(url, params): """ Helper function to get json response for request :param str url: base url for api endpoint :param dict params: params for request :return: response json :rtype: dict """ 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(date): """ Gets response from scoreboard endpoint :param str date: Format - MM/DD/YYYY :return: response json :rtype: dict """ parameters = {"DayOffset": 0, "LeagueID": "00", "gameDate": date} url = "https://stats.nba.com/stats/scoreboardV2" return get_json_response(url, parameters)
[docs]def get_game_ids_for_date(date): """ Gets game ids for all games played on a given date :param str date: Format - MM/DD/YYYY :return: list of game ids :rtype: list """ response_json = get_scoreboard_response_json_for_date(date) games = make_array_of_dicts_from_response_json(response_json, 0) return [game["GAME_ID"] for game in games]
[docs]def get_season_from_game_id(game_id): """ 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 :param str game_id: nba.com game id :return: season - Format YYYY-YY ex 2019-20 :rtype: string """ 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): """ 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 :param str game_id: nba.com game id :return: season type - Regular Season or Playoffs :rtype: string """ if game_id[2] == "4": return PLAYOFFS_STRING elif game_id[2] == "2": return REGULAR_SEASON_STRING elif game_id[2] == "5": return PLAY_IN_STRING return None
[docs]def get_boxscore_response_for_game(game_id): """ Gets response from boxscore endpoint :param str game_id: nba.com game id :return: response json :rtype: dict """ url = "https://stats.nba.com/stats/boxscoretraditionalv2" parameters = { "GameId": game_id, "StartPeriod": 0, "EndPeriod": 10, "RangeType": 2, "StartRange": 0, "EndRange": 55800, } return get_json_response(url, parameters)
[docs]def get_team_id_maps_for_date(date): """ Creates dicts mapping team id to game id and team id to opponent team id for games on a given date :param str date: Format - MM/DD/YYYY :return: team id game id dict, team id opponent id dict :rtype: tuple(dict, dict) """ response_json = get_scoreboard_response_json_for_date(date) games = make_array_of_dicts_from_response_json(response_json, 0) 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): """ Creates a dict mapping player id to team id for a game :param dict boxscore_data: list of dicts with boxscore data for a game :return: player id team id dict :rtype: dict """ 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(date): """ Creates a dict mapping player id to team id for all games on a given date :param str date: Format - MM/DD/YYYY :return: player id team id dict :rtype: dict """ player_game_team_map = {} game_ids = get_game_ids_for_date(date) for game_id in game_ids: boxscores_response = get_boxscore_response_for_game(game_id) boxscore_data = make_array_of_dicts_from_response_json(boxscores_response, 0) 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