beginner
ai-ops
demand-forecasting
heat-map

Demand Forecast Map

How to read the H3-hex demand forecast on the Heat Maps page — layers, horizons, the time slider, and tile tooltips.

Levy Fleets TeamMay 18, 20267 min read

Demand Forecast Map

The demand forecast map lives at Dashboard > Analytics > Heat Maps. It replaces the old "rides last N days" heat-map skeleton with a real predicted-demand surface driven by the AI Ops model.

Page layout

The page has four control regions:

  1. Horizon picker — choose the forecast window: 1 hour, 4 hours, or 24 hours ahead.
  2. History window picker — when looking backward at actuals, choose 24h, 7d, or 30d.
  3. Layer toggles — independently turn on Predicted demand, Actual history, and Unmet demand.
  4. Time slider — a horizontal slider that spans -7 days to +24 hours. The map redraws as you drag.

Below the map are summary tiles: total predicted rides for the current horizon, the hex with the highest predicted demand, and a count of unmet-demand events in the visible window.

H3 hexes

The map is tiled with H3 hexagons. For dense markets we use resolution 9 (about 0.1 km² per hex, roughly 150-meter edges). For sparse markets we use resolution 8 (about 0.7 km² per hex). The resolution is chosen automatically based on subaccount density.

Each hex is colored by the active layer:

  • Predicted demand — green (low) to red (high) by predicted rides for the selected horizon.
  • Actual history — same gradient but based on observed rides in the history window.
  • Unmet demand — red intensity by count of unmet-demand events. See Understanding unmet demand.

Hex tooltip

Click any hex to open its tooltip. You'll see:

FieldMeaning
Predicted ridesModel output for the current horizon
Confidence interval90% CI — ci_low to ci_high
Current supplyAvailable vehicles inside the hex right now
GapPredicted demand minus current supply
Last forecastWhen this hex's forecast was last refreshed

If the gap is positive, this hex is under-supplied for the horizon — a candidate for incoming rebalancing. If the gap is negative, it's over-supplied.

Horizons explained

Three separate model heads are trained, one per horizon:

  • 1 hour — best for "what's about to happen." Highest accuracy because lag features dominate.
  • 4 hours — best for "where should I move vehicles before lunch / dinner / commute." Used by the recommender.
  • 24 hours — best for "where should the fleet be tomorrow morning." Accuracy is lower but the signal is enough for overnight planning.

The recommender always uses the 4-hour horizon. The dashboard lets you flip between all three.

Reading the time slider

The slider's 0 position is now. To its left is observed history (up to 7 days back); to its right is forecast (up to 24 hours ahead).

  • Left of 0 — the active layer is forced to Actual history. The map shows rides that actually started in each hex during the slider's hour.
  • Right of 0 — the active layer is forced to Predicted demand. The map shows the model's forecast for that hour.

Dragging across the 0 boundary transitions cleanly between observation and prediction.

Stale forecast banner

Forecasts refresh hourly. If the most recent forecast is more than 90 minutes old, a yellow banner appears above the map: "Forecast may be stale — last refresh was X minutes ago." When the banner is showing:

  • The map still renders the last good forecast.
  • The recommender hides projected lift dollars (it doesn't trust stale numbers).
  • Check the cron status (see Troubleshooting).

Confidence

The 90% confidence interval (ci_low and ci_high) tells you how certain the model is. Wide intervals mean the model has high uncertainty about that hex × hour — usually because of low historical ride volume in that hex, or because weather or events are pushing the inputs into a region the model hasn't seen much.

The rebalance recommender weights its confidence score by CI width, so the cards you see in /dashboard/operations/rebalance already account for forecast uncertainty.

What's not on the map

  • Multi-modal demand. The forecast is rides total, not split by scooter vs. bike vs. moped.
  • Real-time (sub-hour) predictions. The smallest bucket is one hour.
  • Cross-subaccount roll-ups. Each subaccount has its own forecast surface; AI Ops respects RLS.