xBay Launching before the Dec 5 opener
xBay: The Expected Bay Hockey

Advanced analytics for PWHL San Jose

Expected goals, goaltending beyond save percentage, and a data-driven preview and recap for every San Jose game. Women's hockey deserves the same analysis the NHL gets, so we're building it for the Bay.

43days
00hours
Minnesota at San JoseHome opener · Sat, Dec 5 · SAP Center
What's coming

What you'll find here

All the numbers come from the PWHL's play-by-play data.

At launch

Expected goals

How likely each shot was to go in, based on where it came from and the game situation. Most of the charts here start with it.

24,813PWHL shots rated,
back to game one
At launch

Goaltending

Save percentage ignores how hard the shots were. Goals saved above expected doesn't. A lot of the goalie work here borrows from Steve Valiquette and Clear Sight Analytics.

+24.9Ann-Renée Desbiens, 2025-26
incl. playoffs
At launch

The San Jose roster

San Jose has no history yet, but most of its players do. Everyone in camp gets a profile.

15 of 29in camp have never
played a PWHL game
At launch

Previews & recaps

Every SJ game. Matchups and goalies before, shot maps and the chances that mattered after.

Dec 5vs. Minnesota,
the 2025 champs
In season

Predictions

Win probabilities, once a model can beat just picking the home team. None can yet.

55.9%home teams' win rate
in 320 PWHL games
Later this season

Video breakdowns

The stats feed doesn't track passes or screens, which is what usually beats goalies. I'll tag those from game video.

0shots tagged
so far
Who's behind it

One fan and eight AI agents

I'm a PWHL San Jose season ticket holder. The data work runs through the eight AI agents below, on top of a Python pipeline: DuckDB for the stats warehouse, Neo4j for the player graph, PyTorch for the models. I pick the topics and edit everything before it goes up.

Data Engineer

Pulls play-by-play, box scores, and rosters from the league's HockeyTech feed. Derives strength state from the penalty clock and goalie pulls, then reconciles shot totals against the official game sheets.

HockeyTech API · Parquet · DuckDB
Shots match game sheets within 0.2%

Hockey Analyst

Runs the expected-goals model: logistic regression on shot distance, angle, rebounds, and strength state, cross-validated by game. Builds shot maps, special-teams splits, and on-ice goal shares.

AUC 0.71 on held-out games

Goalie Analyst

Goals saved above expected (xGA minus GA), per 60 and by danger tier. Rebound rate, quality starts, and bootstrapped intervals, because goalie samples are small.

GSAx · HD/MD/LD SV% · QS%

Model Builder

A graph neural network over players, lines, and matchups that predicts games from the actual lineup. Walk-forward tested by season, and it has to beat Elo and the home-team rate before it gets published.

PyTorch Geometric · 8 node, 19 edge types

Game Reporter

Builds the brief for every SJ game: rolling xG share, special teams, goalie matchup, win probability. Until SJ has its own games, the team is projected from its players' prior PWHL careers.

Roster-based projection → actual results

Writer

Drafts posts in Quarto with the charts rendered straight from the Python analysis. Every number in a draft traces back to a warehouse query. I edit everything it writes.

Quarto · matplotlib / plotly

Fact-Checker

Re-derives every number in a draft independently from the raw data and official game sheets, and checks player names against league rosters. Any mismatch blocks the post.

Independent re-query · roster name check

Video Analyst

Clear Sight-style tagging from game video: pre-shot movement across the Royal Road, screens, deflections. Tags join to feed shots and feed a second-generation xG model. Later this season.

Tags keyed to (game_id, event_idx)
HockeyTech feed→Raw cache→DuckDB warehouse→xG + player graph→Agent draft→Fact-check→Me→xbay.blog
Under the hood

Built on every PWHL game

320games
24,813shots
413players
1,405goals

Every regular-season and playoff game from January 2024 through the 2026 Final.

First posts

Before the opener

  1. Early November

    What expected goals is (and why save % misleads)

    The idea behind most of the charts here.

    Methods
  2. Mid November

    Meet the roster

    All 29 players in camp.

    Roster
  3. Mid November

    The goalie question

    San Jose's goalies vs. the best in the league.

    Goalies
  4. Late November

    How the four expansion teams were built

    San Jose, Detroit, Hamilton, and Las Vegas.

    Expansion
  5. Dec 3

    Preview: Minnesota at San Jose

    First game in team history.

    Preview