Skip to main content
Version: 0.1.5

PWHL — additional Python functions — HockeyTech / LeagueStat

pwhl_game_corsi​

pwhl_game_corsi(game_id: 'int', return_as_pandas: 'bool' = False) -> "'Union[pl.DataFrame, pd.DataFrame]'"

Player-level on-ice Corsi and Fenwick for a single PWHL game.

Computes shot-attempt counts for every player found on ice during a shot/blocked_shot/goal event, then joins their time-on-ice so per-60 rates are available.

Corsi/Fenwick note: the HockeyTech feed has no missed-shot event, so both metrics are proxies that count only shot + blocked_shot + goal. Every output row carries corsi_includes_missed = False.

Parameters

ParameterTypeDefaultDescription
game_idintHockeyTech game identifier (integer or string).
return_as_pandasboolFalseIf True, return a pandas.DataFrame instead of a polars.DataFrame.

Returns

One row per on-ice player with columns: - player_id (Utf8) - corsi_for, corsi_against (Int64) - corsi_for_pct (Float64) - fenwick_for, fenwick_against (Int64) - fenwick_for_pct (Float64) - toi_seconds (Int64, from shifts; null if player not in shift data) - corsi_for_per60 (Float64) - corsi_includes_missed (Boolean, always False)

col_nametypedescription
player_idcharacterUnique player identifier.
corsi_forintegerTotal shot attempts (on goal, missed, and blocked) directed toward the opponent by this team while at the tracked strength in the PWHL game.
corsi_againstintegerTotal shot attempts (on goal, missed, and blocked) directed against this team while at the tracked strength in the PWHL game.
corsi_for_pctdoubleShare of all tracked shot attempts belonging to this team, expressed as a decimal (Corsi For percentage).
fenwick_forintegerUnblocked shot attempts (on goal and missed only) directed toward the opponent by this team at the tracked strength in the PWHL game.
fenwick_againstintegerUnblocked shot attempts (on goal and missed only) directed against this team at the tracked strength in the PWHL game.
fenwick_for_pctdoubleShare of all unblocked shot attempts belonging to this team, expressed as a decimal (Fenwick For percentage).
corsi_includes_missedlogicalBoolean flag indicating whether missed shots are included in the Corsi totals for this record.
toi_secondsdoubleTotal time on ice in seconds for this team at the tracked strength during the PWHL game.
corsi_for_per60doubleThis team's Corsi For rate projected to a full 60 minutes of ice time.

pwhl_game_info​

pwhl_game_info(game_id: 'int', return_as_pandas: 'bool' = False) -> 'Any'

PWHL single-game metadata.

NOTE: returns an empty frame pending a captured fixture + correct endpoint wiring (A1.8 follow-up); not yet functional.

Parameters

ParameterTypeDefaultDescription
game_idintThe HockeyTech game id.
return_as_pandasboolFalseReturn a pandas DataFrame instead of polars.

Returns

A zero-row frame today -- the statviewfeed reply is not a SiteKit envelope, so there is nothing to parse (see the note above). A pandas DataFrame when return_as_pandas is True.

pwhl_game_shifts​

pwhl_game_shifts(game_id: 'int', return_as_pandas: 'bool' = False) -> "'Union[pl.DataFrame, pd.DataFrame]'"

Parsed shift stints for a single PWHL game.

Calls the HockeyTech modulekit/gameshifts endpoint and returns one row per player-shift stint via ~sportsdataverse.hockeytech._parsers.parse_shifts.

Parameters

ParameterTypeDefaultDescription
game_idintHockeyTech game identifier (integer or string).
return_as_pandasboolFalseIf True, return a pandas.DataFrame instead of a polars.DataFrame.

Returns

Columns include player_id, first_name, last_name, home, period, start_time, end_time, start_s, end_s, goal_on_shift, penalty_on_shift.

col_nametypedescription
game_idintegerUnique game identifier.
player_idintegerUnique player identifier.
first_namecharacterPlayer first name.
last_namecharacterPlayer last name.
jersey_numbercharacterJersey number.
homeintegerWhether the player's team was home.
periodintegerPeriod number.
start_timecharacterShift start time (MM:SS countdown clock).
end_timecharacterShift end time (MM:SS countdown clock).
lengthcharacterLength of the streak in games.
start_sintegerShift start time in seconds elapsed from the start of the period.
end_sdoubleShift end time in seconds elapsed from the start of the period.
goal_on_shiftintegerNumber of goals scored while this shift was active (0 or 1 in most cases).
penalty_on_shiftintegerNumber of penalties called while this shift was active.

pwhl_game_summary​

pwhl_game_summary(game_id: 'int') -> 'dict'

PWHL game summary — dict of frames (game/goals/penalties/shots_by_period/three_stars).

Parameters

ParameterTypeDefaultDescription
game_idintThe HockeyTech game id.

Returns

game (one row: game_id, date, status, venue, attendance, both teams and scores), goals (one row per goal with the scorer, both assists and the plus / minus skaters), penalties (one row per penalty), shots_by_period (side, period, shots) and three_stars.

pwhl_leaders​

pwhl_leaders(season: 'Optional[int]' = None, season_id: 'Optional[int]' = None, return_as_pandas: 'bool' = False) -> 'Any'

PWHL statistical leaders for a given season.

NOTE: the leadersExtended endpoint uses season_id (integer) to filter by season, not season (name string). The resolved integer is passed as the season_id param so historical-season requests return results.

Parameters

ParameterTypeDefaultDescription
seasonOptional[int]NoneSeason as an END year (2026 = the 2025-26 season). Defaults to the newest regular season when neither season nor season_id is given.
season_idOptional[int]NoneThe HockeyTech season id, when it is already known.
return_as_pandasboolFalseReturn a pandas DataFrame instead of polars.

Returns

One row per ranked skater (points and goals leaders): rank (Int64), player_id, name, jersey_number, position, team_id / team_name / team_code, stat_formatted and type_formatted (String), plus photo and logo URLs. A pandas DataFrame when return_as_pandas is True.

