Skip to main content
Version: 0.1.5

sportsdataverse-py

Lifecycle PyPI Contributors Twitter
Follow

See CHANGELOG.md for details.

sportsdataverse-py gives the community free, tidy, analysis-ready sports data in Python. It is the Python member of the SportsDataverse family and deliberately mirrors its R sisters — hoopR (NBA/MBB), wehoop (WNBA/WBB), cfbfastR (CFB), baseballr (MLB), and fastRhockey (NHL/PWHL) — so the function you know in R is the function you call in Python. The NFL module mirrors the nflverse's nflreadpy, and the package plays well with the wider PySport ecosystem. Beyond aggregation and tidying, the project also exists to make open-source expected-points and win-probability models reproducible and benchmarkable, especially for American football.

New here? Read Ecosystem & philosophy for the design philosophy, the full function-naming paradigm, and how the Python and R packages line up.

Quickstart​

pip install sportsdataverse

:::caution Deprecated sportsdataverse.parsed.* is deprecated. The league wrappers already default to return_parsed=True, so call sportsdataverse.nba (etc.) directly; the parsed namespace is a thin alias kept for back-compat. :::

# Today's NBA scoreboard as a polars DataFrame — no kwargs needed via parsed.*
from sportsdataverse.parsed.nba import espn_nba_scoreboard
df = espn_nba_scoreboard() # → polars

# Or via the original module with the return_parsed=True opt-in:
from sportsdataverse.nba import espn_nba_scoreboard
df = espn_nba_scoreboard(return_parsed=True)
print(df.select(["event_id", "home_name", "away_name",
"home_score", "away_score"]).head())

# Aaron Judge's 2024 season stats from the official MLB API
from sportsdataverse.mlb import mlb_person_stats, parse_mlb_api_person_stats
judge = parse_mlb_api_person_stats(
mlb_person_stats(person_id=592450, stats="season", season=2024)
)
print(judge.select(["stats_group", "stat_home_runs", "stat_avg"]))

# Connor McDavid's 2024-25 EDGE skating speed profile
from sportsdataverse.nhl import nhl_edge_skater_detail, parse_edge_detail
mcdavid = parse_edge_detail(nhl_edge_skater_detail(8478402))
print(mcdavid.select(["player_first_name_default", "top_shot_speed_metric"]))

Parser-backed wrappers return a polars DataFrame by default (0.0.54+); pass return_parsed=False for the raw Dict. Compose with the matching parse_* function for NHL / MLB sibling APIs. See Polars / pandas parser layer below.

Supported leagues and data sources​

