Skip to main content

GENIUS — additional Python functions — Genius Sports LiveStats: wbbl_shots–wbbl_team

wbbl_shots​

wbbl_shots(match_id: 'int', *, return_parsed: 'bool' = True, return_as_pandas: 'bool' = False, **kwargs: 'Any') -> 'Union[pl.DataFrame, pd.DataFrame, Dict]'

Shot chart of a finished Women's British Basketball League game.

Women's British Basketball League (women's); season rule: END year; the label span 2025-26 = 2026.

Convenience wrapper: a thin binding of genius_shots to this competition, minted from the competition registry (tools/codegen/basketball_competitions.yaml).

Read before use: Access (sdv-internal-refs/genius-livestats/README.md): the Genius hosts publish no robots.txt and no terms. CloudFront refuses datacenter IPs on the LiveStats and hosted hosts: from a server set the optional GENIUS_PROXY environment variable to an http(s) proxy URL (it is never logged or printed). The wrappers space requests at least one second apart and read only the Genius hosts; keep crawls slow and incremental. Some league sites (the NZ NBL) forbid AI crawlers in their own robots.txt, which does not cover these hosts. Genius match ids are one global sequence shared by every customer, and data.json names no competition, so the id is checked on the game's LiveStats shell (/u/WBBL/<match_id>/: one extra request per game, cached per process): its competition name must pass the label rule. genius_shots(match_id=...) reads any game unchecked. Women's competition data: flagged for the wehoop mirror (Phase C).

Parameters

ParameterTypeDefaultDescription
match_idintGenius match id (match_id in the schedule) of a game of this competition.
return_parsedboolTrueparse into a polars DataFrame (default True); False returns the raw body.
return_as_pandasboolFalsewith return_parsed, return a pandas DataFrame instead of polars.

Returns

A polars/pandas DataFrame by default; the body or page record (dict / list): data.json as served plus _request (the match id asked for), or the sdv-internal-refs capture shape of a page when return_parsed=False.

col_nametypedescription
match_idintegerGenius match id of the game. data.json does not carry it: it is the match_id asked for, stamped by the runtime (the global match sequence shared by every Genius customer).
tnointegerTeam number within this game: 1 = the team listed first (home on the hosted schedule and widget), 2 = the other, 0 = no team. In-game only: not a team id.
pnointegerPlayer number within this game, the key of the team's player map; 0 = no player. In-game only: not a person id and not the shirt number.
action_numberintegerAction sequence number, unique within the game (gaps where actions were deleted); a shot joins its play-by-play row on it. Null in the 2014-15 feed.
periodintegerPeriod number; restarts at 1 for the first overtime (read it with period_type).
period_typecharacterPeriod type: REGULAR or OVERTIME.
action_typecharacterShot value: 2pt or 3pt
sub_typecharacterShot type (layup, drivinglayup, jumpshot, pullupjumpshot, dunk, ...)
resultintegerShot result: 1 = made, 0 = missed.
xnumericCourt x, PERCENT of the full court length (0-100, float), along the long axis. Not normalised to one basket: a team attacks one end in periods 1-2 and the other end in periods 3-4 (ESAKE 2902690: team 1 mean x 90 and 86 in P1-P2, 11 and 19 in P3-P4). Which end x = 0 is, and which end team 1 starts at, are unverified
ynumericCourt y, PERCENT of the full court width (0-100, float), across the court (observed 1.7-97.2). Origin side unverified
playercharacterShooter's display name as the org enters it, in the local script when it uses one.
shirt_numbercharacterShooter's shirt number (string)

Raises

ExceptionDescription
NoDataErrorThe host answered 404 -- the requested resource does not exist. Genius has nothing for the request (an unknown match id or ORG, an org without hosted pages, a competition with no games).
AssetFetchErrorThe fetch failed (a non-2xx answer or a connection failure after retries, e.g. 401/403/429/5xx, or an empty or unreadable 200 body) -- the answer is unknown, not empty. The fetch failed (the CloudFront block, a rate limit, a 5xx), the game is not finished, or the body is for another match, competition or ORG. The match is not a game of this competition (another org's game, or a cup or play-off of WBBL), or the scope check could not run (the /u/ shell request failed twice or names no competition).
ValueErrorThe host answered 400 / 422 -- the request is wrong; retrying cannot help.

Example

from sportsdataverse.basketball.genius import wbbl_schedule, wbbl_shots
games = wbbl_schedule()
wbbl_shots(match_id=int(games['match_id'][0]))

wbbl_team_box​

wbbl_team_box(match_id: 'int', *, return_parsed: 'bool' = True, return_as_pandas: 'bool' = False, **kwargs: 'Any') -> 'Union[pl.DataFrame, pd.DataFrame, Dict]'

Team box score of a finished Women's British Basketball League game.

Women's British Basketball League (women's); season rule: END year; the label span 2025-26 = 2026.

