PyPSA / PyPSA/powerplantmatching

OPSD: backup URL drops efficiency column; energy_source_level_3 (biomass co-firing) unused

Open
#286 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
227
Forks
74
Avg merge
6d 17h
Merged PRs (30d)
4

Description

Summary

Two data quality improvements for the OPSD EU loader:

  1. energy_source_level_3 (biomass co-firing) is loaded but silently dropped — OPSD uses this field to flag plants with partial biomass co-firing, but the loader discards it before it can influence Fueltype.
  2. Efficiency gaps for EU plants — the OPSD EU dataset does not include efficiency estimates (unlike OPSD DE which has efficiency_estimate). Cross-referencing with TenneT operator declarations shows that efficiency data is available for most EU thermal plants but has no path into PPM. This could be addressed by computing efficiency estimates from available metadata (fuel type, technology, commissioning year) similar to how OPSD DE derives efficiency_estimate.

1. Biomass co-firing (energy_source_level_3) not used

Root cause

The OPSD EU dataset uses a three-level energy source hierarchy. energy_source_level_3 flags biomass co-firing in plants whose primary fuel is coal or waste:

Plant energy_source energy_source_level_3
Eemshavencentrale EM1/EM2 (RWE, 2×780 MW) Hard coal Biomass and biogas
Amercentrale A9 (540 MW) Biomass and biogas — (already correct at level 1)

The backup CSV at pypsa-meets-earth/ppm-data-backup does include this column, so the data is available. However, data.py drops it via .reindex(columns=config["target_columns"]) before it can influence Fueltype. As a result, plants like Eemshavencentrale are labelled pure Hard Coal in the final dataset.

Proposed fix

In data.py, use energy_source_level_3 to enrich Fueltype where it indicates biomass co-firing:

opsd_EU = (
    opsd_EU.rename(columns=str.title)
    .rename(columns=EU_RENAME_COLUMNS)
    ...
    .assign(
        Fueltype=lambda d: d["Energy_Source_Level_3"]
                           .where(d["Energy_Source_Level_3"].notna(), d["Fueltype"])
    )
    .reindex(columns=config["target_columns"])
)

2. Missing efficiency for EU plants

Context

The OPSD DE dataset includes efficiency_estimate (derived from fuel type, technology, and commissioning year) and PPM already maps it via "Efficiency_Estimate": "Efficiency" in data.py.

The OPSD EU dataset does not include efficiency estimates — neither the official release at data.open-power-system-data.org/conventional_power_plants/2020-10-01/ nor the backup CSV. This means EU plants sourced from OPSD arrive with Efficiency = NaN.

Cross-referencing against TenneT operator declarations for the Netherlands, 50 out of 64 matched thermal plants have no efficiency in the final powerplants.csv, despite physically reasonable values being available (e.g. 0.55–0.59 for modern CCGTs).

Possible approaches
  • Apply the same estimation logic used for OPSD DE — derive efficiency_estimate from fuel type, technology, and commissioning year using the same methodology that OPSD's main.ipynb uses for DE plants
  • Cross-reference with ENTSOE transparency platform — some TSOs publish efficiency or heat rate data
  • Accept efficiency contributions — allow curated efficiency values to be submitted (e.g. via a supplementary CSV)

This is a broader question and may warrant separate discussion.


Impact

The biomass co-firing fix (point 1) is a straightforward ~5-line change in data.py that benefits all EU countries. The efficiency gap (point 2) is more involved but affects any model using powerplants.csv for dispatch or techno-economic analysis.

Related

  • #287 — EIC-first matching (architectural improvement to prevent co-located plant confusion)

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in data.py, tracing the OPSD EU loader through its column renaming and target-column selection, then compare it with the OPSD DE efficiency mapping and the estimation logic described in main.ipynb. Review the OPSD EU backup CSV for energy_source_level_3 and confirm the resulting values in powerplants.csv. Done means the biomass co-firing data is retained and the efficiency approach is resolved and reflected consistently.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
data-engineering
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.