Skip to main content

Silly Kicks

The Modern SPADL Analyst vs The Chief SPADL Evaluator & Classifier Comic by NanoBanana — inspired by Monty Python's Ministry of Silly Walks

CI

The Ministry requires that all football actions be properly classified and valued.

silly-kicks is a Python library for objectively quantifying the impact of individual actions performed by football players using event stream data.

It is an independently maintained successor to socceraction, originally developed by Tom Decroos and Pieter Robberechts at KU Leuven. Built under the MIT license with full attribution preserved.

Features

  • SPADL -- Soccer Player Action Description Language: a unified schema for on-ball actions with dedicated DataFrame converters for StatsBomb, Wyscout, Opta, Sportec / IDSSE Bundesliga, Metrica Sports, Gradient Sports, and SkillCorner — plus a kloppy gateway for raw-provider-data consumers (StatsBomb, Sportec, Metrica)
  • Tracking -- 20-column long-form per-frame schema parallel to SPADL, with native adapters for Sportec / IDSSE Bundesliga, Gradient Sports, SkillCorner, and Metrica plus a kloppy gateway (Metrica + SkillCorner) for raw-TrackingDataset consumers. Key capabilities: action-to-frame linkage, frame preprocessing (smoothing, interpolation, velocities), GK identification, defensive-line geometry, ball-carrier inference, and 40+ tracking-aware action-context features for HybridVAEP integration including pitch control (Spearman / Fernández-Bornn / Voronoi), GK influence primitives (GKDV Layer 1), pressure (three published methods), pre-shot GK position/angles, pre-action movement, off-ball runs, line-break detection (threshold + Ward clustering), and team shape envelope. Full feature inventory in the CHANGELOG.
  • VAEP -- Valuing Actions by Estimating Probabilities: a framework for quantifying the value of individual actions
  • Atomic SPADL -- continuous (non-discretized) action representation
  • xT -- Expected Threat with a pluggable transition family (Singh counts / KDE-smoothed) and value iteration on a variable-resolution grid, plus a held-out transition-NLL evaluator
  • xT-GK -- goalkeeper-distribution value. v1 (tracking/_xt_gk.py) is a parametric per-action metric whose RAV term consumes the bundled GkCompletionModel; v2 (xtgk/) is a pressure-stratified possession-value surface V(z, p) and the metric built on it
  • GKDV -- GK Deterrent Value: counterfactual valuation of keeper positioning against a league-average "ghost" keeper in the same frame state
  • Causal -- a propensity-score matching harness (ATT/ATNT with Abadie-Imbens standard errors) used to validate feature claims rather than assert them. Adds no new dependency -- pure numpy/scikit-learn, no R -- which is not the same as dependency-free
  • Feature glossary -- a machine-readable registry of every derived column the library emits, CI-gated for completeness and linked to NOTICE attributions
  • Providers -- raw-data parse ports (bytes → bronze → converter input). Two so far: Sportec/DFL (behind the [parse-dfl] extra), and StatsBomb SB360 freeze-frames → tracking frames + visible_area polygons (no extra)
  • Calibration -- an Optuna harness that recommends tuned defaults and never changes library constants

Installation

pip install silly-kicks

Requires Python 3.10 or later.

With optional provider support:

pip install "silly-kicks[kloppy,xgboost]"

Quick Start

import silly_kicks.spadl as spadl

# Convert StatsBomb events to SPADL actions
actions, report = spadl.statsbomb.convert_to_actions(events, home_team_id=123)

# Add human-readable names
actions = spadl.add_names(actions)

VAEP Workflow

The full pipeline: convert provider events to SPADL, train a VAEP model, and rate individual actions.

from silly_kicks.spadl import statsbomb
from silly_kicks.vaep import VAEP

# 1. Convert provider events to SPADL
actions, report = statsbomb.convert_to_actions(
    events_df, home_team_id=home_team_id,
    xy_fidelity_version=2, shot_fidelity_version=2,
)