Convenience wrapper: a thin binding of genius_team_box to this competition, minted from the competition registry (tools/codegen/basketball_competitions.yaml).

Read before use: Access (sdv-internal-refs/genius-livestats/README.md): the Genius hosts publish no robots.txt and no terms. CloudFront refuses datacenter IPs on the LiveStats and hosted hosts: from a server set the optional GENIUS_PROXY environment variable to an http(s) proxy URL (it is never logged or printed). The wrappers space requests at least one second apart and read only the Genius hosts; keep crawls slow and incremental. Some league sites (the NZ NBL) forbid AI crawlers in their own robots.txt, which does not cover these hosts. Genius match ids are one global sequence shared by every customer, and data.json names no competition, so the id is checked on the game's LiveStats shell (/u/WBBL/<match_id>/: one extra request per game, cached per process): its competition name must pass the label rule. genius_team_box(match_id=...) reads any game unchecked. Women's competition data: flagged for the wehoop mirror (Phase C).

Parameters

ParameterTypeDefaultDescription
match_idintGenius match id (match_id in the schedule) of a game of this competition.
return_parsedboolTrueparse into a polars DataFrame (default True); False returns the raw body.
return_as_pandasboolFalsewith return_parsed, return a pandas DataFrame instead of polars.

Returns

A polars/pandas DataFrame by default; the body or page record (dict / list): data.json as served plus _request (the match id asked for), or the sdv-internal-refs capture shape of a page when return_parsed=False.

