- compute_pca now fits 4 components; PC4 added to PC_LABELS/PC_BLURB
("off-peak spread vs headliner pull", ~5% variance, framed as
diminishing returns).
- "Read an axis" loadings explorer gains PC4.
- The behavioral-map scatter becomes interactive: pick any two
components for the X/Y axes, and color by category tag, spatial
area, or any component's loading (continuous RdBu, symmetric).
- Headline caption pinned to evr[:3] so "3 axes = 60%" stays true;
the by-hour clock stays PC1-3 to preserve the three-axes story.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Replace the "Area N" fallbacks with derived names: Kiddieland
(lowest mean PC2) plus The Woodies / The Grand Midway / Flying
Turns Grove / Giant Wheel Corner, each keyed off the headline
ride that lands in the cluster so the labels survive re-clustering
as the wait history grows.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Two spin/zoom Plotly scatter_3d sub-tabs in the PCA tab:
- Rides in PC1xPC2xPC3 (loadings), color by category / GPS
k-means area / PC1 busyness. Adds GPS k-means areas to
compute_pca(), auto-labeling the lowest-PC2 cluster Kiddieland.
- Moments in PC1xPC2xPC3 (per-snapshot scores), color by hour /
day-of-week / weekend / month, sampled to 15k points if larger.
Pin numpy in requirements (now imported directly).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>