WSBA HOCKEY
A Python package for scraping and analyzing hockey data under the motto: Evaluating, analyzing, and understanding the game of hockey through the lens of different analytical methods.
INSTALLATION AND USAGE
pip install wsba_hockey
import wsba_hockey as wsba
ALL FEATURES
SCRAPING
NHL Play-by-Play (of any game frame up to a full season)
Functions:
wsba.nhl_scrape_game(2024020918,split_shifts=False,remove=['game-end'])
wsba.nhl_scrape_season(20242025,split_shifts=False,remove=['game-end'],local=True)
Reusing Scrapy-backed Sessions
import wsba_hockey as wsba
with wsba.make_pooled_session() as session:
games = [2024020918, 2024020919]
pbp = [wsba.nhl_scrape_game(game, session=session) for game in games]
The session uses Scrapy internally while preserving the package's synchronous API. Scrapy remote control is disabled because it is not used by the client.
NHL Season Information
wsba.nhl_scrape_schedule(20242025)
wsba.nhl_scrape_seasons_info(seasons=[20212022,20222023,20232024,20242025])
wsba.nhl_scrape_standings()
NHL Rosters and Player Information
wsba.nhl_scrape_roster(20242025)
wsba.nhl_scrape_player_info([8477956, 8479987])
wsba.nhl_scrape_team_info()
NHL Draft Rankings and Prospects
wsba.nhl_scrape_draft_rankings()
wsba.nhl_scrape_prospects('BOS')
NHL EDGE Data
wsba.nhl_scrape_edge(20252026,'skater',[8477956, 8479987])
wsba.nhl_scrape_edge(20252026,'goalie',[8480280])
wsba.nhl_scrape_edge(20252026,'team',['BOS'])
NHL Event Tracking Data
wsba.nhl_scrape_event_data({2023020001: [101, 102]})
DATA ANALYTICS
Expected Goals
pbp = wsba.nhl_scrape_game(2024020918,split_shifts=False,remove=['game-end'])
pbp = wsba.nhl_apply_xG(pbp)
Goal Impacts and Shot Analysis
Stat Aggregation
pbp = wsba.nhl_scrape_season(20232024, local = True)
wsba.nhl_calculate_stats(
pbp,
'skater',
['5v5', '4v4', '3v3'],
season_types=[2, 3],
)
Shot Plotting (Plots, Heatmaps, etc.)
pbp = wsba.nhl_scrape_season(20212022, remove=[], local=True)
plots = wsba.nhl_plot_events(
pbp,
group="game",
entities=[2021020002],
events=["goal", "shot-on-goal", "missed-shot", "blocked-shot"],
strengths=["5v5"],
season_types=2,
legend=True,
rotation=0,
display_range="full",
)
plots[2021020002].savefig("skater_events.png", bbox_inches="tight")
Sample Plot:
REPOSITORY
Team Information
wsba.repo_load_teaminfo()
wsba.repo_load_rosters(seasons=[20212022,20222023,20232024,20242025])
Schedule
wsba.repo_load_schedule(seasons=[20212022,20222023,20232024,20242025])
DOCUMENTATION
View full documentation here: WSBA Hockey Package Documentation
EXPORTING DATA
Tabular scraping functions return Polars DataFrames that can be written directly to CSV or Parquet:
data = wsba.nhl_scrape_edge(20252026, "skater", [8477956])
data.write_csv("edge.csv")
data.write_parquet("edge.parquet")
API fields that contain lists or structs, such as player badges and EDGE detail data, are stored as JSON strings in the returned table so both formats remain portable.
