Groundwater Forecast - Model Dashboard Last run: 2026-05-01 12:15

Performance statistics for the machine learning groundwater prediction model. The model trains daily on 3,330 days of data (2003–present), using a 366-day weighted rainfall window with dynamic lag shifting to predict Calculated Groundwater % up to 120 days ahead across three rainfall scenarios. The 20-day backtest reruns automatically each day at 12:15 after EA data updates.

How the Model Works

Core Formula

Each day's groundwater level is predicted using a linear formula applied to a weighted sum of the past 366 days of rainfall. Before being summed, every day’s rainfall is multiplied by two factors: a monthly factor (accounting for seasonal variation in recharge) and a lag weight (accounting for how long ago the rain fell and how much effect it still has on the aquifer).

GW %  =  −8.00  +  0.147 × WeightedRainSum

The intercept (−8.00) and slope (0.147) are currently fixed at calibrated values. The slope derives from the original Excel hydrological model (calibrated against 20+ years of EA gauge data); the intercept was recalibrated in February 2026 when the original value (−22.09) was found to underestimate groundwater levels by ~14% under current weighted rainfall conditions.

To ensure predictions start exactly at today’s measured level, an exponentially decaying correction is added. This fades to near-zero over 90 days, so the model gradually transitions from anchoring on today’s reading to trusting the formula alone:

correction(day) = Δ × e−0.02 × day

Day  0: 100% of correction
Day 35:  50% of correction
Day 90:   5% of correction
Monthly Rainfall Factors

Rain falling in different months has very different effects on groundwater recharge. Summer rain is largely lost to evapotranspiration and plant uptake; winter rain percolates into the chalk aquifer far more efficiently. Each month’s rainfall is therefore multiplied by a seasonal factor before entering the model.

These factors are loaded from the database each run (shown below are the current learned values, starting from the Excel model baseline):

Month Factor Recharge
Jan1.19High
Feb0.91Medium
Mar0.91Medium
Apr0.86Medium
May0.38Low
Jun0.38Low
Jul0.38Low
Aug0.38Low
Sep0.95Medium
Oct1.38High
Nov1.38High
Dec1.10High

Highest recharge months: Oct, Nov, Jan. Lowest recharge months: May, Jun, Jul, Aug. These factors are fixed at calibrated values derived from the Excel model. Automatic ML adjustment has been disabled as the GBM model handles seasonality internally, causing the adjustment to incorrectly push all factors toward 1.0.

Lag Weight Profile

Rain does not immediately reach the groundwater table — it must percolate through the unsaturated chalk above the aquifer. The lag weight profile describes how much influence rainfall from different periods in the past has on today’s groundwater level. The profile covers the past 366 days:

Days ago Weight Interpretation
0 – 19 0.75 Recent — partial effect, still percolating
20 – 39 1.00 Reaching water table
40 – 59 1.20 Peak influence
60 – 179 0.90 Sustained contribution
180 – 199 0.85 Fading influence
200 – 219 0.77 Diminishing
220 – 259 0.70–0.75 Background recharge
260 – 279 0.50 Minor residual
280 – 299 0.05 Negligible
300 – 365 0.00 No effect

The peak influence at 40–59 days ago reflects typical chalk percolation times in the upper Pang valley. The ML model can adjust individual weights by up to 2% per daily run, capped at 1.5× the initial value.

Dynamic Lag Shifting

When the aquifer is already full, rain reaches the water table faster because less unsaturated chalk needs to be saturated first. Conversely, when groundwater is very low, percolation takes longer. The model accounts for this by shifting the entire lag weight curve earlier or later depending on the current groundwater level.

Thresholds are based on historical quartiles from 20+ years of EA data (historical range: 3.3% – 96.6%):

GW Level Quartile Lag Shift Effect
< 26.6% Bottom 25% +40 days Much slower response
26.6 – 49.9% Lower mid +20 days Slower response
49.9 – 73.3% Upper mid 0 days Baseline (current)
> 73.3% Top 25% −20 days Faster response

At today’s level of 68.8%, the model is applying a baseline shift (normal response).

Dynamic shifting is only applied from day 30 of the forecast onwards. In the short term (days 1–29) all three scenarios use the same baseline weights to ensure they diverge smoothly and predictably based only on differing rainfall amounts.

