Repository: pypsa-meets-earth/pypsa-earth
Pull request #1394: Add country specific demand data and adjust workflow
Author: login: doneachh
Created: 2025-04-03T08:13:47Z | Merged: 2025-04-18T08:09:33Z

# Closes # (if applicable).
https://github.com/pypsa-meets-earth/pypsa-earth-sec/issues/373
https://github.com/pypsa-meets-earth/pypsa-earth-sec/issues/267

## Changes proposed in this Pull Request
Adding country specific demand data which were researched by our student research assistant staff. Adjusting the workflow to use default values when country specific values are missing.

## Checklist

- [x] I consent to the release of this PR's code under the AGPLv3 license and non-code contributions under CC0-1.0 and CC-BY-4.0.
- [x] I tested my contribution locally and it seems to work fine.
- [x] Code and workflow changes are sufficiently documented.
- [x] Newly introduced dependencies are added to `envs/environment.yaml` and `doc/requirements.txt`.
- [x] Changes in configuration options are added in all of `config.default.yaml` and `config.tutorial.yaml`.
- [x] Add a test config or line additions to `test/` (note tests are changing the config.tutorial.yaml)
- [x] Changes in configuration options are also documented in `doc/configtables/*.csv` and line references are adjusted in `doc/configuration.rst` and `doc/tutorial.rst`.
- [ ] A note for the release notes `doc/release_notes.rst` is amended in the format of previous release notes, including reference to the requested PR.



Diff:
diff --git a/data/demand/district_heating.csv b/data/demand/district_heating.csv
index 545e39afc..031171f4b 100644
--- a/data/demand/district_heating.csv
+++ b/data/demand/district_heating.csv
@@ -1,3 +1,4 @@
 country,current,potential
 DEFAULT, 0, 0
 MA, 0, 0
+TN, 0, 0
diff --git a/data/demand/efficiency_gains_cagr.csv b/data/demand/efficiency_gains_cagr.csv
index 18cea0bb4..98792fcba 100644
--- a/data/demand/efficiency_gains_cagr.csv
+++ b/data/demand/efficiency_gains_cagr.csv
@@ -1,4 +1,5 @@
 ,total residential space,total residential water,electricity residential,total services space,total services water,total rail,electricity rail,total domestic aviation,total international aviation,total domestic navigation,total international navigation,services electricity,agriculture electricity,agriculture oil,residential oil,residential biomass,residential gas,agriculture biomass,services oil,services biomass,services gas,total road ev,total road fcev,total road ice,total navigation oil,total navigation hydrogen,residential heat biomass,residential heat oil,residential heat gas
-DEFAULT,-0.00495142107203628,-0.0103904288836945,-0.00269600630287126,-0.00670548938169546,-0.0178643127010603,-0.00495142107203628,-0.00214621959744066,0,0,-0.0178643127010603,0.274274985703134,-0.00269600630287126,-0.00269600630287126,-0.00670548938169546,0,-0.00495142107203628,-0.0103904288836945,-0.0123297960281566,0,-0.00552994355602032,0,-0.0614010456744787,-0.0265273598093646,0,-0.0010627352815874,-0.00851714967450834,-0.00269600630287126,-0.00269600630287126,0
-MA,-0.00495142107203628,-0.0103904288836945,-0.00269600630287126,-0.00670548938169546,-0.0178643127010603,-0.00495142107203628,-0.00214621959744066,0,0,-0.0178643127010603,0.274274985703134,-0.00269600630287126,-0.00269600630287126,-0.00670548938169546,0,-0.00495142107203628,-0.0103904288836945,-0.0123297960281566,0,-0.00552994355602032,0,-0.0614010456744787,-0.0265273598093646,0,-0.0010627352815874,-0.00851714967450834,-0.00269600630287126,-0.00269600630287126,0
+DEFAULT,-0.004951421072036277,-0.010390428883694458,-0.0026960063028712566,-0.006705489381695462,-0.01786431270106026,-0.004951421072036277,-0.0021462195974406573,0.0,0.0,-0.01786431270106026,0.2742749857031337,-0.0026960063028712566,-0.0026960063028712566,-0.006705489381695462,0.0,-0.004951421072036277,-0.010390428883694458,-0.012329796028156648,0.0,-0.0055299435560203225,0.0,-0.06140104567447868,-0.026527359809364603,0.0,-0.0010627352815874014,-0.00851714967450834,-0.0026960063028712566,-0.0026960063028712566,0.0
+MA,-0.004951421072036277,-0.010390428883694458,-0.0026960063028712566,-0.006705489381695462,-0.01786431270106026,-0.004951421072036277,-0.0021462195974406573,0.0,0.0,-0.01786431270106026,0.2742749857031337,-0.0026960063028712566,-0.0026960063028712566,-0.006705489381695462,0.0,-0.004951421072036277,-0.010390428883694458,-0.012329796028156648,0.0,-0.0055299435560203225,0.0,-0.06140104567447868,-0.026527359809364603,0.0,-0.0010627352815874014,-0.00851714967450834,-0.0026960063028712566,-0.0026960063028712566,0.0
+TN,,,,,,,,,,,,,,,,,,,,,,,0.0,,,0.0,0.0,0.0,
 US,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
diff --git a/data/demand/fuel_shares.csv b/data/demand/fuel_shares.csv
index 307ce09aa..a8a4c3ec6 100644
--- a/data/demand/fuel_shares.csv
+++ b/data/demand/fuel_shares.csv
@@ -1,4 +1,6 @@
 country,oil residential heat share,biomass residential heat share,biomass to elec heat share,oil to elec heat share,biomass to elec share,oil to elec share,space to water heat share,gas to elec share,gas to elec heat share,gas residential heat share
-DEFAULT,0.6667,0.75,0,0.5,0,0.5,0.6,0,0,0.75
-MA,0.6667,0.75,0,0.5,0,0.5,0.6,0,0,0.75
+DEFAULT, 0.6667, 0.75,0.0, 0.5, 0.0, 0.5,0.6,0,0,0.75
+MA, 0.6667, 0.75,0.0, 0.5, 0.0, 0.5,0.6,0,0,0.75
+TN, 0.0, 0.11, 0.37, 0.0, 0.01, 0.0, 0.01, 0.98, 0.0,
+NA, 0.025, 0.017, 0.76,,,,0.0,0.0,0.0,
 US,0.88,1,0,0,0,0,0,0,0,0.72
diff --git a/data/demand/growth_factors_cagr.csv b/data/demand/growth_factors_cagr.csv
index d03700770..2365771d5 100644
--- a/data/demand/growth_factors_cagr.csv
+++ b/data/demand/growth_factors_cagr.csv
@@ -1,4 +1,6 @@
 ,total residential space,total residential water,electricity residential,total services space,total services water,total road,total rail,electricity rail,total domestic aviation,total international aviation,total domestic navigation,total international navigation,services electricity,agriculture electricity,agriculture oil,residential oil,residential biomass,residential gas,agriculture biomass,services oil,services biomass,services gas,residential heat oil,residential heat biomass,residential heat gas
-DEFAULT,0.0215696008151112,0.0250455320522922,0.0556856865232929,0.0178668003172038,0.0215696008151112,0.0139044251984031,0.0494076141832367,0.0398217808830004,0.0371550444461919,0.0215696008151112,0.00645323998977099,0.0250455320522922,0.0371550444461919,0.0215696008151112,-0.0185972620316256,0,0,0.0109550545280976,0.0147194767041825,-0.0358240020575049,0,-0.00611458810084853,0,0,0
-MA,0.0215696008151112,0.0250455320522922,0.0556856865232929,0.0178668003172038,0.0215696008151112,0.0139044251984031,0.0494076141832367,0.0398217808830004,0.0371550444461919,0.0215696008151112,0.00645323998977099,0.0250455320522922,0.0371550444461919,0.0215696008151112,-0.0185972620316256,0,0,0.0109550545280976,0.0147194767041825,-0.0358240020575049,0,-0.00611458810084853,0,0,0
+DEFAULT,0.021569600815111167,0.025045532052292208,0.055685686523292866,0.01786680031720378,0.021569600815111167,0.01390442519840307,0.04940761418323669,0.03982178088300037,0.03715504444619189,0.021569600815111167,0.006453239989770987,0.025045532052292208,0.03715504444619189,0.021569600815111167,-0.018597262031625594,0.0,0.0,0.01095505452809764,0.0147194767041825,-0.03582400205750491,0.0,-0.006114588100848528,0.0,0.0,0.0
+MA,0.021569600815111167,0.025045532052292208,0.055685686523292866,0.01786680031720378,0.021569600815111167,0.01390442519840307,0.04940761418323669,0.03982178088300037,0.03715504444619189,0.021569600815111167,0.006453239989770987,0.025045532052292208,0.03715504444619189,0.021569600815111167,-0.018597262031625594,0.0,0.0,0.01095505452809764,0.0147194767041825,-0.03582400205750491,0.0,-0.006114588100848528,0.0,0.0,0.0
+TN, 0.02,,0.015,,,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.048,0.063,,,,,0.02
+NA,,, 0.053,,,0.0038,,0.0,,,,,-0.063,0.128,0.071,0.12,0.154,0.045,0.032
 US,0.008,0.0039,0.009,0.009,0.019,0.0076,0.001,0,0.025,0.033,-0.004,-0.004,0.005,0,0,-0.022,-0.0071,-0.0008,0,-0.007,0,0,-0.022,-0.0071,-0.0049