LeagueModuleData sources
NBAsportsdataverse.nbaESPN (122), sportsdataverse-data releases (42), NBA Stats API (130), Fox Sports API (26), Basketball-Reference (9), RealGM (18), Public model datasets (7)
WNBAsportsdataverse.wnbaESPN (123), sportsdataverse-data releases (39), WNBA Stats API (113), Fox Sports API (26)
NBA G Leaguesportsdataverse.nbaglESPN (112)
MBBsportsdataverse.mbbESPN (128), sportsdataverse-data releases (34), stats.ncaa.org (118), KenPom (32), Bart Torvik T-Rank (5), Fox Sports API (27)
WBBsportsdataverse.wbbESPN (129), sportsdataverse-data releases (34), stats.ncaa.org (111), Bart Torvik Women's T-Rank (1), Fox Sports API (27), Her Hoop Stats (5)
CFBsportsdataverse.cfbESPN (131), sportsdataverse-data releases (74), stats.ncaa.org (1), On3 Recruit Database (82), 247Sports Recruit Database (47), Yahoo Sports Shangrila (7), Fox Sports API (29)
NFLsportsdataverse.nflESPN (124), NFL.com Shield API (22), NFL Pro (32), Sleeper fantasy API (15), PFF Developer API (68), PFF Premium Stats (LEGACY) (46), nflverse data releases (46), sportsdataverse-data releases (21), Fox Sports API (25)
MLBsportsdataverse.mlbESPN (122), sportsdataverse-data releases (32), MLB Stats API (79), Baseball Savant (Statcast) (43), Fox Sports API (23)
NHLsportsdataverse.nhlESPN (119), sportsdataverse-data releases (32), NHL Web API (28), NHL EDGE (35), NHL Stats REST (21), NHL Records (50), Fox Sports API (25)
MCHsportsdataverse.mchESPN (118)
WCHsportsdataverse.wchESPN (118)
College baseballsportsdataverse.college_baseballESPN (122), stats.ncaa.org (3)
College softballsportsdataverse.college_softballESPN (121)
UFLsportsdataverse.uflESPN (114)
XFLsportsdataverse.xflESPN (112)
CFLsportsdataverse.cflESPN (112)
Soccer (all)sportsdataverse.soccerESPN (112), American Soccer Analysis (16), FotMob (14), UEFA (7), FIFA (9), Football-Data.co.uk (3), OpenLigaDB (11), kloppy open event data (8)
EPLsportsdataverse.eplESPN (113)
LaLigasportsdataverse.laligaESPN (112)
Bundesligasportsdataverse.bundesligaESPN (112)
Serie Asportsdataverse.serieaESPN (112)
Ligue 1sportsdataverse.ligue1ESPN (112)
MLSsportsdataverse.mlsESPN (113), MLS official web API (12)
Liga MXsportsdataverse.ligamxESPN (112)
UCLsportsdataverse.uclESPN (113)
UELsportsdataverse.uelESPN (112)
NWSLsportsdataverse.nwslESPN (112), NWSL official web API (9)
WWCsportsdataverse.wwcESPN (112)
WCsportsdataverse.wcESPN (112)
Cricketsportsdataverse.cricketESPN (112)
PWHLsportsdataverse.pwhlsportsdataverse-data releases (27), HockeyTech / LeagueStat (25)
AHLsportsdataverse.hockey.ahlHockeyTech / LeagueStat (11)
OHLsportsdataverse.hockey.ohlHockeyTech / LeagueStat (11)
WHLsportsdataverse.hockey.whlHockeyTech / LeagueStat (11)
QMJHLsportsdataverse.hockey.qmjhlHockeyTech / LeagueStat (11)
ECHLsportsdataverse.hockey.echlHockeyTech / LeagueStat (12)
SPHLsportsdataverse.hockey.sphlHockeyTech / LeagueStat (12)
CHLsportsdataverse.hockey.chlHockeyTech / LeagueStat (12)
USHLsportsdataverse.hockey.ushlHockeyTech / LeagueStat (12)
BCHLsportsdataverse.hockey.bchlHockeyTech / LeagueStat (12)
AJHLsportsdataverse.hockey.ajhlHockeyTech / LeagueStat (12)
SJHLsportsdataverse.hockey.sjhlHockeyTech / LeagueStat (12)
OJHLsportsdataverse.hockey.ojhlHockeyTech / LeagueStat (12)
CCHLsportsdataverse.hockey.cchlHockeyTech / LeagueStat (12)
GOJHLsportsdataverse.hockey.gojhlHockeyTech / LeagueStat (12)
MHLsportsdataverse.hockey.mhlHockeyTech / LeagueStat (12)
NOJHLsportsdataverse.hockey.nojhlHockeyTech / LeagueStat (12)
VIJHLsportsdataverse.hockey.vijhlHockeyTech / LeagueStat (12)
KIJHLsportsdataverse.hockey.kijhlHockeyTech / LeagueStat (12)
MJHLsportsdataverse.hockey.mjhlHockeyTech / LeagueStat (12)
Betting oddssportsdataverse.oddsThe Odds API (11), Polymarket (8), Kalshi (9)
CBS Sportssportsdataverse.cbsCBS Sports NAPI (82)
Yahoo Sportssportsdataverse.yahooYahoo Sports Shangrila (107)
Fox Sportssportsdataverse.foxFox Sports API (33)
EuroLeaguesportsdataverse.euroleagueEuroLeague Competition Engine (15)
Formula 1sportsdataverse.f1Jolpica F1 API (Ergast-compatible) (16)
ESPN content (news)sportsdataverse.espn_contentESPN (3)
TheSportsDBsportsdataverse.thesportsdbTheSportsDB (12)

Errors (0.1.5)​

  • NoDataError — the fetch SUCCEEDED and there is nothing there (a 404, or ESPN's 200-with-code:404 body).
  • AssetFetchError — the fetch FAILED and the answer is unknown (403, rate limit, exhausted retries). Never record this as an empty season.
  • ValueError — a 400 / 422: the request itself is wrong, so retrying cannot help.

As of 0.1.5 the hand-written ESPN scrapers and every generated flat-API getter raise rather than returning an error body or an empty dict.

Asking the package about itself​

sdv-docs is an MCP server over a prebuilt index of this surface — exact columns, function signatures, provider endpoints and released datasets:

claude mcp add sdv-docs -- uvx --from 'sportsdataverse[mcp]' sdv-docs

Needs 0.1.5 or newer and Python >= 3.10.

Polars / pandas parser layer​

Parser-backed wrappers return a polars DataFrame by default (0.0.54+); pass return_parsed=False for the raw Dict. The parser layer in sportsdataverse._common_espn_parsers (plus matching modules for the MLB and NHL sibling APIs) turns those payloads into tidy polars (or pandas) DataFrames.

For ESPN wrappers, return_parsed=True is now the default for parser-backed endpoints. Pass return_parsed=False to recover the raw Dict, or return_as_pandas=True to get a pandas DataFrame:

from sportsdataverse.nba import espn_nba_team_roster

df = espn_nba_team_roster(team_id=13) # → polars (default)
raw = espn_nba_team_roster(team_id=13, return_parsed=False) # → Dict
pdf = espn_nba_team_roster(team_id=13,
return_as_pandas=True) # → pandas

For NHL / MLB sibling-API wrappers, compose the wrapper with its parser:

from sportsdataverse.nhl import nhl_web_pbp, parse_nhl_web_pbp
df = parse_nhl_web_pbp(nhl_web_pbp(2023030417)) # 331-row polars frame

See the Architecture and Parsers pages for full details.

Installation​

sportsdataverse-py can be installed via pip:

pip install sportsdataverse

or from the repo (which may at times be more up to date):

git clone https://github.com/sportsdataverse/sportsdataverse-py
cd sportsdataverse-py
pip install -e .

Our Authors

Citations​

To cite the sportsdataverse-py Python package in publications, use:

BibTex Citation

@misc{gilani_sdvpy_2021,
author = {Gilani, Saiem},
title = {sportsdataverse-py: The SportsDataverse's Python Package for Sports Data.},
url = {https://py.sportsdataverse.org},
season = {2021}
}