NerdCorner VAM: filter short climbs, opacity-encode confidence, add climbing time to tooltip

- Exclude per-activity VAM contributions where climbing_time_s < 10 min; short
  punchy efforts don't represent aerobic fitness and were skewing monthly averages
- Store climbing_time_s alongside climbing_vam_mh in metrics, detail JSON, and
  summary JSON so the frontend has the data to reason about confidence
- Accumulate total climbing time per period; opacity scales from 0.25 (10 min,
  minimum threshold) to 1.0 (≥ 1 h) so thin-evidence months read as faint dots
- Render VAM as dots only (no lines) since each period is an independent average,
  not a cumulative — lines implied continuity that isn't there
- Tooltip now shows "1060 m/h · 38 min climbing"
This commit is contained in:
Davide Scaini
2026-05-17 10:13:39 +02:00
parent 7a44cbbef0
commit 766da0320b
4 changed files with 84 additions and 34 deletions
+2
View File
@@ -102,6 +102,7 @@ def write_activity(
"best_efforts": metrics.best_efforts,
"best_climb_m": metrics.best_climb_m,
"climbing_vam_mh": metrics.climbing_vam_mh,
"climbing_time_s": metrics.climbing_time_s,
"laps": [_serialise_lap(lap) for lap in activity.laps],
"timeseries_url": f"activities/{activity_id}.timeseries.json" if timeseries else None,
"source": source,
@@ -259,6 +260,7 @@ def build_summary(
"best_efforts": metrics.best_efforts,
"best_climb_m": metrics.best_climb_m,
"climbing_vam_mh": metrics.climbing_vam_mh,
"climbing_time_s": metrics.climbing_time_s,
"source": _infer_source(activity),
"privacy": privacy,
"detail_url": f"activities/{activity_id}.json",