Seine nowcast, 2026 season — what the record says
Paris (four sites on the Seine and the Villette basin) and the Marne (three sites, Syndicat Marne Vive). Written 2026-09-24 by OpenCurrent, after the Paris bathing season closed. Frozen: every number below is computed from the published decision record, the 2026-09-08 full-history replay, the Pumphaus installation register, the units' own diagnostics and Open-Meteo archive rainfall. Nothing is estimated.
What the nowcast is, for readers new to it
Every hour, for every site in the fleet, the nowcast publishes an estimate of the E. coli concentration in the water and a probability that it is above that site's action limit (900 CFU/100 mL on the Seine and Marne, the EU bathing-water threshold). If that probability is 0.35 or higher the site shows an alert. Several versions of the model, called arms, run side by side:
- calibration
- a prior for the site (from satellite and landscape data, pooled with the region) plus a slowly updated site offset learned from that site's own lab results. It has no sensor input, so it barely moves between lab samples.
- stack
- calibration plus a machine-learned correction from the Lume sensor (tryptophan-like fluorescence, turbidity, temperature) and recent rain, trained on the whole fleet's paired samples.
- regression
- a small per-site linear model on the sensor features, using only that site's own samples.
Two words are kept apart throughout. A sample is the bottle of water taken at the site on a given morning. Its result is the lab's E. coli count for that bottle, which comes back one to two days later. The arms are judged the honest way: when a result comes back, it is scored against what each arm had already published at the hour the sample was taken. A missed exceedance costs 3 points, a false alarm 1. Per site, the arm with the lowest cost is the one whose estimate the dashboard shows (the served arm). Arms never see the result they are being judged on.
"Never alarm" is the reference in every table: a model that stays silent pays 3 per exceedance and nothing else. At an 11% exceedance rate, an alarm only pays for itself when more than a quarter of the alarms it raises turn out to be right.
1The deployment and the lab record
Each panel is one site: lab results on a log scale (red triangles are exceedances, green dots are under the limit), the dashed line is the 900 limit, the thin line is the estimate the nowcast was serving each hour (from the full-history replay, through 2026-09-08, and cut at the unit's removal), the shaded band is the window in which the Pumphaus register says the unit was in the water, and the grey stripe marks each site's first days, when samples were being taken but no result from that site had come back yet (see stage 2). Hover any point for the numbers.
Sites, units and sampling
| site | unit | in water | lab samples | exceedances | notes |
|---|
Paris sampling stopped on 2026-08-27, the day the register records the Bercy, Bras Marie and Grenelle units being removed. Villette stays in with a weekly sample. The Marne programme continues. Bercy and Bras Marie were cleaned on 2026-08-18, which stepped their fluorescence up 2 to 4 fold.
2The scoreboard
Decision cost (3 per missed exceedance + 1 per false alarm) on the published record, by arm, against the never-alarm reference. Lower is better. Hover a bar for the miss and false-alarm split.
Scoreboard as a table
| pool | samples | exceedances | never alarm | calibration | stack | regression |
|---|
Where the cost comes from
- A cold start that was scored. samples were taken in each site's first days, before the result of any earlier sample from that site had come back from the lab. The model had nothing from the site to calibrate on, so at those hours every arm was running on the region-pooled prior, about 2.9 log10 (the Marne's level) at Paris sites whose true level was about 1.8, so every arm alarmed on nearly all of them, and none was an exceedance. The dashboard held those alarms back (a site shows "held" until its first result), but the scoring did not, so a third of the Seine's cost is charged to a period when nothing was being served.
- Weak ranking at a low base rate. The arms' probabilities separate exceedances from clean samples only modestly on the Seine (area under the ROC curve 0.56 to 0.65). At the 0.35 alarm threshold they raise 40 to 46 false alarms to catch 4 to 10 of the 19 exceedances. Sweeping the threshold (below) helps, but on the warm record the best any arm reaches is a few points under never-alarm.
- The uncertainty is fleet-wide and honest. Each arm's spread is its own prediction error pooled across all 27 sites, about 0.65 to 0.75 log10. The Seine's lab results themselves scatter by 0.62, and the arms' estimates correlate with them at only 0.2 to 0.4. The level model has almost nothing to say about which morning will exceed.
Cost against alarm threshold, warm record only
Alarm if the arm's published probability is at or above the threshold. The production threshold is 0.35. The horizontal rule is never-alarm.
Reading the numbers
Five Paris exceedances and fourteen on the Marne, nine of them at Neuilly. Five of the Neuilly nine came in one storm week (08-28 to 09-01).
3What the sensors saw
How well does one measurement, on its own, rank the exceedances above the clean samples? The score is the area under the ROC curve: 0.5 is a coin toss, 1.0 is perfect. "Raw" uses the value as measured. "Within site" first removes each site's own average, so a feature only scores if it moves within a site when that site exceeds, rather than merely being higher at the site that exceeds most. Both are shown because the Marne site with the most exceedances is also the most turbid and the most fluorescent, which flatters the raw column.
- The fluorescence level carries real signal on the Seine, and it survives the within-site test (0.69). It is already a feature of the stack, alongside the anomaly. What the stack learned about it came from a fleet dominated by Boulder Creek, a clear snowmelt stream, and does not transfer well: its probability ranks Seine exceedances at 0.59 on the same samples.
- The anomaly (level against a 14-day trailing baseline) is close to noise at Paris (correlation with the lab value of about −0.14), and the two cleanings on 08-18 are part of why: a cleaning steps fluorescence up 2 to 4 fold, which looks like an event to a trailing baseline and then poisons the baseline for two weeks. On the Marne, where nothing was cleaned, the anomaly is the best single feature at Neuilly (0.73).
- Turbidity is a between-site effect, not a within-site one: raw 0.71, within site 0.55, and its within-site correlation with the lab value is negative.
- Rain matters with a lag the features do not cover (stage 4).
4Rain, and the lag
Daily rainfall from the Open-Meteo archive at Paris and three points up the Marne and Seine, with the exceedance days marked. The nowcast's rain features are 24, 48 and 72 hour totals at the site itself, taken at the hour of the sample.
- 08-19: 7.7 mm at Paris, 13 mm at Chateau-Thierry on the upper Marne. Exceedances followed on 08-21 at Bercy, Bras Marie and Neuilly on the Marne, and again at Bercy and Bras Marie on 08-23 (5,794 CFU). At the 08-21 morning sample the 48-hour rain total was 2 to 3 mm: the rain had already left the window. A 72-hour total would have held it, but a single lag of 2 to 4 days is not something one event can teach a model.
- 08-27: 34 mm at Paris, 9 to 23 mm upstream. Neuilly read 11,199 and 15,531 CFU on 08-28 and 08-29 and stayed above the limit to 09-01. The stack caught this one (probability 0.47 to 0.59), and that single week is most of its Marne advantage.
- Dry-weather exceedances: Bercy on 08-10 (1,935 CFU) and St-Maur on 09-03, 09-07 and 09-10 (2,045, 8,972, 6,014 CFU) came with no rain anywhere in the basin for five days. The sensors did register them, but in two different ways that the level model does not separate. At Bercy and Bras Marie on 08-21 and 08-23, and at Neuilly on 07-31 to 08-03, fluorescence ran 2 to 3.6 times the site's median while turbidity was normal or near zero: a dissolved, organic-rich input, which is what a sewer or treatment-works discharge looks like (with the caveat that the 08-18 cleanings also raised Paris fluorescence). At St-Maur on 09-03, 09-07 and 09-10, fluorescence sat below the site's median while the 24-hour turbidity peak ran 4 to 9 times it: a particle pulse without dissolved organics, which is what resuspended sediment or a mineral-laden inflow looks like. Neither is a rain or river-flow signature. They need an explanation from the operators (dry-weather sewer discharges, treatment-works bypasses, lock or dredging operations, boat traffic) before any model can be expected to catch them.
5River flow: a dry season, and a feature for next year
Flow at the Paris-Austerlitz gauge on the Seine and the Gournay gauge on the Marne (Vigicrues, daily means), against the day-of-year climatology of the same reach from a 39-year GloFAS record (median and the 10th to 90th percentile band). Red rules mark days with an exceedance on that river; the shaded span is the Paris sampling window.
- It was a low-flow season. From August through late September the Seine ran at 0.4 to 0.6 of its climatological median for the date, below the 10th percentile, and the Marne the same. While Paris was sampling, flow sat between 64 and 78 m3/s with no pulse at all. The one pulse of the season, on 08-27, arrived the day Paris sampling stopped, and it coincides with the Neuilly exceedance cluster on the Marne. A model cannot learn a flow response from a season without a flow event.
- Flow carries signal once it is standardized. Raw flow pooled across the two rivers ranks exceedances at 0.42 (a Marne flow is a fraction of a Seine flow). Expressed as an anomaly against each reach's climatology, the same flows rank them at 0.74 to 0.76 across both rivers with one feature. In the pooled nowcast model, tested walk-forward with the same standardized feature at every site (USGS gauges in the US), it improves Boulder (decision cost 39 to 33) and the fleet (106 to 101) and leaves the Seine unchanged this season. It is a cheap, promising feature for 2027.
- Gauges, not modelled discharge. GloFAS tracks the Seine and Marne at a correlation of 0.7 to 0.8 (running about 1.3x the Seine gauge and exaggerating the 08-27 pulse), but on the small or managed streams the US fleet sits on it does not: Boulder Creek 0.04, Old Woman Creek near zero, and the DC cell is the Potomac rather than the Anacostia. The feature has to come from a gauge at every site, with GloFAS used only to supply the Seine's long-term climatology until a gauge record is obtained.
6Units on a shelf
The three Paris units kept transmitting after they were removed on 08-27, and the nowcast kept treating them as in the water: its registry knows when a unit was installed but not when it was removed, and its health check only asks whether readings are fresh. The units' own temperature record settles it. Every unit in a river swings several degrees over a few days; the three Paris units read a constant 23.3 °C, identical to each other, for as long as we looked.
Hourly mean board temperature from unit diagnostics, 2026-09-18 to 09-24. The Bercy, Bras Marie and Grenelle traces lie on top of one another at 23.3 °C. Villette (Paris, still in the basin) and Neuilly (Marne) for comparison.
So from 08-27 until the ingest cut them off on 09-23, the dashboard published "sensor+rain, health ok" estimates for Bercy, Bras Marie and Grenelle that were computed from a room. The Grenelle alert that stood on the dashboard in the last week of September was the regression arm reacting to a shelf. None of this touched the scoreboard above: every Paris lab sample predates the removal.
7Notes
- The scoreboard still counts the first days at each site. When a site is new, the model has no lab result from it yet, and its guess for that site is a regional average. Those first samples are scored against that guess and the misses are charged to every version of the model. The dashboard never showed those alarms (it shows "held" until the first result is in), so the scoreboard is counting alarms nobody saw. A third of the Seine's cost comes from this. The fix is to start scoring a site only once it has its first lab result. Not done yet.
- Three Paris units kept reporting from a shelf after 08-27. The nowcast did not know they had been removed, so from 08-27 to 09-22 it published sensor-based estimates for Bercy, Bras Marie and Grenelle that were computed from a room, and those rows have since been dropped from the database. As of 2026-09-24 the feed reads the installation register: a removed unit now gets the site's calibration estimate and the label "unit not deployed". What the dashboard should display for such a site is still to be decided. Any look at those three sites between 08-27 and 09-22 should use the engine's replay, not the published series.
8What it would take to serve decision makers on the Seine
The Paris decision is binary and daily: is the bathing site open this morning, at 900 CFU/100 mL, with lab results that arrive a day or two late. The city already closes on rain. A nowcast earns a place in that decision only if it calls the morning better than "closed if it rained, otherwise yesterday's result", and can show it on a season of paired data. In order:
- Registry and ingest agree on what is in the water. Read the Pumphaus installation windows in the feed, publish no sensor estimate for a unit outside its window, fail the run when the database rejects a registered site, and add a bench detector (temperature range over 24 h) as a backstop.
- Score only what was served. Leave a site's samples out of the arms' record until its first lab result is known, or score the held state, so the scoreboard measures the product people saw.
- A Seine regime of its own. A pooled Seine model on raw fluorescence, turbidity and lagged rain, trained on Seine samples only, run as a shadow arm through the Marne autumn and the 2027 Paris season. Do not expect the Boulder-trained stack to transfer.
- Basin signals, not point rain. Rain over the sewershed and the upper Marne and Seine at 1 to 5 day lags; gauge discharge as a standardized feature at every site (Vigicrues for the Seine and Marne, USGS in the US; stage 5), with a one-time Banque Hydro export for the Seine's climatology; and the combined-sewer-overflow and dry-weather discharge logs the city's own bathing programme runs on, if the operators will share them.
- Use the city's daily lab results as a feature. Paris samples every weekday morning. The last known result, and the day-of-week and time-of-day pattern, are free information that the current 30-day site offset throws away. A site state that moves in hours is the cheapest change with a plausible payoff.
- A Seine operating point. The 3:1 cost and the 0.35 threshold were set for Boulder's limit and base rate. Paris needs its own price for a wrongly open beach against a wrongly closed one, agreed with the city, and the threshold set on the Seine record alone.
- Explain the dry-weather exceedances on the Marne and at Bercy with the customer before promising to catch them.
- Deploy before the season. Units in the water from April and samples from May, so 2027 opens with a warm record instead of a cold start.
Until steps 1 and 2 are done, the Seine's live record should not be read as a measurement of the model.
Sources and reproduction
- Decision record:
GET /api/nowcast/decisions?site=<site>for the seven Seine sites, 170 rows as of 2026-09-24. Cold-start flag: no earlier sample from the site whose result was known (known_at) by this sample's hour. - Sensor features at each sample:
lume-nowcast/state/grab_features.parquetjoined to the 2026-09-08 full-history replay (out/replay_full/decisions.parquet, 132 Seine rows, 126 with features). Served-estimate lines:out/replay_full/series.parquet. - Installation windows: inventory worker
/api/validation/install-windows. Unit diagnostics:/api/pumphaus/proxy, endpointdiagnostics. - Discharge: Vigicrues observations service (stations F700000103 Paris-Austerlitz, F664000104 Gournay-sur-Marne, 5-minute Q, last two months); USGS daily values 1990 to date (06730200, 05536290, 04199155, 01649500, 06711565, 06710247); GloFAS v4 intermediate 2026 and consolidated 1985-2023 from the Copernicus Early Warning Data Store via discharge_etl. Climatology: 31-day day-of-year window on the 39-year GloFAS record at the Paris cells.
- Rain: Open-Meteo archive, daily precipitation sum at 48.85/2.35 (Paris), 48.96/2.88 (Meaux), 49.04/3.40 (Chateau-Thierry), 48.54/2.66 (Melun).
- Walk-forward Seine model: logistic regression on log fluorescence, log 24-hour turbidity max, log 48-hour rain and temperature, refit on all Seine samples known at each sample hour (minimum 20 with 2 exceedances), class-balanced, C = 0.5.
- The full engineering postmortem is
lume-nowcast/engine/SEINE_POSTMORTEM.md.