Inspiration
Singapore is getting hotter, and heat does not land evenly. A question from sociology research on thermal inequality stuck with us: who gets to be cool? An elderly resident living alone in an older one-room rental flat, without air-conditioning or worried about the utility bill, experiences the same afternoon very differently from a family in a new air-conditioned estate. The Lancet has reported 71–124 heat-related hospital admissions a year in Singapore between 2010 and 2020, and the people most at risk are often the least visible.
Singapore already measures heat stress well. NEA publishes real-time Wet Bulb Globe Temperature (WBGT) readings every 15 minutes, with national Low / Moderate / High bands. What's missing is the link between that reading and who lives underneath it. A "moderate" afternoon is routine in one estate and dangerous in another.
What it does
HeatGuard turns live heat-stress data into a ranked, actionable list of the subzones and HDB blocks where seniors are most at risk, hours before the daily peak. For each URA subzone s at time t:
$$\text{Risk}{s,t} = H{s,t} \times E_s \times V_s \times G_s$$
- H, Hazard: forecast WBGT from the nearest stations
- E, Exposure: number of elderly residents
- V, Vulnerability: share of 1- and 2-room rental flats and block age, from HDB block data
- G, Cooling gap: walking distance to the nearest senior centre or park
Alerts are anchored to NEA's own thresholds (WBGT below 31, 31 to under 33, and 33 °C and above) and escalated by vulnerability. A subzone is High if WBGT is 33 or above, or 31–33 in a top-quartile-vulnerability subzone. Each tier comes with recommended actions, from routine monitoring to prioritised door-to-door check-ins on a short block list.
How we will build it
- Ingest: a scheduled Lakeflow Job polls NEA's WBGT, air temperature, relative humidity and rainfall APIs every 15 minutes into Bronze Delta tables.
- Transform: Silver tables clean nulls and stale stations, align timestamps, geocode HDB blocks, and spatially join stations, blocks and senior centres to subzones. A Gold table holds the live risk score.
- ML: a short-horizon WBGT forecast per station (next few hours and next-day peak), benchmarked against a persistence baseline and tracked in MLflow. The forecast is what makes alerts proactive rather than reactive.
- Govern: Unity Catalog with bronze/silver/gold schemas and lineage from API to alert.
- Serve: an AI/BI dashboard (live map, tiers, action list) and a Genie space, so a non-technical coordinator can ask "Which blocks in Bukit Merah are High right now?"
Challenges
- No ground-truth risk labels. There is no open data on heat hospitalisations by area, so we won't pretend to train a supervised "risk" model. ML goes where real labels exist (WBGT forecasting); the score's weights are transparent and sensitivity-tested.
- Coarse sensing. 15 WBGT stations cover the whole island, so subzone hazard is an estimate. The dashboard shows which station each subzone draws from.
- Mismatched granularity. Age data stops at subzone level, so block-level signal comes from flat mix, not ages. HDB block data has no coordinates, so we geocode via OneMap.
- Free Edition quotas. One small SQL warehouse and limited concurrent tasks, so ingestion runs as a single job and we develop on a representative sample.
What we learned
Scoping the data reshaped the idea. I started out planning to build a heat index from scratch. Seeing what NEA already publishes, we realised the more useful contribution is the join, not the index. Plugging into the national WBGT bands makes HeatGuard something existing outreach teams could adopt, rather than a parallel system they'd have to learn to trust.
What's next
Week 1: live pipeline and risk score. Week 2: forecast model, dashboard and Genie space. Stretch goals: green-space cooling analysis using NParks parks, and multilingual alert drafts (English, Chinese, Malay, Tamil) for human review.
Built With
- ai-bi-dashboards
- data.gov.sg
- databricks
- databricks-sql
- delta-lake
- genie
- geopandas
- h3
- lakeflow
- mlflow
- onemap
- pyspark
- python
- scikit-learn
- unity-catalog
Log in or sign up for Devpost to join the conversation.