Skip to content

data(nordic): per-zone carbon intensity for Norwegian bidding zones NO1–NO5#1260

Open
avalyset wants to merge 1 commit into
mlco2:masterfrom
avalyset:khepri-no-per-zone-ci
Open

data(nordic): per-zone carbon intensity for Norwegian bidding zones NO1–NO5#1260
avalyset wants to merge 1 commit into
mlco2:masterfrom
avalyset:khepri-no-per-zone-ci

Conversation

@avalyset

@avalyset avalyset commented Jun 29, 2026

Copy link
Copy Markdown

data(nordic): per-zone carbon intensity for Norwegian bidding zones NO1–NO5

Hi! This proposes replacing the uniform 18.0 gCO2eq/kWh placeholder currently shared by all five Norwegian bidding zones in codecarbon/data/private_infra/nordic_emissions.json with per-zone, derived values. Data-only change — happy to adjust anything based on your review.

What

Zone before after (gCO2eq/kWh)
NO1 (Oslo) 18.0 23.3
NO2 (Southern) 18.0 23.9
NO3 (Central) 18.0 21.5
NO4 (Northern) 18.0 39.6
NO5 (Western) 18.0 24.5

SE1–SE4 and FI are unchanged (byte-for-byte; only NO blocks + file metadata touched).

Why the placeholder is worth improving

The current 18.0 is identical across NO1–NO5 (so it can't distinguish the zones) and reads low for every zone — and ~2.2× low for NO4 (39.6), which carries persistent fossil-gas generation. A single value can't represent the five zones; NO4 in particular is structurally different.

Source & method (aligned with CodeCarbon's own fallback)

  • Source: ENTSO-E Transparency Actual Generation per Production Type (A75), per bidding zone, full year 2025.
  • Method: production-based generation-mix — weighted average of each generation source × its lifecycle factor. This matches the approach CodeCarbon's own static fallback already documents ("weighted average of the emissions from the different energy sources used to generate electricity").
  • These values replace the production fallback; they do not touch the Electricity Maps API path, which remains the consumption-based (import-adjusted) source when a token is configured.

A point we'd like your steer on: the factor basis

We derived these with IPCC AR5 Annex III (Table A.III.2) lifecycle medians (coal 820, gas 490, hydro 24, wind 11, …) rather than CodeCarbon's carbon_intensity_per_source.json (coal 995 / gas 743 direct-combustion + WNA-lifecycle for low-carbon). Our reasoning:

  • IPCC AR5 is a single, peer-reviewed, consistent-lifecycle basis, and it keeps these numbers identical to the upstream derivation's DOI-frozen record (so there's one citable value per zone, not two).
  • Using AR5 (gas 490 vs 743) makes the NO values slightly conservative relative to CodeCarbon's own gas factor.

That said — this is a recommendation, not a correction of your table. If you'd prefer internal consistency with carbon_intensity_per_source.json, re-deriving with your own per-source factors is a one-line change on our side; just say the word. What matters to us is that NO gets real per-zone numbers.

Honest characterization (per-zone notes added, not just five numbers)

A multi-year analysis (2021–2025) is carried in the per-zone note fields, because a bare NO4 number would mislead:

  • NO1/NO2/NO3: stable year-over-year (<5% drift) → annual update is sufficient.
  • NO4: event-driven, not a stable constant — driven by Hammerfest LNG gas turbines, which were offline after a Sept-2020 fire and restarted June 2022 (source). NO4 CI ranged 23–51 gCO2eq/kWh across 2021–2024; the 39.6 value is period-dependent.
  • NO5: sits near the hydro lifecycle floor (~24) in pure-hydropower periods.
  • Honest limit, stated plainly: production-based NO carbon intensity is low and not very distinct between zones except where fossil gas occurs (NO4).

Reproducibility

Every value is traceable. Derivation method, pre-registered before computation, is in the ADR chain (esp. ADR-0001 CI method); the per-zone results and the multi-year drift analysis are in the repo's docs/. Frozen and citable:

Tests

CodeCarbon's existing Nordic tests read the factor values dynamically from the JSON and pass unchanged with the new values (verified locally). No code changes — data only.

Thanks for maintaining CodeCarbon — glad to iterate on any of this.

Replace the uniform 18.0 gCO2eq/kWh placeholder for NO1-NO5 with per-zone
production-based values (NO1 23.3, NO2 23.9, NO3 21.5, NO4 39.6, NO5 24.5)
derived from ENTSO-E generation-per-type x IPCC AR5 lifecycle factors (2025).
Adds per-zone method/source/drift notes + updated file metadata. SE/FI unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@avalyset

Copy link
Copy Markdown
Author

Hi @benoit-cty — a note in the same spirit as the one on #1262, for the
zone that carries the strongest claim in this set.

Our docs/ mix figures report each type's energy-weighted share of total generation,
while the headline CI normalises over the factor-carrying types — same weighting,
different denominator (full explanation on #1262). For NO4 the excluded category is
"Other renewable" (1.35%); the four types below carry 98.65% of generation and
reproduce the headline exactly.

NO4 (2025) — energy/duration-weighted decomposition

  • Interval coverage: 100.00% (27912 / 27912 intervals)
  • Factors: IPCC AR5 Annex III lifecycle medians (per src/khepri/factors.py)
Production type Energy share AR5 factor (gCO2eq/kWh) Contribution
Hydro Water Reservoir 77.2411 % 24 18.5379
Wind Onshore 11.6688 % 11 1.2836
Hydro Run-of-river and poundage 7.4069 % 24 1.7777
Fossil Gas 3.6832 % 490 18.0477
Total 39.6468 → 39.65

Contributions are display-rounded to 4 decimals; the column as printed sums to 39.6469 against the exact 39.6468.

The point worth making visible: Fossil Gas is only 3.68 % of the mix but 18.05 of
39.65 gCO2eq/kWh — 45.5 % of NO4's carbon intensity.
That is precisely why NO4
separates from the other Norwegian zones (all ≈21–24.5, hydro-dominated): a persistent
gas share at a factor of 490 dominates the number despite a small mix share. This
is the value the uniform 18.0 placeholder is most wrong about, so it is the one that
most deserves a visible calculation.

Full method, EIC codes, and the same-weighting/different-denominator explanation are
in #1262; happy to provide the same decomposition for NO1–NO3 and NO5 on request.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant