SportsDataverse

SportsDataverse

@sportsdataverse.org

Building the network of people and open-source sports data packages to foster diversity and inclusion in sports analytics. Visit our site (sportsdataverse.org) or check our GitHub (github.com/sportsdataverse). Contact @saiemgilani.bsky.social for q's

183 followers25 following56 posts

🏈 cfbseedR is on CRAN. An R package to simulate college football seasons: standings, conference champions, and a seeded 12-team Playoff field — using each conference's own published tiebreaker procedure. Pairs with cfbfastR. install.packages("cfbseedR") Built by @saiemgilani.bsky.social

View full thread

Or just run the season. 138 FBS teams, 761 games, 51 of them played. cfb_simulations() splits the run into chunks and dispatches them through future, so a parallel plan spreads it across your cores. summary() returns a gt table grouped by conference.

Four calls end to end: load a schedule with cfbfastR, map it, compute standings, seed the field. Three articles and the full reference: 📖 https://cfbseedR.sportsdataverse.org Thanks to Lee Sharpe and Sebastian Carl — the design is theirs, and nflseedR (@nflverse.com) is worth your time.

cfbseedr.sportsdataverse.orgcfbseedR • Simulate College Football SeasonsFunctions to efficiently simulate and evaluate college football seasons, including conference standings, championships, and College Football Playoff seeding. Adapted from nflseedR.

🏈 cfbseedR is on CRAN. An R package to simulate college football seasons: standings, conference champions, and a seeded 12-team Playoff field — using each conference's own published tiebreaker procedure. Pairs with cfbfastR. install.packages("cfbseedR") Built by @saiemgilani.bsky.social

View full thread

The Playoff's auto-bid policy is season-keyed too. autobid = "2026": the ACC, Big 12, Big Ten and SEC champions are in regardless of ranking, the best Group-of-6 team is in champion or not, and Notre Dame is in when ranked inside the field. autobid = "2025" keeps the old rule.

Which lets you ask what a rule change is actually worth. Take 10,000 simulated 2026 seasons and seed the same ones twice, once under each policy. 10 teams helped, 12 hurt. Miami gains 14 points of playoff probability purely from the ACC's guaranteed bid.

🏈 cfbseedR is on CRAN. An R package to simulate college football seasons: standings, conference champions, and a seeded 12-team Playoff field — using each conference's own published tiebreaker procedure. Pairs with cfbfastR. install.packages("cfbseedR") Built by @saiemgilani.bsky.social

View full thread

The part that isn't nflseedR: college football has no single rulebook. Nine conferences ship with their OWN published procedure. The Mountain West leads with a metric composite, not head-to-head. The SEC ends on a capped scoring margin. The Big 12 counts total wins.

And the procedures are season-scoped. The ACC threw out its cascade for 2026 and replaced it with three steps, so cfbseedR stores dated epochs and resolves the right one from the season you're ranking. A conference that has published nothing uses a documented fallback.

🏈 cfbseedR is on CRAN. An R package to simulate college football seasons: standings, conference champions, and a seeded 12-team Playoff field — using each conference's own published tiebreaker procedure. Pairs with cfbfastR. install.packages("cfbseedR") Built by @saiemgilani.bsky.social

View full thread
View full thread

toa_quota() reports your usage credits from the most recent request — remaining, used, and what the last call cost. The same values ride along on every returned tibble and print with it, so you always know where you stand against your plan.

Quiet markets no longer look like broken code: an event with no bookmaker lines yet returns a zero-row tibble carrying the documented schema, and an API error returns an empty tibble with a clear message instead of throwing.

Five new wrappers complete the v4 surface: toa_sports_events(), toa_event_markets(), toa_sports_participants(), toa_sports_events_history() and toa_event_odds_history() — in-play events, per-bookmaker market keys, participants, and historical snapshots.

Its Python counterpart, sportsdataverse-py, carries the same ~43-endpoint Baseball Savant surface and the matching model loaders — same Statcast work, same published datasets.

mlb_pbp() overhaul: pre-2010 games parse again, pre-pitch counts are actually pre-pitch, base runners no longer leak across at-bats, and opt-in per-pitch base state — validated 4,388/4,388 pitches against Statcast's own columns.

