luxury-lakehouse/xg-shot-data-v3
Pre-Shot xG v3 — Shot Data (Tabular Corpus) The tabular 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, all providers — the provider is the data_source column, not a separate file format. Sourced from the gold fct_action_values fact. Each shot is joinable to its freeze-frame player set (dataset xg-shot-freeze-frames) and to the full action-level corpus… See the full description on the dataset page: https://huggingface.co/datasets/luxury-lakehouse/xg-shot-data-v3.
Pre-Shot xG v3 — Shot Data (Tabular Corpus)
The tabular 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, all providers — the provider is the data_source column, not a separate file format. Sourced from the gold fct_action_values fact.
Each shot is joinable to its freeze-frame player set (dataset `xg-shot-freeze-frames`) and to the full action-level corpus (spadl-vaep-action-values) on the shot identity `(match_key, action_id)` — action_id is per-match, NOT globally unique, so both keys are always required.
Shot family
Rows cover action_type ∈ {shot, shot_freekick, shot_penalty}. Penalties are included here so the downstream xG scorer's constant-penalty path has rows; the xg_model_v3 trainer excludes shot_penalty from the model itself and assigns it a constant penalty-xG at scoring time. The goal label is action_result == 'success'.
Columns / contract
Coordinates are canonical SPADL 105×68, home-LTR — no provider is bent to StatsBomb units. (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-data-v3-restricted`) rather than this public dataset, per lakehouse ADR-049 / ADR-064. 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:
from datasets import load_dataset
# All public providers at once (config "all" — the default):
ds = load_dataset("luxury-lakehouse/xg-shot-data-v3", "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-data-v3", "statsbomb", split="train").to_pandas()Related artifacts
- `xg-shot-freeze-frames` — the per-shot freeze-frame player set (the context half of the corpus), joined on
(match_key, action_id) - `spadl-vaep-action-values` — the full action-level value corpus
Citation
@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.
