Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
Empty file modified .codespell.ignore
100644 → 100755
Empty file.
Binary file added .github/.DS_Store
Binary file not shown.
Empty file modified .github/ISSUE_TEMPLATE/bug_report.yaml
100644 → 100755
Empty file.
Empty file modified .github/ISSUE_TEMPLATE/config.yml
100644 → 100755
Empty file.
Empty file modified .github/ISSUE_TEMPLATE/documentation_improvement.yaml
100644 → 100755
Empty file.
Empty file modified .github/ISSUE_TEMPLATE/feature_request.md
100644 → 100755
Empty file.
Empty file modified .github/dependabot.yml
100644 → 100755
Empty file.
Empty file modified .github/pull_request_template.md
100644 → 100755
Empty file.
Empty file modified .github/workflows/codeql.yml
100644 → 100755
Empty file.
Empty file modified .github/workflows/release.yml
100644 → 100755
Empty file.
Empty file modified .github/workflows/test.yml
100644 → 100755
Empty file.
Empty file modified .github/workflows/type-checking.yml
100644 → 100755
Empty file.
7 changes: 7 additions & 0 deletions .gitignore
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -102,3 +102,10 @@ uv.lock

# jupyter
*.ipynb

# claude
.claude/

# local analysis files
NL_plants_comparison.xlsx
powerplants_custom.csv
Empty file modified .pre-commit-config.yaml
100644 → 100755
Empty file.
Empty file modified .readthedocs.yaml
100644 → 100755
Empty file.
Empty file modified CITATION.cff
100644 → 100755
Empty file.
Empty file modified LICENSES/Apache-2.0.txt
100644 → 100755
Empty file.
Empty file modified LICENSES/CC-BY-4.0.txt
100644 → 100755
Empty file.
Empty file modified LICENSES/CC0-1.0.txt
100644 → 100755
Empty file.
Empty file modified LICENSES/MIT.txt
100644 → 100755
Empty file.
Empty file modified MANIFEST.in
100644 → 100755
Empty file.
Empty file modified README.md
100644 → 100755
Empty file.
Empty file modified REUSE.toml
100644 → 100755
Empty file.
Empty file modified analysis/compare-with-entsoe-stats.py
100644 → 100755
Empty file.
Empty file modified analysis/danish-powerplants.py
100644 → 100755
Empty file.
Empty file modified analysis/german-powerplants.py
100644 → 100755
Empty file.
Empty file modified analysis/interactive-map-with-widgets.py
100644 → 100755
Empty file.
Empty file modified analysis/interactive-map.py
100644 → 100755
Empty file.
Empty file modified analysis/update_powerplants.py
100644 → 100755
Empty file.
Binary file added docs/.DS_Store
Binary file not shown.
Empty file modified docs/api-core.md
100644 → 100755
Empty file.
Empty file modified docs/api-data.md
100644 → 100755
Empty file.
Empty file modified docs/api-utils.md
100644 → 100755
Empty file.
Empty file modified docs/assets/images/powerplants.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified docs/basics.md
100644 → 100755
Empty file.
Empty file modified docs/citing.md
100644 → 100755
Empty file.
Empty file modified docs/contributors.md
100644 → 100755
Empty file.
Empty file modified docs/custom-config.md
100644 → 100755
Empty file.
Empty file modified docs/examples/example.ipynb
100644 → 100755
Empty file.
Empty file modified docs/faq.md
100644 → 100755
Empty file.
Empty file modified docs/getting-started.md
100644 → 100755
Empty file.
Empty file modified docs/index.md
100644 → 100755
Empty file.
Empty file modified docs/installation.md
100644 → 100755
Empty file.
Empty file modified docs/license.md
100644 → 100755
Empty file.
Empty file modified docs/powerplants.png
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file modified docs/release-notes.md
100644 → 100755
Empty file.
Empty file modified docs/support.md
100644 → 100755
Empty file.
Empty file modified docs/troubleshooting.md
100644 → 100755
Empty file.
Empty file modified mkdocs.yaml
100644 → 100755
Empty file.
30 changes: 30 additions & 0 deletions osm-changeset-amer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# OSM changeset draft — Amer power plant

**OSM object:** relation `power=plant` at 51.7098, 4.8437 (Amercentrale, Geertruidenberg, NL)

**Tag changes to apply:**
- `plant:source` → `biomass` (was likely `coal` or mixed)
- `plant:method` → `combustion`
- `plant:output:electricity` → `500 MW`
- `generator:type` (on the active unit) → `steam_turbine`
- (consider) `start_date:plant:source=biomass` → `2019` (conversion year)

---

## Changeset comment

<!-- TODO: write 1 line, human-readable, public forever -->


## Source tags

<!-- TODO: cite verifiable source(s) for each numeric/categorical change -->
- `source:plant:source` =
- `source:plant:output:electricity` =
- `source:start_date` =

---

