Files
grabowski 6d4beae65a
CI / Format & lint (push) Successful in 24s
CI / Test suite (push) Successful in 48s
Docs / Validate documentation (push) Successful in 24s
Security / Dependency vulnerabilities (push) Successful in 2m20s
Security / Static analysis (push) Successful in 21s
Security / License report (push) Successful in 1m40s
fix(ml): serve the forecast rain the model was trained with
build_features cut the rain series to the gauge grid before the forward sum,
and the grid ends at the newest reading, so the row every live forecast is
made from had rain_fc24 = NaN. Training and all evaluations had the real
Open-Meteo forecast there. The forward sum now runs over the grid extended by
24 h; earlier rows are unchanged.

Harness (new opt-in variant rise_rain_fc24_missing = rise_rain with
rain_fc24 blanked on test rows, five folds, --from-cache): P.1 and P.103
nearly unaffected, P.21 false alarms 10 -> 5 and MAE 0.232 -> 0.215 with the
fix. Write-up in docs/FLOOD_FORECASTING.md section 5; results in
models/eval_2026-10-18_fc24.json.

Also: HII mirror rows in one hour now resolve to the latest reading via a
stable sort on the raw time (was an unstable sort on the floored hour, i.e.
row-order dependent). Needed for an exact Rust port.
2026-10-18 14:07:56 +07:00

737 lines
17 KiB
JSON

