Energy · Analysis
Ontario runs one of North America's cleanest grids, and the usual line is that it's basically decarbonized. The hourly generation data tells a less comfortable story — and shows exactly where the "job done" narrative goes wrong.
Ontario phased out coal in 2014 and built a grid that runs mostly on nuclear and hydro. So is it still decarbonizing — or has it started to backslide?
Canada · Electricity Decarbonization Tracker
Generation mix & carbon trajectory · 2019–2026 · Source: IESO Generator Output Capability
Every month, May 2019 → present (GWh, stacked). Seasonal nuclear refuelling dips and the steady rise of the gas wedge are both visible.
Full calendar years (2020–2025). Nuclear + hydro carry the system; note gas climbing every year since 2021.
Nuclear + hydro + wind + solar + bioenergy, as % of total.
As nuclear units enter refurbishment, gas fills the gap (TWh).
assets/js/ontario-data.js, generated directly
from the same star-schema fact tables that feed the Power BI model — the site numbers can't drift from the pipeline.
The headline is only worth as much as the data behind it, so most of the work was upstream of the charts. The pipeline runs from the original publisher all the way to the model — no hand-edited spreadsheets in between.
Incrementally download IESO monthly Generator Output Capability CSVs (hourly, per generator). Only re-fetch the open month — closed months are immutable.
Skip comment lines, unpivot Hour 1–24 to long form, pivot measurements to columns, attach DST-safe local timestamps, write Hive-partitioned Parquet.
Roll hourly output up to province × fuel × period GWh and load a star schema: Date, Province, Fuel, Generator dims around generation & emissions facts.
DAX measures for renewable share, grid intensity and YoY change in Power BI / Fabric; this page mirrors the model in Chart.js.
Generation is keyed to a year-end date, a province, and a fuel type, with a generator dimension for plant-level drill-down. Renewable and emitting flags live on the fuel dimension so a single measure can switch between "renewable" and "emissions-free":
-- emissions-free = everything except Natural Gas and the mixed "Other" category Total Generation (GWh) = SUM ( Fact_Generation[Generation_GWh] ) Renewable Share % = DIVIDE ( CALCULATE ( [Total Generation (GWh)], Dim_FuelType[IsRenewable] = 1 ), [Total Generation (GWh)] ) YoY Δ Renewable Share = [Renewable Share %] - CALCULATE ( [Renewable Share %], DATEADD ( Dim_Date[Date], -1, YEAR ) )
Public CSVs are messy in ways that fail silently. Two real bugs only surfaced because the loader was validated against an actual April-2025 file rather than trusted because it "looked right":
index_col=False.output_mw loaded as text and would concatenate instead of sum. Fixed by coercing to numeric.A pipeline you can't reconcile is a pipeline you can't trust. The IESO feed covers transmission-connected generators only, so it runs a few percent below the Canada Energy Regulator's province-wide total — exactly the gap you'd expect from embedded rooftop solar and small hydro:
| Year | IESO grid-connected (TWh) | CER total (TWh) | Notes |
|---|---|---|---|
| 2019 | 98.1 | — | partial — feed starts May 2019 |
| 2020 | 146.8 | — | |
| 2021 | 141.9 | 148.3 | gap ≈ 6.4 TWh (4.3%) = embedded generation |
| 2022 | 146.4 | — | |
| 2023 | 148.6 | — | |
| 2024 | 156.6 | — | nuclear 51% / hydro 24% / gas 16% / wind 8.5% |
| 2025 | 162.4 | — | first year "Other" appears (178 GWh) |
Method: IESO Generator Output Capability,
transmission-connected generators only (excludes embedded/distribution-connected
solar & small hydro — ~4% of the provincial total per CER). Annual GWh = Σ hourly output.
Grid carbon intensity (ECCC NIR): 220 g/kWh (2005) → 35 g/kWh (2022).
Sources:
IESO Generator Output Capability ·
CER Ontario Energy Profile ·
ECCC National Inventory Report