diff --git a/data/demand/industry_growth_cagr.csv b/data/demand/industry_growth_cagr.csv
index 7b5fc04ad..d1b9b1b29 100644
--- a/data/demand/industry_growth_cagr.csv
+++ b/data/demand/industry_growth_cagr.csv
@@ -1,4 +1,6 @@
 country,chemical and petrochemical,construction,food and tobacco,iron and steel,machinery,mining and quarrying,non-ferrous metals,non-metallic minerals,paper pulp and print,textile and leather,transport equipment,wood and wood products,other
 DEFAULT,0.03,0.015,0.02,0.017,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03
 MA,0.03,0.015,0.02,0.017,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03,0.03
+TN,0.128, 0.167, 0.073,,,0.45,,,,0.079,,,0.096
+NA,0.0037,-0.0024, -0.0338,,,0.1888,-0.048,-0.0624,,0.0354,,0.0278,
 US,0.017,0.008,0.0094,0.005,0.014,0.002,0.011,0.008,0.003,-0.001,0.014,0.001,0.009
diff --git a/scripts/build_industry_demand.py b/scripts/build_industry_demand.py
index ee618a2d0..9b5a5cf66 100644
--- a/scripts/build_industry_demand.py
+++ b/scripts/build_industry_demand.py
@@ -115,6 +115,8 @@ def country_to_nodal(industrial_production, keys):
                     + country
                     + " using default data instead."
                 )
+            else:
+                cagr.loc[country] = cagr.loc[country].fillna(cagr.loc["DEFAULT"])
 
         cagr = cagr[cagr.index.isin(countries)]
 
diff --git a/scripts/prepare_energy_totals.py b/scripts/prepare_energy_totals.py
index e9382544f..ea5e63b8d 100644
--- a/scripts/prepare_energy_totals.py
+++ b/scripts/prepare_energy_totals.py
@@ -36,6 +36,14 @@ def calculate_end_values(df):
     return (1 + df) ** no_years
 
 
+def fill_country_data(df, country, default_key="DEFAULT", label="", logger=_logger):
+    if country not in df.index:
+        df.loc[country] = df.loc[default_key]
+        logger.warning(f"No {label} data for {country} — using default data instead.")
+    else:
+        df.loc[country] = df.loc[country].fillna(df.loc[default_key])
+
+
 if __name__ == "__main__":
     if "snakemake" not in globals():
         from _helpers import mock_snakemake
@@ -66,34 +74,15 @@ def calculate_end_values(df):
     no_years = int(snakemake.wildcards.planning_horizons) - int(
         snakemake.params.base_year
     )
-    growth_factors = calculate_end_values(growth_factors_cagr)
-    efficiency_gains = calculate_end_values(efficiency_gains_cagr)
 
     for country in countries:
-        if country not in efficiency_gains.index:
-            efficiency_gains.loc[country] = efficiency_gains.loc["DEFAULT"]
-            _logger.warning(
-                "No efficiency gains cagr data for "
-                + country
-                + " using default data instead."
-            )
-        if country not in growth_factors.index:
-            growth_factors.loc[country] = growth_factors.loc["DEFAULT"]
-            _logger.warning(
-                "No growth factors cagr data for "
-                + country
-                + " using default data instead."
-            )
-        if country not in fuel_shares.index:
-            fuel_shares.loc[country] = fuel_shares.loc["DEFAULT"]
-            _logger.warning(
-                "No fuel share data for " + country + " using default data instead."
-            )
-        if country not in district_heating.index:
-            district_heating.loc[country] = district_heating.loc["DEFAULT"]
-            _logger.warning(
-                "No heating data for " + country + " using default data instead."
-            )
+        fill_country_data(efficiency_gains_cagr, country, label="efficiency gains CAGR")
+        fill_country_data(growth_factors_cagr, country, label="growth factors CAGR")
+        fill_country_data(fuel_shares, country, label="fuel share")
+        fill_country_data(district_heating, country, label="heating")
+
+    growth_factors = calculate_end_values(growth_factors_cagr)
+    efficiency_gains = calculate_end_values(efficiency_gains_cagr)
 
     efficiency_gains = efficiency_gains[efficiency_gains.index.isin(countries)]
     fuel_shares = fuel_shares[fuel_shares.index.isin(countries)]


Reviews:
user: login: ekatef
body: Hello @doneachh and apologies for being slow with the review!
I'm leaving the domain-related part to @energyLS and @Eddy-JV, and sharing a couple of comments related to the implementation. Let me know please your thoughts about it!
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-16T20:29:53Z
user: login: doneachh
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-17T07:25:24Z
user: login: doneachh
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-17T07:53:00Z
user: login: doneachh
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-17T08:06:17Z
user: login: ekatef
body: @doneachh Super, many thanks for the changes and comments! To me, looks great now and ready to merge 🙂 
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-17T11:10:59Z

Review comments:
diff_hunk: @@ -1,3 +1,5 @@
 country,oil residential heat share,biomass residential heat share,biomass to elec heat share,oil to elec heat share,biomass to elec share,oil to elec share,space to water heat share,gas to elec share,gas to elec heat share,gas residential heat share
 DEFAULT, 0.6667, 0.75,0.0, 0.5, 0.0, 0.5,0.6,0,0,0.75
 MA, 0.6667, 0.75,0.0, 0.5, 0.0, 0.5,0.6,0,0,0.75
+TN, 0.0, 0.11, 0.37, 0.0, 0.01, 0.0, 0.01, 0.98, 0.0,
+NA, 0.025, 0.017, 0.76,,,,0.0,0.0,0.0,
path: data/demand/fuel_shares.csv
user: login: ekatef
body: As a word of caution, ISO2 index for Namibia can be interpreted by some Python routines as non-available. @doneachh have you had a chance to test it?

To fix that, it may be needed to use double quotes or similar tricks. Not sure however if it makes sense to include that in this PR as it's a completely different issue
created_at: 2025-04-16T20:17:26Z
author_association: MEMBER
diff_hunk: @@ -66,34 +66,51 @@ def calculate_end_values(df):
     no_years = int(snakemake.wildcards.planning_horizons) - int(
         snakemake.params.base_year
     )
-    growth_factors = calculate_end_values(growth_factors_cagr)
-    efficiency_gains = calculate_end_values(efficiency_gains_cagr)
 
     for country in countries:
-        if country not in efficiency_gains.index:
-            efficiency_gains.loc[country] = efficiency_gains.loc["DEFAULT"]
+        if country not in efficiency_gains_cagr.index:
+            efficiency_gains_cagr.loc[country] = efficiency_gains_cagr.loc["DEFAULT"]
path: scripts/prepare_energy_totals.py
user: login: ekatef
body: From a naïve developer's perspective: what is the meaning of `cagr`, and do `efficiency_gains` and `efficiency_gains_cagr` have the same type and physical meaning different?

I'm just wondering if it could be possible to also improve a bit readability of the code, along with enhancement the functionality 🙂 
created_at: 2025-04-16T20:21:13Z
author_association: MEMBER
diff_hunk: @@ -66,34 +66,51 @@ def calculate_end_values(df):
     no_years = int(snakemake.wildcards.planning_horizons) - int(
         snakemake.params.base_year
     )
-    growth_factors = calculate_end_values(growth_factors_cagr)
-    efficiency_gains = calculate_end_values(efficiency_gains_cagr)
 
     for country in countries:
-        if country not in efficiency_gains.index:
-            efficiency_gains.loc[country] = efficiency_gains.loc["DEFAULT"]
+        if country not in efficiency_gains_cagr.index:
+            efficiency_gains_cagr.loc[country] = efficiency_gains_cagr.loc["DEFAULT"]
             _logger.warning(
                 "No efficiency gains cagr data for "
                 + country
                 + " using default data instead."
             )