col_nametypedescription
rankintegerRank of the streak.
player_idcharacterUnique player identifier.
jersey_numbercharacterJersey number.
namecharacterPlayer full name (e.g. 'Hilary Knight').
team_idcharacterUnique team identifier.
team_namecharacterTeam name.
team_codecharacterTeam abbreviation.
team_logocharacterURL to the team logo image.
team_logo_smallcharacterURL of the small-format team logo image for the PWHL leader-board entry.
stat_formattedcharacterThe leader's value in the type_formatted category as a display string; for the Points and Goals leaderboards requested here it is a whole-number count (e.g. '29'), and '0' on every row when the season has no games yet.
type_formattedcharacterHuman-readable label for the statistical category driving the leader-board ranking (e.g., "Goals", "Save Percentage").
photocharacterURL to the player photo.
photo_smallcharacterURL of the small-format headshot image for the PWHL leader-board player.
positioncharacterPlayer position.
divisioncharacterDivision identifier.

pwhl_pbp​

pwhl_pbp(game_id: 'int', return_as_pandas: 'bool' = False) -> 'Any'

PWHL play-by-play — one row per event, fully enriched.

Matches fastRhockey pwhl_pbp column parity, adding:

  • Coordinate transforms (*_original, *_neutral, *_fixed, *_right, *_vertical).
  • Clock columns (minute_start, second_start, clock, sec_from_start).
  • Shot geometry (shot_distance, shot_angle, scoring_chance).
  • Game-meta join (game_date, game_season, game_season_id, home_team, home_team_id, away_team, away_team_id).
  • On-ice player strings (on_ice_home, on_ice_away) derived from shift data.

Goal double-rowing: the HockeyTech feed emits both a goal row and a twin shot row for (nearly) every goal. The twin shot row is flagged is_goal_twin = True — shot rows (twins included) match the official boxscore shots-on-goal totals, while dropping flagged rows yields a deduplicated event stream. See sportsdataverse.hockeytech._parsers.parse_pbp.

The three network fetches (PBP payload, game summary meta, and shift data) all go through the module-level hockeytech_api reference so tests can monkeypatch sportsdataverse.pwhl.pwhl_api.hockeytech_api to intercept all calls without touching the shared core.

Parameters

ParameterTypeDefaultDescription
game_idintThe HockeyTech game id.
return_as_pandasboolFalseReturn a pandas DataFrame instead of polars.

Returns

One row per event (shot, goal, penalty, faceoff, hit, goalie change ...): game_id, event, team_id, period_of_game, time_of_period, rink x_coord / y_coord (Float64, hockeytech_a canvas) and the transforms above, the primary / second / third player and goalie ids (Float64) and names, the plus / minus skaters on a goal, is_goal_twin, and the clock, geometry, game-meta and on-ice columns listed above. A pandas DataFrame when return_as_pandas is True.

col_nametypedescription
game_idintegerUnique game identifier.
eventcharacterEvent description label.
team_idcharacterUnique team identifier.
period_of_gamecharacterPeriod in which the event occurred.
time_of_periodcharacterElapsed time within the period (MM:SS).
x_coorddoubleTransformed x-coordinate of the event (feet scale).
y_coorddoubleTransformed y-coordinate of the event (feet scale).
player_iddoubleUnique player identifier.
player_name_firstcharacterPrimary player first name.
player_name_lastcharacterPrimary player last name.
player_positioncharacterPrimary player position.
goallogicalFlag for whether the event was a goal.
is_goal_twinlogical
goalie_iddoubleGoalie identifier on the play.
goalie_firstcharacterGoalie first name.
goalie_lastcharacterGoalie last name.
home_wincharacterWhether the home player won the faceoff.
player_team_idcharacterUnique team identifier of the primary player.
event_typecharacterStandardized event type code.
shot_qualitycharacterShot quality descriptor.
empty_netcharacterWhether the net was empty.
game_winnercharacterWhether the goal was the game-winning goal.
penalty_shotcharacterWhether the goal came on a penalty shot.
insurancecharacterWhether the goal was an insurance goal.
short_handedcharacterWhether the event occurred while short-handed.
power_playcharacterWhether the event occurred on a power play.
player_two_iddoubleSecond player's unique identifier.
player_two_name_firstcharacterSecond player first name.
player_two_name_lastcharacterSecond player last name.
player_two_positioncharacterSecond player position.
plus_player_one_iddoubleOn-ice plus player one unique identifier.
plus_player_one_firstcharacterOn-ice plus player one first name.
plus_player_one_lastcharacterOn-ice plus player one last name.
plus_player_one_positioncharacterOn-ice plus player one position.
plus_player_two_iddoubleOn-ice plus player two unique identifier.
plus_player_two_firstcharacterOn-ice plus player two first name.
plus_player_two_lastcharacterOn-ice plus player two last name.
plus_player_two_positioncharacterOn-ice plus player two position.
plus_player_three_iddoubleOn-ice plus player three unique identifier.
plus_player_three_firstcharacterOn-ice plus player three first name.
plus_player_three_lastcharacterOn-ice plus player three last name.
plus_player_three_positioncharacterOn-ice plus player three position.
plus_player_four_iddoubleOn-ice plus player four unique identifier.
plus_player_four_firstcharacterOn-ice plus player four first name.
plus_player_four_lastcharacterOn-ice plus player four last name.
plus_player_four_positioncharacterOn-ice plus player four position.
plus_player_five_iddoubleOn-ice plus player five unique identifier.
plus_player_five_firstcharacterOn-ice plus player five first name.
plus_player_five_lastcharacterOn-ice plus player five last name.
plus_player_five_positioncharacterOn-ice plus player five position.
minus_player_one_iddoubleOn-ice minus player one unique identifier.
minus_player_one_firstcharacterOn-ice minus player one first name.
minus_player_one_lastcharacterOn-ice minus player one last name.
minus_player_one_positioncharacterOn-ice minus player one position.
minus_player_two_iddoubleOn-ice minus player two unique identifier.
minus_player_two_firstcharacterOn-ice minus player two first name.
minus_player_two_lastcharacterOn-ice minus player two last name.
minus_player_two_positioncharacterOn-ice minus player two position.
minus_player_three_iddoubleOn-ice minus player three unique identifier.
minus_player_three_firstcharacterOn-ice minus player three first name.
minus_player_three_lastcharacterOn-ice minus player three last name.
minus_player_three_positioncharacterOn-ice minus player three position.
minus_player_four_iddoubleOn-ice minus player four unique identifier.
minus_player_four_firstcharacterOn-ice minus player four first name.
minus_player_four_lastcharacterOn-ice minus player four last name.
minus_player_four_positioncharacterOn-ice minus player four position.
minus_player_five_iddoubleOn-ice minus player five unique identifier.
minus_player_five_firstcharacterOn-ice minus player five first name.
minus_player_five_lastcharacterOn-ice minus player five last name.
minus_player_five_positioncharacterOn-ice minus player five position.
penalty_lengthcharacterPenalty length in minutes.
player_three_iddoubleThird player's unique identifier.
player_three_name_firstcharacterThird player first name.
player_three_name_lastcharacterThird player last name.
player_three_positioncharacterThird player position.
game_datecharacterGame date.
game_seasonintegerSeason (concluding year, YYYY).
game_season_idcharacterHockeyTech season identifier.
home_teamcharacterHome team name.
home_team_idcharacterHome team identifier.
away_teamcharacterAway team name.
away_team_idcharacterAway team identifier.
x_coord_originaldoubleOriginal raw x-coordinate from the feed.
y_coord_originaldoubleOriginal raw y-coordinate from the feed.
x_coord_neutraldoubleNeutral-zone-centered x-coordinate.
y_coord_neutraldoubleNeutral-zone-centered y-coordinate.
x_coord_fixeddoubleFixed-orientation x-coordinate.
y_coord_fixeddoubleFixed-orientation y-coordinate.
x_coord_rightdoubleRight-orientation x-coordinate.
y_coord_rightdoubleRight-orientation y-coordinate.
x_coord_verticaldoubleVertical-orientation x-coordinate.
y_coord_verticaldoubleVertical-orientation y-coordinate.
minute_startintegerMinute mark of the period when the event started.
second_startintegerSecond mark of the period when the event started.
clockcharacterGame clock time remaining (MM:SS).
sec_from_startintegerSeconds elapsed since the start of the game.
shot_distancedoubleDistance of the shot from the net.
shot_angledoubleAngle of the shot relative to the net.
scoring_chancelogicalTRUE when event is a shot-type within 25 ft of the net.
on_ice_homecharacterComma-joined sorted player_ids on ice for the home team.
on_ice_awaycharacterComma-joined sorted player_ids on ice for the away team.