Three rainfall scenarios are projected: average uses historical monthly means; +40% and −40% scale future rain up or down. All scenarios start identically at today’s actual reading.

2.0%
Mean Error (MAE)
20-day backtest
2.4%
RMSE
20-day backtest
-2.0%
Bias
Over-pred
0.9976
Validation R²
3,330 samples
68.8%
Today (Actual)
2026-05-01
74
Model Runs
11,289 prediction rows

Tomorrow’s Forecast

+40%
69.1%
Avg
69.0%
-40%
69.0%

Actual today: 68.8%

60-Day Forecast

+40%
65.5%
Avg
63.1%
-40%
60.8%

Blue=wet, Green=average, Orange=dry

Accuracy by Forecast Horizon

Days AheadNAvg Error %Bias %Max Error %
1290.440.440.85
2280.750.751.31
3271.041.041.87
5251.641.642.40
7232.242.243.17
10203.103.104.12
14164.194.195.14
2196.186.186.82

Backtest History Daily 20-day results

DateMAE %RMSE %Bias %Status
2026-05-012.052.39-2.03Significant bias detected
2026-04-301.852.21-1.83Within acceptable range
2026-04-291.662.03-1.62Within acceptable range
2026-04-281.501.86-1.41Within acceptable range
2026-04-271.371.69-1.20Within acceptable range
2026-04-261.231.54-1.02Within acceptable range
2026-04-251.101.38-0.84Within acceptable range
2026-04-240.981.21-0.66Within acceptable range
2026-04-230.881.06-0.50Within acceptable range
2026-04-220.820.96-0.33Within acceptable range
2026-04-210.780.91-0.18Within acceptable range
2026-04-200.760.88-0.04Within acceptable range
2026-04-190.780.910.14Within acceptable range
2026-04-180.800.940.29Within acceptable range
2026-04-170.851.020.46Within acceptable range
2026-04-160.881.060.60Within acceptable range
2026-04-150.971.230.81Within acceptable range
2026-04-141.111.451.02Within acceptable range
2026-04-131.211.561.18Within acceptable range
2026-04-121.361.711.35Within acceptable range
2026-04-111.491.821.48Within acceptable range
2026-04-101.601.891.60Within acceptable range
2026-04-091.701.961.70Within acceptable range
2026-04-081.782.011.78Within acceptable range
2026-04-071.872.071.87Within acceptable range
2026-04-061.982.161.98Within acceptable range
2026-04-052.102.252.10Significant bias detected
2026-04-042.182.302.18Significant bias detected
2026-04-032.292.382.29Significant bias detected
2026-04-022.362.442.36Significant bias detected

Monthly Averages Trend over time

MonthAvg MAE %Avg RMSE %Avg Bias %Days
2026-052.052.39-2.031
2026-041.421.650.6030
2026-033.713.893.5031
2026-025.146.23-3.5812

Model Training Log Daily training metrics

DateTrain R²Val R²Tr RMSEVal RMSESamples
2026-05-01 12:151.00000.99760.0961.0693330
2026-04-30 12:151.00000.99760.0961.0593329
2026-04-29 12:151.00000.99770.0971.0373328
2026-04-28 12:151.00000.99770.0971.0383328
2026-04-27 12:151.00000.99790.0971.0053327
2026-04-26 12:151.00000.99790.0980.9863326
2026-04-25 12:151.00000.99780.0961.0183325
2026-04-24 12:151.00000.99730.0951.1363324
2026-04-23 12:151.00000.99730.0951.1363324
2026-04-22 12:151.00000.99770.0981.0393323
2026-04-21 12:151.00000.99770.0981.0503322
2026-04-20 12:151.00000.99790.0981.0073321
2026-04-19 12:151.00000.99740.0971.1133320
2026-04-18 12:151.00000.99740.0971.1133320
2026-04-17 12:151.00000.99810.0970.9413319
2026-04-16 12:151.00000.99790.0961.0033318
2026-04-15 12:151.00000.99710.0981.1683317
2026-04-14 12:151.00000.99730.0971.1233316
2026-04-13 12:151.00000.99730.0971.1243316
2026-04-12 12:151.00000.99780.0971.0263315
2026-04-11 12:151.00000.99780.0981.0233314
2026-04-10 12:151.00000.99770.0961.0423313
2026-04-09 12:151.00000.99740.0991.1173312
2026-04-08 12:151.00000.99740.0991.1183312
2026-04-07 12:151.00000.99770.0981.0453311
2026-04-06 12:151.00000.99810.0960.9663310
2026-04-05 12:151.00000.99760.0961.0753309
2026-04-04 12:151.00000.99750.0961.1083308
2026-04-03 12:151.00000.99750.0961.1083308
2026-04-02 12:151.00000.99790.0981.0153307