[
{
"station": "P.1",
"warn_thr": 3.7,
"folds": [
{
"year": 2021,
"n_train": 20024,
"n_test": 4392,
"events": [],
"variants": {
"rise_rain": {
"mae": 0.07375926701460789,
"mae_above_2p5": null,
"brier_warn": 0.0,
"events": [],
"false_alarm_episodes": 0
},
"rise_rain_fc24_missing": {
"mae": 0.07349391292098781,
"mae_above_2p5": null,
"brier_warn": 0.0,
"events": [],
"false_alarm_episodes": 0
}
}
},
{
"year": 2022,
"n_train": 28784,
"n_test": 4392,
"events": [
{
"crossing": "2022-10-02T19:00:00",
"peak_ts": "2022-10-03T15:00:00",
"peak_level": 4.65
}
],
"variants": {
"rise_rain": {
"mae": 0.08452847354970178,
"mae_above_2p5": 0.25082252888260664,
"brier_warn": 0.004300908725927739,
"events": [
{
"crossing": "2022-10-02T19:00:00",
"lead_h": 5.0,
"peak_level": 4.65,
"peak_pred_24h_before": 3.8173954245046406
}
],
"false_alarm_episodes": 0
},
"rise_rain_fc24_missing": {
"mae": 0.08511964468019045,
"mae_above_2p5": 0.2527703432441232,
"brier_warn": 0.004315341268867166,
"events": [
{
"crossing": "2022-10-02T19:00:00",
"lead_h": 5.0,
"peak_level": 4.65,
"peak_pred_24h_before": 3.8102898827310137
}
],
"false_alarm_episodes": 0
}
}
},
{
"year": 2023,
"n_train": 37539,
"n_test": 4392,
"events": [],
"variants": {
"rise_rain": {
"mae": 0.07696637416933236,
"mae_above_2p5": 0.10643655855133666,
"brier_warn": 1.919860722404625e-15,
"events": [],
"false_alarm_episodes": 0
},
"rise_rain_fc24_missing": {
"mae": 0.07281928830426289,
"mae_above_2p5": 0.12255431002563086,
"brier_warn": 1.859416740909973e-15,
"events": [],
"false_alarm_episodes": 0
}
}
},
{
"year": 2024,
"n_train": 46323,
"n_test": 4392,
"events": [
{
"crossing": "2024-09-24T17:00:00",
"peak_ts": "2024-09-26T02:00:00",
"peak_level": 4.93
},
{
"crossing": "2024-10-03T09:00:00",
"peak_ts": "2024-10-05T12:00:00",
"peak_level": 5.3
}
],
"variants": {
"rise_rain": {
"mae": 0.0890019157543212,
"mae_above_2p5": 0.2093245927883516,
"brier_warn": 0.005826169840715695,
"events": [
{
"crossing": "2024-09-24T17:00:00",
"lead_h": 10.0,
"peak_level": 4.93,
"peak_pred_24h_before": 4.817519939833057
},
{
"crossing": "2024-10-03T09:00:00",
"lead_h": 21.0,
"peak_level": 5.3,
"peak_pred_24h_before": 5.546588884631041
}
],
"false_alarm_episodes": 0
},
"rise_rain_fc24_missing": {
"mae": 0.0896559193295349,
"mae_above_2p5": 0.2184968282693981,
"brier_warn": 0.00611626529479383,
"events": [
{
"crossing": "2024-09-24T17:00:00",
"lead_h": 9.0,
"peak_level": 4.93,
"peak_pred_24h_before": 4.7051072221287855
},
{
"crossing": "2024-10-03T09:00:00",
"lead_h": 21.0,
"peak_level": 5.3,
"peak_pred_24h_before": 5.563518687086929
}
],
"false_alarm_episodes": 0
}
}
},
{
"year": 2025,
"n_train": 55083,
"n_test": 4392,
"events": [
{
"crossing": "2025-09-27T18:00:00",
"peak_ts": "2025-09-27T22:00:00",
"peak_level": 3.93
}
],
"variants": {
"rise_rain": {
"mae": 0.11202835461695825,
"mae_above_2p5": 0.2456782496767171,
"brier_warn": 0.005178356039745929,
"events": [
{
"crossing": "2025-09-27T18:00:00",
"lead_h": 2.0,
"peak_level": 3.93,
"peak_pred_24h_before": 3.23
}
],
"false_alarm_episodes": 0
},
"rise_rain_fc24_missing": {
"mae": 0.11232147044143151,
"mae_above_2p5": 0.2457513740974484,
"brier_warn": 0.004988582804599792,
"events": [
{
"crossing": "2025-09-27T18:00:00",
"lead_h": 4.0,
"peak_level": 3.93,
"peak_pred_24h_before": 3.3264027753671597
}
],
"false_alarm_episodes": 0
}
}
}
]
},
{
"station": "P.103",
"warn_thr": 5.95,
"folds": [
{
"year": 2021,
"n_train": 20009,
"n_test": 4392,
"events": [],
"variants": {
"rise_rain": {
"mae": 0.14438683486790602,
"mae_above_2p5": null,
"brier_warn": 0.0,
"events": [],
"false_alarm_episodes": 0
},
"rise_rain_fc24_missing": {
"mae": 0.14435605468178428,
"mae_above_2p5": null,
"brier_warn": 0.0,
"events": [],
"false_alarm_episodes": 0
}
}
},
{
"year": 2022,
"n_train": 28769,
"n_test": 4392,
"events": [
{
"crossing": "2022-08-14T04:00:00",
"peak_ts": "2022-08-14T08:00:00",
"peak_level": 6.09
},
{
"crossing": "2022-10-02T16:00:00",
"peak_ts": "2022-10-03T16:00:00",
"peak_level": 7.54
}
],
"variants": {
"rise_rain": {
"mae": 0.14392334606606189,
"mae_above_2p5": 0.41075382386412596,
"brier_warn": 0.00764679988213082,
"events": [
{
"crossing": "2022-08-14T04:00:00",
"lead_h": 6.0,
"peak_level": 6.09,
"peak_pred_24h_before": 4.825270553204425
},
{
"crossing": "2022-10-02T16:00:00",
"lead_h": 9.0,
"peak_level": 7.54,
"peak_pred_24h_before": 7.194064117976157
}
],
"false_alarm_episodes": 0
},
"rise_rain_fc24_missing": {
"mae": 0.1438805977972288,
"mae_above_2p5": 0.41655333933205874,
"brier_warn": 0.007670614570637225,
"events": [
{
"crossing": "2022-08-14T04:00:00",
"lead_h": 5.0,
"peak_level": 6.09,
"peak_pred_24h_before": 4.822220911656332
},
{
"crossing": "2022-10-02T16:00:00",
"lead_h": 9.0,
"peak_level": 7.54,
"peak_pred_24h_before": 7.187888665288963
}
],
"false_alarm_episodes": 0
}
}
},
{
"year": 2023,
"n_train": 37524,
"n_test": 4392,
"events": [],
"variants": {
"rise_rain": {
"mae": 0.16195301512514512,
"mae_above_2p5": null,
"brier_warn": 3.0208441147560167e-07,
"events": [],
"false_alarm_episodes": 0
},
"rise_rain_fc24_missing": {
"mae": 0.15117839869986002,
"mae_above_2p5": null,
"brier_warn": 6.508469941612771e-08,
"events": [],
"false_alarm_episodes": 0
}
}
},
{
"year": 2024,
"n_train": 46308,
"n_test": 4058,
"events": [
{
"crossing": "2024-09-24T10:00:00",
"peak_ts": "2024-09-26T00:00:00",
"peak_level": 8.27
},
{
"crossing": "2024-09-30T03:00:00",
"peak_ts": "2024-09-30T06:00:00",
"peak_level": 5.99
},
{
"crossing": "2024-10-03T06:00:00",
"peak_ts": "2024-10-05T07:00:00",
"peak_level": 9.93
}
],
"variants": {
"rise_rain": {
"mae": 0.13901842325128816,
"mae_above_2p5": 0.2887416310966684,
"brier_warn": 0.0072040857753137046,
"events": [
{
"crossing": "2024-09-24T10:00:00",
"lead_h": 19.0,
"peak_level": 8.27,
"peak_pred_24h_before": 8.212734363860193
},
{
"crossing": "2024-09-30T03:00:00",
"lead_h": 9.0,
"peak_level": 5.99,
"peak_pred_24h_before": 5.47565489914091
},
{
"crossing": "2024-10-03T06:00:00",
"lead_h": 55.0,
"peak_level": 9.93,
"peak_pred_24h_before": 8.780278464915938
}
],
"false_alarm_episodes": 0
},
"rise_rain_fc24_missing": {
"mae": 0.15101681306989473,
"mae_above_2p5": 0.3221006670360109,
"brier_warn": 0.008559364941781224,
"events": [
{
"crossing": "2024-09-24T10:00:00",
"lead_h": 18.0,
"peak_level": 8.27,
"peak_pred_24h_before": 7.997091483400909
},
{
"crossing": "2024-09-30T03:00:00",
"lead_h": 9.0,
"peak_level": 5.99,
"peak_pred_24h_before": 5.502287543201456
},
{
"crossing": "2024-10-03T06:00:00",
"lead_h": 62.0,
"peak_level": 9.93,
"peak_pred_24h_before": 9.103449390810866
}
],
"false_alarm_episodes": 0
}
}
},
{
"year": 2025,
"n_train": 54577,
"n_test": 4392,
"events": [
{
"crossing": "2025-09-26T06:00:00",
"peak_ts": "2025-09-27T21:00:00",
"peak_level": 6.64
},
{
"crossing": "2025-10-03T06:00:00",
"peak_ts": "2025-10-03T12:00:00",
"peak_level": 6.14
}
],
"variants": {
"rise_rain": {
"mae": 0.17206685418009837,
"mae_above_2p5": 0.3840520085986099,
"brier_warn": 0.015824852891785323,
"events": [
{
"crossing": "2025-09-26T06:00:00",
"lead_h": 6.0,
"peak_level": 6.64,
"peak_pred_24h_before": 5.73043665401637
},
{
"crossing": "2025-10-03T06:00:00",
"lead_h": 8.0,
"peak_level": 6.14,
"peak_pred_24h_before": 5.609919760117381
}
],
"false_alarm_episodes": 2
},
"rise_rain_fc24_missing": {
"mae": 0.17368174393168262,
"mae_above_2p5": 0.3756076666801506,
"brier_warn": 0.014794520234147523,
"events": [
{
"crossing": "2025-09-26T06:00:00",
"lead_h": 5.0,
"peak_level": 6.64,
"peak_pred_24h_before": 5.8809952440025
},
{
"crossing": "2025-10-03T06:00:00",
"lead_h": 35.0,
"peak_level": 6.14,
"peak_pred_24h_before": 5.6215400644356235
}
],
"false_alarm_episodes": 2
}
}
}
]
},
{
"station": "P.21",
"warn_thr": 3.2,
"folds": [
{
"year": 2021,
"n_train": 19099,
"n_test": 4392,
"events": [],
"variants": {
"rise_rain": {
"mae": 0.31976019104736464,
"mae_above_2p5": 0.49280187683998045,
"brier_warn": 4.599376306869306e-06,
"events": [],
"false_alarm_episodes": 0
},
"rise_rain_fc24_missing": {
"mae": 0.3238133154815793,
"mae_above_2p5": 0.49187453544981,
"brier_warn": 4.609640062881583e-06,
"events": [],
"false_alarm_episodes": 0
}
}
},
{
"year": 2022,
"n_train": 27860,
"n_test": 4392,
"events": [
{
"crossing": "2022-09-12T05:00:00",
"peak_ts": "2022-09-12T05:00:00",
"peak_level": 3.21
},
{
"crossing": "2022-10-02T04:00:00",
"peak_ts": "2022-10-03T21:00:00",
"peak_level": 3.92
}
],
"variants": {
"rise_rain": {
"mae": 0.188862265489962,
"mae_above_2p5": 0.22738565836625405,
"brier_warn": 0.009674093199871036,
"events": [
{
"crossing": "2022-09-12T05:00:00",
"lead_h": 0.0,
"peak_level": 3.21,
"peak_pred_24h_before": 2.49615362708868
},
{
"crossing": "2022-10-02T04:00:00",
"lead_h": 1.0,
"peak_level": 3.92,
"peak_pred_24h_before": 3.907087039152045
}
],
"false_alarm_episodes": 0
},
"rise_rain_fc24_missing": {
"mae": 0.19791868293297726,
"mae_above_2p5": 0.2739869896442161,
"brier_warn": 0.0103072884296978,
"events": [
{
"crossing": "2022-09-12T05:00:00",
"lead_h": 0.0,
"peak_level": 3.21,
"peak_pred_24h_before": 2.4722245571508683
},
{
"crossing": "2022-10-02T04:00:00",
"lead_h": 0.0,
"peak_level": 3.92,
"peak_pred_24h_before": 3.845235629130954
}
],
"false_alarm_episodes": 0
}
}
},
{
"year": 2023,
"n_train": 36614,
"n_test": 4392,
"events": [
{
"crossing": "2023-10-10T06:00:00",
"peak_ts": "2023-10-10T06:00:00",
"peak_level": 3.2
}
],
"variants": {
"rise_rain": {
"mae": 0.17283257678933697,
"mae_above_2p5": 0.39237224972369483,
"brier_warn": 0.012908395601661503,
"events": [
{
"crossing": "2023-10-10T06:00:00",
"lead_h": 15.0,
"peak_level": 3.2,
"peak_pred_24h_before": 1.8019095357375217
}
],
"false_alarm_episodes": 3
},
"rise_rain_fc24_missing": {
"mae": 0.1953027570197896,
"mae_above_2p5": 0.37345466270918226,
"brier_warn": 0.005336247430915456,
"events": [
{
"crossing": "2023-10-10T06:00:00",
"lead_h": 14.0,
"peak_level": 3.2,
"peak_pred_24h_before": 1.8796882667592647
}
],
"false_alarm_episodes": 3
}
}
},
{
"year": 2024,
"n_train": 45398,
"n_test": 4385,
"events": [
{
"crossing": "2024-09-01T03:00:00",
"peak_ts": "2024-09-01T08:00:00",
"peak_level": 4.3
},
{
"crossing": "2024-09-23T06:00:00",
"peak_ts": "2024-09-23T15:00:00",
"peak_level": 4.68
},
{
"crossing": "2024-10-03T05:00:00",
"peak_ts": "2024-10-04T20:00:00",
"peak_level": 5.21
}
],
"variants": {
"rise_rain": {
"mae": 0.20733600140331027,
"mae_above_2p5": 0.4173432645880738,
"brier_warn": 0.013730524899775963,
"events": [
{
"crossing": "2024-09-01T03:00:00",
"lead_h": 0.0,
"peak_level": 4.3,
"peak_pred_24h_before": 1.7973215452596953
},
{
"crossing": "2024-09-23T06:00:00",
"lead_h": 2.0,
"peak_level": 4.68,
"peak_pred_24h_before": 2.670881094688805
},
{
"crossing": "2024-10-03T05:00:00",
"lead_h": 33.0,
"peak_level": 5.21,
"peak_pred_24h_before": 4.999142187693036
}
],
"false_alarm_episodes": 0
},
"rise_rain_fc24_missing": {
"mae": 0.2222046566812092,
"mae_above_2p5": 0.43423994130380844,
"brier_warn": 0.01611358822165686,
"events": [
{
"crossing": "2024-09-01T03:00:00",
"lead_h": 0.0,
"peak_level": 4.3,
"peak_pred_24h_before": 1.7847018175539242
},
{
"crossing": "2024-09-23T06:00:00",
"lead_h": 1.0,
"peak_level": 4.68,
"peak_pred_24h_before": 2.640820102168781
},
{
"crossing": "2024-10-03T05:00:00",
"lead_h": 32.0,
"peak_level": 5.21,
"peak_pred_24h_before": 4.749354278189956
}
],
"false_alarm_episodes": 0
}
}
},
{
"year": 2025,
"n_train": 54150,
"n_test": 4392,
"events": [
{
"crossing": "2025-07-23T15:00:00",
"peak_ts": "2025-07-24T04:00:00",
"peak_level": 3.63
},
{
"crossing": "2025-08-26T19:00:00",
"peak_ts": "2025-08-26T23:00:00",
"peak_level": 3.48
},
{
"crossing": "2025-09-12T21:00:00",
"peak_ts": "2025-09-12T22:00:00",
"peak_level": 3.21
},
{
"crossing": "2025-09-22T20:00:00",
"peak_ts": "2025-09-22T21:00:00",
"peak_level": 3.27
}
],
"variants": {
"rise_rain": {
"mae": 0.1851599197920176,
"mae_above_2p5": 0.29411810271343447,
"brier_warn": 0.021849546400589632,
"events": [
{
"crossing": "2025-07-23T15:00:00",
"lead_h": 3.0,
"peak_level": 3.63,
"peak_pred_24h_before": 2.4024371626847
},
{
"crossing": "2025-08-26T19:00:00",
"lead_h": 4.0,
"peak_level": 3.48,
"peak_pred_24h_before": 2.492383184457359
},
{
"crossing": "2025-09-12T21:00:00",
"lead_h": 18.0,
"peak_level": 3.21,
"peak_pred_24h_before": 2.5690976144688706
},
{
"crossing": "2025-09-22T20:00:00",
"lead_h": 1.0,
"peak_level": 3.27,
"peak_pred_24h_before": 2.382265050508778
}
],
"false_alarm_episodes": 2
},
"rise_rain_fc24_missing": {
"mae": 0.21936157981899435,
"mae_above_2p5": 0.3121582241464527,
"brier_warn": 0.025980409031233827,
"events": [
{
"crossing": "2025-07-23T15:00:00",
"lead_h": 2.0,
"peak_level": 3.63,
"peak_pred_24h_before": 2.096100137296138
},
{
"crossing": "2025-08-26T19:00:00",
"lead_h": 69.0,
"peak_level": 3.48,
"peak_pred_24h_before": 2.3678295230657067
},
{
"crossing": "2025-09-12T21:00:00",
"lead_h": 19.0,
"peak_level": 3.21,
"peak_pred_24h_before": 2.783241642058761
},
{
"crossing": "2025-09-22T20:00:00",
"lead_h": 2.0,
"peak_level": 3.27,
"peak_pred_24h_before": 2.279238629032059
}
],
"false_alarm_episodes": 7
}
}
}
]
}
]