pwhl_player_box​

pwhl_player_box(game_id: 'int', return_as_pandas: 'bool' = False) -> 'Any'

PWHL player box score for a single game.

NOTE: returns an empty frame pending a captured fixture + correct endpoint wiring (A1.8 follow-up); not yet functional.

Parameters

ParameterTypeDefaultDescription
game_idintThe HockeyTech game id.
return_as_pandasboolFalseReturn a pandas DataFrame instead of polars.

Returns

A zero-row frame today -- the statviewfeed reply is not a SiteKit envelope, so there is nothing to parse (see the note above). A pandas DataFrame when return_as_pandas is True.

pwhl_player_game_log​

pwhl_player_game_log(player_id: 'int', return_as_pandas: 'bool' = False) -> 'Any'

PWHL player game-by-game log.

Parameters

ParameterTypeDefaultDescription
player_idintThe HockeyTech player id.
return_as_pandasboolFalseReturn a pandas DataFrame instead of polars.

Returns

One row per game played: id (the game id), date_played, home_team_code / visiting_team_code and names, player_team, goals, assists, points, plus_minus, shots, hits, penalty_minutes, ice_time_minutes_seconds, faceoff, power-play, short-handed and shootout counts. Counts arrive as strings except points and the percentages (Int64). A pandas DataFrame when return_as_pandas is True; a zero-row frame for a player with no games.

pwhl_player_info​

pwhl_player_info(player_id: 'int', return_as_pandas: 'bool' = False) -> 'Any'

PWHL player biographical info.

NOTE: returns an empty frame pending a captured fixture + correct endpoint wiring (A1.8 follow-up); not yet functional.

Parameters

ParameterTypeDefaultDescription
player_idintThe HockeyTech player id.
return_as_pandasboolFalseReturn a pandas DataFrame instead of polars.

Returns

A zero-row frame today -- the statviewfeed reply is not a SiteKit envelope, so there is nothing to parse (see the note above). A pandas DataFrame when return_as_pandas is True.

pwhl_player_search(name: 'str', return_as_pandas: 'bool' = False) -> 'Any'

Search for PWHL players by name.

Parameters

ParameterTypeDefaultDescription
namestrThe search text, matched against player names.
return_as_pandasboolFalseReturn a pandas DataFrame instead of polars.

Returns

One row per matching player (String): person_id, player_id, first_name / last_name, position, shoots / catches, height / weight, birthdate and birthplace, last_team_name / last_team_code, role_name, active, last_active_date and the match score. A pandas DataFrame when return_as_pandas is True.

col_nametypedescription
person_idcharacterUnique person identifier.
player_idcharacterUnique player identifier.
activecharacterWhether athlete is currently active.
first_namecharacterPlayer first name.
last_namecharacterPlayer last name.
phonetic_namecharacterPhonetic spelling of the player name.
shootscharacterShooting hand.
catchescharacterCatching hand (goalies).
heightcharacterPlayer height in inches.
weightcharacterPlayer weight in pounds.
rawbirthdatecharacterPlayer's birth date as a raw string in the format returned by the PWHL HockeyTech API, typically YYYY-MM-DD.
birthdatecharacterDate of birth.
birthtowncharacterPlayer birth town.
birthprovcharacterPlayer birth province/state.
birthcntrycharacterPlayer birth country.
team_idcharacterUnique team identifier.
jersey_numbercharacterJersey number.
role_idcharacterId of the person's role in the HockeyTech person record ('1' = 'Player' in the captures): player or staff, not a playing position (see position).
season_idcharacterSeason identifier.
role_namecharacterLabel of the person's role in the HockeyTech person record (e.g. 'Player'), not a playing position (see position).
all_rolescharacterPipe- or comma-delimited string listing every positional or roster role associated with the player in the PWHL HockeyTech system.
last_team_namecharacterFull name of the PWHL team on which the player most recently appeared.
last_team_codecharacterShort abbreviation code for the PWHL team on which the player most recently appeared.
divisioncharacterDivision identifier.
positioncharacterPlayer position.
profile_imagecharacterFile name of the player's profile photo, not a URL (e.g. '7dea378a91cedc9d5d14b1222802322c.jpg').
scorecharacterSearch relevance score of the match as a decimal string (e.g. '5.911529541015625'), not a game score.
last_active_datecharacterDate (YYYY-MM-DD) the feed reports the person as last active; for the active players captured it equals the capture date, so it is not the date of the player's last game.

pwhl_player_stats​

pwhl_player_stats(player_id: 'int', return_as_pandas: 'bool' = False) -> 'Any'