Historical Accuracy: Predictions Made 30 Days Ago Average scenario — comparing the 30-day "long range" forecast to what actually happened

Target DateActual %Predicted %Error %Days AheadMade On
2026-05-0168.7876.968.17282026-04-03
2026-05-0168.7877.218.42292026-04-02
2026-05-0168.7880.4211.63302026-04-01
2026-04-3069.1477.268.13282026-04-02
2026-04-3069.1477.568.42292026-04-01
2026-04-2969.5177.598.07282026-04-01

* This table filters for predictions where the horizon was approximately 30 days. It will begin populating once the model has been running with the new snapshot storage for at least 30 days.

Recent Predictions vs Actuals Average scenario — where actual data now exists

DateActual %Predicted %Error %Days AheadMade On
2026-04-3069.1477.568.42292026-04-01 00:00:00
2026-04-3069.1477.268.13282026-04-02 00:00:00
2026-04-3069.1477.017.88272026-04-03 00:00:00
2026-04-3069.1476.867.73262026-04-04 00:00:00
2026-04-3069.1476.657.52252026-04-05 00:00:00
2026-04-3069.1476.577.44242026-04-06 00:00:00
2026-04-3069.1476.547.40232026-04-07 00:00:00
2026-04-3069.1476.277.13222026-04-08 00:00:00
2026-04-3069.1475.966.82212026-04-09 00:00:00
2026-04-3069.1475.546.41202026-04-10 00:00:00
2026-04-3069.1475.556.41192026-04-11 00:00:00
2026-04-3069.1475.296.15182026-04-12 00:00:00
2026-04-3069.1475.045.90172026-04-13 00:00:00
2026-04-3069.1474.825.68162026-04-14 00:00:00
2026-04-3069.1474.245.11152026-04-15 00:00:00
2026-04-3069.1474.275.14142026-04-16 00:00:00
2026-04-3069.1474.185.05132026-04-17 00:00:00
2026-04-3069.1473.774.64122026-04-18 00:00:00
2026-04-3069.1473.484.34112026-04-19 00:00:00
2026-04-3069.1473.264.12102026-04-20 00:00:00
2026-04-3069.1472.983.8492026-04-21 00:00:00
2026-04-3069.1472.373.2482026-04-22 00:00:00
2026-04-3069.1471.912.7872026-04-23 00:00:00
2026-04-3069.1471.392.2562026-04-24 00:00:00
2026-04-3069.1471.192.0552026-04-25 00:00:00
2026-04-3069.1470.871.7442026-04-26 00:00:00
2026-04-3069.1470.431.3032026-04-27 00:00:00
2026-04-3069.1470.010.8822026-04-28 00:00:00
2026-04-3069.1469.660.5212026-04-29 00:00:00
2026-04-3069.1469.14-0.0002026-04-30 00:00:00
2026-04-2969.5177.598.07282026-04-01 00:00:00
2026-04-2969.5177.297.78272026-04-02 00:00:00
2026-04-2969.5177.047.52262026-04-03 00:00:00
2026-04-2969.5176.897.37252026-04-04 00:00:00
2026-04-2969.5176.687.16242026-04-05 00:00:00
2026-04-2969.5176.607.08232026-04-06 00:00:00
2026-04-2969.5176.577.05222026-04-07 00:00:00
2026-04-2969.5176.296.78212026-04-08 00:00:00
2026-04-2969.5175.986.47202026-04-09 00:00:00
2026-04-2969.5175.566.05192026-04-10 00:00:00
2026-04-2969.5175.616.10182026-04-11 00:00:00
2026-04-2969.5175.355.83172026-04-12 00:00:00
2026-04-2969.5175.095.58162026-04-13 00:00:00
2026-04-2969.5174.875.36152026-04-14 00:00:00
2026-04-2969.5174.294.77142026-04-15 00:00:00
2026-04-2969.5174.324.80132026-04-16 00:00:00
2026-04-2969.5174.234.72122026-04-17 00:00:00
2026-04-2969.5173.814.30112026-04-18 00:00:00
2026-04-2969.5173.514.00102026-04-19 00:00:00
2026-04-2969.5173.293.7892026-04-20 00:00:00
2026-04-2969.5173.013.4982026-04-21 00:00:00
2026-04-2969.5172.392.8872026-04-22 00:00:00
2026-04-2969.5171.932.4162026-04-23 00:00:00
2026-04-2969.5171.391.8852026-04-24 00:00:00
2026-04-2969.5171.201.6842026-04-25 00:00:00
2026-04-2969.5170.871.3632026-04-26 00:00:00
2026-04-2969.5170.430.9122026-04-27 00:00:00
2026-04-2969.5170.000.4912026-04-28 00:00:00
2026-04-2969.5169.51-0.0002026-04-29 00:00:00
2026-04-2869.9077.607.70272026-04-01 00:00:00

