CoolFace
Datasetpublic

luxury-lakehouse/xg-shot-freeze-frames

Pre-Shot xG v3 — Shot Freeze Frames (Context Corpus) The context half of the training corpus for xg_model_v3, the canonical-SPADL-native pre-shot expected goals model from the luxury-lakehouse analytics platform. One row per (shot, player) — every player present in the shot's freeze frame is a row. The provider is the data_source column, not a separate file format. Sourced from bronze.shot_freeze_frames. Each shot's freeze-frame player set is joinable to its tabular shot record… See the full description on the dataset page: https://huggingface.co/datasets/luxury-lakehouse/xg-shot-freeze-frames.

sourceHugging Facecc-by-nc-4.0updated 1mo agoView on Hugging Face
0likes33downloads
Dataset Card

Pre-Shot xG v3 — Shot Freeze Frames (Context Corpus)

The context half of the training corpus for xg_model_v3, the canonical-SPADL-native pre-shot expected goals model from the luxury-lakehouse analytics platform. One row per (shot, player) — every player present in the shot's freeze frame is a row. The provider is the data_source column, not a separate file format. Sourced from bronze.shot_freeze_frames.

Each shot's freeze-frame player set is joinable to its tabular shot record (dataset `xg-shot-data-v3`) on the shot identity `(match_key, action_id)` — action_id is per-match, NOT globally unique, so both keys are always required. The set encoder in xg_model_v3 sum-aggregates this player set into the shot's context vector.

Columns / contract

ColumnTypeMeaning
match_keyBIGINTKimball match surrogate — half of the shot identity
action_idBIGINTPer-match SPADL action id — the other half of the shot identity
data_sourceSTRINGProvider (statsbomb, skillcorner, gradientsports, ...)
player_idSTRINGPlayer present in this shot's freeze frame
xDOUBLEPlayer x, canonical SPADL 105×68, home-LTR (goal at x=105)
yDOUBLEPlayer y, canonical SPADL 105×68
is_keeperINT1 if this player is a goalkeeper, else 0
is_teammateINT1 if this player is on the shooting team, else 0
set_cardinalityINTNumber of players in this shot's freeze-frame set
shooter_attacks_high_xBOOLEANWhether the shooting team attacks the HIGH-x goal in the canonical home-LTR frame (per-shot orientation; may be NULL when it could not be derived)
team_attacking_directionSTRINGProvenance string the shooter_attacks_high_x flag is derived from

Coordinates are canonical SPADL 105×68, home-LTR — no provider is bent to StatsBomb units. StatsBomb-360 freeze frames (raw 120×80) are converted at compute time. One row per (shot, player); the ball row is dropped and the shooter is always included (the sum-aggregation requires actor-inclusion consistency across sources). (access_tier is used internally for the public/restricted split and is dropped before upload.)

Public / restricted split

RM SkillCorner and GradientSports partitions are license-restricted: they publish to a private org-members-only companion repo (`xg-shot-freeze-frames-restricted`) rather than this public dataset, per lakehouse ADR-049 / ADR-064. StatsBomb-360 freeze frames are public. The split is per-row (per-match access_tier), so a public-licensed SkillCorner match publishes here while a restricted one goes to the companion. A partition migrates here automatically once its license permits public redistribution. The `xg_model_v3` trainer reads BOTH repos.

Quick Start

Every row carries a data_source column. The dataset is split into one config per provider, so you can pull a single provider without downloading the rest:

python
from datasets import load_dataset

# All public providers at once (config "all" — the default):
ds = load_dataset("luxury-lakehouse/xg-shot-freeze-frames", "all", split="train")
df = ds.to_pandas()
print(df["data_source"].value_counts())

# Just one provider (downloads only that provider's parquet):
sb = load_dataset("luxury-lakehouse/xg-shot-freeze-frames", "statsbomb", split="train").to_pandas()

# Reassemble a single shot's freeze-frame set:
shot = sb[(sb["match_key"] == 12345) & (sb["action_id"] == 678)]

Related artifacts

Citation

bibtex
@software{luxury_lakehouse,
  title  = {Luxury Lakehouse — Serverless Soccer Analytics Platform},
  url    = {https://github.com/karsten-s-nielsen/luxury-lakehouse}
}

License

CC-BY-NC-4.0 — see repository for details.