Genius Level
Every input, formula, threshold, and applied calculation in SHA's river/weather/forecast/run intelligence stack. One scroll, no clicks, no caches. Designed to be diagnostic-first, educational-second.
1 · Live snapshot — Cuyahoga River @ Independence
The single most recent river_conditions row for this river.
Fed every 15 min by the rivers:update command which combines USGS
instantaneous values (flow, gauge height, water temp, parameter 00045 for rain bucket) with
OpenWeather current conditions (air temp, weather, wind, humidity, barometric pressure).
2 · Recommendation breakdown
The fishing rating shown on each river page comes from
FishingRecommendationService::getRecommendation(). Four
independently scored components plus a barometric-pressure modifier produce a 0–11 raw score, which is
clamped and cut into Excellent / Good / Fair / Poor. Below is the live decomposition for this river.
"Blown out at 3,070 CFS, water is muddy, 58°F — active feeding range. The river needs time. Check back after the next drop. Too much color right now. Let it drop. Increased activity — falling pressure. The Best One Always Comes Unbuttoned."
Per-component contribution
| Component | Points | Why |
|---|---|---|
| flow | 0 | |
| temp | 1 | |
| clarity | 0 | |
| weather | 0 | |
| pressure | 1 | |
| flow_value | 3070 | |
| temp_value | 58.1 | |
| clarity_value | Muddy |
Barometric pressure analyzer
Scoring rules
- flow
- In optimal zone = 4 · within 30% = 3 · within 60% = 2 · outside = 1 · above p95×1.5 = 0 (blown).
- temp
- 38–55°F = 3 (prime: covers winter holdover + spring run) · 33–58°F = 2 · 30–62°F = 1 · outside = 0.
- clarity
- Stained = 3 (steelhead green) · Clear = 2 · Muddy = 0.
- weather
- Cloudy/Overcast = 1 · else = 0.
- pressure
- Rapidly falling = +2 · falling = +1 · stable = 0 · rising = -1 · rapidly rising = -1.
- rating_cuts
- Excellent ≥ 9 · Good ≥ 6 · Fair ≥ 3 · Poor < 3 (max 11 after clamp).
3 · Statistics engine
Cached in river_flow_stats, regenerated nightly at 03:00 ET by
flow:compute-stats. The pipeline pulls a 3-year window of hourly-
downsampled USGS flow, removes Tukey outliers at 3× IQR on log-flow, then computes percentiles, a
20-bin log-space histogram, Q-Q quantiles vs. a fitted normal, and (if ≥ 20 historical "Good" reports
exist) promotes the optimal zone from a heuristic p15–p30 to the empirical p10–p90 of those reports.
Percentile distribution
| P | cfs |
|---|---|
| pp5 | 511 |
| pp10 | 565 |
| pp25 | 798 |
| pp50 | 1,273 |
| pp75 | 1,903 |
| pp90 | 2,993 |
| pp95 | 5,062 |
Flow distribution histogram (log-space, 3 yr)
Green bars overlap the optimal zone. Bars are equal-width in log-flow space.
Today's flow placement
Current flow 3,070 cfs sits at the p95 of the 3-year record. Green band = optimal zone.
4 · Weather integration
Three independent feeds power the per-river weather story. NWS gridpoint forecasts (refreshed every 3 hours) supply 7-day periods + 48 hours of hourly data. AHPS stage forecasts give 5-day predicted flow / gauge height. SPC convective outlooks tier the river's lat/lon by tornado / wind / hail risk for days 1–3. Active alerts are de-duplicated against expired headlines.
NWS 7-day forecast
| Period | Temp | Wind | Forecast |
|---|---|---|---|
| This Afternoon | 70°F | 14 mph SW | Slight Chance Showers And Thunderstorms |
| Tonight | 50°F | 5 to 13 mph W | Chance Showers And Thunderstorms then Showers And Thunderstorms |
| Sunday | 63°F | 7 mph N | Sunny |
| Sunday Night | 45°F | 1 to 5 mph NW | Partly Cloudy |
| Monday | 57°F | 2 to 10 mph N | Sunny |
| Monday Night | 41°F | 0 to 7 mph NE | Mostly Clear |
| Tuesday | 66°F | 0 to 7 mph S | Mostly Sunny then Slight Chance Rain Showers |
5 · Run indicator (alley-wide)
Latest 24h average lake-surface temp from NDBC buoys + C-MAN stations, compared against 7-day delta and 55°F threshold crossing detection. State changes drive copy on every river page.
Lake Erie
| NDBC-MRHO1 | 57.6°F | May 9 3:30pm |
| NDBC-FAIO1 | 57.7°F | May 9 3:30pm |
| NDBC-CNDO1 | 55.2°F | May 9 3:30pm |
| NDBC-MRHO1 | 57.2°F | May 9 3:24pm |
| NDBC-FAIO1 | 57.9°F | May 9 3:24pm |
| NDBC-CNDO1 | 55.2°F | May 9 3:24pm |
Lake Ontario
Lake Ontario stations 45012 + 45139 are seasonal NDBC buoys, currently out of the water (re-deployed in late spring). Until they're back online, the run-state classifier has no surface-temp series to evaluate. Land-based C-MAN proxy options (e.g. OSGN6, FAIO1) are not WTMP-reporting — adding a year-round Ontario WTMP source is a known TODO for next data-pipeline pass.
Seven-state classifier
- pre_run_fall
- Fish staging in lake; tribs empty.
- run_starting_fall
- First fish entering tribs (fall pulse).
- run_active_fall
- Active fall run.
- holdover
- Fish wintering in tribs between fall + spring.
- run_starting_spring
- Spring run starting (post-holdover surge).
- run_active_spring
- Active spring run.
- run_ending
- Drop-back; spawned fish leaving for the lake.
- off_season
- Lake-bound; tribs warm; warmwater season.
6 · Storm detection (alley-wide)
ActiveStormDetector fires four parallel triggers against
river_precip_observations, NWS active alerts, and 6-hour flow deltas.
Any single trigger flips the storm card to active; severity is then classified by the most aggressive
signal across all 31 rivers. Precip readings flow from a 4-source priority chain — fresher, more
accurate sources override stale ones.
"1 river rising 3.2×+ in 6h"
Precipitation rate — last 24 hours (NWS publishes in 6h intervals; USGS hourly where available)
Y axis is in/hr precipitation, auto-scaled but always includes the broad-rain trigger so quiet days still have context. The cyan line is the alley-wide average; gray ticks above each cyan dot show how high the single wettest river was running at that observation. When cyan crosses amber → broad-front rain. When a gray tick crosses red → one river is in a heavy cell. Sparse points are real — NWS gridpoint QPE only updates every 6 hours per river; the hourly USGS rows fill in for the handful of rivers whose gauges publish precipitation.
Triggers
- Trigger 1A — Heavy MRMS rate
- ≥ 1 river over 0.5 in/hr in last 30 min.
- Trigger 1B — Broad rain
- ≥ 3 rivers with precipitation_1h > 0.10".
- Trigger 2 — NWS alert
- ≥ 1 active alert covering any river.
- Trigger 3 — Flow rise
- ≥ 1 river with current flow ≥ 1.5× flow 6 hours ago.
Severity classifier
- severe
- NWS Extreme/Severe alert · MRMS ≥ 1.0 in/hr · ≥ 5 rivers rising · ≥ 8 raining · ≥ 3 heavy MRMS rivers
- moderate
- Any active alert · MRMS ≥ 0.5 in/hr · ≥ 1 rising · ≥ 5 raining
- light
- Default when active but none of the above
Precipitation source priority
- mrms — Open-Meteo Lite (15-min observations) — 10 min staleness window
- usgs — USGS parameter 00045 from gauges with rain buckets — 30 min
- nws_obs — NWS gridpoint quantitativePrecipitation past intervals — 90 min
- nws_fcst — NWS gridpoint forecast (final fallback) — 240 min
7 · Alley Index (alley-wide)
Percentile rank of today's underlying conditions composite (mean of per-river fishing scores 0–100) against the historical record on this calendar window (±15 days, all years). Below 10 comparable days in the window the Index falls back to the raw underlying score so the page always shows a meaningful number.
Band cuts
| Band | Cut | Meaning |
|---|---|---|
| Excellent | ≥ 90 | Top 10% of comparable days ever recorded. |
| Good | ≥ 70 | Top 30%. |
| Average | ≥ 30 | Middle 40%. |
| Poor | ≥ 10 | Bottom 30%. |
| Blown | ≥ 0 | Bottom 10%. |
Last 30 days
Older → newer left to right. Color follows band cuts.
8 · Forecast verification (alley-wide)
Most-recent NWS prediction for each (river, date) in the last 14 days, sorted past→future. The verifier joins each prediction to MAX/MIN(air_temp_f) + MAX(precipitation_1h) from river_conditions on that date. Δ column compares observed vs predicted. Known upstream gap: predicted precipitation inches are unreliable (NWS forecast text rarely includes a clean inches value, so the snapshotter falls back to 0). Use precip probability as the better forecast signal.
| Date | River | Predicted (hi/lo · precip) | Observed (hi/lo · max 1h) | Δ vs predicted |
|---|---|---|---|---|
| 2026-05-15 | Ashtabula River | 70°/— · 14% POP · 7 mph W | (future — not yet verifiable) | |
| 2026-05-15 | Black River | 71°/— · 14% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Black River (Watertown) | 65°/— · 21% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Brandy Run near Girard | 70°/— · 15% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Buffalo Creek | 67°/— · 17% POP · 5 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Canadaway Creek | 67°/— · 16% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Cattaraugus Creek | 68°/— · 19% POP · 5 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Cazenovia Creek | 67°/— · 17% POP · 5 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Chagrin River @ Willoughby | 73°/— · 14% POP · 6 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Chautauqua Creek | 65°/— · 16% POP · 6 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Conneaut Creek | 70°/— · 14% POP · 7 mph W | (future — not yet verifiable) | |
| 2026-05-15 | Crooked Creek | 70°/— · 14% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Cuyahoga River @ Independence | 72°/— · 14% POP · 7 mph W | (future — not yet verifiable) | |
| 2026-05-15 | Eighteen Mile Creek | 68°/— · 17% POP · 5 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Eighteenmile Creek (Niagara) | 66°/— · 15% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Elk Creek | 69°/— · 14% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Euclid Creek | 71°/— · 14% POP · 7 mph W | (future — not yet verifiable) | |
| 2026-05-15 | Genesee River | 65°/— · 20% POP · 7 mph E | (future — not yet verifiable) | |
| 2026-05-15 | Grand River near Painesville | 74°/— · 13% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Huron River | 72°/— · 13% POP · 6 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Irondequoit Creek | 66°/— · 20% POP · 7 mph E | (future — not yet verifiable) | |
| 2026-05-15 | Johnson Creek | 62°/— · 15% POP · 7 mph E | (future — not yet verifiable) | |
| 2026-05-15 | Oak Orchard Creek | 63°/— · 16% POP · 6 mph E | (future — not yet verifiable) | |
| 2026-05-15 | Rocky River near Berea | 71°/— · 15% POP · 8 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Salmon River | 65°/— · 19% POP · 6 mph S | (future — not yet verifiable) | |
| 2026-05-15 | Sandy Creek (Adams) | 64°/— · 18% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Sandy Creek (Hamlin) | 64°/— · 17% POP · 7 mph E | (future — not yet verifiable) | |
| 2026-05-15 | Silver Creek | 64°/— · 16% POP · 6 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Twenty Mile Creek | 63°/— · 15% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Vermilion River @ Vermilion | 71°/— · 14% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-05-15 | Walnut Creek | 66°/— · 14% POP · 8 mph SW | (future — not yet verifiable) | |
| 2026-05-14 | Ashtabula River | 63°/51° · 29% POP · 15 mph E | (future — not yet verifiable) | |
| 2026-05-14 | Black River | 64°/49° · 30% POP · 12 mph E | (future — not yet verifiable) | |
| 2026-05-14 | Black River (Watertown) | 61°/45° · 50% POP · 7 mph S | (future — not yet verifiable) | |
| 2026-05-14 | Brandy Run near Girard | 64°/50° · 33% POP · 9 mph SW | (future — not yet verifiable) | |
| 2026-05-14 | Buffalo Creek | 61°/46° · 43% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-05-14 | Canadaway Creek | 61°/48° · 49% POP · 9 mph SW | (future — not yet verifiable) | |
| 2026-05-14 | Cattaraugus Creek | 62°/46° · 46% POP · 6 mph SW | (future — not yet verifiable) | |
| 2026-05-14 | Cazenovia Creek | 61°/46° · 43% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-05-14 | Chagrin River @ Willoughby | 66°/51° · 32% POP · 10 mph E | (future — not yet verifiable) | |
| 2026-05-14 | Chautauqua Creek | 60°/50° · 47% POP · 8 mph SW | (future — not yet verifiable) | |
| 2026-05-14 | Conneaut Creek | 64°/51° · 30% POP · 12 mph SE | (future — not yet verifiable) | |
| 2026-05-14 | Crooked Creek | 64°/51° · 31% POP · 10 mph E | (future — not yet verifiable) | |
| 2026-05-14 | Cuyahoga River @ Independence | 65°/51° · 31% POP · 12 mph NE | (future — not yet verifiable) | |
| 2026-05-14 | Eighteen Mile Creek | 62°/48° · 44% POP · 6 mph SW | (future — not yet verifiable) | |
| 2026-05-14 | Eighteenmile Creek (Niagara) | 61°/45° · 41% POP · 9 mph W | (future — not yet verifiable) | |
| 2026-05-14 | Elk Creek | 63°/50° · 32% POP · 12 mph SW | (future — not yet verifiable) | |
| 2026-05-14 | Euclid Creek | 64°/52° · 34% POP · 12 mph E | (future — not yet verifiable) | |
| 2026-05-14 | Genesee River | 60°/45° · 46% POP · 8 mph W | (future — not yet verifiable) | |
| 2026-05-14 | Grand River near Painesville | 67°/52° · 31% POP · 10 mph NE | (future — not yet verifiable) | |
| 2026-05-14 | Huron River | 65°/50° · 25% POP · 10 mph E | (future — not yet verifiable) | |
| 2026-05-14 | Irondequoit Creek | 61°/45° · 48% POP · 8 mph W | (future — not yet verifiable) | |
| 2026-05-14 | Johnson Creek | 58°/45° · 42% POP · 9 mph W | (future — not yet verifiable) | |
| 2026-05-14 | Oak Orchard Creek | 59°/45° · 42% POP · 9 mph W | (future — not yet verifiable) | |
| 2026-05-14 | Rocky River near Berea | 64°/50° · 33% POP · 13 mph NE | (future — not yet verifiable) | |
| 2026-05-14 | Salmon River | 60°/44° · 59% POP · 8 mph SE | (future — not yet verifiable) | |
| 2026-05-14 | Sandy Creek (Adams) | 61°/46° · 51% POP · 8 mph S | (future — not yet verifiable) | |
| 2026-05-14 | Sandy Creek (Hamlin) | 59°/44° · 43% POP · 9 mph W | (future — not yet verifiable) | |
| 2026-05-14 | Silver Creek | 59°/46° · 48% POP · 7 mph SW | (future — not yet verifiable) | |
| 2026-05-14 | Twenty Mile Creek | 58°/48° · 47% POP · 9 mph SW | (future — not yet verifiable) | |
| 2026-05-14 | Vermilion River @ Vermilion | 64°/51° · 29% POP · 13 mph E | (future — not yet verifiable) | |
| 2026-05-14 | Walnut Creek | 60°/47° · 35% POP · 12 mph W | (future — not yet verifiable) | |
| 2026-05-13 | Ashtabula River | 67°/50° · 85% POP · 17 mph NW | (future — not yet verifiable) | |
| 2026-05-13 | Black River | 67°/49° · 86% POP · 17 mph NW | (future — not yet verifiable) | |
| 2026-05-13 | Black River (Watertown) | 60°/44° · 54% POP · 8 mph SE | (future — not yet verifiable) | |
| 2026-05-13 | Brandy Run near Girard | 66°/49° · 83% POP · 15 mph W | (future — not yet verifiable) | |
| 2026-05-13 | Buffalo Creek | 60°/45° · 65% POP · 9 mph SW | (future — not yet verifiable) | |
| 2026-05-13 | Canadaway Creek | 63°/47° · 70% POP · 14 mph W | (future — not yet verifiable) | |
| 2026-05-13 | Cattaraugus Creek | 62°/46° · 71% POP · 8 mph SW | (future — not yet verifiable) | |
| 2026-05-13 | Cazenovia Creek | 61°/46° · 65% POP · 9 mph SW | (future — not yet verifiable) | |
| 2026-05-13 | Chagrin River @ Willoughby | 68°/51° · 85% POP · 16 mph NW | (future — not yet verifiable) | |
| 2026-05-13 | Chautauqua Creek | 64°/48° · 74% POP · 15 mph W | (future — not yet verifiable) | |
| 2026-05-13 | Conneaut Creek | 67°/50° · 84% POP · 17 mph NW | (future — not yet verifiable) | |
| 2026-05-13 | Crooked Creek | 67°/50° · 83% POP · 15 mph NW | (future — not yet verifiable) | |
| 2026-05-13 | Cuyahoga River @ Independence | 68°/50° · 85% POP · 15 mph NW | (future — not yet verifiable) | |
| 2026-05-13 | Eighteen Mile Creek | 62°/47° · 66% POP · 8 mph SW | (future — not yet verifiable) | |
| 2026-05-13 | Eighteenmile Creek (Niagara) | 60°/44° · 65% POP · 13 mph SW | (future — not yet verifiable) | |
| 2026-05-13 | Elk Creek | 67°/49° · 83% POP · 17 mph NW | (future — not yet verifiable) | |
| 2026-05-13 | Euclid Creek | 67°/51° · 85% POP · 17 mph NW | (future — not yet verifiable) | |
| 2026-05-13 | Genesee River | 60°/45° · 71% POP · 10 mph S | (future — not yet verifiable) |
9 · Conditions archive (alley-wide)
Tiered retention so the database doesn't grow unbounded but the long-history aggregates that power the
Alley Index, forecast verifier, and storm-pulse detector remain intact. Raw river_conditions
prune weekly via rivers:clean; hourly + daily rollups are forever.
Retention policy
- raw river_conditions
- 90 days (pruned weekly via rivers:clean)
- gauge_readings
- 90 days
- lake_temp_snapshots
- forever (small volume)
- precip_observations
- raw 90 days; hourly + daily rollups forever
- ahps_forecasts
- forever
- alley_index_snapshots
- forever
- spc_outlooks
- forever
- nws_alerts
- forever (with ended_at marker)
Row counts (live)
| river_conditions | 422,491 |
| gauge_readings | 141,538 |
| lake_temp_snapshots | 2,762 |
| precip_observations | 5,226 |
| ahps_forecasts | 362 |
| alley_index_snapshots | 104 |
| spc_outlooks | 45 |
| nws_alerts | 5 |
10 · Data sources & cadence (operational)
Every external feed feeding SHA's intelligence stack, with the artisan command that drives it, last-fetch timestamp, and total row count. If a "last_at" is hours behind cadence, that source is stalled.
| Source | Cadence | Driver | Last at | Rows |
|---|---|---|---|---|
| USGS instantaneous values | 15 min | rivers:update | May 9 5:15pm | 141,538 |
| OpenWeather current | 15 min | rivers:update | May 9 5:15pm | 422,491 |
| NWS 7-day + hourly forecast | 3 hours | forecasts:fetch | May 9 5:07pm | 31 |
| NWS AHPS predicted flow | 6 hours | ahps:fetch | May 9 1:38pm | 362 |
| NWS active alerts | 15 min | alerts:fetch-nws | May 7 6:31am | 5 |
| SPC convective outlooks | 3 hours | spc:fetch-outlook | May 9 5:17pm | 45 |
| NDBC + C-MAN lake temps | 1 hour | noaa:fetch-buoys | May 9 3:30pm | 2,762 |
| River precip (USGS / NWS / MRMS-Lite) | 5–60 min | rivers:update + precip:fetch-nws + local Open-Meteo worker | May 9 2:00pm | 5,226 |
| Alley Index snapshot | hourly + daily 04:50 ET | index:compute | May 9 5:07pm | 104 |
| Run state classifier | daily 06:30 ET | run-state:compute | May 8 | 12 |
11 · Constants reference (every threshold in one place)
Every magic number that drives a SHA decision, with the file it lives in. Edit the source to change a threshold — this page reflects the live code path. Grouped by subsystem.
| Group | Constant | Value | Where |
|---|---|---|---|
| Flow scoring | In optimal zone | 4 points | IndexCalculatorService::scoreCondition |
| Flow scoring | Within 30% of optimal | 3 points | IndexCalculatorService::scoreCondition |
| Flow scoring | Within 60% of optimal | 2 points | IndexCalculatorService::scoreCondition |
| Flow scoring | Above p95 × 1.5 | Blown (0) | IndexCalculatorService::scoreCondition |
| Temp scoring | Prime band (winter + spring) | 38–55°F = 3 | FishingRecommendationService::analyzeTemperature |
| Temp scoring | Good band | 33–58°F = 2 | FishingRecommendationService::analyzeTemperature |
| Temp scoring | Marginal band | 30–62°F = 1 | FishingRecommendationService::analyzeTemperature |
| Clarity | Clear / Stained ratio | < 1.4× p50 | RiverMonitorService::determineClarity |
| Clarity | Stained / Muddy ratio | < 2.8× p50 | RiverMonitorService::determineClarity |
| Pressure | Rapidly falling | ≤ -1.0 hPa/hr | PressureService |
| Pressure | Falling | ≤ -0.3 hPa/hr | PressureService |
| Pressure | Score modifier (rapidly falling) | +2 points | PressureService |
| Storm card | Heavy-MRMS threshold | 0.5 in/hr | ActiveStormDetector::HEAVY_RATE_INCHES_PER_HOUR |
| Storm card | Heavy-MRMS lookback | 30 min | ActiveStormDetector::HEAVY_RATE_LOOKBACK_MINUTES |
| Storm card | Broad-rain threshold | 0.10"/hr | ActiveStormDetector::RAIN_THRESHOLD_INCHES |
| Storm card | Broad-rain river count | ≥ 3 | ActiveStormDetector::MIN_RAIN_RIVERS |
| Storm card | Flow-rise factor | 1.5× vs 6h ago | ActiveStormDetector::FLOW_RISE_FACTOR |
| Run indicator | Lake threshold | 55°F | RunStateClassifier |
| Alley Index | Calendar window | ±15 days, all years | IndexPercentileService::WINDOW_DAYS |
| Alley Index | Min pool for percentile | 10 days | IndexPercentileService::MIN_POOL |
| Alley Index | Excellent band | ≥ 90 | IndexPercentileService::descriptorFor |
| Alley Index | Good band | 70–89 | IndexPercentileService::descriptorFor |
| Alley Index | Average band | 30–69 | IndexPercentileService::descriptorFor |
| Alley Index | Poor band | 10–29 | IndexPercentileService::descriptorFor |
| Alley Index | Blown band | 0–9 | IndexPercentileService::descriptorFor |
| Forecast verify | Snapshot time | Daily 05:15 ET | routes/console.php |
| Optimal zone | Empirical promotion threshold | ≥ 20 Good reports | RiverFlowStatistics |
| Stats engine | Window | 3 years | RiverFlowStatistics |
| Stats engine | Outlier removal | 3× IQR on log-flow | RiverFlowStatistics |
| Stats engine | Histogram bins | 20 (log-space) | RiverFlowStatistics |