CoolFace
Datasetpublic

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.

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

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

ColumnTypeMeaning
match_keyBIGINTKimball match surrogate — half of the shot identity
action_idBIGINTPer-match SPADL action id — the other half of the shot identity
action_typeSTRINGshot, shot_freekick, or shot_penalty
action_resultSTRINGOutcome; success = goal (the training label)
start_xDOUBLEShot origin x, canonical SPADL 105×68 (goal at x=105)
start_yDOUBLEShot origin y, canonical SPADL 105×68
data_sourceSTRINGProvider (statsbomb, wyscout, skillcorner, idsse, metrica, ...)

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:

python
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

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.