# 2. Train a VAEP model
model = VAEP(nb_prev_actions=3)
features = model.compute_features(game, actions)
labels = model.compute_labels(game, actions)
model.fit(features, labels, learner="xgboost", random_state=42)

# 3. Rate actions
ratings = model.rate(game, actions)
# Returns DataFrame with offensive_value, defensive_value, vaep_value

Hybrid-VAEP

Standard VAEP includes the action's result (success/fail) as a feature, which creates information leakage. HybridVAEP removes result information from the current action while preserving it for previous actions.

from silly_kicks.vaep import HybridVAEP

# HybridVAEP removes result leakage from current-action features
model = HybridVAEP(nb_prev_actions=3)
# Same fit/rate API as standard VAEP

Multi-Provider Support

All converters share the same output schema, so downstream code works identically regardless of the data provider.

from silly_kicks.spadl import opta, wyscout

actions_opta, _ = opta.convert_to_actions(opta_events, home_team_id)
actions_wyscout, _ = wyscout.convert_to_actions(wyscout_events, home_team_id)

Architecture

Open docs/c4/architecture.html in a browser to explore the C4 architecture diagrams (System Context, Containers).

Attribution

This project incorporates academic methodologies from the soccer-analytics literature. See NOTICE for full bibliographic citations and third-party library acknowledgements.

silly-kicks builds on the foundational research by the KU Leuven Machine Learning Research Group. If you use this library in academic work, please cite the original papers:

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

@inproceedings{Decroos2020AtomicSPADL,
  title     = {Interpretable Prediction of Goals in Soccer},
  author    = {Tom Decroos and Jesse Davis},
  booktitle = {Proceedings of the AAAI-20 Workshop on Artificial Intelligence
               in Team Sports},
  year      = {2020}
}

Contributing

See CONTRIBUTING.md for development setup, coding standards, and PR process. Open items and planned work are tracked in TODO.md.

License

MIT License. See LICENSE for details.

Release files for silly-kicks 4.122.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for silly-kicks 4.122.0
File Size Uploaded
silly_kicks-4.122.0.tar.gz 35.8 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for silly-kicks 4.122.0
File Interpreter ABI Platform
silly_kicks-4.122.0-py3-none-any.whl Python 3 none any Details

Total release size: 48.6 MB

Release files / silly_kicks-4.122.0.tar.gz

Download URL silly_kicks-4.122.0.tar.gz
Size 35.8 MB
Tags Source
SHA-256 checksum
How to use checksums
3b1bb128e98f320f4077c92ea78487819d3bf6deb4612a578143ccb6af53ec43
BLAKE2b-256 checksum
How to use checksums
9f3b91b23ebd762fcccca5f6e507aa7430b55b67d934c38c005c6c235042ec1b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.

Transparency log

Release files / silly_kicks-4.122.0-py3-none-any.whl

Download URL silly_kicks-4.122.0-py3-none-any.whl
Size 12.8 MB
Tags Python 3
SHA-256 checksum
How to use checksums
7e0a53863a44dd2cda7fbea72e722c8827f7e8dbed9f7a638a5804ea54fbb800
BLAKE2b-256 checksum
How to use checksums
69cfbceabdaac4c6515b50e4bd71633ef5fe877b4252d69b7fd7d484fd2fea49
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

4.122.0 This release

2 release files

4.99.0

2 release files

4.98.0

2 release files

4.97.0

2 release files

4.96.0

2 release files

4.94.0

2 release files

4.93.0

2 release files

4.92.0

2 release files

4.91.0

2 release files

4.90.1

2 release files

4.90.0

2 release files

4.89.0

2 release files

4.88.0

2 release files

4.87.0

2 release files

4.86.1

2 release files

4.86.0

2 release files

4.85.0

2 release files

4.84.0

2 release files

4.83.0

2 release files

4.82.0

2 release files

4.81.0

2 release files