## Notes for reviewer (optional, goes in changeset comment if space)

<!-- Any context a DWG reviewer might want: prior state, why the change is uncontroversial -->
47 changes: 47 additions & 0 deletions osm-changeset-hemweg.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# OSM changeset draft — Hemweg coal unit retirement

**Context:** Hemwegcentrale, Amsterdam. The site historically contained multiple units:
- Hemweg 7 (gas, CCGT) — still operating
- Hemweg 8 (coal, ~650 MW) — closed Dec 2019 (Dutch coal phase-out), demolished 2024

**OSM objects:** search "Hemwegcentrale" in OSM. Likely either:
- One `power=plant` relation for the whole site (must not delete — Hemweg 7 still operates)
- Separate objects per unit (preferred — edit only the coal unit)

---

## Decision point — lifecycle prefix

OSM has three ways to represent a retired asset. You must pick one:

<!--
(a) disused:power=plant → structure still standing but not operating
(b) abandoned:power=plant → structure standing, operator gone, no maintenance
(c) demolished:power=plant → physically torn down, geometry represents former footprint
(d) delete the object → only if geometry is now used for something else

Your commit says "torn down 2024". That points to (c) demolished.
BUT: if the cooling tower or smokestack still stands, (a) disused is more accurate.
Check recent aerial imagery in iD before deciding.
-->

My choice: <!-- TODO -->

## Tag changes

- Remove: `power=plant` (only if demolished)
- Add: `demolished:power=plant=yes` (or `disused:power=plant=yes`)
- Add: `end_date` = `2019` (last generation) or `2024` (physical demolition) — pick the semantically meaningful date for *this* tag
- Keep: name, operator (as historical record)

## Changeset comment

<!-- TODO -->

## Source tag

- `source:end_date` = <!-- e.g. Vattenfall press release, AT5 news article on demolition, aerial imagery date -->

## IMPORTANT

Do NOT edit anything on Hemweg 7 (the gas unit). Verify in iD that you're editing only the coal unit geometry — a wrong click here will retire an active plant in the database.
26 changes: 26 additions & 0 deletions osm-changeset-maasstroom.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# OSM changeset draft — Maasstroom (Rijnmond 2)

**OSM object:** relation `power=plant` near 51.8901, 4.352 (Maasstroom Energie, adjacent to Rijnmond 1)

**Tag changes to apply:**
- `plant:output:electricity` → `426 MW` (was 428 MW)

Minor correction — 2 MW delta is within common rounding error, so the changeset comment must be extra clear about the source, otherwise it may be reverted as "noise."

## Changeset comment

<!-- TODO: 1 line, explicit source -->


## Source tag

- `source:plant:output:electricity` =

## Decision point

<!--
2 MW is within typical reporting variance. Options:
(a) Skip this edit entirely — not worth a changeset
(b) Bundle it with Rijnmond 1 in a single changeset covering "Maasvlakte gas cluster"
(c) Solo changeset with very explicit source
-->
17 changes: 17 additions & 0 deletions osm-changeset-rijnmond.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# OSM changeset draft — Rijnmond 1 (Enecogen neighbour, InterGen)

**OSM object:** relation `power=plant` near 51.8902, 4.3547 (Rijnmond Energie Centrale, Rotterdam)

**Tag changes to apply:**
- `plant:output:electricity` → `750 MW` (was 810 MW)

Simple numeric correction. No fuel/method/date change.

## Changeset comment

<!-- TODO: 1 line, e.g. "Rijnmond REC: correct capacity 810→750 MW per operator" -->


## Source tag

- `source:plant:output:electricity` = <!-- operator (InterGen) page URL or ENTSO-E registered capacity export -->
Binary file added powerplantmatching/.DS_Store
Binary file not shown.
Empty file modified powerplantmatching/__init__.py
100644 → 100755
Empty file.
Empty file modified powerplantmatching/accessor.py
100644 → 100755
Empty file.
Empty file modified powerplantmatching/cleaning.py
100644 → 100755
Empty file.
Empty file modified powerplantmatching/collection.py
100644 → 100755
Empty file.
Empty file modified powerplantmatching/core.py
100644 → 100755
Empty file.
39 changes: 25 additions & 14 deletions powerplantmatching/data.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,9 @@ def OPSD(
.assign(
Name=lambda df: df.Name.str.replace("\x96", " "), # for geoparsing
projectID=lambda s: "OEU-" + s.index.astype(str),
Fueltype=lambda d: d.Fueltype.fillna(d.Energy_Source_Level_1),
Fueltype=lambda d: d.Energy_Source_Level_3.where(
d.Energy_Source_Level_3.notna(), d.Fueltype
).fillna(d.Energy_Source_Level_1),
# We don't want to include this as this is overestimating CHP capacities
# Set=lambda df: np.where(df.Set.isin(["yes", "Yes"]), "CHP", "PP"),
)
Expand Down Expand Up @@ -1409,17 +1411,20 @@ def BNETZA(
regex=True,
),
)[
lambda df: df.projectID.notna()
& df.Status.str.contains(pattern, regex=True, case=False)
lambda df: (
df.projectID.notna()
& df.Status.str.contains(pattern, regex=True, case=False)
)
].pipe(
gather_specifications,
search_col=["Name", "Fueltype", "Blockname"],
config=config,
)

