CoolFace
Datasetpublic

luxury-lakehouse/spadl-vaep-action-values

SPADL/VAEP Action Values Every on-ball action from ~9.5 million professional soccer events, converted to the SPADL unified format and scored with offensive, defensive, and net VAEP values. Built with the silly-kicks library — enabling player ranking by total contribution beyond goals and assists. Part of the (Right! Luxury!) Lakehouse soccer analytics platform. ⚠️ Schema change (cut-over 2026-07-22) This dataset now emits both legacy and canonical Kimball key… See the full description on the dataset page: https://huggingface.co/datasets/luxury-lakehouse/spadl-vaep-action-values.

sourceHugging Facemitupdated 1mo agoView on Hugging Face
0likes67downloads
Dataset Card

SPADL/VAEP Action Values

Every on-ball action from ~9.5 million professional soccer events, converted to the SPADL unified format and scored with offensive, defensive, and net VAEP values. Built with the silly-kicks library — enabling player ranking by total contribution beyond goals and assists.

Part of the (Right! Luxury!) Lakehouse soccer analytics platform.

⚠️ Schema change (cut-over 2026-07-22)

This dataset now emits both legacy and canonical Kimball key columns side-by-side. The legacy columns will be removed on 2026-07-22 (90-day dual-column window opened at the PR 4b ship on 2026-04-24, per ADR-011):

Legacy columnCanonical replacementNotes
match_idmatch_keyBIGINT Kimball surrogate; collision-free across providers
competition_idcompetition_keyBIGINT Kimball surrogate

Both columns are populated during the window. Update consumer code to read the canonical match_key / competition_key columns before the cut-over date; after cut-over the legacy columns are removed.

Quick Start

python
from datasets import load_dataset

ds = load_dataset("luxury-lakehouse/spadl-vaep-action-values")
df = ds["train"].to_pandas()

# Top 10 players by total VAEP contribution
top_players = df.groupby("player_id")["vaep_value"].sum().nlargest(10)
Explore interactively: Soccer Analytics App

What is SPADL/VAEP?

SPADL (Soccer Player Action Description Language) is a unified event representation that converts vendor-specific event streams into 23 canonical action types with standardized coordinates (105×68 meters). This enables cross-source analysis that would otherwise require bespoke adapters per data provider.

VAEP (Valuing Actions by Estimating Probabilities) scores each action by its impact on scoring and conceding probabilities, as described in:

Decroos, T., Bransen, L., Van Haaren, J., & Davis, J. (2019). Actions Speak Louder than Goals: Valuing Player Actions in Soccer. Proceedings of the 25th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining.

Data Fields

ColumnTypeDescription
action_value_idstringSurrogate key (deterministic hash of matchid + period + timeseconds + playerid + typeid + data_source)
match_keybigintCanonical Kimball match FK (ADR-011). BIGINT surrogate, collision-free across providers.
competition_keybigintCanonical Kimball competition FK. BIGINT surrogate.
player_keybigintCanonical Kimball player FK (PR 7, ADR-011). BIGINT surrogate.
team_keybigintCanonical Kimball team FK (PR 7, ADR-011). BIGINT surrogate.
match_idbigintLEGACY provider-native match identifier; sunset 2026-07-22 (see top-of-card).
player_idbigintPlayer identifier (source-native)
team_idbigintTeam identifier (provider-native)
competition_idbigintLEGACY provider-native competition identifier; sunset 2026-07-22 (see top-of-card).
season_idbigintSeason identifier
periodintMatch period (1 = first half, 2 = second half, 3+ = extra time)
time_secondsdoubleElapsed time within the period in seconds
minuteintMatch minute
secondintSecond within the minute
start_xdoubleAction start x-coordinate (meters, 0–105)
start_ydoubleAction start y-coordinate (meters, 0–68)
end_xdoubleAction end x-coordinate (meters, 0–105)
end_ydoubleAction end y-coordinate (meters, 0–68)
action_typestringSPADL action type (see vocabulary below)
action_resultstringAction outcome (success, fail, offside, owngoal, yellowcard, redcard)
result_sourcestringProvenance tier of action_result (silly-kicks 4.21+): native (provider-flagged), inferred (derived from follow-on events), stopgap (heuristic fallback). NULL on synthesized dribbles.
bodypartstringBody part used (foot, head, other, head/other)
offensive_valuedoubleVAEP offensive value — change in scoring probability
defensive_valuedoubleVAEP defensive value — change in conceding probability
vaep_valuedoubleNet VAEP value (offensivevalue + defensivevalue)
data_sourcestringOrigin data provider — partition key (statsbomb, wyscout, idsse, metrica, skillcorner)
original_event_idstringEvent ID from the source provider
gk_pass_length_mdoubleGVM goalkeeper-distribution pass length in metres (Euclidean start→end); null except on GK distribution passes (silly-kicks 4.31.0, Lamberts 2025; ADR-056).
gk_pass_length_classstringGVM distribution length bucket: short / medium / long; null off GK distribution passes.
is_launchbooleanGVM: a long deliberate-distribution launch (length above the long threshold).
gk_xt_deltadoubleGVM xT delta (start→end zone) on the lakehouse's canonical 12×8 xT grid; non-null only on successful GK distribution passes — single xT source of truth, derived in dbt (ADR-056).

