🚴♂️ PACE-VIEW: Explainable Cycling Intelligence Dashboard
PACE-VIEW turns raw TCX rides into decision-ready insights for athletes and coaches.
It combines physics-informed modeling, digital-twin prediction, and explainable AI in one interactive dashboard.
💪 Why PACE-VIEW?
- Dashboard-first workflow: inspect workload, HR zone mix, efficiency trends, and per-session explanations in one place.
- Explainability by design: use counterfactual analysis, rationale generation, and pattern mining to understand why a session felt hard or easy.
- Physics + ML pipeline: quantify wind/terrain/environmental load and compare expected vs observed physiology.
- Modular architecture: run the full web app or use components independently in scripts.
📦 Installation
Install PACE-VIEW with pip:
pip install pace_view
In case you want to install directly from the source code, use:
git clone https://github.com/firefly-cpp/pace_view.git
cd pace_view
poetry build
↗️ Quick start
Run the full dashboard:
python examples/full_dashboard.py
Then open an activity to view detailed explanations and decision-support outputs.
- Free software: MIT license
- Python versions: 3.8.x, 3.9.x, 3.10.x, 3.11.x, 3.12.x
- Documentation: https://pace-view.readthedocs.io/en/latest/
- Tested OS: Windows, Ubuntu, Fedora, Alpine, Arch, macOS. However, that does not mean it does not work on others
✨ Implemented Components
Component 1: Data Ingestion & Preprocessing
This component loads raw activity and weather signals, aligns timestamps, and builds clean dataframes for downstream modeling.
Classes/modules: DataParser (pace_view/data_parsing.py), DataCleaner (pace_view/data_cleaning.py).
Component 2: Environmental Quantification
This component quantifies external/mechanical load and learns expected physiological behavior from historical rides.
Classes/modules: PhysicsEngine (pace_view/physics.py), DigitalTwinModel (pace_view/digital_twin.py).
Component 3: XAI
This component explains deviations with counterfactual reasoning, generates human-readable rationales, and mines global patterns.
Classes/modules: CounterfactualAnalyzer (pace_view/counterfactual.py), RationaleGenerator (pace_view/rationale.py), PatternMiner (pace_view/mining.py).
Component 4: Interactive Dashboard & Decision Support
This component exposes session-level explanation and inter-session analysis through the web UI and example views.
Classes/modules: ContextTrainer (pace_view/core.py) plus the Flask/Dash app in examples/full_dashboard.py.
📓 Examples
Run these from the repository root:
-
python examples/full_dashboard.py
Runs the full interactive dashboard with all cards and activity detail routing. It is the end-to-end example that combines visualization and contextual explanations. -
python examples/activity_detail_page_example.py
Serves only the activity detail page for a single example TCX activity. It demonstrates the detail view with ContextTrainer output but without the full dashboard. -
python examples/context_trainer_text_example.py
Runs ContextTrainer without Flask or Dash and prints text-only results to the terminal. It demonstrates model fitting, pattern mining, and single-activity explanation in CLI form. -
python examples/hr_zone_mix_example.py
Shows only the HR Zone Mix card with period controls. It demonstrates the zone-distribution visualization in isolation. -
python examples/efficiency_over_time_example.py
Shows only the Efficiency Over Time card with rolling-window controls. It demonstrates how trend window changes affect the efficiency plot. -
python examples/hr_vs_speed_duration_example.py
Shows only the HR vs Speed x Duration heatmap card. It demonstrates the binned relationship between duration, speed, and heart rate.
Repository Structure
pace_view/core pipeline modulesdata/sample TCX files for local testingtests/pytest unit testsscripts/local helpers and experimentsassets/images and supporting artifacts
Core Components
pace_view/data_parsing.pyloads TCX files and optional weather contextpace_view/data_cleaning.pybuilds aligned dataframespace_view/physics.pycomputes headwind, gradient, and virtual powerpace_view/digital_twin.pypredicts expected HR and driftpace_view/counterfactual.pyandpace_view/rationale.pybuild explanationspace_view/mining.pymines interpretable rules using NiaARM
Data Flow (high level)
- Parse TCX -> activity arrays + weather
- Clean + align -> dataframe
- Physics features -> headwind, gradient, virtual power
- Digital twin -> predicted HR and drift
- Counterfactual + rationale -> explanation output
- Pattern mining -> global rules across rides
Testing
Run from repo root:
python -m pytest -q
If you use a specific interpreter:
<path/to/your/python/>python.exe -m pytest -q
Configuration (Weather API)
If you want weather enrichment, provide an API key via environment variables:
WEATHER_API_KEY=<your_key_here>
Examples using ContextTrainer now resolve the key centrally via pace_view.config.get_weather_api_key().
It checks the process environment first and also loads a project-root .env file if present.
Optional manual loading with python-dotenv:
from dotenv import load_dotenv
import os
load_dotenv()
api_key = os.getenv("WEATHER_API_KEY")
🖼️ Dashboard Preview
These screenshots show the main views provided by the example dashboard and activity detail page.
Overview dashboard
The main dashboard combines session-level summary cards, dataset metadata, an activity list, and quick access to detailed explanations for individual rides.
HR Zone Mix
This view summarizes how training time is distributed across heart-rate zones over a selectable time window.
Efficiency Over Time
This chart tracks speed-per-heartbeat efficiency across sessions and overlays a rolling trend to make longer-term changes easier to spot.
HR vs Speed x Duration
This heatmap highlights how average heart rate changes across combinations of ride duration and average speed.
Single-activity explanation page
The activity detail page brings together the digital twin conclusion, session metrics, and rationale cards that explain why a ride felt the way it did.
🔑 License
This package is distributed under the MIT License. This license can be found online at http://www.opensource.org/licenses/MIT.
Disclaimer
This framework is provided as-is, and there are no guarantees that it fits your purposes or that it is bug-free. Use it at your own risk!
📖 Further read
[1] Awesome Computational Intelligence in Sports
🔗 Related packages/frameworks
[2] ast-tdl: Training Description Language for Artificial Sport Trainer
📝 References
Fister Jr, I., Fister, I., Iglesias, A., Galvez, A., Deb, S., & Fister, D. (2021). On deploying the Artificial Sport Trainer into practice. arXiv preprint arXiv:2109.13334.
Fister Jr, I., Salcedo-Sanz, S., Iglesias, A., Fister, D., Gálvez, A., & Fister, I. (2021). New Perspectives in the Development of the Artificial Sport Trainer. Applied Sciences, 11(23), 11452. DOI: 10.3390/app112311452
🫂 Contributors
Metadata
Release files for pace_view 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pace_view-0.1.0.tar.gz | 19.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pace_view-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 38.9 kB
Release files / pace_view-0.1.0.tar.gz
| Download URL | pace_view-0.1.0.tar.gz |
|---|---|
| Size | 19.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bb32c8974557434199ec91c16aebcca206b1b36076b442973d61d7fe4a0dc0d1
|
|
BLAKE2b-256 checksum How to use checksums |
345b7f8e31755bcce4b11f3d8e754d0f8f2a9412643be4258114624917be700e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.1.4 CPython/3.14.3 Linux/6.18.13-200.fc43.x86_64
|
Release files / pace_view-0.1.0-py3-none-any.whl
| Download URL | pace_view-0.1.0-py3-none-any.whl |
|---|---|
| Size | 19.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
48f19529ed480f0023120c67af669019ba249f71eeaa79eec0de596d2cb50ea5
|
|
BLAKE2b-256 checksum How to use checksums |
85446c5d32dcebf16bcf749cfea3ab99f58c9fab466721ac1f64a15f5f6e7777
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.1.4 CPython/3.14.3 Linux/6.18.13-200.fc43.x86_64
|