gps-performance-dashboard

GPS performance pipeline & dashboard

An end-to-end training-load pipeline and interactive dashboard for team-sport GPS data, built around Gaelic football and STATSports 10 Hz exports. Raw per-sample files go in; a pseudonymised, browser-only dashboard comes out.

Live demo → · Write-up (synthetic squad, no real athlete data)

Session analysis Load monitoring
One match or training session at 10-second resolution: per-minute running, most demanding scenarios (1–10 min), player comparison, benchmarks by position and playing group. Daily load, acute:chronic workload, changepoint detection and a time-series toolkit (smoothing, power spectrum, Morlet wavelet, Holt-Winters forecast).

Why it’s built this way

The pipeline follows the five-stage decision-support framework of Schelling & Robertson (2020) and Schelling et al. (2025):

  1. Collect – read raw STATSports exports once each into a 10 s bin cache (src/pipeline/sources.py)
  2. Condition – position → velocity, smoothing, artefact removal (conditioning.py)
  3. Features – session totals, per-minute distance, ACWR (features.py)
  4. Patterns – periodisation (wavelet + spectrum), duration-specific MDS, changepoints (patterns.py)
  5. Output – tidy tables plus the JS payloads the dashboard reads (output.py)

Method choices worth calling out:

Run it

pip install -r requirements.txt
python scripts/make_sample_data.py     # synthetic 14-player squad, 8 weeks (~1 GB, git-ignored)
python run.py                          # pipeline -> outputs/
open dashboard/index.html              # works straight from disk, no server

python publish.py --public inlines each page (CSS, JS, data) into a single file in docs/ for GitHub Pages. It refuses to run unless the pipeline is pointed at the synthetic sample.

Using real data

Point data.root in config.yaml (or GPS_DATA_ROOT) at a folder of YYYY-MM-DD-<Team>-<Match|Training>.csv exports. Optional squad context (fixtures, grades, positions) goes in the CSVs listed under reference:.

Data governance is built in:

About the sample data

scripts/make_sample_data.py invents everything: names, fixtures, opposition, pitch location and the movement itself. Speeds follow a mean-reverting baseline with superimposed high-speed efforts, scaled by position line, across a weekly rhythm (two trainings and a match) with a three-build, one-deload block. It targets plausible magnitudes (about 100–110 m/min in matches), not a model of real players.

References


Eamon McGleenan · PhD researcher, Predictive Sports Analytics, Queen’s University Belfast