PWHL player season stats across all seasons.

Parameters

ParameterTypeDefaultDescription
player_idintThe HockeyTech player id.
return_as_pandasboolFalseReturn a pandas DataFrame instead of polars.

Returns

One row per season (and team) the player played: season_id, season_name, playoff, team_id / team_name / team_code, games_played, goals, assists, points, plus_minus, penalty_minutes, power-play / short-handed / shootout splits, shots, faceoff_wins / faceoff_attempts, ice_time and stat_type (String, as the feed ships them). A pandas DataFrame when return_as_pandas is True.

col_nametypedescription
season_idcharacterSeason identifier.
season_namecharacterFull season name (e.g., "2024-25 Regular Season").
shortnamecharacterPlayer short name.
playoffcharacterWhether the row is playoff statistics.
careercharacterWhether this is a career-stats season.
sopt_track_faceoffscharacterFlag indicating whether faceoff tracking is enabled for this player's statistical record in the HockeyTech system.
max_start_datecharacterLatest game start date for the season.
veteran_statuscharacterPlayer veteran status.
veterancharacterWhether the player is a veteran.
jersey_numbercharacterJersey number.
goalscharacterGoals scored.
games_playedcharacterGames played.
assistscharacterAssists.
pointscharacterTotal points (goals + assists).
plus_minuscharacterPlus/minus rating.
penalty_minutescharacterPenalty minutes.
power_play_goalscharacterPower-play goals.
power_play_assistscharacterPower-play assists.
shotscharacterShots on goal.
shootout_attemptscharacterShootout attempts.
shootout_goalscharacterShootout goals.
shootout_percentagecharacterShootout scoring percentage.
shooting_percentagecharacterShooting percentage.
shootout_winning_goalscharacterShootout game-winning goals.
points_per_gamecharacterPoints per game.
short_handed_goalscharacterShort-handed goals.
short_handed_assistscharacterShort-handed assists.
game_winning_goalscharacterGame-winning goals.
game_tieing_goalscharacterGame-tying goals.
faceoff_winscharacterFaceoff wins.
faceoff_attemptscharacterFaceoff attempts.
faceoff_pctcharacterFaceoff win percentage.
hitscharacterHits.
team_namecharacterTeam name.
team_codecharacterTeam abbreviation.
team_citycharacterTeam city.
team_nicknamecharacterTeam nickname.
team_idcharacterUnique team identifier.
activecharacterWhether athlete is currently active.
first_goalscharacterFirst goals of a game.
insurance_goalscharacterInsurance goals.
overtime_goalscharacterOvertime goals.
unassisted_goalscharacterUnassisted goals.
empty_net_goalscharacterEmpty-net goals.
penalty_minutes_per_gamecharacterPenalty minutes per game.
divisioncharacterDivision identifier.
ice_timecharacterTotal ice time.
ice_time_minutes_secondscharacterIce time in minutes and seconds.
shots_blocked_by_playercharacterShots blocked by the player.
stat_typecharacterStatistic type ("regular"/"playoff").

pwhl_player_toi​

pwhl_player_toi(game_id: 'int', return_as_pandas: 'bool' = False) -> "'Union[pl.DataFrame, pd.DataFrame]'"

Per-player time-on-ice totals for a single PWHL game.

Fetches shifts via pwhl_game_shifts then aggregates via ~sportsdataverse.hockeytech._analytics.player_toi.

Parameters

ParameterTypeDefaultDescription
game_idintHockeyTech game identifier (integer or string).
return_as_pandasboolFalseIf True, return a pandas.DataFrame instead of a polars.DataFrame.

Returns

One row per player with player_id, first_name, last_name, toi_seconds, num_shifts, avg_shift_s, sorted by toi_seconds descending.

col_nametypedescription
player_idintegerUnique player identifier.
first_namecharacterPlayer first name.
last_namecharacterPlayer last name.
toi_secondsdoubleTotal time on ice for the PWHL player during the game or reporting period, recorded in seconds.
num_shiftsintegerTotal number of shifts the player took during the game or reporting period.
avg_shift_sdoubleAverage duration of a single shift for the player during the game or reporting period, measured in seconds.

pwhl_playoff_bracket​

pwhl_playoff_bracket(season: 'Optional[int]' = None, season_id: 'Optional[int]' = None, return_as_pandas: 'bool' = False) -> 'Any'

PWHL playoff bracket for a given season.

With neither season nor season_id, the newest season that has playoffs: the newest season overall is usually still before its playoffs, with no bracket.

Parameters

ParameterTypeDefaultDescription
seasonOptional[int]NoneSeason as an END year (2026 = the 2025-26 season).
season_idOptional[int]NoneThe HockeyTech playoff season id, when it is already known.
return_as_pandasboolFalseReturn a pandas DataFrame instead of polars.

Returns

One row per playoff series: round / round_name / round_type_name, series_letter / series_name, team1 / team2 (team ids), team1_wins / team2_wins (Int64), winner (the winning team id, but the feed often leaves it empty even after a series ends, so read the result from the win counts), feeder_series1 / feeder_series2, and games (a list of structs, one per game: ids, both teams, goal counts, status, date). A pandas DataFrame when return_as_pandas is True.

pwhl_schedule​

pwhl_schedule(season: 'Optional[int]' = None, season_id: 'Optional[int]' = None, return_as_pandas: 'bool' = False) -> 'Any'

PWHL schedule — one row per game (matches fastRhockey pwhl_schedule).

Parameters

ParameterTypeDefaultDescription
seasonOptional[int]NoneSeason as an END year (2026 = the 2025-26 season). With neither season nor season_id, no season filter is sent and the feed's whole recent window comes back.
season_idOptional[int]NoneThe HockeyTech season id, when it is already known.
return_as_pandasboolFalseReturn a pandas DataFrame instead of polars.

Returns

One row per game: game_id, game_date, game_status, home_team / home_team_id / home_score, away_team / away_team_id / away_score, venue, season_id and game_type (all String). With no season given, the feed's whole recent window. A pandas DataFrame when return_as_pandas is True.

col_nametypedescription
game_idcharacterUnique game identifier.
game_datecharacterGame date.
game_statuscharacterGame status text.
home_teamcharacterHome team name.
home_team_idcharacterHome team identifier.
home_scorecharacterHome team final score.
away_teamcharacterAway team name.
away_team_idcharacterAway team identifier.
away_scorecharacterAway team final score.
venuecharacterVenue where the game was played.
season_idcharacterSeason identifier.
game_typecharacterGame type the row belongs to.