Coordinate System

All coordinates use the SPADL academic standard: 105×68 meters representing real-world pitch dimensions. The origin (0, 0) is at the bottom-left corner of the attacking team's half. The x-axis runs along the length of the pitch (0–105m), and the y-axis runs along the width (0–68m).

Action Type Vocabulary

SPADL defines 23 canonical action types:

pass, cross, throw_in, freekick_crossed, freekick_short, corner_crossed, corner_short, take_on, foul, tackle, interception, shot, shot_penalty, shot_freekick, keeper_save, keeper_claim, keeper_punch, keeper_pick_up, clearance, bad_touch, non_action, dribble, goalkick

Data Sources

Partitioned by data_source (data/data_source=<provider>/data.parquet):

SourceMatchesLicense
StatsBomb Open Data~3,460CC-BY 4.0
Wyscout Public Dataset~1,940CC-BY-NC 4.0
IDSSE (DFL / Bundesliga open research dataset)7Research use
Metrica Sports Sample Data3Open sample
SkillCorner Open Data (A-League)10Research use

Coverage includes the Premier League, La Liga, Serie A, Bundesliga, Ligue 1, Champions League, World Cup, and more. One additional provider (GradientSports / PFF FC, FIFA World Cup 2022) is computed internally but license-restricted and therefore not included in this public dataset.

Limitations

  • —Open data only: Built from publicly available event data. Commercial datasets with richer event annotations may yield different VAEP scores.
  • —No tracking data: VAEP is event-based. Off-ball positioning, pressing intensity, and space creation are not captured.
  • —Competition-agnostic model: The underlying XGBoost model is trained across all competitions jointly. League-specific models may produce more calibrated probabilities.
  • —Cross-source alignment: Providers use different event taxonomies. The SPADL adapter normalizes them, but subtle differences in event definitions (e.g., duel classification) remain.

Citation

If you use this dataset, please cite the original VAEP paper:

bibtex
@inproceedings{decroos2019actions,
  title={Actions Speak Louder than Goals: Valuing Player Actions in Soccer},
  author={Decroos, Tom and Bransen, Lotte and Van Haaren, Jan and Davis, Jesse},
  booktitle={Proceedings of the 25th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining},
  pages={1851--1861},
  year={2019},
  publisher={ACM}
}

And the silly-kicks library:

bibtex
@article{silly-kicks,
  title={silly-kicks: A Python library for valuing soccer actions},
  author={Decroos, Tom and Van Haaren, Jan and Davis, Jesse},
  year={2020},
  url={https://github.com/karsten-s-nielsen/silly-kicks}
}

Companion Resources

ResourceTypeDescription
VAEP ModelModelP(scores) + P(concedes) XGBClassifiers trained on this dataset
Player EmbeddingsDatasetBehavioral + statistical vectors derived from SPADL actions

More Information

Explore interactively: Soccer Analytics App

ADR-049 changelog (2026-06-10)

The dataset is now published via the restricted-split mechanism (lakehouse ADR-049): the publisher pulls all providers from the gold mart and routes license-restricted partitions (currently GradientSports) to a private companion repo, with everything else published here. The partition layout is data/data_source=<provider>/data.parquet; legacy stray Parquet files inside partition directories were swept in the same change — glob data/*/data.parquet, not **/*.parquet. The schema also gains result_source (provenance tier of action_result, silly-kicks 4.21+; see Data Fields).

PR 7 changelog (2026-04-27)

The upstream gold mart fct_action_values (9.5M-row VAEP spine) now carries Kimball surrogate FKs (team_key, player_key) alongside the existing match_key (PR 4b) and the legacy team_id/player_id INT columns during the 2026-07-22 dual-column window per ADR-011. SPADL covers SB+WS providers only; native team/player IDs are real BIGINTs cast to string for the dim JOINs. PR 8 will sunset the legacy *_id columns post-2026-07-22.

  • —License: MIT