"""The central module containing code to merge data on electricity demand
and feed this data into the corresponding etraGo tables.
"""
from datetime import datetime
from pathlib import Path
import os
import egon.data.config
import pandas as pd
from egon.data import db
from egon.data.datasets import Dataset
[docs]def demands_per_bus(scenario):
"""Sum all electricity demand curves up per bus
Parameters
----------
scenario : str
Scenario name.
Returns
-------
pandas.DataFrame
Aggregated electrical demand timeseries per bus
"""
# Read information from configuration file
sources = egon.data.config.datasets()["etrago_electricity"]["sources"]
# Select data on CTS electricity demands per bus
cts_curves = db.select_dataframe(
f"""SELECT bus_id, p_set FROM
{sources['cts_curves']['schema']}.
{sources['cts_curves']['table']}
WHERE scn_name = '{scenario}'""",
index_col="bus_id",
)
# Rename index
cts_curves.index.rename("bus", inplace=True)
# Select data on industrial demands assigned to osm landuse areas
ind_curves_osm = db.select_dataframe(
f"""SELECT bus, p_set FROM
{sources['osm_curves']['schema']}.
{sources['osm_curves']['table']}
WHERE scn_name = '{scenario}'""",
index_col="bus",
)
# Select data on industrial demands assigned to industrial sites
ind_curves_sites = db.select_dataframe(
f"""SELECT bus, p_set FROM
{sources['sites_curves']['schema']}.
{sources['sites_curves']['table']}
WHERE scn_name = '{scenario}'""",
index_col="bus",
)
# Select data on household electricity demands per bus
hh_curves = db.select_dataframe(
f"""SELECT bus_id, p_set FROM
{sources['household_curves']['schema']}.
{sources['household_curves']['table']}
WHERE scn_name = '{scenario}'""",
index_col="bus_id",
)
# Create one df by appending all imported dataframes
demand_curves = cts_curves.append(
[ind_curves_osm, ind_curves_sites, hh_curves]
)
# Split array to single columns in the dataframe
demand_curves_split = demand_curves
demand_curves_split = pd.DataFrame(
demand_curves.p_set.tolist(), index=demand_curves_split.index
)
# Group all rows with the same bus
demand_curves_bus = demand_curves_split.groupby(
demand_curves_split.index
).sum()
# Initzialize and fill resulsting dataframe
curves = pd.DataFrame(columns=["bus", "p_set"])
curves["bus"] = demand_curves_bus.index
curves["p_set"] = demand_curves_bus.values.tolist()
# Store national demand time series for pypsa-eur-sec
store_national_profiles(
ind_curves_sites,
ind_curves_osm,
cts_curves,
hh_curves,
scenario,
)
return curves
[docs]def store_national_profiles(
ind_curves_sites,
ind_curves_osm,
cts_curves,
hh_curves,
scenario,
):
"""
Store electrical load timeseries aggregated for national level as an
input for pypsa-eur-sec
Parameters
----------
ind_curves_sites : pd.DataFrame
Industrial load timeseries for industrial sites per bus
ind_curves_osm : pd.DataFrame
Industrial load timeseries for industrial osm areas per bus
cts_curves : pd.DataFrame
CTS load curves per bus
hh_curves : pd.DataFrame
Household load curves per bus
scenario : str
Scenario name
Returns
-------
None.
"""
folder = Path(".") / "input-pypsa-eur-sec"
# Create the folder, if it does not exists already
if not os.path.exists(folder):
os.mkdir(folder)
national_demand = pd.DataFrame(
columns=["residential_and_service", "industry"],
index=pd.date_range(datetime(2011, 1, 1, 0), periods=8760, freq="H"),
)
national_demand["industry"] = (
pd.DataFrame(ind_curves_sites.p_set.tolist()).sum()
+ pd.DataFrame(ind_curves_osm.p_set.tolist()).sum()
).values
national_demand["residential_and_service"] = (
pd.DataFrame(cts_curves.p_set.tolist()).sum()
+ pd.DataFrame(hh_curves.p_set.tolist()).sum()
).values
national_demand.to_csv(
folder / f"electrical_demand_timeseries_DE_{scenario}.csv"
)
[docs]def export_to_db():
"""Prepare and export eTraGo-ready information of loads per bus and their
time series to the database
Returns
-------
None.
"""
sources = egon.data.config.datasets()["etrago_electricity"]["sources"]
targets = egon.data.config.datasets()["etrago_electricity"]["targets"]
for scenario in ["eGon2035", "eGon100RE"]:
# Delete existing data from database
db.execute_sql(
f"""
DELETE FROM
{targets['etrago_load']['schema']}.{targets['etrago_load']['table']}
WHERE scn_name = '{scenario}'
AND carrier = 'AC'
AND bus IN (
SELECT bus_id FROM
{sources['etrago_buses']['schema']}.
{sources['etrago_buses']['table']}
WHERE country = 'DE'
AND carrier = 'AC'
AND scn_name = '{scenario}')
"""
)
db.execute_sql(
f"""
DELETE FROM
{targets['etrago_load_curves']['schema']}.{targets['etrago_load_curves']['table']}
WHERE scn_name = '{scenario}'
AND load_id NOT IN (
SELECT load_id FROM
{targets['etrago_load']['schema']}.
{targets['etrago_load']['table']}
WHERE scn_name = '{scenario}')
"""
)
curves = demands_per_bus(scenario)
# Initialize dataframes equivalent to database tables
load = pd.DataFrame(
columns=[
"scn_name",
"load_id",
"bus",
"type",
"carrier",
"p_set",
"q_set",
"sign",
]
)
load_timeseries = pd.DataFrame(
columns=["scn_name", "load_id", "temp_id", "p_set", "q_set"]
)
# Choose next unused load_id
next_load_id = db.next_etrago_id("load")
# Insert values into load df
load.bus = curves.bus
load.scn_name = scenario
load.sign = -1
load.carrier = "AC"
load.load_id = range(next_load_id, next_load_id + len(load))
load.p_set = curves.p_set
# Insert values into load timeseries df
load_timeseries[["load_id", "p_set"]] = load[["load_id", "p_set"]]
load_timeseries.scn_name = scenario
load_timeseries.temp_id = 1
# Delete p_set column from load df
load.drop(columns=["p_set"], inplace=True)
# Set index
load = load.set_index(["scn_name", "load_id"])
load_timeseries = load_timeseries.set_index(
["scn_name", "load_id", "temp_id"]
)
# Insert data into database
load.to_sql(
targets["etrago_load"]["table"],
schema=targets["etrago_load"]["schema"],
con=db.engine(),
if_exists="append",
)
load_timeseries.to_sql(
targets["etrago_load_curves"]["table"],
schema=targets["etrago_load_curves"]["schema"],
con=db.engine(),
if_exists="append",
)
[docs]class ElectricalLoadEtrago(Dataset):
def __init__(self, dependencies):
super().__init__(
name="Electrical_load_etrago",
version="0.0.6",
dependencies=dependencies,
tasks=(export_to_db,),
)