Statcast search now trusts Savant's own CSV headers instead of renaming columns by position. That kills a bug class which silently shifted your data six separate times over two years.

PWHL was rewritten and expanded — players, leaders, transactions, playoff bracket, shift charts, xG play-by-play — plus fixes so pwhl_stats() finally honors the season and team you asked for.

Junior and minor leagues too: AHL, OHL, WHL and QMJHL wrappers with on-ice Corsi/Fenwick/TOI analytics. And 24 new season loaders (13 NHL + 11 PWHL) put every published hockey dataset one call away.

The NHL surface moved to the modern api-web.nhle.com (the old statsapi is gone upstream) and brought friends: EDGE player tracking (33 functions), the Records API (25), Stats REST (13), and integrated xG models.

NBA and MBB crosswalks link ESPN, NBA Stats, KenPom, Bart Torvik and Fox Sports on a shared key, so identities line up across every source hoopR touches. As with wehoop, the same engine and the same datasets are there in sportsdataverse-py if Python is where you work.

The full NCAA men's basketball family: play-by-play with lineups, possessions and stints, shots back to 2019, box scores, rosters and schedules. League-wide NCAA MBB RAPM across 17 published seasons.

Expanded NBA Stats API coverage for every season type published to the data releases. Model-dataset loaders round it out: player impact across 30 seasons (including NBA RAPM), possession-engine outputs, and play-context filters. Very much a work in progress, do not go around quoting these values.

New crosswalks link ESPN, the WNBA Stats API, Fox Sports and Bart Torvik team/game/player identities on one key — the end of hand-mapping team names between sources.

Plus league-wide NCAA WBB RAPM: regularized adjusted plus-minus for all of Division I across 16 published seasons, and expanded WNBA Stats coverage with model-dataset loaders.

The full NCAA women's basketball family is here: play-by-play with reconstructed 5-player lineups, shot context, possessions, stints, on/off splits and box scores — 2010 to today, one loader call each.

🏈 Good news / bad news for anyone computing CFB EPA/WPA themselves this weekend. Worth two minutes before today's kickoffs. Good news: on GitHub, EP and WP now load from the shared cfb_model_artifacts bundle — the same artifact sportsdataverse-py scores with.

View full thread

🏈 Good news / bad news for anyone computing CFB EPA/WPA themselves this weekend. Worth two minutes before today's kickoffs. Good news: on GitHub, EP and WP now load from the shared cfb_model_artifacts bundle — the same artifact sportsdataverse-py scores with.

View full thread

What to do the next couple weekends: use the loaders. load_espn_cfb_pbp() already reads published data carrying the updated models and columns, and load_cfb_pbp() will soon. Hold off on compiling pbp from scratch unless you want the older model on purpose.

Or take everything now: remotes::install_github("sportsdataverse/cfbfastR") The GitHub build is now numbered 3.0.0.9000, so packageVersion() tells you which you're on — until today both reported 3.0.0 while returning different EPA/WPA.

🏈 Good news / bad news for anyone computing CFB EPA/WPA themselves this weekend. Worth two minutes before today's kickoffs. Good news: on GitHub, EP and WP now load from the shared cfb_model_artifacts bundle — the same artifact sportsdataverse-py scores with.

That branch also adds cp/cpoe, spread-aware vegas_wp, xpass/pass_oe, fourth-down and two-point decision surfaces, and create_qbr() — plus a fix for the failure that made epa_wpa = TRUE unusable for 2006–2013.

The bad news, and it's mine to own: I rushed the CRAN submission and the updated models didn't make it in. The CRAN build still computes the previous model generation. Compile pbp yourself right now and your EPA/WPA won't match what the loaders return.

View full thread
View full thread

48 new full-season loaders now cover every published release dataset: 27 ESPN datasets back to 2004, ratings, talent, recruiting and crosswalks, plus 10 stats.ncaa.org datasets — including FCS play-by-play.

ESPN college football coverage went from 8 wrappers to 73: players, teams, games, play-by-play, FPI, QBR, recruiting and futures. There's a new Fox Sports layer too (fox_cfb_*).

The play-by-play EPA/WPA engine was rebuilt as one shared modular engine behind cfbd_pbp_data_v2() and espn_cfb_pbp_v2() — penalty enforcement resolution, player IDs, and output tiers all included.