4.80.0

2 release files

4.79.0

2 release files

4.78.0

2 release files

4.70.0

2 release files

4.69.0

2 release files

4.68.0

2 release files

4.67.0

2 release files

4.66.0

2 release files

4.65.0

2 release files

4.64.0

2 release files

4.63.0

2 release files

4.62.0

2 release files

4.61.0

2 release files

4.60.0

2 release files

4.59.0

2 release files

4.58.0

2 release files

4.57.0

2 release files

4.56.0

2 release files

4.55.4

2 release files

4.55.3

2 release files

4.55.2

2 release files

4.55.1

2 release files

4.55.0

2 release files

4.54.0

2 release files

4.50.0

2 release files

4.49.0

2 release files

4.48.1

2 release files

4.48.0

2 release files

4.47.0

2 release files

4.46.0

2 release files

4.45.0

2 release files

4.44.0

2 release files

4.43.0

2 release files

4.42.0

2 release files

4.41.0

2 release files

4.37.0

2 release files

4.36.1

2 release files

4.36.0

2 release files

4.35.1

2 release files

4.35.0

2 release files

4.34.0

2 release files

4.33.0

2 release files

4.32.0

2 release files

4.31.0

2 release files

4.30.0

2 release files

4.29.0

2 release files

4.28.0

2 release files

4.27.1

2 release files

4.27.0

2 release files

4.26.0

2 release files

4.25.0

2 release files

4.24.0

2 release files

4.23.0

2 release files

4.22.2

2 release files

4.22.1

2 release files

4.22.0

2 release files

4.21.4

2 release files

4.21.3

2 release files

4.21.2

2 release files

4.9.1

2 release files

4.9.0

2 release files

4.8.0

2 release files

4.7.0

2 release files

4.6.0

2 release files

4.5.0

2 release files

4.4.1

2 release files

4.4.0

2 release files

4.3.0

2 release files

4.2.0

2 release files

4.1.1

2 release files

4.1.0

2 release files

4.0.3

2 release files

4.0.2

2 release files

4.0.1

2 release files

4.0.0

2 release files

3.30.0

2 release files

3.29.1

2 release files

3.29.0

2 release files

3.28.0

2 release files

3.27.0

2 release files

3.26.0

2 release files

3.25.1

2 release files

3.25.0

2 release files

3.24.0

2 release files

3.23.0

2 release files

3.22.2

2 release files

3.22.1

2 release files

3.22.0

2 release files

3.21.0

2 release files

3.20.1

2 release files

3.20.0

2 release files

3.19.0

2 release files

3.18.2

2 release files

3.18.1

2 release files

3.18.0

2 release files

3.17.0

2 release files

3.16.2

2 release files

3.16.1

2 release files

3.16.0

2 release files

3.15.4

2 release files

3.15.3

2 release files

3.15.2

2 release files

3.15.1

2 release files

3.15.0

2 release files

3.14.1

2 release files

3.14.0

2 release files

3.13.0

2 release files

3.12.0

2 release files

3.11.3

2 release files

3.11.2

2 release files

3.11.1

2 release files

3.11.0

2 release files

3.10.1

2 release files

3.10.0

2 release files

3.9.0

2 release files

3.8.0

2 release files

3.7.0

2 release files

3.6.0

2 release files

3.5.0

2 release files

3.4.0

2 release files

3.3.0

2 release files

3.2.0

2 release files

3.1.0

2 release files

3.0.1

2 release files

3.0.0

2 release files

2.9.0

2 release files

2.8.0

2 release files

2.7.0

2 release files

2.6.0

2 release files

2.5.0

2 release files

2.4.0

2 release files

2.3.0

2 release files

2.2.0

2 release files

2.1.1

2 release files

2.1.0

2 release files

2.0.0

2 release files

1.10.0

2 release files

1.9.0

2 release files

1.8.0

2 release files

1.7.0

2 release files

1.6.0

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page