Skip to content

Commit d8dd031

Browse files
authored
Merge pull request #164 from alliander-opensource/feature/extra-info
Add pp input data to extra info
2 parents 1db236c + 6307cec commit d8dd031

File tree

4 files changed

+184
-38
lines changed

4 files changed

+184
-38
lines changed

src/power_grid_model_io/converters/pandapower_converter.py

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ def _parse_data(self, data: PandaPowerData, data_type: str, extra_info: Optional
7979

8080
# Construct extra_info
8181
if extra_info is not None:
82-
self._fill_extra_info(extra_info=extra_info)
82+
self._fill_pgm_extra_info(extra_info=extra_info)
83+
self._fill_pp_extra_info(extra_info=extra_info)
8384

8485
return self.pgm_input_data
8586

@@ -135,22 +136,56 @@ def _create_input_data(self):
135136
self._create_pgm_input_generators()
136137
self._create_pgm_input_dclines()
137138

138-
def _fill_extra_info(self, extra_info: ExtraInfo):
139+
def _fill_pgm_extra_info(self, extra_info: ExtraInfo):
140+
"""
141+
Fills in extra information of power-grid-model input after conversion from pandapower to the extra_info dict
142+
143+
Args:
144+
extra_info: The extra info dict
145+
"""
139146
for (pp_table, name), indices in self.idx_lookup.items():
140147
for pgm_id, pp_idx in zip(indices.index, indices):
141148
if name:
142149
extra_info[pgm_id] = {"id_reference": {"table": pp_table, "name": name, "index": pp_idx}}
143150
else:
144151
extra_info[pgm_id] = {"id_reference": {"table": pp_table, "index": pp_idx}}
152+
145153
for component_data in self.pgm_input_data.values():
146154
for attr_name in component_data.dtype.names:
147155
if not NODE_REF_RE.fullmatch(attr_name):
148156
continue
149157
for pgm_id, node_id in component_data[["id", attr_name]]:
150-
if pgm_id in extra_info:
151-
extra_info[pgm_id][attr_name] = node_id
152-
else:
153-
extra_info[pgm_id] = {attr_name: node_id}
158+
if pgm_id not in extra_info:
159+
extra_info[pgm_id] = {}
160+
if "pgm_input" not in extra_info[pgm_id]:
161+
extra_info[pgm_id]["pgm_input"] = {}
162+
extra_info[pgm_id]["pgm_input"][attr_name] = node_id
163+
164+
def _fill_pp_extra_info(self, extra_info: ExtraInfo):
165+
"""
166+
Fills extra information from pandapower input dataframes not available in power-grid-model input
167+
to the extra_info dict.
168+
Currently, it is possible to only store the derating factor (df) of trafo.
169+
170+
Args:
171+
extra_info: The extra info dict
172+
"""
173+
pp_input = {"trafo": {"df"}}
174+
for pp_table, pp_attr in pp_input.items():
175+
if pp_table in self.pp_input_data:
176+
pp_attr = pp_attr & set(self.pp_input_data[pp_table].columns)
177+
if not pp_attr:
178+
continue
179+
pgm_ids = self._get_pgm_ids(pp_table=pp_table)
180+
pp_extra_data = self.pp_input_data[pp_table][pp_attr]
181+
pp_extra_data.index = pgm_ids
182+
for pgm_id, pp_element in pp_extra_data.iterrows():
183+
if pgm_id not in extra_info:
184+
extra_info[pgm_id] = {}
185+
if "pp_input" not in extra_info[pgm_id]:
186+
extra_info[pgm_id]["pp_input"] = {}
187+
for attr in pp_attr:
188+
extra_info[pgm_id]["pp_input"][attr] = pp_element[attr]
154189

155190
def _extra_info_to_idx_lookup(self, extra_info: ExtraInfo):
156191
"""
@@ -202,10 +237,29 @@ def _extra_info_to_pgm_input_data(self, extra_info: ExtraInfo):
202237
dtype={"names": ["id"] + node_cols, "formats": [dtype] * num_cols},
203238
)
204239
for i, pgm_id in enumerate(data["id"]):
205-
extra = extra_info[pgm_id]
240+
extra = extra_info[pgm_id].get("pgm_input", {})
206241
ref[i] = (pgm_id,) + tuple(extra[col] for col in node_cols)
207242
self.pgm_input_data[component] = ref
208243

244+
def _extra_info_to_pp_input_data(self, extra_info: ExtraInfo):
245+
"""
246+
Converts extra component info into node_lookup
247+
Currently, it is possible to only retrieve the derating factor (df) of trafo.
248+
249+
Args:
250+
extra_info: a dictionary where the node reference ids are stored
251+
"""
252+
assert not self.pp_input_data
253+
assert self.pgm_output_data
254+
255+
if "transformer" not in self.pgm_output_data:
256+
return
257+
258+
pgm_ids = self.pgm_output_data["transformer"]["id"]
259+
pp_ids = self._get_pp_ids(pp_table="trafo", pgm_idx=pgm_ids)
260+
derating_factor = (extra_info.get(pgm_id, {}).get("pp_input", {}).get("df", np.nan) for pgm_id in pgm_ids)
261+
self.pp_input_data = {"trafo": pd.DataFrame(derating_factor, columns=["df"], index=pp_ids)}
262+
209263
def _create_output_data(self):
210264
"""
211265
Performs the conversion from power-grid-model to PandaPower by calling individual conversion functions.

tests/data/pandapower/pgm_output_data.json

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,47 +10,47 @@
1010
],
1111
"line":
1212
[
13-
{"id": 6, "energized": 1, "loading": 0.5930290459172566, "p_from": -1763554.1135053905, "q_from": -1245081.6865976173, "i_from": 64.0471369590637, "s_from": 2158784.7316401307, "p_to": 1765096.6771171533, "q_to": 1169229.7700732222, "i_to": 62.767063741949805, "s_to": 2117230.39246925, "id_reference": {"table": "line", "index": 101}, "from_node": 2, "to_node": 1}
13+
{"id": 6, "energized": 1, "loading": 0.5930290459172566, "p_from": -1763554.1135053905, "q_from": -1245081.6865976173, "i_from": 64.0471369590637, "s_from": 2158784.7316401307, "p_to": 1765096.6771171533, "q_to": 1169229.7700732222, "i_to": 62.767063741949805, "s_to": 2117230.39246925, "id_reference": {"table": "line", "index": 101}, "pgm_input": {"from_node": 2, "to_node": 1}}
1414
],
1515
"source":
1616
[
17-
{"id": 7, "energized": 1, "p": 1798666.0004384827, "q": 3476627.872944676, "i": 20.545012571488463, "s": 3914350.6163946516, "pf": 0.4595055928063901, "id_reference": {"table": "ext_grid", "index": 1}, "node": 0}
17+
{"id": 7, "energized": 1, "p": 1798666.0004384827, "q": 3476627.872944676, "i": 20.545012571488463, "s": 3914350.6163946516, "pf": 0.4595055928063901, "id_reference": {"table": "ext_grid", "index": 1}, "pgm_input": {"node": 0}}
1818
],
1919
"sym_load":
2020
[
21-
{"id": 8, "energized": 1, "p": 575000.0, "q": 55200.0, "i": 17.13761141048308, "s": 577643.5232909652, "pf": 0.9954236078405164, "id_reference": {"table": "load", "name": "const_power", "index": 101}, "node": 2},
22-
{"id": 9, "energized": 1, "p": 1207113.6835430216, "q": 115882.91362013007, "i": 35.977469977108086, "s": 1212663.3063904808, "pf": 0.9954236078405161, "id_reference": {"table": "load", "name": "const_impedance", "index": 101}, "node": 2},
23-
{"id": 10, "energized": 1, "p": 632458.9617296124, "q": 60716.06032604279, "i": 18.850149424695108, "s": 635366.6486790245, "pf": 0.9954236078405163, "id_reference": {"table": "load", "name": "const_current", "index": 101}, "node": 2},
24-
{"id": 18, "energized": 1, "p": 99999.99999999999, "q": 99999.99999999999, "i": 1.4000314325372134, "s": 141421.3562373095, "pf": 0.7071067811865475, "id_reference": {"table": "ward", "name": "ward_const_power_load", "index": 34}, "node": 4},
25-
{"id": 19, "energized": 1, "p": 94477.99488734086, "q": 94477.99488734086, "i": 1.3227216252536735, "s": 133612.0617154934, "pf": 0.7071067811865475, "id_reference": {"table": "ward", "name": "ward_const_impedance_load", "index": 34}, "node": 4},
26-
{"id": 20, "energized": 1, "p": 71111.11111111111, "q": 34440.68301069173, "i": 0.7821998773897324, "s": 79012.34567901235, "pf": 0.9, "id_reference": {"table": "motor", "name": "motor_load", "index": 12}, "node": 4}
21+
{"id": 8, "energized": 1, "p": 575000.0, "q": 55200.0, "i": 17.13761141048308, "s": 577643.5232909652, "pf": 0.9954236078405164, "id_reference": {"table": "load", "name": "const_power", "index": 101}, "pgm_input": {"node": 2}},
22+
{"id": 9, "energized": 1, "p": 1207113.6835430216, "q": 115882.91362013007, "i": 35.977469977108086, "s": 1212663.3063904808, "pf": 0.9954236078405161, "id_reference": {"table": "load", "name": "const_impedance", "index": 101}, "pgm_input": {"node": 2}},
23+
{"id": 10, "energized": 1, "p": 632458.9617296124, "q": 60716.06032604279, "i": 18.850149424695108, "s": 635366.6486790245, "pf": 0.9954236078405163, "id_reference": {"table": "load", "name": "const_current", "index": 101}, "pgm_input": {"node": 2}},
24+
{"id": 18, "energized": 1, "p": 99999.99999999999, "q": 99999.99999999999, "i": 1.4000314325372134, "s": 141421.3562373095, "pf": 0.7071067811865475, "id_reference": {"table": "ward", "name": "ward_const_power_load", "index": 34}, "pgm_input": {"node": 4}},
25+
{"id": 19, "energized": 1, "p": 94477.99488734086, "q": 94477.99488734086, "i": 1.3227216252536735, "s": 133612.0617154934, "pf": 0.7071067811865475, "id_reference": {"table": "ward", "name": "ward_const_impedance_load", "index": 34}, "pgm_input": {"node": 4}},
26+
{"id": 20, "energized": 1, "p": 71111.11111111111, "q": 34440.68301069173, "i": 0.7821998773897324, "s": 79012.34567901235, "pf": 0.9, "id_reference": {"table": "motor", "name": "motor_load", "index": 12}, "pgm_input": {"node": 4}}
2727
],
2828
"shunt":
2929
[
30-
{"id": 11, "energized": 1, "p": 282008.0001416396, "q": 1551044.0007790178, "i": 31.188122375690188, "s": 1576472.6462886913, "pf": 0.17888543819998318, "id_reference": {"table": "shunt", "index": 1201}, "node": 3}
30+
{"id": 11, "energized": 1, "p": 282008.0001416396, "q": 1551044.0007790178, "i": 31.188122375690188, "s": 1576472.6462886913, "pf": 0.17888543819998318, "id_reference": {"table": "shunt", "index": 1201}, "pgm_input": {"node": 3}}
3131
],
3232
"transformer":
3333
[
34-
{"id": 12, "energized": 1, "loading": 0.04892939318768632, "p_from": 1798665.9834270997, "q_from": 3476628.8259518775, "i_from": 20.545016973103277, "s_from": 3914351.4550149054, "p_to": -1765096.6771171836, "q_to": -1169229.7700735242, "i_to": 62.76706374195551, "s_to": 2117230.3924694424, "id_reference": {"table": "trafo", "index": 101}, "from_node": 0, "to_node": 1}
34+
{"id": 12, "energized": 1, "loading": 0.04892939318768632, "p_from": 1798665.9834270997, "q_from": 3476628.8259518775, "i_from": 20.545016973103277, "s_from": 3914351.4550149054, "p_to": -1765096.6771171836, "q_to": -1169229.7700735242, "i_to": 62.76706374195551, "s_to": 2117230.3924694424, "id_reference": {"table": "trafo", "index": 101}, "pgm_input": {"from_node": 0, "to_node": 1}, "pp_input": {"df": 1.0}}
3535
],
3636
"sym_gen":
3737
[
38-
{"id": 13, "energized": 1, "p": 1210000.0, "q": 810000.0, "i": 14.414885714493, "s": 1456090.6565183362, "pf": 0.8309922150680065, "id_reference": {"table": "sgen", "index": 31}, "node": 4}
38+
{"id": 13, "energized": 1, "p": 1210000.0, "q": 810000.0, "i": 14.414885714493, "s": 1456090.6565183362, "pf": 0.8309922150680065, "id_reference": {"table": "sgen", "index": 31}, "pgm_input": {"node": 4}}
3939
],
4040
"three_winding_transformer":
4141
[
42-
{"id": 14, "energized": 1, "loading": 0.03152945292576947, "p_1": -651018.5317680555, "q_1": 1013282.7126517809, "i_1": 35.73216058618558, "s_1": 1204394.8623538653, "p_2": 944410.894001629, "q_2": 581081.3221020879, "i_2": 10.977386752839678, "s_2": 1108858.6202058704, "p_3": -282008.00014178595, "q_3": -1551044.0007787698, "i_3": 31.18812237568588, "s_3": 1576472.6462884734, "id_reference": {"table": "trafo3w", "index": 102}, "node_1": 2, "node_2": 4, "node_3": 3}
42+
{"id": 14, "energized": 1, "loading": 0.03152945292576947, "p_1": -651018.5317680555, "q_1": 1013282.7126517809, "i_1": 35.73216058618558, "s_1": 1204394.8623538653, "p_2": 944410.894001629, "q_2": 581081.3221020879, "i_2": 10.977386752839678, "s_2": 1108858.6202058704, "p_3": -282008.00014178595, "q_3": -1551044.0007787698, "i_3": 31.18812237568588, "s_3": 1576472.6462884734, "id_reference": {"table": "trafo3w", "index": 102}, "pgm_input": {"node_1": 2, "node_2": 4, "node_3": 3}}
4343
],
4444
"link":
4545
[
46-
{"id": 15, "energized": 1, "loading": 0.0, "p_from": 0.0, "q_from": -0.0, "i_from": 0.0, "s_from": 0.0, "p_to": 0.0, "q_to": -0.0, "i_to": 0.0, "s_to": 0.0, "id_reference": {"table": "switch", "name": "b2b_switches", "index": 3021}, "from_node": 0, "to_node": 5}
46+
{"id": 15, "energized": 1, "loading": 0.0, "p_from": 0.0, "q_from": -0.0, "i_from": 0.0, "s_from": 0.0, "p_to": 0.0, "q_to": -0.0, "i_to": 0.0, "s_to": 0.0, "id_reference": {"table": "switch", "name": "b2b_switches", "index": 3021}, "pgm_input": {"from_node": 0, "to_node": 5}}
4747
],
4848
"asym_load":
4949
[
50-
{"id": 16, "energized": 1, "p": 3300000.0000000005, "q": 30000.000000000004, "i": 32.670416687651056, "s": 3300136.36081905, "pf": 0.9999586802470745, "id_reference": {"table": "asymmetric_load", "index": 33}, "node": 4}
50+
{"id": 16, "energized": 1, "p": 3300000.0000000005, "q": 30000.000000000004, "i": 32.670416687651056, "s": 3300136.36081905, "pf": 0.9999586802470745, "id_reference": {"table": "asymmetric_load", "index": 33}, "pgm_input": {"node": 4}}
5151
],
5252
"asym_gen":
5353
[
54-
{"id": 17, "energized": 1, "p": 3300000.0000000005, "q": 30000.000000000004, "i": 32.670416687651056, "s": 3300136.36081905, "pf": 0.9999586802470745, "id_reference": {"table": "asymmetric_sgen", "index": 32}, "node": 4}
54+
{"id": 17, "energized": 1, "p": 3300000.0000000005, "q": 30000.000000000004, "i": 32.670416687651056, "s": 3300136.36081905, "pf": 0.9999586802470745, "id_reference": {"table": "asymmetric_sgen", "index": 32}, "pgm_input": {"node": 4}}
5555
]
5656
}

0 commit comments

Comments
 (0)