col_nametypedescription
match_idintegerGenius match id of the game. data.json does not carry it: it is the match_id asked for, stamped by the runtime (the global match sequence shared by every Genius customer).
tnointegerTeam number within this game: 1 = the team listed first (home on the hosted schedule and widget), 2 = the other, 0 = no team. In-game only: not a team id.
namecharacterTeam name as the org enters it
name_internationalcharacterTeam name in Latin script
short_namecharacterShort team name (shortName in the feed), in the competition's own script when the org enters one.
codecharacterTeam code, three letters as entered (may be in the local script, e.g. Greek 'ΑΕΚ')
code_internationalcharacterTeam code in Latin script
coachcharacterHead coach display name
scoreintegerTeam points (current or final); a numeric string in the 2014-15 era sample (WBBL 12248), an integer since
full_scoreintegerTeam points including overtime; equal to score in every sample (a numeric string in the 2014-15 era)
p1_scoreintegerPoints scored in period 1 (a numeric string in the 2014-15 era)
p2_scoreintegerPoints scored in period 2 (a numeric string in the 2014-15 era)
p3_scoreintegerPoints scored in period 3 (a numeric string in the 2014-15 era)
p4_scoreintegerPoints scored in period 4 (a numeric string in the 2014-15 era)
ot_scoreintegerPoints the team scored in overtime; null without overtime. Whether several overtimes are summed is unverified.
foulsintegerTeam fouls in the current (last) period
timeoutsintegerTimeouts counter of the current period (unverified: remaining vs taken); 0 in every sampled (finished) game
minutescharacterMinutes as the feed prints them, an 'mm:ss' text (can exceed 59 for a team; '199:60' happens); the text of an integer when the feed sends one.
seconds_playedintegerSeconds played parsed from the printed mm:ss text as minutes * 60 + seconds (so '224:60' gives 13500); null when the feed sent an integer, whose unit is unknown.
field_goals_madeintegerTeam total: field goals made
field_goals_attemptedintegerTeam total: field goals attempted
field_goals_percentagenumericTeam total: field-goal percentage, 0-100, rounded to an integer by the feed
three_pointers_madeintegerTeam total: three-pointers made
three_pointers_attemptedintegerTeam total: three-pointers attempted
three_pointers_percentagenumericTeam total: three-point percentage, 0-100, rounded to an integer
two_pointers_madeintegerTeam total: two-pointers made
two_pointers_attemptedintegerTeam total: two-pointers attempted
two_pointers_percentagenumericTeam total: two-point percentage, 0-100, rounded to an integer
free_throws_madeintegerTeam total: free throws made
free_throws_attemptedintegerTeam total: free throws attempted
free_throws_percentagenumericTeam total: free-throw percentage, 0-100, rounded to an integer
rebounds_defensiveintegerTeam total: defensive rebounds
rebounds_offensiveintegerTeam total: offensive rebounds
rebounds_totalintegerTeam total: total rebounds
assistsintegerTeam total: assists
turnoversintegerTeam total: turnovers
stealsintegerTeam total: steals
blocksintegerTeam total: blocks made
blocks_receivedintegerTeam total: own shots blocked by an opponent
fouls_personalintegerTeam total: personal fouls committed
fouls_onintegerTeam total: fouls drawn
pointsintegerTeam total: points
points_from_turnoversintegerTeam total: points off turnovers
points_second_chanceintegerTeam total: second-chance points
points_fast_breakintegerTeam total: fast-break points
points_in_the_paintintegerTeam total: points in the paint
eff_1integerGenius efficiency formula 1. The feed carries seven formulas (eff_1..eff_7) with no labels; the definitions are not published. In samples eff_1/eff_6/eff_7 often agree (an index-rating style total), eff_3/eff_4 are decimals. Unverified: do not treat any as PIR/EFF without checking against a league site (team total). Absent in the 2014-15 era sample (WBBL 12248), which carries eff_1..eff_6 on players and no team tot_eff_*
eff_2integerGenius efficiency formula 2. The feed carries seven formulas (eff_1..eff_7) with no labels; the definitions are not published. In samples eff_1/eff_6/eff_7 often agree (an index-rating style total), eff_3/eff_4 are decimals. Unverified: do not treat any as PIR/EFF without checking against a league site (team total). Team tot_eff_2 is 2 in every 2016+ sample (a constant, not a stat). Absent in the 2014-15 era sample (WBBL 12248), which carries eff_1..eff_6 on players and no team tot_eff_*
eff_3numericGenius efficiency formula 3. The feed carries seven formulas (eff_1..eff_7) with no labels; the definitions are not published. In samples eff_1/eff_6/eff_7 often agree (an index-rating style total), eff_3/eff_4 are decimals. Unverified: do not treat any as PIR/EFF without checking against a league site (team total). Absent in the 2014-15 era sample (WBBL 12248), which carries eff_1..eff_6 on players and no team tot_eff_*
eff_4numericGenius efficiency formula 4. The feed carries seven formulas (eff_1..eff_7) with no labels; the definitions are not published. In samples eff_1/eff_6/eff_7 often agree (an index-rating style total), eff_3/eff_4 are decimals. Unverified: do not treat any as PIR/EFF without checking against a league site (team total). Absent in the 2014-15 era sample (WBBL 12248), which carries eff_1..eff_6 on players and no team tot_eff_*
eff_5integerGenius efficiency formula 5. The feed carries seven formulas (eff_1..eff_7) with no labels; the definitions are not published. In samples eff_1/eff_6/eff_7 often agree (an index-rating style total), eff_3/eff_4 are decimals. Unverified: do not treat any as PIR/EFF without checking against a league site (team total). Absent in the 2014-15 era sample (WBBL 12248), which carries eff_1..eff_6 on players and no team tot_eff_*
eff_6integerGenius efficiency formula 6. The feed carries seven formulas (eff_1..eff_7) with no labels; the definitions are not published. In samples eff_1/eff_6/eff_7 often agree (an index-rating style total), eff_3/eff_4 are decimals. Unverified: do not treat any as PIR/EFF without checking against a league site (team total). Absent in the 2014-15 era sample (WBBL 12248), which carries eff_1..eff_6 on players and no team tot_eff_*
eff_7integerGenius efficiency formula 7. The feed carries seven formulas (eff_1..eff_7) with no labels; the definitions are not published. In samples eff_1/eff_6/eff_7 often agree (an index-rating style total), eff_3/eff_4 are decimals. Unverified: do not treat any as PIR/EFF without checking against a league site (team total). Absent in the 2014-15 era sample (WBBL 12248), which carries eff_1..eff_6 on players and no team tot_eff_*
bench_pointsintegerTeam total: points scored by non-starters
biggest_leadintegerTeam total: biggest lead, points
biggest_scoring_runintegerTeam total: biggest unanswered scoring run, points
lead_changesintegerTeam total: lead changes in the game (same value on both teams)
times_scores_levelintegerTeam total: times the score was tied (same value on both teams)
time_leadingnumericTeam total: minutes the team led, decimal minutes (33.58 = 33 min 35 s)
fouls_teamintegerTeam total: team (bench) fouls
fouls_totalintegerTeam total: all fouls committed (personal + technical + team bench)
rebounds_teamintegerTeam total: team rebounds (credited to no player)
rebounds_team_defensiveintegerTeam total: team defensive rebounds
rebounds_team_offensiveintegerTeam total: team offensive rebounds
turnovers_teamintegerTeam total: team turnovers (credited to no player, e.g. shot clock)

Raises

ExceptionDescription
NoDataErrorThe host answered 404 -- the requested resource does not exist. Genius has nothing for the request (an unknown match id or ORG, an org without hosted pages, a competition with no games).
AssetFetchErrorThe fetch failed (a non-2xx answer or a connection failure after retries, e.g. 401/403/429/5xx, or an empty or unreadable 200 body) -- the answer is unknown, not empty. The fetch failed (the CloudFront block, a rate limit, a 5xx), the game is not finished, or the body is for another match, competition or ORG. The match is not a game of this competition (another org's game, or a cup or play-off of WBBL), or the scope check could not run (the /u/ shell request failed twice or names no competition).
ValueErrorThe host answered 400 / 422 -- the request is wrong; retrying cannot help.

Example

from sportsdataverse.basketball.genius import wbbl_schedule, wbbl_team_box
games = wbbl_schedule()
wbbl_team_box(match_id=int(games['match_id'][0]))