pwhl_scorebar​

pwhl_scorebar(return_as_pandas: 'bool' = False) -> 'Any'

PWHL live scorebar (today ± 3 days).

Parameters

ParameterTypeDefaultDescription
return_as_pandasboolFalseReturn a pandas DataFrame instead of polars.

Returns

One row per game in the window, as the feed ships it (String): id, season_id, game_date / game_date_iso8601, scheduled_time, home_id / home_code / home_long_name / home_goals, the same visitor_* columns, period, game_clock, game_status / game_status_string, venue_name, both teams' records, and broadcast URLs. A pandas DataFrame when return_as_pandas is True.

col_nametypedescription
idcharacterHockeyTech game id, the game_id the single-game functions (pwhl_pbp, pwhl_game_summary) take.
season_idcharacterSeason identifier.
league_idcharacterHockeyTech league id of the game within the feed (e.g. '1'; AHL '4', SJHL '3'); not always the league_id the standings call sends.
game_numbercharacterGame number within the schedule.
game_lettercharacterPlayoff-series letter (A, B, C, ... one per series), set on every playoff game and empty on regular-season games.
game_typecharacterGame type the row belongs to.
quick_scorecharacterUnused by the feed: '0' in every captured row (final and scheduled games, 17 leagues), never a score.
datecharacterGame date as YYYY-MM-DD (date only, no time).
flo_core_event_idcharacterFloSports core event identifier linking this PWHL game to its FloSports broadcast event record.
flo_live_event_idcharacterFloSports live-stream event identifier for this PWHL game.
game_datecharacterGame date.
game_date_iso8601characterScheduled start as an ISO 8601 date-time with UTC offset (e.g. '2023-12-04T13:00:00-05:00').
scheduled_timecharacterRaw scheduled start time for the game as returned by the HockeyTech feed, typically in HH:MM:SS format.
scheduled_formatted_timecharacterHuman-readable local game start time string formatted for display (e.g., "7:00 PM ET").
timezonecharacterTime zone of the scheduled start as a tz database name (e.g. 'Canada/Eastern').
ticket_urlcharacterURL to the official ticketing page where fans can purchase tickets for this game.
home_idcharacterHockeyTech team id of the home team (the team_id of pwhl_teams, e.g. '1' = Boston), not an ESPN id.
home_codecharacterShort team code (abbreviation) for the home team (e.g., "BOS", "MIN").
home_citycharacterCity name of the home team (e.g. 'Boston', 'Minnesota').
home_nicknamecharacterFranchise nickname for the home team (e.g., "Fleet", "Frost").
home_long_namecharacterFull name including city and franchise for the home team (e.g., "Boston Fleet").
home_divisioncharacterHome team division.
home_goalscharacterGoals scored by the home team in the game so far; the final score once game_status is '4'.
home_audio_urlcharacterURL of the home-team radio or audio broadcast stream for this game.
home_video_urlcharacterURL of the home-team video broadcast stream for this game.
home_webcast_urlcharacterURL of the home-team webcast for online viewing of this game.
visitor_idcharacterHockeyTech team identifier for the visiting team in this game.
visitor_codecharacterShort team code (abbreviation) for the visiting team (e.g., "NYR", "OTT").
visitor_citycharacterCity name of the visiting team (e.g., "New York", "Ottawa").
visitor_nicknamecharacterFranchise nickname for the visiting team (e.g., "Charge", "Sceptres").
visitor_long_namecharacterFull name including city and franchise for the visiting team (e.g., "Ottawa Charge").
visiting_divisioncharacterVisiting team division.
visitor_goalscharacterNumber of goals scored by the visiting team at the current point in the game.
visitor_audio_urlcharacterURL of the visiting-team radio or audio broadcast stream for this game.
visitor_video_urlcharacterURL of the visiting-team video broadcast stream for this game.
visitor_webcast_urlcharacterURL of the visiting-team webcast for online viewing of this game.
periodcharacterPeriod number.
period_name_shortcharacterAbbreviated name of the current or final game period (e.g., "3rd", "OT").
period_name_longcharacterVerbose name of the current or final game period (e.g., "Third Period", "Overtime").
game_clockcharacter
game_summary_urlcharacterGame-summary link target, not a full URL: the bare game id in some leagues (e.g. PWHL '74') and a site-relative path in others (e.g. '/game-center/?game_id=4896').
home_winscharacterHome team's wins in its record for this game's season (season_id) as the feed reports it when fetched: the same value on every row of that team-season, not the record as of the game date.
home_regulation_lossescharacterHome team's regulation losses in its record for this game's season (season_id) as the feed reports it when fetched: the same value on every row of that team-season, not the record as of the game date.
home_ot_lossescharacterHome team's overtime losses in its record for this game's season (season_id) as the feed reports it when fetched: the same value on every row of that team-season, not the record as of the game date.
home_shootout_lossescharacterHome team's shootout losses in its record for this game's season (season_id) as the feed reports it when fetched: the same value on every row of that team-season, not the record as of the game date.
visitor_winscharacterVisiting team's wins in its record for this game's season (season_id) as the feed reports it when fetched: the same value on every row of that team-season, not the record as of the game date.
visitor_regulation_lossescharacterVisiting team's regulation losses in its record for this game's season (season_id) as the feed reports it when fetched: the same value on every row of that team-season, not the record as of the game date.
visitor_ot_lossescharacterVisiting team's overtime losses in its record for this game's season (season_id) as the feed reports it when fetched: the same value on every row of that team-season, not the record as of the game date.
visitor_shootout_lossescharacterVisiting team's shootout losses in its record for this game's season (season_id) as the feed reports it when fetched: the same value on every row of that team-season, not the record as of the game date.
game_statuscharacterNumeric game-status code as text: '1' for a scheduled game, '4' for a final. The label is in game_status_string ('Final', or the start time of a scheduled game).
intermissioncharacterFlag or string indicating whether the game is currently in an intermission period.
game_status_stringcharacterShort status label for the game's current state (e.g., "Final", "In Progress", "Scheduled").
game_status_string_longcharacterVerbose status description for the game's current state, including period or overtime context.
ordcharacterOrdinal sort key used by the HockeyTech scorebar feed to order games within a day.
venue_namecharacterName of the venue.
venue_locationcharacterCity and/or arena name indicating the physical location where the game is played.
league_namecharacterLeague name.
league_codecharacterShort code identifying the league for this scorebar record (e.g., "PWHL").
time_tbdcharacterScorebar flag string named for a to-be-determined start time; '0' in every sampled row, so the non-zero case was not observed.
date_tbdcharacterScorebar flag string named for a to-be-determined game date; '0' in every sampled row, so the non-zero case was not observed.
timezone_shortcharacterAbbreviated timezone label for the game's scheduled start time (e.g., "ET", "CT").
home_logocharacterHome team logo URL.
visitor_logocharacterURL of the logo image for the visiting team.
flo_hockey_urlcharacterURL to the FloHockey streaming page for this PWHL game.
combined_client_codecharacterCombined league-and-client identifier string used by the HockeyTech feed to distinguish multi-tenant deployments.