Forward Predictions — All Scenarios Made on 2026-05-01 00:00

DateAverage %+40% Rain %-40% Rain %Range %
2026-05-0168.7868.7868.780.00
2026-05-0269.0169.0768.950.12
2026-05-0369.2469.3369.150.18
2026-05-0469.4369.5569.310.24
2026-05-0569.3769.5269.220.30
2026-05-0669.5469.7169.360.36
2026-05-0769.3169.5169.100.42
2026-05-0869.0769.3168.840.48
2026-05-0969.1269.3968.850.54
2026-05-1069.0969.3968.790.60
2026-05-1168.9469.2668.610.66
2026-05-1268.6468.9968.280.72
2026-05-1368.5768.9668.180.78
2026-05-1468.4668.8768.040.83
2026-05-1568.4368.8867.980.89
2026-05-1668.4568.9267.970.95
2026-05-1768.4668.9767.951.01
2026-05-1868.4969.0367.951.07
2026-05-1968.3868.9467.811.13
2026-05-2068.1868.7867.591.19
2026-05-2167.7068.3367.061.27
2026-05-2267.7268.4067.041.35
2026-05-2367.7568.4667.031.43
2026-05-2467.8668.6167.101.51
2026-05-2568.0268.8167.221.59
2026-05-2668.1168.9467.271.67
2026-05-2768.1669.0367.281.75
2026-05-2867.8668.7866.951.83
2026-05-2967.8468.7966.881.91
2026-05-3067.8268.8166.821.99
2026-05-3167.8068.8366.772.07
2026-06-0167.6768.7566.602.14
2026-06-0267.4568.5666.342.22
2026-06-0367.2168.3666.062.30
2026-06-0466.9668.1565.772.38
2026-06-0566.8868.1165.652.46
2026-06-0666.7668.0365.492.53
2026-06-0766.6867.9865.372.61
2026-06-0866.4267.7765.082.69
2026-06-0966.2467.6364.862.77
2026-06-1064.9266.3563.492.86
2026-06-1164.7066.1763.222.95
2026-06-1264.8466.3663.313.05
2026-06-1364.9466.5163.373.14
2026-06-1464.9366.5563.313.24
2026-06-1564.9866.6463.313.33
2026-06-1664.8166.5263.093.42
2026-06-1764.0965.8462.333.52
2026-06-1863.8365.6462.033.61
2026-06-1963.6065.4561.753.70
2026-06-2063.2065.1061.303.80
2026-06-2162.9864.9261.033.89
2026-06-2262.9964.9861.003.98
2026-06-2363.0365.0760.994.08
2026-06-2463.0365.1260.944.17
2026-06-2563.0865.2160.944.26
2026-06-2663.1665.3360.984.36
2026-06-2763.0165.2360.784.45
2026-06-2863.0665.3360.794.54
2026-06-2963.0465.3660.724.64
2026-06-3062.9465.2960.594.71
2026-07-0162.9865.3660.604.77
2026-07-0263.0865.5060.674.83
2026-07-0363.1165.5660.664.89
2026-07-0463.0765.5560.594.95
2026-07-0562.9765.4860.465.02
2026-07-0662.2764.8159.735.08
2026-07-0761.3863.9558.815.14
2026-07-0861.3563.9658.755.20
2026-07-0961.1963.8358.565.27
2026-07-1060.1962.8657.535.33
2026-07-1160.0962.7957.405.39
2026-07-1259.9362.6657.205.45
2026-07-1359.9962.7457.235.51
2026-07-1459.9262.7157.135.58
2026-07-1559.9162.7357.105.64
2026-07-1659.9062.7557.055.70
2026-07-1759.8862.7657.005.76
2026-07-1859.7862.6956.875.82
2026-07-1959.2662.2156.325.88
2026-07-2059.1062.0756.125.95
2026-07-2159.0662.0656.056.01
2026-07-2259.1262.1556.096.07
2026-07-2359.1462.2056.086.13
2026-07-2459.1462.2356.046.18
2026-07-2559.1562.2756.036.24
2026-07-2657.8861.0454.736.30
2026-07-2755.9259.1152.746.36
2026-07-2855.8559.0652.646.42
2026-07-2955.6458.8852.406.48
2026-07-3055.3658.6352.096.54
2026-07-3155.0058.3051.706.60
2026-08-0154.1857.5150.846.67
2026-08-0254.1057.4850.736.75
2026-08-0353.9357.3450.526.82
2026-08-0453.7857.2250.336.89
2026-08-0553.5857.0650.106.97
2026-08-0653.3356.8549.817.04
2026-08-0752.9656.5240.4116.11
2026-08-0851.7455.3340.2915.04
2026-08-0951.2754.9039.7215.18
2026-08-1051.1554.8139.5615.26
2026-08-1151.1854.8739.5315.34
2026-08-1251.1054.8339.3215.51
2026-08-1350.9754.7438.8615.89
2026-08-1450.9254.7238.6616.06
2026-08-1550.4154.2537.8416.42
2026-08-1649.9753.8437.1316.71
2026-08-1750.0053.9137.1016.81
2026-08-1849.7553.6936.6417.05
2026-08-1940.5953.6836.4817.21
2026-08-2040.5053.0636.3516.71
2026-08-2140.0951.1835.9015.28
2026-08-2239.7950.9835.5615.42
2026-08-2339.7151.0235.4415.58
2026-08-2439.4250.8835.1115.77
2026-08-2539.2850.7634.9315.83
2026-08-2638.5250.0834.1215.96
2026-08-2738.5950.1234.1615.96
2026-08-2838.6150.0834.1315.94