add_location_b = bnetza[bnetza.Ort.notnull()].apply(
lambda ds: (ds["Ort"] not in ds["Name"])
and (str.title(ds["Ort"]) not in ds["Name"]),
lambda ds: (
(ds["Ort"] not in ds["Name"]) and (str.title(ds["Ort"]) not in ds["Name"])
),
axis=1,
)
bnetza.loc[bnetza.Ort.notnull() & add_location_b, "Name"] = (
Expand Down Expand Up @@ -1808,8 +1813,10 @@ def GNPT(raw=False, update=False, config=None):
.pipe(convert_to_short_name)
.dropna(subset="Capacity")
.assign(
Name=lambda df: df["Name"]
+ df["Unit Name"].fillna("").apply(lambda x: f" {x}" if x else ""),
Name=lambda df: (
df["Name"]
+ df["Unit Name"].fillna("").apply(lambda x: f" {x}" if x else "")
),
DateIn=df["DateIn"].apply(pd.to_numeric, errors="coerce"),
DateOut=df["DateOut"].apply(pd.to_numeric, errors="coerce"),
lat=df["lat"].apply(pd.to_numeric, errors="coerce"),
Expand Down Expand Up @@ -1899,8 +1906,10 @@ def GCPT(raw=False, update=False, config=None):
.pipe(convert_to_short_name)
.dropna(subset="Capacity")
.assign(
Name=lambda df: df["Name"]
+ df["Unit name"].fillna("").apply(lambda x: f" {x}" if x else ""),
Name=lambda df: (
df["Name"]
+ df["Unit name"].fillna("").apply(lambda x: f" {x}" if x else "")
),
DateIn=df["DateIn"].apply(pd.to_numeric, errors="coerce"),
DateOut=df["DateOut"]
.apply(pd.to_numeric, errors="coerce")
Expand Down Expand Up @@ -2545,11 +2554,13 @@ def MASTR(
df_processed.loc[mask, "Set"] = "PP"

df_processed["Name"] = df_processed.apply(
lambda x: f"{x.Name} {x.NameKraftwerksblock.replace(x.Name, '').strip()}"
if x.NameKraftwerksblock
and x.NameKraftwerksblock != x.Name
and x.Fueltype in config["clean_name"]["fueltypes_with_blocks"]
else x.Name,
lambda x: (
f"{x.Name} {x.NameKraftwerksblock.replace(x.Name, '').strip()}"
if x.NameKraftwerksblock
and x.NameKraftwerksblock != x.Name
and x.Fueltype in config["clean_name"]["fueltypes_with_blocks"]
else x.Name
),
axis=1,
)

Expand Down
Empty file modified powerplantmatching/duke.py
100644 → 100755
Empty file.
Empty file modified powerplantmatching/export.py
100644 → 100755
Empty file.
Empty file modified powerplantmatching/heuristics.py
100644 → 100755
Empty file.
Empty file modified powerplantmatching/matching.py
100644 → 100755
Empty file.
Empty file modified powerplantmatching/package_data/Comparison.xml
100644 → 100755
Empty file.
Empty file modified powerplantmatching/package_data/Deleteduplicates.xml
100644 → 100755
Empty file.
Empty file modified powerplantmatching/package_data/PLZ_Coords_map.csv
100644 → 100755
Empty file.
Empty file modified powerplantmatching/package_data/config.yaml
100644 → 100755
Empty file.
Empty file modified powerplantmatching/package_data/country_codes.csv
100644 → 100755
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file modified powerplantmatching/package_data/entsoe_country_codes.csv
100644 → 100755
Empty file.
Empty file modified powerplantmatching/package_data/manual_corrections.csv
100644 → 100755
Empty file.
Empty file modified powerplantmatching/package_data/manual_corrections_old.csv
100644 → 100755
Empty file.
Empty file modified powerplantmatching/package_data/parsed_locations.csv
100644 → 100755
Empty file.
Empty file modified powerplantmatching/plot.py
100644 → 100755
Empty file.
Empty file modified powerplantmatching/utils.py
100644 → 100755
Empty file.
Empty file modified powerplants.csv
100644 → 100755
Empty file.
Empty file modified pyproject.toml
100644 → 100755
Empty file.
Empty file modified test/test_aggregate.py
100644 → 100755
Empty file.
Empty file modified test/test_cleaning.py
100644 → 100755
Empty file.
Empty file modified test/test_duke.py
100644 → 100755
Empty file.
Empty file modified test/test_plots.py
100644 → 100755
Empty file.