Skip to content

Commit

Permalink
proposal for etrago sqlalchemy table structure
Browse files Browse the repository at this point in the history
  • Loading branch information
ulfmueller committed Jan 14, 2021
1 parent 9ea77ae commit 2d1a289
Showing 1 changed file with 312 additions and 0 deletions.
312 changes: 312 additions & 0 deletions src/egon/data/importing/etrago/etrago_grid.py
@@ -0,0 +1,312 @@
# coding: utf-8
from sqlalchemy import ARRAY, BigInteger, Boolean, CHAR, Column, Date, DateTime, Float, ForeignKey, Integer, JSON, Numeric, SmallInteger, String, Table, Text, text
from geoalchemy2.types import Geometry
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
metadata = Base.metadata



class EgonPfHvBus(Base):
__tablename__ = 'egon_pf_hv_bus'
__table_args__ = {'schema': 'grid'}

version = Column(Text, primary_key=True, nullable=False)
scn_name = Column(String, primary_key=True, nullable=False)
bus_id = Column(BigInteger, primary_key=True, nullable=False)
v_nom = Column(Float(53))
carrier = Column(Text)
v_mag_pu_min = Column(Float(53))
v_mag_pu_max = Column(Float(53))
geom = Column(Geometry('POINT', 4326), index=True)

This comment has been minimized.

Copy link
@ClaraBuettner

ClaraBuettner Jan 15, 2021

Contributor

The bus component in pypsa has the attributes 'x' and 'y' for the position. It's redundant to the 'geometry' so it won't add any information but we don't have the same columns.
And there is also a column 'v_mag_pu_set' and 'type' which is not in this structure

This comment has been minimized.

Copy link
@ulfmueller

ulfmueller Jan 18, 2021

Author Member

I would leave out x and y since like you said that information is in our case in the geom column. v_mag_pu_set I will add. The type column is a bit tricky. I will post a corresponding question in the issue.



class EgonPfHvGenerator(Base):
__tablename__ = 'egon_pf_hv_generator'
__table_args__ = {'schema': 'grid'}

version = Column(Text, primary_key=True, nullable=False)
scn_name = Column(String, primary_key=True, nullable=False)
generator_id = Column(BigInteger, primary_key=True, nullable=False)
bus = Column(BigInteger)
control = Column(Text)
carrier = Column(Text)
p_nom = Column(Float(53))
p_nom_extendable = Column(Boolean)
p_nom_min = Column(Float(53))
p_nom_max = Column(Float(53))
p_min_pu_fixed = Column(Float(53))
p_max_pu_fixed = Column(Float(53))
sign = Column(Float(53))
marginal_cost_fixed = Column(Float(53))
capital_cost = Column(Float(53))
efficiency = Column(Float(53))
committable = Column(Boolean)
start_up_cost = Column(Float(53))
shut_down_cost = Column(Float(53))
min_up_time = Column(BigInteger)
min_down_time = Column(BigInteger)
up_time_before = Column(BigInteger)
down_time_before = Column(BigInteger)
ramp_limit_up = Column(Float(53))
ramp_limit_down = Column(Float(53))
ramp_limit_start_up = Column(Float(53))
ramp_limit_shut_down = Column(Float(53))

This comment has been minimized.

Copy link
@ClaraBuettner

ClaraBuettner Jan 15, 2021

Contributor

Compared to the pypsa component, a 'p_set_fixed' and 'q_set_fixed' column is missing



class EgonPfHvGeneratorTimeseries(Base):
__tablename__ = 'egon_pf_hv_generator_timeseries'
__table_args__ = {'schema': 'grid'}

version = Column(Text, primary_key=True, nullable=False)
scn_name = Column(String, primary_key=True, nullable=False)
generator_id = Column(Integer, primary_key=True, nullable=False)
temp_id = Column(Integer, nullable=False)
p_set = Column(ARRAY(Float(precision=53)))
q_set = Column(ARRAY(Float(precision=53)))
p_min_pu = Column(ARRAY(Float(precision=53)))
p_max_pu = Column(ARRAY(Float(precision=53)))
marginal_cost = Column(ARRAY(Float(precision=53)))