-        if country not in growth_factors.index:
-            growth_factors.loc[country] = growth_factors.loc["DEFAULT"]
+        else:
+            efficiency_gains_cagr.loc[country] = efficiency_gains_cagr.loc[
+                country
+            ].fillna(efficiency_gains_cagr.loc["DEFAULT"])
+        if country not in growth_factors_cagr.index:
+            growth_factors_cagr.loc[country] = growth_factors_cagr.loc["DEFAULT"]
path: scripts/prepare_energy_totals.py
user: login: ekatef
body: If I understand the design properly, there are four `if/else` blocks which are intended to do basically the same pre-processing procedure on the dataframes (`efficiency_gains_cagr` etc.). In this case, it may be a good idea to put this procedure into a single function. What do you think @doneachh?
created_at: 2025-04-16T20:28:14Z
author_association: MEMBER
diff_hunk: @@ -1,3 +1,5 @@
 country,oil residential heat share,biomass residential heat share,biomass to elec heat share,oil to elec heat share,biomass to elec share,oil to elec share,space to water heat share,gas to elec share,gas to elec heat share,gas residential heat share
 DEFAULT, 0.6667, 0.75,0.0, 0.5, 0.0, 0.5,0.6,0,0,0.75
 MA, 0.6667, 0.75,0.0, 0.5, 0.0, 0.5,0.6,0,0,0.75
+TN, 0.0, 0.11, 0.37, 0.0, 0.01, 0.0, 0.01, 0.98, 0.0,
+NA, 0.025, 0.017, 0.76,,,,0.0,0.0,0.0,
path: data/demand/fuel_shares.csv
user: login: doneachh
body: in the read-in process, I'm using the helpers function readcsvna, which fixes the interpretation as non-available :)
created_at: 2025-04-17T07:25:23Z
author_association: COLLABORATOR
diff_hunk: @@ -66,34 +66,51 @@ def calculate_end_values(df):
     no_years = int(snakemake.wildcards.planning_horizons) - int(
         snakemake.params.base_year
     )
-    growth_factors = calculate_end_values(growth_factors_cagr)
-    efficiency_gains = calculate_end_values(efficiency_gains_cagr)
 
     for country in countries:
-        if country not in efficiency_gains.index:
-            efficiency_gains.loc[country] = efficiency_gains.loc["DEFAULT"]
+        if country not in efficiency_gains_cagr.index:
+            efficiency_gains_cagr.loc[country] = efficiency_gains_cagr.loc["DEFAULT"]
path: scripts/prepare_energy_totals.py
user: login: doneachh
body: Its the same, I just moved the calculate_end_values a little bit down, to have it after the value mapping :) 
created_at: 2025-04-17T07:53:00Z
author_association: COLLABORATOR
diff_hunk: @@ -66,34 +66,51 @@ def calculate_end_values(df):
     no_years = int(snakemake.wildcards.planning_horizons) - int(
         snakemake.params.base_year
     )
-    growth_factors = calculate_end_values(growth_factors_cagr)
-    efficiency_gains = calculate_end_values(efficiency_gains_cagr)
 
     for country in countries:
-        if country not in efficiency_gains.index:
-            efficiency_gains.loc[country] = efficiency_gains.loc["DEFAULT"]
+        if country not in efficiency_gains_cagr.index:
+            efficiency_gains_cagr.loc[country] = efficiency_gains_cagr.loc["DEFAULT"]
             _logger.warning(
                 "No efficiency gains cagr data for "
                 + country
                 + " using default data instead."
             )
-        if country not in growth_factors.index:
-            growth_factors.loc[country] = growth_factors.loc["DEFAULT"]
+        else:
+            efficiency_gains_cagr.loc[country] = efficiency_gains_cagr.loc[
+                country
+            ].fillna(efficiency_gains_cagr.loc["DEFAULT"])
+        if country not in growth_factors_cagr.index:
+            growth_factors_cagr.loc[country] = growth_factors_cagr.loc["DEFAULT"]
path: scripts/prepare_energy_totals.py
user: login: doneachh
body: Agree! Adjusted it :)
created_at: 2025-04-17T08:06:17Z
author_association: COLLABORATOR
diff_hunk: @@ -1,3 +1,5 @@
 country,oil residential heat share,biomass residential heat share,biomass to elec heat share,oil to elec heat share,biomass to elec share,oil to elec share,space to water heat share,gas to elec share,gas to elec heat share,gas residential heat share
 DEFAULT, 0.6667, 0.75,0.0, 0.5, 0.0, 0.5,0.6,0,0,0.75
 MA, 0.6667, 0.75,0.0, 0.5, 0.0, 0.5,0.6,0,0,0.75