pwhl_skater_rapm​

pwhl_skater_rapm(pbp: 'pl.DataFrame', shifts: 'pl.DataFrame', *, model_dir: "'str | None'" = None, **kwargs: 'Any') -> "'pl.DataFrame | pd.DataFrame'"

② PWHL skater xG RAPM -- shim over nhl_skater_rapm with league='pwhl'.

Guards on PWHL shift-chart coverage (see the module docstring); returns a documented empty frame + cli_warn rather than fitting a degenerate ridge when shifts is too thin.

Parameters

ParameterTypeDefaultDescription
pbpDataFramea PWHL play-by-play frame shaped like load_nhl_pbp_full.
shiftsDataFramea PWHL shift-chart frame shaped like load_nhl_shifts.
model_dirstr | NoneNonebooster directory passed through to the borrowed NHL xG boosters.

Returns

Same schema as nhl_skater_rapm: player_id:Int64, xg_rapm_off:Float64, xg_rapm_def:Float64, xg_rapm:Float64, toi_minutes:Float64. A zero-row frame with this schema (+ a cli_warn) when PWHL shift coverage is insufficient.

No returns table is published for this function: no capture: it expects NHL-style play-by-play columns (secondary_type, x_fixed, strength_state) that no PWHL loader provides, so it raises ColumnNotFoundError on real PWHL games.

Example

from sportsdataverse.pwhl.pwhl_player_impact import pwhl_skater_rapm
rapm = pwhl_skater_rapm(pbp, shifts)

pwhl_skater_war​

pwhl_skater_war(pbp: 'pl.DataFrame', shifts: 'pl.DataFrame', *, model_dir: "'str | None'" = None, **kwargs: 'Any') -> "'pl.DataFrame | pd.DataFrame'"

③ PWHL GAR/WAR composite -- shim over nhl_skater_war with league='pwhl'.

Guards on PWHL shift-chart coverage (see the module docstring).

Parameters

ParameterTypeDefaultDescription
pbpDataFramea PWHL play-by-play frame shaped like load_nhl_pbp_full.
shiftsDataFramea PWHL shift-chart frame shaped like load_nhl_shifts.
model_dirstr | NoneNonebooster directory passed through to the borrowed NHL xG boosters.

Returns

Same schema as nhl_skater_war: player_id:Int64, ev_off:Float64, ev_def:Float64, pp:Float64, pk:Float64, pens:Float64, faceoffs:Float64, gar:Float64, war:Float64. A zero-row frame with this schema (+ a cli_warn) when PWHL shift coverage is insufficient.

No returns table is published for this function: no capture: it expects NHL-style play-by-play columns (secondary_type, x_fixed, strength_state) that no PWHL loader provides, so it raises ColumnNotFoundError on real PWHL games.

Example

from sportsdataverse.pwhl.pwhl_player_impact import pwhl_skater_war
war = pwhl_skater_war(pbp, shifts)

pwhl_special_teams_value​

pwhl_special_teams_value(pbp: 'pl.DataFrame', shifts: 'pl.DataFrame', *, model_dir: "'str | None'" = None, **kwargs: 'Any') -> "'pl.DataFrame | pd.DataFrame'"

⑥ PWHL special-teams value -- shim over nhl_special_teams_value with league='pwhl'.

Guards on PWHL shift-chart coverage (see the module docstring).

Parameters

ParameterTypeDefaultDescription
pbpDataFramea PWHL play-by-play frame shaped like load_nhl_pbp_full.
shiftsDataFramea PWHL shift-chart frame shaped like load_nhl_shifts.
model_dirstr | NoneNonebooster directory passed through to the borrowed NHL xG boosters.

Returns

Same schema as nhl_special_teams_value: player_id:Int64, pp_toi_minutes:Float64, pk_toi_minutes:Float64, pp_value:Float64, pk_value:Float64. A zero-row frame with this schema (+ a cli_warn) when PWHL shift coverage is insufficient.

No returns table is published for this function: no capture: it expects NHL-style play-by-play columns (secondary_type, x_fixed, strength_state) that no PWHL loader provides, so it raises ColumnNotFoundError on real PWHL games.

Example

from sportsdataverse.pwhl.pwhl_player_impact import pwhl_special_teams_value
st = pwhl_special_teams_value(pbp, shifts)

pwhl_standings​

pwhl_standings(season: 'Optional[int]' = None, season_id: 'Optional[int]' = None, return_as_pandas: 'bool' = False) -> 'Any'

PWHL standings — one row per team.

Parameters

ParameterTypeDefaultDescription
seasonOptional[int]NoneSeason as an END year (2026 = the 2025-26 season). Defaults to the newest regular season when neither season nor season_id is given.
season_idOptional[int]NoneThe HockeyTech season id, when it is already known.
return_as_pandasboolFalseReturn a pandas DataFrame instead of polars.

Returns

One row per team: team, team_code, team_rank and wins (Int64), and games_played, losses, regulation_wins, non_reg_wins, non_reg_losses, points, goals_for, goals_against, games_remaining, percentage and overall_rank (String, as the feed ships them). A pandas DataFrame when return_as_pandas is True.

col_nametypedescription
team_codecharacterTeam abbreviation.
lossescharacterLosses.
regulation_winscharacterWins in regulation.
pointsintegerTotal points (goals + assists).
streak_wlcharacterPresent but unpopulated in the sampled PWHL standings (empty string in every row); the name suggests a win/loss streak, but no value was observed to confirm a format.
goals_forcharacterGoals for.
goals_againstcharacterGoals against.
non_reg_winscharacterNon-regulation wins.
non_reg_lossescharacterNon-regulation losses.
games_remainingcharacterGames remaining in the season.
percentagecharacterPoints percentage earned by the PWHL team (points divided by maximum possible points), expressed as a decimal between 0 and 1.
overall_rankcharacter
games_playedcharacterGames played.
team_rankintegerTeam rank in the standings.
teamcharacterTeam name.
winsintegerWins.