Cron Log Last modified: 2026-05-01 11:15:24

Using learned parameters: intercept=-8.0000, slope=0.147000
Today's actual: 68.783, formula predicts: 73.098, adjustment: -4.315
Day 0: GW=68.8%, lag_shift=+0, weighted_sum=551.7, adj=-4.31, pred=68.783
Day 10: GW=69.1%, lag_shift=+0, weighted_sum=547.4, adj=-3.53, pred=68.936
Day 20: GW=68.2%, lag_shift=+0, weighted_sum=534.6, adj=-2.89, pred=67.695
Day 30: GW=67.8%, lag_shift=+0, weighted_sum=531.8, adj=-2.37, pred=67.801
Day 40: GW=66.2%, lag_shift=+0, weighted_sum=509.3, adj=-1.94, pred=64.922
Day 50: GW=63.6%, lag_shift=+0, weighted_sum=495.1, adj=-1.59, pred=63.198
Day 60: GW=63.0%, lag_shift=+0, weighted_sum=491.4, adj=-1.30, pred=62.939
Day 70: GW=61.2%, lag_shift=+0, weighted_sum=471.1, adj=-1.06, pred=60.193
Day 80: GW=59.3%, lag_shift=+0, weighted_sum=462.4, adj=-0.87, pred=59.096
Day 90: GW=55.6%, lag_shift=+0, weighted_sum=435.9, adj=-0.71, pred=55.361
Day 100: GW=51.7%, lag_shift=+0, weighted_sum=407.2, adj=-0.58, pred=51.273
Day 110: GW=49.7%, lag_shift=+20, weighted_sum=333.8, adj=-0.48, pred=40.586
Predicted range: 38.516 to 69.535
Generating predictions for scenario: +40%
Predicting calc_gw from 2026-05-01 00:00:00 (level: 68.783)
Using learned parameters: intercept=-8.0000, slope=0.147000
Today's actual: 68.783, formula predicts: 73.098, adjustment: -4.315
Day 0: GW=68.8%, lag_shift=+0, weighted_sum=551.7, adj=-4.31, pred=68.783
Day 10: GW=69.4%, lag_shift=+0, weighted_sum=549.6, adj=-3.53, pred=69.264
Day 20: GW=68.8%, lag_shift=+0, weighted_sum=538.9, adj=-2.89, pred=68.331
Day 30: GW=68.8%, lag_shift=+0, weighted_sum=538.8, adj=-2.37, pred=68.834
Day 40: GW=67.6%, lag_shift=+0, weighted_sum=519.0, adj=-1.94, pred=66.353
Day 50: GW=65.4%, lag_shift=+0, weighted_sum=508.1, adj=-1.59, pred=65.097
Day 60: GW=65.4%, lag_shift=+0, weighted_sum=507.4, adj=-1.30, pred=65.292
Day 70: GW=63.8%, lag_shift=+0, weighted_sum=489.3, adj=-1.06, pred=62.857
Day 80: GW=62.2%, lag_shift=+0, weighted_sum=482.6, adj=-0.87, pred=62.069
Day 90: GW=58.9%, lag_shift=+0, weighted_sum=458.1, adj=-0.71, pred=58.632
Day 100: GW=55.3%, lag_shift=+0, weighted_sum=431.9, adj=-0.58, pred=54.901
Day 110: GW=53.7%, lag_shift=+0, weighted_sum=422.9, adj=-0.48, pred=53.683
Predicted range: 50.075 to 69.714
Generating predictions for scenario: -40%
Predicting calc_gw from 2026-05-01 00:00:00 (level: 68.783)
Using learned parameters: intercept=-8.0000, slope=0.147000
Today's actual: 68.783, formula predicts: 73.098, adjustment: -4.315
Day 0: GW=68.8%, lag_shift=+0, weighted_sum=551.7, adj=-4.31, pred=68.783
Day 10: GW=68.8%, lag_shift=+0, weighted_sum=545.2, adj=-3.53, pred=68.609
Day 20: GW=67.6%, lag_shift=+0, weighted_sum=530.3, adj=-2.89, pred=67.059
Day 30: GW=66.8%, lag_shift=+0, weighted_sum=524.7, adj=-2.37, pred=66.767
Day 40: GW=64.9%, lag_shift=+0, weighted_sum=499.5, adj=-1.94, pred=63.492
Day 50: GW=61.7%, lag_shift=+0, weighted_sum=482.2, adj=-1.59, pred=61.299
Day 60: GW=60.7%, lag_shift=+0, weighted_sum=475.4, adj=-1.30, pred=60.586
Day 70: GW=58.6%, lag_shift=+0, weighted_sum=453.0, adj=-1.06, pred=57.529
Day 80: GW=56.3%, lag_shift=+0, weighted_sum=442.1, adj=-0.87, pred=56.123
Day 90: GW=52.4%, lag_shift=+0, weighted_sum=413.6, adj=-0.71, pred=52.090
Day 100: GW=40.3%, lag_shift=+20, weighted_sum=328.6, adj=-0.58, pred=39.721
Day 110: GW=36.6%, lag_shift=+20, weighted_sum=305.8, adj=-0.48, pred=36.477
Predicted range: 34.124 to 69.357
✓ Saved calc_gw predictions to database
============================================================
SUCCESS: Daily update completed
============================================================
============================================================
PREDICTION SUMMARY
============================================================
CALC_GW:
average: 68.783 (day 1) → 38.607 (day 60)
+40%: 68.783 (day 1) → 50.075 (day 60)
-40%: 68.783 (day 1) → 34.134 (day 60)