| Horizon | Our Model | FMI Harmonie |
|---|---|---|
|
+6h
|
7.09°C | 3.9°C |
|
+12h
|
7.3°C | 4.0°C |
|
+24h
|
4.21°C | 2.4°C |
| Horizon | Our Model | FMI Harmonie |
|---|---|---|
|
+3h
|
Clear | — |
|
+6h
|
Clear | Rain |
|
+12h
|
Clear | Rain |
| Horizon | Our Model | FMI Harmonie |
|---|---|---|
|
+6h
|
5.25°C | 4.4°C |
|
+12h
|
5.09°C | 2.7°C |
|
+24h
|
0.86°C | 1.9°C |
| Horizon | Our Model | FMI Harmonie |
|---|---|---|
|
+3h
|
Clear | — |
|
+6h
|
Clear | Rain |
|
+12h
|
Rain | Rain |
| Horizon | Our Model | FMI Harmonie |
|---|---|---|
|
+6h
|
1.53°C | 2.6°C |
|
+12h
|
1.93°C | 1.2°C |
|
+24h
|
-3.29°C | 2.1°C |
| Horizon | Our Model | FMI Harmonie |
|---|---|---|
|
+3h
|
Clear | — |
|
+6h
|
Snow | Rain |
|
+12h
|
Snow | Rain |
| Horizon | Our Model | FMI Harmonie |
|---|---|---|
|
+6h
|
5.02°C | 5.4°C |
|
+12h
|
6.46°C | 2.5°C |
|
+24h
|
3.48°C | 1.7°C |
| Horizon | Our Model | FMI Harmonie |
|---|---|---|
|
+3h
|
Clear | — |
|
+6h
|
Clear | Rain |
|
+12h
|
Clear | Rain |
| Horizon | Our Model | FMI Harmonie |
|---|---|---|
|
+6h
|
5.78°C | 4.1°C |
|
+12h
|
6.52°C | 3.8°C |
|
+24h
|
4.14°C | 2.7°C |
| Horizon | Our Model | FMI Harmonie |
|---|---|---|
|
+3h
|
Clear | — |
|
+6h
|
Clear | Clear |
|
+12h
|
Clear | Rain |
| Horizon | Our Model | FMI Harmonie |
|---|---|---|
|
+6h
|
2.88°C | 3.7°C |
|
+12h
|
4.21°C | 2.6°C |
|
+24h
|
1.56°C | 2.6°C |
| Horizon | Our Model | FMI Harmonie |
|---|---|---|
|
+3h
|
Rain | — |
|
+6h
|
Clear | Rain |
|
+12h
|
Clear | Rain |
XGBoost + LightGBM
V2 runs two parallel model families. An XGBoost regression model handles temperature forecasting at +6h, +12h, and +24h horizons.
A LightGBM multiclass classifier predicts weather codes (Clear / Rain / Snow) at +3h, +6h, and +12h.
Both models are trained independently and run in parallel during each hourly worker cycle.
Training Dataset
Over 120,000 city-aggregated hourly observations spanning November 2023 to March 2026 across 6 Finnish cities — Oulu, Helsinki, Tampere, Turku, Rovaniemi, and Vaasa.
Data sourced from FMI Open Data via dual WFS endpoints — hourly for temperature, wind and pressure, and 10-min for cloud cover and dew point.
Train/val/test split uses a seasonal gap strategy — validation and test sets are both full Finnish winters from different years to ensure reliable evaluation of snow and rain detection.
Feature Set
- Pressure Tendency: 1h / 3h / 6h change — signals approaching frontal systems.
- Cloud Cover + Dew Point: From 10-min endpoint — critical for fog and snow detection.
- Wind Decomposition: U/V components derived from speed and direction.
- Coastal Distance: Static feature encoding proximity to coastline — differentiates maritime vs inland cities.
- Seasonal Encoding: Day-of-year sine/cosine captures annual temperature cycles.
Model Performance
Evaluated on a held-out winter test set (Nov 2025 → Mar 2026). Hover the buttons to see per-horizon metrics.
Hourly Worker
GitHub Actions triggers every hour
Each run fetches the last 8 hours of observations (for lag features), aggregates 10 stations into 6 cities, engineers features, and runs inference on the latest row per city.
FMI Harmonie NWP forecasts are fetched alongside and stored in MongoDB for side-by-side comparison on the dashboard.
Stack
MongoDB Atlas: Stores one document per city per hour. Each document contains current observations, our model predictions, and FMI Harmonie forecasts.
Azure App Service: Flask app served from a Docker container, reads latest city documents from MongoDB and renders the dashboard.
fmiopendata: Open-source Python library for WFS queries — github.com/pnuu/fmiopendata
Source Code: Full project available at github.com/Doug-Vo/Weather-Predictor