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.
back to game one
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.
All the numbers come from the PWHL's play-by-play data.
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.
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.
San Jose has no history yet, but most of its players do. Everyone in camp gets a profile.
Every SJ game. Matchups and goalies before, shot maps and the chances that mattered after.
Win probabilities, once a model can beat just picking the home team. None can yet.
The stats feed doesn't track passes or screens, which is what usually beats goalies. I'll tag those from game video.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Every regular-season and playoff game from January 2024 through the 2026 Final.
The idea behind most of the charts here.
All 29 players in camp.
San Jose's goalies vs. the best in the league.
San Jose, Detroit, Hamilton, and Las Vegas.
First game in team history.