pwhl_stats​

pwhl_stats(season: 'Optional[int]' = None, season_id: 'Optional[int]' = None, position: 'str' = 'skaters', return_as_pandas: 'bool' = False) -> 'Any'

PWHL aggregate stats by season and position.

Parameters

ParameterTypeDefaultDescription
seasonOptional[int]NoneSeason as an END year (2026 = the 2025-26 season). Defaults to the newest regular season when neither season nor season_id is given.
season_idOptional[int]NoneThe HockeyTech season id, when it is already known.
positionstr'skaters'"skaters" (default) or "goalies".
return_as_pandasboolFalseReturn a pandas DataFrame instead of polars.

Returns

One row per player for that season and position, as the feed ships it (String, ~90 columns): player_id, name, team_id / team_name / team_code, position, games_played, and the counting, per-game and ice-time stats of that position (skaters: goals, assists, points, plus_minus, shots, hits, penalty_minutes ...). A pandas DataFrame when return_as_pandas is True.

col_nametypedescription
player_idcharacterUnique player identifier.
shortnamecharacterPlayer short name.
first_namecharacterPlayer first name.
last_namecharacterPlayer last name.
namecharacterPlayer full name (e.g. 'Jessie Eldridge').
phonetic_namecharacterPhonetic spelling of the player name.
activecharacterWhether athlete is currently active.
heightcharacterPlayer height as feet-and-inches text (e.g. 5'11), not a number of inches.
weightcharacterPlayer weight in pounds.
last_years_clubcharacterPlayer's club in the previous season.
agecharacterPlayer age.
shootscharacterShooting hand.
positioncharacterPlayer position.
suspension_games_remainingcharacterSuspension games remaining.
suspension_indefinitecharacterWhether the suspension is indefinite.
rookiecharacterWhether the player is a rookie.
veterancharacterHockeyTech veteran-status code as text ('1' or '2' in the captured rows; the feed does not document the codes), not a boolean.
draft_eligiblecharacterWhether the player is draft eligible.
jersey_numbercharacterJersey number.
team_namecharacterTeam name.
team_codecharacterTeam abbreviation.
team_idcharacterUnique team identifier.
divisioncharacterDivision name as text (e.g. 'PWHL'), not an identifier.
birthdatecharacterDate of birth.
birthdate_yearcharacterPlayer birth year.
hometowncharacterPlayer hometown as city and province, state or country abbreviation (e.g. 'Barrie, ON').
homeprovcharacterPlayer home province/state.
homecntrycharacterPlayer home country.
birthtowncharacterPlayer birth town.
birthprovcharacterPlayer birth province/state.
birthcntrycharacterPlayer birth country.
hometownprovcharacterPlayer hometown and province/state.
homeplacecharacterPlayer home place description.
games_playedcharacterGames played.
game_winning_goalscharacterGame-winning goals.
game_tieing_goalscharacterGame-tying goals.
first_goalscharacterFirst goals of a game.
insurance_goalscharacterInsurance goals.
unassisted_goalscharacterUnassisted goals.
empty_net_goalscharacterEmpty-net goals.
overtime_goalscharacterOvertime goals.
ice_timecharacterTotal ice time.
ice_time_avgcharacterAverage ice time.
goalscharacterGoals scored.
shotscharacterShots on goal.
loose_ball_recoveriescharacterLoose ball recoveries.
caused_turnoverscharacterTurnovers caused.
turnoverscharacterTurnovers committed.
hitscharacterHits.
shots_blocked_by_playercharacterShots blocked by the player.
ice_time_minutes_secondscharacterIce time in minutes and seconds.
shooting_percentagecharacterShooting percentage.
assistscharacterAssists.
pointscharacterTotal points (goals + assists).
points_per_gamecharacterPoints per game.
plus_minuscharacterPlus/minus rating.
penalty_minutescharacterPenalty minutes.
penalty_minutes_per_gamecharacterPenalty minutes per game.
ice_time_per_game_avgcharacterAverage ice time per game.
hits_per_game_avgcharacterAverage hits per game.
minor_penaltiescharacterMinor penalties.
major_penaltiescharacterMajor penalties.
power_play_goalscharacterPower-play goals.
power_play_assistscharacterPower-play assists.
power_play_pointscharacterPower play points.
short_handed_goalscharacterShort-handed goals.
short_handed_assistscharacterShort-handed assists.
short_handed_pointscharacterShort-handed points.
shootout_goalscharacterShootout goals.
shootout_attemptscharacterShootout attempts.
shootout_winning_goalscharacterShootout game-winning goals.
shootout_games_playedcharacterGames played that went to a shootout.
faceoff_attemptscharacterFaceoff attempts.
faceoff_winscharacterFaceoff wins.
faceoff_pctcharacterFaceoff win percentage.
faceoff_wacharacterFaceoff wins-to-attempts metric.
shots_oncharacterShots on goal count.
shootout_percentagecharacterShootout scoring percentage.
latest_team_idcharacterMost recent team identifier.
num_teamscharacterNumber of teams the player has played for.
logocharacterURL to the team logo.
rankinteger1-based position of the player in the feed's sorted stat table.
player_page_linkcharacterURL to the player page.
player_imagecharacterURL to the player's headshot image as served by the HockeyTech/PWHL data feed.
namelinkcharacterPlayer name as plain text (the text of the feed's player link; equals name in the captures), not HTML.
teamlinkcharacterHTML link for the team.
team_breakdownintegerPer-team statistical breakdown.
is_totaldoubleWhether the row is a season total.

pwhl_streaks​

pwhl_streaks(return_as_pandas: 'bool' = False) -> 'Any'

Current PWHL player/team streaks — non-functional: no such upstream view.

Parameters

ParameterTypeDefaultDescription
return_as_pandasboolFalseIf True return a pandas.DataFrame instead of a polars.DataFrame.

Returns

An empty frame (the upstream view does not exist).

pwhl_team_roster​

pwhl_team_roster(team_id: 'int', season: 'Optional[int]' = None, season_id: 'Optional[int]' = None, return_as_pandas: 'bool' = False) -> 'Any'

PWHL team roster for a given team + season.

Parameters

ParameterTypeDefaultDescription
team_idintThe HockeyTech team id.
seasonOptional[int]NoneSeason as an END year (2026 = the 2025-26 season). Defaults to the newest regular season when neither season nor season_id is given.
season_idOptional[int]NoneThe HockeyTech season id, when it is already known.
return_as_pandasboolFalseReturn a pandas DataFrame instead of polars.

Returns

One row per rostered player: player_id, person_id, names (first_name, last_name, display_name), position, tp_jersey_number, shoots / catches, height / weight, birthdate, home and birth places, rookie, veteran_status, draft_status and player_image (String, as the feed ships them). A pandas DataFrame when return_as_pandas is True.

col_nametypedescription
idcharacterUnique player identifier.
person_idcharacterUnique person identifier.
activecharacterWhether athlete is currently active.
first_namecharacterPlayer first name.
last_namecharacterPlayer last name.
phonetic_namecharacterPhonetic spelling of the player name.
display_namecharacterPlayer display name.
shootscharacterShooting hand.
hometowncharacterProspect hometown.
homeprovcharacterPlayer home province/state.
homecntrycharacterPlayer home country.
homeplacecharacterPlayer home place description.
birthtowncharacterPlayer birth town.
birthprovcharacterPlayer birth province/state.
birthcntrycharacterPlayer birth country.
birthplacecharacterCity, province/state, or country where the player was born, as recorded in the PWHL HockeyTech roster.
heightcharacterPlayer height in inches.
weightcharacterPlayer weight in pounds.
height_hyphenatedcharacterPlayer's height formatted as feet-inches with a hyphen separator (e.g., '5-9'), as supplied by the PWHL HockeyTech API.
hiddencharacterFlag indicating whether the player's roster entry is suppressed from public-facing displays in the PWHL HockeyTech system.
current_teamcharacterName or identifier of the PWHL team to which the player is currently rostered.
player_idcharacterUnique player identifier.
statuscharacterStatus string (e.g. captain markers).
birthdatecharacterDate of birth.
birthdate_yearcharacterPlayer birth year.
rawbirthdatecharacterPlayer's birth date as a raw string in the format returned by the PWHL HockeyTech API, typically YYYY-MM-DD.
latest_team_idcharacterMost recent team identifier.
veteran_statuscharacterPlayer veteran status.
veteran_descriptioncharacterText label or descriptor indicating the player's veteran status or experience classification in the PWHL.
team_idcharacterUnique team identifier.
team_namecharacterTeam name.
divisioncharacterDivision identifier.
tp_jersey_numbercharacterJersey number assigned to the player on the current PWHL team roster, as provided by the HockeyTech feed.
rookiecharacterWhether the player is a rookie.
position_idcharacterOfficial position identifier.
positioncharacterPlayer position.
nhlteamcharacterName or identifier of the NHL organization that holds the player's NHL rights, if applicable.
player_id_1characterAlternate or secondary HockeyTech player identifier, distinct from the primary person_id and player_id fields.
is_rookiecharacterWhether the player is a rookie.
hcharacter
wcharacter
draft_statuscharacterText description of the player's draft history or eligibility status (e.g., undrafted, drafted year and round).
namecharacterPlayer full name, first then last (e.g. 'Megan Keller').
player_imagecharacterURL of the player's official roster photograph from the PWHL HockeyTech feed.
catchescharacterCatching hand (goalies).

pwhl_teams​

pwhl_teams(season: 'Optional[int]' = None, season_id: 'Optional[int]' = None, return_as_pandas: 'bool' = False) -> 'Any'

PWHL teams for a given season.

Parameters

ParameterTypeDefaultDescription
seasonOptional[int]NoneSeason as an END year (2026 = the 2025-26 season). Defaults to the newest regular season when neither season nor season_id is given.
season_idOptional[int]NoneThe HockeyTech season id, when it is already known.
return_as_pandasboolFalseReturn a pandas DataFrame instead of polars.

Returns

One row per team: team_id, team_name, team_code, team_nickname, team_label, division and team_logo (String). A pandas DataFrame when return_as_pandas is True.

col_nametypedescription
team_namecharacterTeam name.
team_idcharacterUnique team identifier.
team_codecharacterTeam abbreviation.
team_nicknamecharacterTeam nickname.
team_labelcharacterShort city label.
divisioncharacterDivision identifier.
team_logocharacterURL to the team logo image.

pwhl_transactions​

pwhl_transactions(return_as_pandas: 'bool' = False) -> 'Any'

PWHL roster transactions.

Parameters

ParameterTypeDefaultDescription
return_as_pandasboolFalseReturn a pandas DataFrame instead of polars.

Returns

One row per transaction on the feed's current page (the newest 20): transaction_date / transaction_time, transaction_type / ttype_text, title, detail, player_id / player_name / position, and team_id / team_name / team_code / team_city (String). A pandas DataFrame when return_as_pandas is True.

pwhl_unit_ratings​

pwhl_unit_ratings(pbp: 'pl.DataFrame', shifts: 'pl.DataFrame', *, model_dir: "'str | None'" = None, **kwargs: 'Any') -> "'pl.DataFrame | pd.DataFrame'"

⑤ PWHL line/pair ratings -- shim over nhl_unit_ratings with league='pwhl'.

Guards on PWHL shift-chart coverage (see the module docstring).

Parameters

ParameterTypeDefaultDescription
pbpDataFramea PWHL play-by-play frame shaped like load_nhl_pbp_full.
shiftsDataFramea PWHL shift-chart frame shaped like load_nhl_shifts.
model_dirstr | NoneNonebooster directory passed through to the borrowed NHL xG boosters.

Returns

Same schema as nhl_unit_ratings: team:Utf8, unit_ids:Utf8, unit_players:Utf8, toi_minutes:Float64, on_ice_xgf:Float64, on_ice_xga:Float64, on_ice_xgf_pct:Float64, summed_rapm:Float64, unit_value:Float64. A zero-row frame with this schema (+ a cli_warn) when PWHL shift coverage is insufficient.

No returns table is published for this function: no capture: it expects NHL-style play-by-play columns (secondary_type, x_fixed, strength_state) that no PWHL loader provides, so it raises ColumnNotFoundError on real PWHL games.

Example

from sportsdataverse.pwhl.pwhl_player_impact import pwhl_unit_ratings
units = pwhl_unit_ratings(pbp, shifts)