+TN, 0.0, 0.11, 0.37, 0.0, 0.01, 0.0, 0.01, 0.98, 0.0,
+NA, 0.025, 0.017, 0.76,,,,0.0,0.0,0.0,
path: data/demand/fuel_shares.csv
user: login: ekatef
body: Super 😄 
created_at: 2025-04-17T08:20:52Z
author_association: MEMBER
diff_hunk: @@ -66,34 +66,51 @@ def calculate_end_values(df):
     no_years = int(snakemake.wildcards.planning_horizons) - int(
         snakemake.params.base_year
     )
-    growth_factors = calculate_end_values(growth_factors_cagr)
-    efficiency_gains = calculate_end_values(efficiency_gains_cagr)
 
     for country in countries:
-        if country not in efficiency_gains.index:
-            efficiency_gains.loc[country] = efficiency_gains.loc["DEFAULT"]
+        if country not in efficiency_gains_cagr.index:
+            efficiency_gains_cagr.loc[country] = efficiency_gains_cagr.loc["DEFAULT"]
             _logger.warning(
                 "No efficiency gains cagr data for "
                 + country
                 + " using default data instead."
             )
-        if country not in growth_factors.index:
-            growth_factors.loc[country] = growth_factors.loc["DEFAULT"]
+        else:
+            efficiency_gains_cagr.loc[country] = efficiency_gains_cagr.loc[
+                country
+            ].fillna(efficiency_gains_cagr.loc["DEFAULT"])
+        if country not in growth_factors_cagr.index:
+            growth_factors_cagr.loc[country] = growth_factors_cagr.loc["DEFAULT"]
path: scripts/prepare_energy_totals.py
user: login: ekatef
body: Perfect, many thanks!
created_at: 2025-04-17T08:22:19Z
author_association: MEMBER

PR comments:
user: login: doneachh
created_at: 2025-04-03T08:42:01Z
body: [TUN_PyPSA-Earth__154 (2).xlsx](https://github.com/user-attachments/files/19582937/TUN_PyPSA-Earth__154.2.xlsx)
[Issue__138_NAM_data_V2 (2).xlsx](https://github.com/user-attachments/files/19582938/Issue__138_NAM_data_V2.2.xlsx)

There would be sources in the Excel File provided by our student research stuff. Of course, we cannot add them to the csv files, but should we add them somewhere else?

@ekatef @energyLS @Eddy-JV What do you think?

author_association: COLLABORATOR
user: login: ekatef
created_at: 2025-04-16T21:44:40Z
body: > [TUN_PyPSA-Earth__154 (2).xlsx](https://github.com/user-attachments/files/19582937/TUN_PyPSA-Earth__154.2.xlsx) [Issue__138_NAM_data_V2 (2).xlsx](https://github.com/user-attachments/files/19582938/Issue__138_NAM_data_V2.2.xlsx)
> 
> There would be sources in the Excel File provided by our student research stuff. Of course, we cannot add them to the csv files, but should we add them somewhere else?
> 
> @ekatef @energyLS @Eddy-JV What do you think?

Thank you so much for sharing the files!
Absolutely agree that the data are precious. Actually, we still have a dedicated stream [PyPSA-Earth-Status](https://github.com/pypsa-meets-earth/pypsa-earth-status)  to coordinate on the availability of the regional-specific data and knowledge. There is still work ongoing to elaborate a particular structure which can be used to easily contribute the regional data. Also, I expect that a number of iterations would be required to elaborate something really handy.

What I can suggest to now is to open an issue in [PyPSA-Earth-Status](https://github.com/pypsa-meets-earth/pypsa-earth-status) repo and sharing the files (or a even better a link to this comment) there. What do you think?
author_association: MEMBER
user: login: doneachh
created_at: 2025-04-17T08:13:49Z
body: @ekatef thanks for the review - adjusted the code and added an issue in status :)
author_association: COLLABORATOR
user: login: ekatef
created_at: 2025-04-18T08:10:06Z
body: Merged 😄 
@doneachh Many thanks for the great contribution!
author_association: MEMBER