class EgonPfHvLine(Base):
__tablename__ = 'egon_pf_hv_line'
__table_args__ = {'schema': 'grid'}

version = Column(Text, primary_key=True, nullable=False)
scn_name = Column(String, primary_key=True, nullable=False)
line_id = Column(BigInteger, primary_key=True, nullable=False)
bus0 = Column(BigInteger)
bus1 = Column(BigInteger)
x = Column(Numeric)
r = Column(Numeric)
g = Column(Numeric)
b = Column(Numeric)
s_nom = Column(Numeric)
s_nom_extendable = Column(Boolean)
s_nom_min = Column(Float(53))
s_nom_max = Column(Float(53))
s_max_pu_fixed = Column(ARRAY(Float(precision=53)))

This comment has been minimized.

Copy link
@ClaraBuettner

ClaraBuettner Jan 15, 2021

Contributor

Aren't the '_fixed' columns only static values and not an array?

This comment has been minimized.

Copy link
@ulfmueller

ulfmueller Jan 18, 2021

Author Member

Right, some copy-paste error. Changed it.

capital_cost = Column(Float(53))
length = Column(Float(53))
cables = Column(Integer)
terrain_factor = Column(Float(53))
geom = Column(Geometry('MULTILINESTRING', 4326))
topo = Column(Geometry('LINESTRING', 4326))

This comment has been minimized.

Copy link
@ClaraBuettner

ClaraBuettner Jan 15, 2021

Contributor

Compared to pypsa, a 'v_ang_min' and 'v_ang_max' column is missing. And they use 'n_parallel' instead of 'cables'. But as I said, I think the 'cables' attribute is used in etrago so we would need to change this if we want to use 'n_parallel'.



class EgonPfHvLineTimeseries(Base):
__tablename__ = 'egon_pf_hv_line_timeseries'
__table_args__ = {'schema': 'grid'}

version = version = Column(Text, primary_key=True, nullable=False)
scn_name = Column(String, primary_key=True, nullable=False)
line_id = Column(BigInteger, primary_key=True, nullable=False)
s_max_pu = Column(ARRAY(Float(precision=53)))


class EgonPfHvLink(Base):
__tablename__ = 'egon_pf_hv_link'
__table_args__ = {'schema': 'grid'}

version = version = Column(Text, primary_key=True, nullable=False)
scn_name = Column(String, primary_key=True, nullable=False)
link_id = Column(BigInteger, primary_key=True, nullable=False)
bus0 = Column(BigInteger)
bus1 = Column(BigInteger)
carrier = Column(Text)
efficiency_fixed = Column(Float(53))
p_nom = Column(Numeric)
p_nom_extendable = Column(Boolean)
p_nom_min = Column(Float(53))
p_nom_max = Column(Float(53))
p_min_pu_fixed = Column(Float(53))
p_max_pu_fixed = Column(Float(53))
p_set_fixed = Column(Float(53))
capital_cost = Column(Float(53))
marginal_cost_fixed = Column(Float(53))
length = Column(Float(53))
terrain_factor = Column(Float(53))
geom = Column(Geometry('MULTILINESTRING', 4326))
topo = Column(Geometry('LINESTRING', 4326))

This comment has been minimized.

Copy link
@ClaraBuettner

ClaraBuettner Jan 15, 2021

Contributor

Compared to pypsa, a 'p_set_fixed' column is missing


class EgonPfHvLinkTimeseries(Base):
__tablename__ = 'egon_pf_hv_link_timeseries'
__table_args__ = {'schema': 'grid'}

version = version = Column(Text, primary_key=True, nullable=False)
scn_name = Column(String, primary_key=True, nullable=False)
link_id = Column(BigInteger, primary_key=True, nullable=False)
p_set = Column(ARRAY(Float(precision=53)))
p_min_pu = Column(ARRAY(Float(precision=53)))
p_max_pu = Column(ARRAY(Float(precision=53)))
efficiency = Column(ARRAY(Float(precision=53)))
marginal_cost = Column(ARRAY(Float(precision=53)))


