Source code for egon.data.datasets.power_plants.assign_weather_data

import geopandas as gpd
import pandas as pd

from egon.data import db
import egon.data.config
import egon.data.datasets.power_plants.__init__ as init_pp


[docs]def weatherId_and_busId(): power_plants, cfg, con = find_weather_id() power_plants = find_bus_id(power_plants, cfg) write_power_plants_table(power_plants, cfg, con)
[docs]def find_bus_id(power_plants, cfg): # Define bus_id for power plants without it power_plants_no_busId = power_plants[power_plants.bus_id.isna()] power_plants = power_plants[~power_plants.bus_id.isna()] power_plants_no_busId = power_plants_no_busId.drop(columns="bus_id") if len(power_plants_no_busId) > 0: power_plants_no_busId = init_pp.assign_bus_id( power_plants_no_busId, cfg ) power_plants = power_plants.append(power_plants_no_busId) return power_plants
[docs]def find_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()["weather_BusID"] # Import table with power plants sql = f""" SELECT * FROM {cfg['sources']['power_plants']['schema']}. {cfg['sources']['power_plants']['table']} """ power_plants = gpd.GeoDataFrame.from_postgis( sql, con, crs="EPSG:4326", geom_col="geom" ) # select the power_plants that are weather dependant (wind offshore is # not included here, because it alredy has weather_id assigned) power_plants = power_plants[ (power_plants["carrier"] == "solar") | (power_plants["carrier"] == "wind_onshore") ] power_plants.set_index("id", inplace=True) # Import table with weather data for each technology sql = f""" SELECT * FROM {cfg['sources']['renewable_feedin']['schema']}. {cfg['sources']['renewable_feedin']['table']} """ 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 = f""" SELECT * FROM {cfg['sources']['weather_cells']['schema']}. {cfg['sources']['weather_cells']['table']} """ 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" sql = f""" SELECT * FROM {cfg['sources']['boundaries']['schema']}. {cfg['sources']['boundaries']['table']} """ 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 return (power_plants, cfg, con)
[docs]def write_power_plants_table(power_plants, cfg, con): # delete weather dependent power_plants from supply.egon_power_plants db.execute_sql( f""" DELETE FROM {cfg['sources']['power_plants']['schema']}. {cfg['sources']['power_plants']['table']} WHERE carrier IN ('wind_onshore', 'solar') """ ) # assert that the column "bus_id" is set as integer power_plants["bus_id"] = power_plants["bus_id"].apply( lambda x: pd.NA if pd.isna(x) else int(x) ) # assert that the column "weather_cell_id" is set as integer power_plants["weather_cell_id"] = power_plants["weather_cell_id"].apply( lambda x: pd.NA if pd.isna(x) else int(x) ) # Look for the maximum id in the table egon_power_plants sql = f""" SELECT MAX(id) FROM {cfg['sources']['power_plants']['schema']}. {cfg['sources']['power_plants']['table']} """ max_id = pd.read_sql(sql, con) max_id = max_id["max"].iat[0] if max_id is 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( name=f"{cfg['sources']['power_plants']['table']}", schema=f"{cfg['sources']['power_plants']['schema']}", con=con, if_exists="append", ) return "Bus_id and Weather_id were updated succesfully"