def test_get_tracking_results_for_team_speed_distance(): with open("tests/data/tracking/2019-20/team-playoffs/SpeedDistance.json" ) as f: tracking_response_json = json.loads(f.read()) entity_type = PlayerOrTeam.team measure_type = TrackingMeasureType.speed_distance season = "2019-20" season_type = SeasonType.playoffs url = generate_url(measure_type, season, season_type, entity_type) responses.add(responses.GET, url, json=tracking_response_json, status=200) stats, _ = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, [season], [season_type], entity_type) assert len(stats) == 16 for stat in stats: if stat.team_id == 1610612738: assert stat.season == f"{season} {season_type}" assert stat.minutes == 4155.0 assert stat.dist_miles == 301.0 assert stat.dist_miles_off == 161.5 assert stat.dist_miles_def == 139.5
def test_get_tracking_results_for_player_pullup_shoot(): with open( "tests/data/tracking/2019-20/player-regular-season/PullUpShot.json" ) as f: tracking_response_json = json.loads(f.read()) entity_type = PlayerOrTeam.player measure_type = TrackingMeasureType.pull_up season = "2019-20" season_type = SeasonType.regular_season url = generate_url(measure_type, season, season_type, entity_type) responses.add(responses.GET, url, json=tracking_response_json, status=200) stats, _ = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, [season], [season_type], entity_type) assert len(stats) == 529 for stat in stats: if stat.player_id == 203932: assert stat.season == f"{season} {season_type}" assert stat.team_id == 1610612753 assert stat.minutes == 2017.0 assert stat.fga == 217 assert stat.fg3pct == stat.fg3m / stat.fg3a assert round(stat.efg, 3) == 0.327
def test_get_tracking_results_for_player_rebounding(): with open( "tests/data/tracking/2019-20/player-regular-season/Rebounding.json" ) as f: tracking_response_json = json.loads(f.read()) entity_type = PlayerOrTeam.player measure_type = TrackingMeasureType.rebounding season = "2019-20" season_type = SeasonType.regular_season url = generate_url(measure_type, season, season_type, entity_type) responses.add(responses.GET, url, json=tracking_response_json, status=200) stats, _ = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, [season], [season_type], entity_type) assert len(stats) == 529 for stat in stats: if stat.player_id == 203932: assert stat.season == f"{season} {season_type}" assert stat.team_id == 1610612753 assert stat.minutes == 2017.0 assert stat.oreb_contest == 72 assert stat.dreb_contest == 93 assert stat.contested_oreb_pct == stat.oreb_contest / stat.oreb assert stat.contested_dreb_pct == stat.dreb_contest / stat.dreb
def test_get_tracking_results_for_team_possessions(): with open( "tests/data/tracking/2019-20/team-playoffs/Possessions.json") as f: tracking_response_json = json.loads(f.read()) entity_type = PlayerOrTeam.team measure_type = TrackingMeasureType.possessions season = "2019-20" season_type = SeasonType.playoffs url = generate_url(measure_type, season, season_type, entity_type) responses.add(responses.GET, url, json=tracking_response_json, status=200) stats, _ = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, [season], [season_type], entity_type) assert len(stats) == 16 for stat in stats: if stat.team_id == 1610612738: assert stat.season == f"{season} {season_type}" assert stat.minutes == 4155.0 assert stat.touches == 6711 assert stat.time_of_poss == 358.2 assert stat.pts_per_touch == stat.points / stat.touches
def test_get_tracking_results_for_player_post_touch(): with open( "tests/data/tracking/2019-20/player-regular-season/PostTouch.json" ) as f: tracking_response_json = json.loads(f.read()) entity_type = PlayerOrTeam.player measure_type = TrackingMeasureType.post_touches season = "2019-20" season_type = SeasonType.regular_season url = generate_url(measure_type, season, season_type, entity_type) responses.add(responses.GET, url, json=tracking_response_json, status=200) stats, _ = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, [season], [season_type], entity_type) assert len(stats) == 529 for stat in stats: if stat.player_id == 203932: assert stat.season == f"{season} {season_type}" assert stat.team_id == 1610612753 assert stat.minutes == 2017.0 assert stat.post_touches == 198 assert stat.points == 109 assert stat.pass_pct == stat.passes / stat.post_touches assert stat.assist_pct == stat.assists / stat.post_touches assert stat.turnover_pct == stat.turnovers / stat.post_touches assert stat.foul_pct == stat.fouls / stat.post_touches assert stat.pts_per_post_touch == stat.points / stat.post_touches
def test_get_tracking_results_for_player_passing(): with open("tests/data/tracking/2019-20/player-regular-season/Passing.json" ) as f: tracking_response_json = json.loads(f.read()) entity_type = PlayerOrTeam.player measure_type = TrackingMeasureType.passing season = "2019-20" season_type = SeasonType.regular_season url = generate_url(measure_type, season, season_type, entity_type) responses.add(responses.GET, url, json=tracking_response_json, status=200) stats, _ = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, [season], [season_type], entity_type) assert len(stats) == 529 for stat in stats: if stat.player_id == 203932: assert stat.season == f"{season} {season_type}" assert stat.team_id == 1610612753 assert stat.minutes == 2017.0 assert stat.passes_made == 2223 assert stat.assists == 228 assert stat.potential_assists == 424 assert stat.pts_per_assist == stat.assist_pts / stat.assists assert stat.assists_per_pass == stat.assists / stat.passes_made assert (stat.potential_assists_per_pass == stat.potential_assists / stat.passes_made)
def test_get_tracking_results_for_team_catch_shoot(): with open( "tests/data/tracking/2019-20/team-playoffs/CatchShoot.json") as f: tracking_response_json = json.loads(f.read()) entity_type = PlayerOrTeam.team measure_type = TrackingMeasureType.catch_and_shoot season = "2019-20" season_type = SeasonType.playoffs url = generate_url(measure_type, season, season_type, entity_type) responses.add(responses.GET, url, json=tracking_response_json, status=200) stats, league_totals = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, [season], [season_type], entity_type) assert len(stats) == 16 for stat in stats: if stat.team_id == 1610612738: assert stat.season == f"{season} {season_type}" assert stat.minutes == 4155.0 assert stat.fga == 408 assert stat.fg3pct == stat.fg3m / stat.fg3a assert round(stat.efg, 3) == 0.542 assert league_totals.fga == 4477
def test_get_tracking_results_for_team_elbow_touch(): with open( "tests/data/tracking/2019-20/team-playoffs/ElbowTouch.json") as f: tracking_response_json = json.loads(f.read()) entity_type = PlayerOrTeam.team measure_type = TrackingMeasureType.elbow_touches season = "2019-20" season_type = SeasonType.playoffs url = generate_url(measure_type, season, season_type, entity_type) responses.add(responses.GET, url, json=tracking_response_json, status=200) stats, _ = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, [season], [season_type], entity_type) assert len(stats) == 16 for stat in stats: if stat.team_id == 1610612738: assert stat.season == f"{season} {season_type}" assert stat.minutes == 4155.0 assert stat.elbow_touches == 140 assert stat.points == 92 assert stat.pass_pct == stat.passes / stat.elbow_touches assert stat.assist_pct == stat.assists / stat.elbow_touches assert stat.turnover_pct == stat.turnovers / stat.elbow_touches assert stat.foul_pct == stat.fouls / stat.elbow_touches assert stat.pts_per_elbow_touch == stat.points / stat.elbow_touches
def test_get_tracking_results_for_team_passing(): with open("tests/data/tracking/2019-20/team-playoffs/Passing.json") as f: tracking_response_json = json.loads(f.read()) entity_type = PlayerOrTeam.team measure_type = TrackingMeasureType.passing season = "2019-20" season_type = SeasonType.playoffs url = generate_url(measure_type, season, season_type, entity_type) responses.add(responses.GET, url, json=tracking_response_json, status=200) stats, _ = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, [season], [season_type], entity_type) assert len(stats) == 16 for stat in stats: if stat.team_id == 1610612738: assert stat.season == f"{season} {season_type}" assert stat.minutes == 4155.0 assert stat.passes_made == 4690 assert stat.assists == 385 assert stat.potential_assists == 722 assert stat.pts_per_assist == stat.assist_pts / stat.assists assert stat.assists_per_pass == stat.assists / stat.passes_made assert (stat.potential_assists_per_pass == stat.potential_assists / stat.passes_made)
def test_get_tracking_results_for_team_efficiency(): with open( "tests/data/tracking/2019-20/team-playoffs/Efficiency.json") as f: tracking_response_json = json.loads(f.read()) entity_type = PlayerOrTeam.team measure_type = TrackingMeasureType.shooting season = "2019-20" season_type = SeasonType.playoffs url = generate_url(measure_type, season, season_type, entity_type) responses.add(responses.GET, url, json=tracking_response_json, status=200) stats, _ = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, [season], [season_type], entity_type) assert len(stats) == 16 for stat in stats: if stat.team_id == 1610612738: assert stat.season == f"{season} {season_type}" assert stat.minutes == 4155.0 assert stat.drive_pts == 436 assert stat.catch_shoot_pts == 454 assert stat.pull_up_pts == 409 assert stat.paint_touch_pts == 292 assert stat.post_touch_pts == 55 assert stat.elbow_touch_pts == 92
def test_get_tracking_results_for_player_efficiency(): with open( "tests/data/tracking/2019-20/player-regular-season/Efficiency.json" ) as f: tracking_response_json = json.loads(f.read()) entity_type = PlayerOrTeam.player measure_type = TrackingMeasureType.shooting season = "2019-20" season_type = SeasonType.regular_season url = generate_url(measure_type, season, season_type, entity_type) responses.add(responses.GET, url, json=tracking_response_json, status=200) stats, _ = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, [season], [season_type], entity_type) assert len(stats) == 529 for stat in stats: if stat.player_id == 203932: assert stat.season == f"{season} {season_type}" assert stat.team_id == 1610612753 assert stat.minutes == 2017.0 assert stat.drive_pts == 145 assert stat.catch_shoot_pts == 193 assert stat.pull_up_pts == 142 assert stat.paint_touch_pts == 262 assert stat.post_touch_pts == 109 assert stat.elbow_touch_pts == 43
def test_get_tracking_results_for_player_defense(): with open("tests/data/tracking/2019-20/player-regular-season/Defense.json" ) as f: tracking_response_json = json.loads(f.read()) entity_type = PlayerOrTeam.player measure_type = TrackingMeasureType.defense season = "2019-20" season_type = SeasonType.regular_season url = generate_url(measure_type, season, season_type, entity_type) responses.add(responses.GET, url, json=tracking_response_json, status=200) stats, _ = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, [season], [season_type], entity_type) assert len(stats) == 529 for stat in stats: if stat.player_id == 203932: assert stat.season == f"{season} {season_type}" assert stat.team_id == 1610612753 assert stat.minutes == 2017.0 assert stat.def_rim_fga == 185 assert stat.blocks == 39 assert stat.def_rim_fgpct == stat.def_rim_fgm / stat.def_rim_fga
def test_player_aggregate_full_season_tracking_stats_for_seasons(): with open('tests/data/player_2020_speed_distance_response.json') as f: tracking_2020_response_json = json.loads(f.read()) with open('tests/data/player_2019_speed_distance_response.json') as f: tracking_2019_response_json = json.loads(f.read()) entity_type = 'player' measure_type = 'SpeedDistance' seasons = ['2018-19', '2019-20'] season_types = ['Regular Season'] url_2020 = generate_url(measure_type, seasons[1], season_types[0], entity_type) responses.add(responses.GET, url_2020, json=tracking_2020_response_json, status=200) url_2019 = generate_url(measure_type, seasons[0], season_types[0], entity_type) responses.add(responses.GET, url_2019, json=tracking_2019_response_json, status=200) stats, league_totals = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, seasons, season_types, entity_type) assert len(stats) == 645 for stat in stats: if stat['PLAYER_ID'] == 203932: assert stat['MIN'] == 4035.0 assert stat['DIST_FEET'] == 1604918 assert league_totals['MIN'] == 961707.0 assert league_totals['DIST_FEET'] == 379831114
def test_get_tracking_results_for_player_catch_shoot(): with open( "tests/data/tracking/2019-20/player-regular-season/CatchShoot.json" ) as f: tracking_response_json = json.loads(f.read()) entity_type = PlayerOrTeam.player measure_type = TrackingMeasureType.catch_and_shoot season = "2019-20" season_type = SeasonType.regular_season url = generate_url(measure_type, season, season_type, entity_type) responses.add(responses.GET, url, json=tracking_response_json, status=200) stats, league_totals = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, [season], [season_type], entity_type) assert len(stats) == 529 for stat in stats: if stat.player_id == 203932: assert stat.season == f"{season} {season_type}" assert stat.team_id == 1610612753 assert stat.minutes == 2017.0 assert stat.points == 184 assert stat.fgm == 66 assert stat.fga == 198 assert stat.fg3m == 52 assert stat.fg3a == 160 assert stat.fg3pct == stat.fg3m / stat.fg3a assert round(stat.efg, 3) == 0.465 assert league_totals.fga == 54954
def test_get_tracking_results_for_player_speed_distance(): with open( "tests/data/tracking/2019-20/player-regular-season/SpeedDistance.json" ) as f: tracking_response_json = json.loads(f.read()) entity_type = PlayerOrTeam.player measure_type = TrackingMeasureType.speed_distance season = "2019-20" season_type = SeasonType.regular_season url = generate_url(measure_type, season, season_type, entity_type) responses.add(responses.GET, url, json=tracking_response_json, status=200) stats, _ = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, [season], [season_type], entity_type) assert len(stats) == 529 for stat in stats: if stat.player_id == 203932: assert stat.season == f"{season} {season_type}" assert stat.team_id == 1610612753 assert stat.minutes == 2017.0 assert stat.dist_miles == 150.5 assert stat.dist_miles_off == 83.4 assert stat.dist_miles_def == 67.2
def test_team_aggregate_full_season_tracking_stats_for_seasons(): with open("tests/data/tracking/2019-20/team-regular-season/CatchShoot.json" ) as f: tracking_2020_response_json = json.loads(f.read()) with open("tests/data/tracking/2018-19/team-regular-season/CatchShoot.json" ) as f: tracking_2019_response_json = json.loads(f.read()) entity_type = PlayerOrTeam.team measure_type = TrackingMeasureType.catch_and_shoot seasons = ["2018-19", "2019-20"] season_types = [SeasonType.regular_season] url_2020 = generate_url(measure_type, seasons[1], season_types[0], entity_type) responses.add(responses.GET, url_2020, json=tracking_2020_response_json, status=200) url_2019 = generate_url(measure_type, seasons[0], season_types[0], entity_type) responses.add(responses.GET, url_2019, json=tracking_2019_response_json, status=200) stats, league_totals = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, seasons, season_types, entity_type) minutes = 0 assert len(stats) == 30 for stat in stats: if stat.team_id == 1610612737: assert stat.team_name == "Atlanta Hawks" assert stat.team_abbreviation == "ATL" assert stat.minutes == 36135.0 assert stat.fgm == 1406 assert stat.fga == 3962 assert stat.points == 4141 assert stat.fg3m == 1329 assert stat.fg3a == 3719 assert stat.fg3pct == stat.fg3m / stat.fg3a minutes += stat.minutes assert league_totals.minutes == 1106520.0 assert league_totals.fgm == 44236 assert league_totals.fga == 117893 assert league_totals.points == 127215 assert league_totals.fg3m == 38743 assert league_totals.fg3a == 105039
def test_team_aggregate_full_season_tracking_stats_for_seasons(): with open('tests/data/team_2020_catch_and_shoot_response.json') as f: tracking_2020_response_json = json.loads(f.read()) with open('tests/data/team_2019_catch_and_shoot_response.json') as f: tracking_2019_response_json = json.loads(f.read()) entity_type = 'team' measure_type = 'CatchShoot' seasons = ['2018-19', '2019-20'] season_types = ['Regular Season'] url_2020 = generate_url(measure_type, seasons[1], season_types[0], entity_type) responses.add(responses.GET, url_2020, json=tracking_2020_response_json, status=200) url_2019 = generate_url(measure_type, seasons[0], season_types[0], entity_type) responses.add(responses.GET, url_2019, json=tracking_2019_response_json, status=200) stats, league_totals = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, seasons, season_types, entity_type) assert len(stats) == 30 for stat in stats: if stat['TEAM_ID'] == 1610612737: assert stat == { 'TEAM_ID': 1610612737, 'TEAM_NAME': 'Atlanta Hawks', 'TEAM_ABBREVIATION': 'ATL', 'MIN': 32170.0, 'CATCH_SHOOT_FGM': 1243, 'CATCH_SHOOT_FGA': 3537, 'CATCH_SHOOT_PTS': 3658, 'CATCH_SHOOT_FG3M': 1172, 'CATCH_SHOOT_FG3A': 3313 } assert league_totals == { 'MIN': 956470.0, 'CATCH_SHOOT_FGM': 37981, 'CATCH_SHOOT_FGA': 101524, 'CATCH_SHOOT_PTS': 109049, 'CATCH_SHOOT_FG3M': 33087, 'CATCH_SHOOT_FG3A': 90075 }
def test_player_aggregate_full_season_tracking_stats_for_seasons(): with open( "tests/data/tracking/2019-20/player-regular-season/SpeedDistance.json" ) as f: tracking_2020_response_json = json.loads(f.read()) with open( "tests/data/tracking/2018-19/player-regular-season/SpeedDistance.json" ) as f: tracking_2019_response_json = json.loads(f.read()) entity_type = PlayerOrTeam.player measure_type = TrackingMeasureType.speed_distance seasons = ["2018-19", "2019-20"] season_types = [SeasonType.regular_season] url_2020 = generate_url(measure_type, seasons[1], season_types[0], entity_type) responses.add(responses.GET, url_2020, json=tracking_2020_response_json, status=200) url_2019 = generate_url(measure_type, seasons[0], season_types[0], entity_type) responses.add(responses.GET, url_2019, json=tracking_2019_response_json, status=200) stats, league_totals = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, seasons, season_types, entity_type) assert len(stats) == 659 for stat in stats: if stat.player_id == 203932: assert stat.minutes == 4584.0 assert stat.dist_feet == 1821576 assert league_totals.minutes == 1101624.0 assert league_totals.dist_feet == 434945971
def test_get_tracking_results_for_opponent_drives(): with open("tests/data/tracking/2019-20/opponent-regular-season/Drives.json" ) as f: tracking_response_json = json.loads(f.read()) entity_type = PlayerOrTeam.team measure_type = TrackingMeasureType.drives season = "2019-20" season_type = SeasonType.playoffs url = generate_url(measure_type, season, season_type, entity_type, OpponentTeamID=1610612761) responses.add(responses.GET, url, json=tracking_response_json, status=200) _, opponent_totals = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, [season], [season_type], entity_type, OpponentTeamID=1610612761) assert opponent_totals.games_played == 71
def test_get_tracking_results_for_team_defense(): with open("tests/data/tracking/2019-20/team-playoffs/Defense.json") as f: tracking_response_json = json.loads(f.read()) entity_type = PlayerOrTeam.team measure_type = TrackingMeasureType.defense season = "2019-20" season_type = SeasonType.playoffs url = generate_url(measure_type, season, season_type, entity_type) responses.add(responses.GET, url, json=tracking_response_json, status=200) stats, _ = tracking.aggregate_full_season_tracking_stats_for_seasons( measure_type, [season], [season_type], entity_type) assert len(stats) == 16 for stat in stats: if stat.team_id == 1610612738: assert stat.season == f"{season} {season_type}" assert stat.minutes == 4155.0 assert stat.def_rim_fga == 400 assert stat.blocks == 82 assert stat.def_rim_fgpct == stat.def_rim_fgm / stat.def_rim_fga