class EgonPfHvLoad(Base):
__tablename__ = 'egon_pf_hv_load'
__table_args__ = {'schema': 'grid'}

version = Column(Text, primary_key=True, nullable=False)
scn_name = Column(String, primary_key=True, nullable=False)
load_id = Column(BigInteger, primary_key=True, nullable=False)
bus = Column(BigInteger)
carrier = Column(Text)
sign = Column(Float(53))


class EgonPfHvLoadTimeseries(Base):
__tablename__ = 'egon_pf_hv_load_timeseries'
__table_args__ = {'schema': 'grid'}

version = Column(Text, primary_key=True, nullable=False)
scn_name = Column(String, primary_key=True, nullable=False)
load_id = Column(BigInteger, primary_key=True, nullable=False)
temp_id = Column(Integer, nullable=False)
p_set = Column(ARRAY(Float(precision=53)))
q_set = Column(ARRAY(Float(precision=53)))


class EgonPfHvCarrier(Base):
__tablename__ = 'egon_pf_hv_carrier'
__table_args__ = {'schema': 'grid'}

version = Column(Text, primary_key=True, nullable=False)
name = Column(Text)
co2_emissions = Column(Float(53))
commentary = Column(Text)

This comment has been minimized.

Copy link
@ClaraBuettner

ClaraBuettner Jan 15, 2021

Contributor

Pypsa has additional columns for 'color' and 'nice_name', but I don't know if we will use them.

This comment has been minimized.

Copy link
@ulfmueller

ulfmueller Jan 18, 2021

Author Member

I guess that is something we really can do on the tool level, I think. I would not include it. ok?



class EgonPfHvStorage(Base):
__tablename__ = 'egon_pf_hv_storage'
__table_args__ = {'schema': 'grid'}

version = Column(Text, primary_key=True, nullable=False)
scn_name = Column(String, primary_key=True, nullable=False)
storage_id = Column(BigInteger, primary_key=True, nullable=False)
bus = Column(BigInteger)
control = Column(Text)
carrier = Column(Text)
p_nom = Column(Float(53))
p_nom_extendable = Column(Boolean)
p_nom_min = Column(Float(53))
p_nom_max = Column(Float(53))
p_min_pu_fixed = Column(Float(53))
p_max_pu_fixed = Column(Float(53))
sign = Column(Float(53))
marginal_cost_fixed = Column(Float(53))
capital_cost = Column(Float(53))
state_of_charge_initial = Column(Float(53))
cyclic_state_of_charge = Column(Boolean)
max_hours = Column(Float(53))
efficiency_store = Column(Float(53))
efficiency_dispatch = Column(Float(53))
standing_loss = Column(Float(53))

This comment has been minimized.

Copy link
@ClaraBuettner

ClaraBuettner Jan 15, 2021

Contributor

Compared to pypsa columns for 'state_of_charge_set_fixed' and 'inflow_fixed' are missing



class EgonPfHvStorageTimeseries(Base):
__tablename__ = 'egon_pf_hv_storage_timeseries'
__table_args__ = {'schema': 'grid'}

version = Column(Text, primary_key=True, nullable=False)
scn_name = Column(String, primary_key=True, nullable=False)
storage_id = Column(BigInteger, primary_key=True, nullable=False)
temp_id = Column(Integer, primary_key=True, nullable=False)
p_set = Column(ARRAY(Float(precision=53)))
q_set = Column(ARRAY(Float(precision=53)))
p_min_pu = Column(ARRAY(Float(precision=53)))
p_max_pu = Column(ARRAY(Float(precision=53)))
state_of_charge_set = Column(ARRAY(Float(precision=53)))
inflow = Column(ARRAY(Float(precision=53)))
marginal_cost = Column(ARRAY(Float(precision=53)))

class EgonPfHvStore(Base):
__tablename__ = 'egon_pf_hv_store'
__table_args__ = {'schema': 'grid'}

