Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Features/#330 assign weather cell id to power plants #449

Merged
merged 9 commits into from
Oct 11, 2021
5 changes: 4 additions & 1 deletion src/egon/data/datasets/power_plants/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
from egon.data.datasets.power_plants.pv_rooftop import pv_rooftop_per_mv_grid
import egon.data.config
import egon.data.datasets.power_plants.pv_ground_mounted as pv_ground_mounted

import egon.data.datasets.power_plants.assign_weather_data as assign_weather_data
import egon.data.datasets.power_plants.wind_farms as wind_onshore

Base = declarative_base()
Expand All @@ -48,14 +50,15 @@ class PowerPlants(Dataset):
def __init__(self, dependencies):
super().__init__(
name="PowerPlants",
version="0.0.1",
version="0.0.2",
dependencies=dependencies,
tasks=(
create_tables,
insert_hydro_biomass,
wind_onshore.insert,
pv_ground_mounted.insert,
pv_rooftop_per_mv_grid,
assign_weather_data.weather_id,
),
)

Expand Down
108 changes: 108 additions & 0 deletions src/egon/data/datasets/power_plants/assign_weather_data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
import pandas as pd
import geopandas as gpd
import numpy as np
from egon.data import db
from shapely.geometry import Point
from pathlib import Path
import egon.data.config


def weather_id():
"""
Assign weather data to the weather dependant generators (wind and solar)

Parameters
----------
*No parameters required
"""

# Connect to the data base
con = db.engine()

cfg = egon.data.config.datasets()["power_plants"]

# Import table with power plants
sql = "SELECT * FROM supply.egon_power_plants"
power_plants = gpd.GeoDataFrame.from_postgis(
sql, con, crs="EPSG:4326", geom_col="geom"
)

# select the power_plants that are weather dependant
power_plants = power_plants[
(power_plants["carrier"] == "solar")
| (power_plants["carrier"] == "wind_onshore")
| (power_plants["carrier"] == "wind_offshore")
]
power_plants.set_index("id", inplace=True)

########################## ERASE #########################################
# solar = power_plants[power_plants['carrier'] == 'solar']
# solar.set_crs(epsg= 3035, allow_override= True, inplace= True)
# solar = solar.to_crs(4326)
# power_plants.drop(labels= (power_plants[power_plants['carrier'] == 'solar']).index.values, axis= 0,inplace= True)
# power_plants = power_plants.append(solar)
########################## ERASE #########################################
# Import table with weather data for each technology
sql = "SELECT * FROM supply.egon_era5_renewable_feedin"
weather_data = pd.read_sql_query(sql, con)
weather_data.set_index("w_id", inplace=True)

# Import weather cells with Id to match with the weather data
sql = "SELECT * FROM supply.egon_era5_weather_cells"
weather_cells = gpd.GeoDataFrame.from_postgis(
sql, con, crs="EPSG:4326", geom_col="geom"
)

# import Germany borders to speed up the matching process
sql = "SELECT * FROM boundaries.vg250_sta"
boundaries = gpd.GeoDataFrame.from_postgis(
sql, con, crs="EPSG:4326", geom_col="geometry"
)

# Clip weater data cells using the German boundaries
weather_cells = gpd.clip(weather_cells, boundaries)

for weather_id in weather_cells["w_id"]:
df = gpd.clip(
power_plants, weather_cells[weather_cells["w_id"] == weather_id]
)
power_plant_list = df.index.to_list()
power_plants.loc[power_plant_list, "weather_cell_id"] = weather_id

# delete weather dependent power_plants from supply.egon_power_plants
db.execute_sql(
f"""
DELETE FROM {cfg['target']['schema']}.{cfg['target']['table']}
WHERE carrier IN ('wind_onshore', 'solar', 'wind_offshore')
"""
)

# Look for the maximum id in the table egon_power_plants
sql = (
"SELECT MAX(id) FROM "
+ cfg["target"]["schema"]
+ "."
+ cfg["target"]["table"]
)
max_id = pd.read_sql(sql, con)
max_id = max_id["max"].iat[0]
if max_id == None:
ini_id = 1
else:
ini_id = int(max_id + 1)

# write_table in egon-data database:
# Reset index
power_plants.index = pd.RangeIndex(
start=ini_id, stop=ini_id + len(power_plants), name="id"
)

# Insert into database
power_plants.reset_index().to_postgis(
cfg["target"]["table"],
schema=cfg["target"]["schema"],
con=db.engine(),
if_exists="append",
)

return 0
5 changes: 3 additions & 2 deletions src/egon/data/datasets/power_plants/pv_ground_mounted.py
Original file line number Diff line number Diff line change
Expand Up @@ -1006,7 +1006,7 @@ def run_methodology(
},
)
plt.savefig("pv_per_distr_map_eGon100RE.png", dpi=300)

pv_rora = pv_rora[pv_rora['installed capacity in kW']>0]
pv_agri = pv_agri[pv_agri['installed capacity in kW']>0]
pv_per_distr = pv_per_distr[pv_per_distr['installed capacity in kW']>0]
Expand Down Expand Up @@ -1095,10 +1095,11 @@ def pv_parks(pv_rora, pv_agri, pv_per_distr, scenario_name):
insert_pv_parks["scenario"] = scenario_name

# change name and crs of geometry column
insert_pv_parks.set_crs(epsg= 3035, allow_override= True, inplace= True)
insert_pv_parks = (
insert_pv_parks.rename({"geometry": "geom"}, axis=1)
.set_geometry("geom")
.set_crs(4326)
.to_crs(4326)
)

# reset index
Expand Down
9 changes: 4 additions & 5 deletions src/egon/data/datasets/renewable_feedin.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,11 @@ def weather_cells_in_germany(geom_column='geom'):
cfg = egon.data.config.datasets()['renewable_feedin']['sources']

return db.select_geodataframe(
f"""SELECT a.w_id, a.geom_point, a.geom
f"""SELECT w_id, geom_point, geom
FROM {cfg['weather_cells']['schema']}.
{cfg['weather_cells']['table']} a,
{cfg['vg250_sta_union']['schema']}.
{cfg['vg250_sta_union']['table']} b
WHERE ST_Intersects(ST_Transform(b.geometry, 4326), a.geom)""",
{cfg['weather_cells']['table']}
WHERE ST_Intersects('SRID=4326;
POLYGON((5 56, 15.5 56, 15.5 47, 5 47, 5 56))', geom)""",
ClaraBuettner marked this conversation as resolved.
Show resolved Hide resolved
geom_col=geom_column, index_col='w_id')

def federal_states_per_weather_cell():
Expand Down