version = Column(Text, primary_key=True, nullable=False)
scn_name = Column(String, primary_key=True, nullable=False)
store_id = Column(BigInteger, primary_key=True, nullable=False)
bus = Column(BigInteger)
carrier = Column(Text)
e_nom = Column(Float(53))
e_nom_extendable = Column(Boolean)
e_nom_min = Column(Float(53))
e_nom_max = Column(Float(53))
e_min_pu_fixed = Column(Float(53))
e_max_pu_fixed = Column(Float(53))
e_initial = Column(Float(53))
e_cyclic = Column(Boolean)
sign = Column(Float(53))
marginal_cost_fixed = Column(Float(53))
capital_cost = Column(Float(53))
standing_loss = Column(Float(53))

This comment has been minimized.

Copy link
@ClaraBuettner

ClaraBuettner Jan 15, 2021

Contributor

The columns 'p_set_fixed' and 'q_set_fixed' are missing. But since you did this for all tables this seems to be desired, isn't it?


class EgonPfHvStoreTimeseries(Base):
__tablename__ = 'egon_pf_hv_store_timeseries'
__table_args__ = {'schema': 'grid'}

version = Column(Text, primary_key=True, nullable=False)
scn_name = Column(String, primary_key=True, nullable=False)
store_id = Column(BigInteger, primary_key=True, nullable=False)
temp_id = Column(Integer, primary_key=True, nullable=False)
p_set = Column(ARRAY(Float(precision=53)))
q_set = Column(ARRAY(Float(precision=53)))
e_min_pu = Column(ARRAY(Float(precision=53)))
e_max_pu = Column(ARRAY(Float(precision=53)))
marginal_cost = Column(ARRAY(Float(precision=53)))

class EgonPfHvTempResolution(Base):
__tablename__ = 'egon_pf_hv_temp_resolution'
__table_args__ = {'schema': 'grid'}

version = Column(Text, primary_key=True, nullable=False)
temp_id = Column(BigInteger, primary_key=True, nullable=False)
timesteps = Column(BigInteger, nullable=False)
resolution = Column(Text)
start_time = Column(DateTime)


class EgonPfHvTransformer(Base):
__tablename__ = 'egon_pf_hv_transformer'
__table_args__ = {'schema': 'grid'}

version = Column(Text, primary_key=True, nullable=False)
scn_name = Column(String, primary_key=True, nullable=False)
trafo_id = Column(BigInteger, primary_key=True, nullable=False)
bus0 = Column(BigInteger)
bus1 = Column(BigInteger)
model = Column(Text)
x = Column(Numeric)
r = Column(Numeric)
g = Column(Numeric)
b = Column(Numeric)
s_nom = Column(Float(53))
s_nom_extendable = Column(Boolean)
s_nom_min = Column(Float(53))
s_nom_max = Column(Float(53))
s_max_pu_fixed = Column(Float(53))
tap_ratio = Column(Float(53))
tap_side = Column(Float(53))

This comment has been minimized.

Copy link
@ClaraBuettner

ClaraBuettner Jan 15, 2021

Contributor

'tap_side' is an integer value in pypsa

This comment has been minimized.

Copy link
@ulfmueller

ulfmueller Jan 18, 2021

Author Member

you are right. Changed it!

tap_position = Column(BigInteger)
phase_shift = Column(Float(53))
v_ang_min = Column(Float(53))
v_ang_max = Column(Float(53))
capital_cost = Column(Float(53))
num_parallel = Column(Float(53))
geom = Column(Geometry('MULTILINESTRING', 4326))
topo = Column(Geometry('LINESTRING', 4326))


class EgonPfHvTransformerTimeseries(Base):
__tablename__ = 'egon_pf_hv_transformer_timeseries'
__table_args__ = {'schema': 'grid'}

version = version = Column(Text, primary_key=True, nullable=False)
scn_name = Column(String, primary_key=True, nullable=False)
trafo_id = Column(BigInteger, primary_key=True, nullable=False)
s_max_pu = Column(ARRAY(Float(precision=53)))

0 comments on commit 2d1a289

Please sign in to comment.