5
5
"""
6
6
Panda Power Converter
7
7
"""
8
+
8
9
import logging
9
10
from functools import lru_cache
10
11
from typing import Dict , List , MutableMapping , Optional , Tuple , Type , Union
@@ -39,9 +40,21 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
39
40
Panda Power Converter
40
41
"""
41
42
42
- __slots__ = ("pp_input_data" , "pgm_input_data" , "idx" , "idx_lookup" , "next_idx" , "system_frequency" )
43
+ __slots__ = (
44
+ "pp_input_data" ,
45
+ "pgm_input_data" ,
46
+ "idx" ,
47
+ "idx_lookup" ,
48
+ "next_idx" ,
49
+ "system_frequency" ,
50
+ )
43
51
44
- def __init__ (self , system_frequency : float = 50.0 , trafo_loading : str = "current" , log_level : int = logging .INFO ):
52
+ def __init__ (
53
+ self ,
54
+ system_frequency : float = 50.0 ,
55
+ trafo_loading : str = "current" ,
56
+ log_level : int = logging .INFO ,
57
+ ):
45
58
"""
46
59
Prepare some member variables
47
60
@@ -60,7 +73,12 @@ def __init__(self, system_frequency: float = 50.0, trafo_loading: str = "current
60
73
self .idx_lookup : Dict [Tuple [str , Optional [str ]], pd .Series ] = {}
61
74
self .next_idx = 0
62
75
63
- def _parse_data (self , data : PandaPowerData , data_type : str , extra_info : Optional [ExtraInfo ] = None ) -> Dataset :
76
+ def _parse_data (
77
+ self ,
78
+ data : PandaPowerData ,
79
+ data_type : str ,
80
+ extra_info : Optional [ExtraInfo ] = None ,
81
+ ) -> Dataset :
64
82
"""
65
83
Set up for conversion from PandaPower to power-grid-model
66
84
@@ -172,7 +190,13 @@ def _fill_pgm_extra_info(self, extra_info: ExtraInfo):
172
190
for (pp_table , name ), indices in self .idx_lookup .items ():
173
191
for pgm_id , pp_idx in zip (indices .index , indices ):
174
192
if name :
175
- extra_info [pgm_id ] = {"id_reference" : {"table" : pp_table , "name" : name , "index" : pp_idx }}
193
+ extra_info [pgm_id ] = {
194
+ "id_reference" : {
195
+ "table" : pp_table ,
196
+ "name" : name ,
197
+ "index" : pp_idx ,
198
+ }
199
+ }
176
200
else :
177
201
extra_info [pgm_id ] = {"id_reference" : {"table" : pp_table , "index" : pp_idx }}
178
202
@@ -850,8 +874,8 @@ def _create_pgm_input_three_winding_transformers(self):
850
874
# Default vector group for odd clocks_12 = Yndx, for odd clocks_13 = Ynxd and for even clocks = YNxyn or YNynx
851
875
no_vector_groups = (
852
876
np .isnan (winding_types ["winding_1" ])
853
- | np .isnan (winding_types ["winding_2" ])
854
- | np .isnan (winding_types ["winding_3" ])
877
+ & np .isnan (winding_types ["winding_2" ])
878
+ & np .isnan (winding_types ["winding_3" ])
855
879
)
856
880
no_vector_groups_ynd2 = no_vector_groups & (clocks_12 % 2 )
857
881
no_vector_groups_ynd3 = no_vector_groups & (clocks_13 % 2 )
@@ -860,7 +884,9 @@ def _create_pgm_input_three_winding_transformers(self):
860
884
winding_types .loc [no_vector_groups_ynd3 , "winding_3" ] = WindingType .delta
861
885
862
886
pgm_3wtransformers = initialize_array (
863
- data_type = "input" , component_type = "three_winding_transformer" , shape = len (pp_trafo3w )
887
+ data_type = "input" ,
888
+ component_type = "three_winding_transformer" ,
889
+ shape = len (pp_trafo3w ),
864
890
)
865
891
pgm_3wtransformers ["id" ] = self ._generate_ids ("trafo3w" , pp_trafo3w .index )
866
892
@@ -995,7 +1021,8 @@ def _create_pgm_input_wards(self):
995
1021
if "sym_load" in self .pgm_input_data :
996
1022
symload_dtype = self .pgm_input_data ["sym_load" ].dtype
997
1023
self .pgm_input_data ["sym_load" ] = np .concatenate ( # pylint: disable=unexpected-keyword-arg
998
- [self .pgm_input_data ["sym_load" ], pgm_sym_loads_from_ward ], dtype = symload_dtype
1024
+ [self .pgm_input_data ["sym_load" ], pgm_sym_loads_from_ward ],
1025
+ dtype = symload_dtype ,
999
1026
)
1000
1027
else :
1001
1028
self .pgm_input_data ["sym_load" ] = pgm_sym_loads_from_ward
@@ -1036,7 +1063,10 @@ def _create_pgm_input_motors(self):
1036
1063
p_spec = pgm_sym_loads_from_motor ["p_specified" ]
1037
1064
cos_phi = self ._get_pp_attr ("motor" , "cos_phi" , expected_type = "f8" )
1038
1065
valid = np .logical_and (np .not_equal (cos_phi , 0.0 ), np .isfinite (cos_phi ))
1039
- q_spec = np .sqrt (np .power (np .divide (p_spec , cos_phi , where = valid ), 2 , where = valid ) - p_spec ** 2 , where = valid )
1066
+ q_spec = np .sqrt (
1067
+ np .power (np .divide (p_spec , cos_phi , where = valid ), 2 , where = valid ) - p_spec ** 2 ,
1068
+ where = valid ,
1069
+ )
1040
1070
q_spec [np .logical_not (valid )] = np .nan
1041
1071
pgm_sym_loads_from_motor ["q_specified" ] = q_spec
1042
1072
@@ -1045,7 +1075,8 @@ def _create_pgm_input_motors(self):
1045
1075
if "sym_load" in self .pgm_input_data :
1046
1076
symload_dtype = self .pgm_input_data ["sym_load" ].dtype
1047
1077
self .pgm_input_data ["sym_load" ] = np .concatenate ( # pylint: disable=unexpected-keyword-arg
1048
- [self .pgm_input_data ["sym_load" ], pgm_sym_loads_from_motor ], dtype = symload_dtype
1078
+ [self .pgm_input_data ["sym_load" ], pgm_sym_loads_from_motor ],
1079
+ dtype = symload_dtype ,
1049
1080
)
1050
1081
else :
1051
1082
self .pgm_input_data ["sym_load" ] = pgm_sym_loads_from_motor
@@ -1112,8 +1143,15 @@ def _pp_buses_output__accumulate_power(self, pp_output_buses: pd.DataFrame):
1112
1143
component_sides = {
1113
1144
"line" : [("from_node" , "p_from" , "q_from" ), ("to_node" , "p_to" , "q_to" )],
1114
1145
"link" : [("from_node" , "p_from" , "q_from" ), ("to_node" , "p_to" , "q_to" )],
1115
- "transformer" : [("from_node" , "p_from" , "q_from" ), ("to_node" , "p_to" , "q_to" )],
1116
- "three_winding_transformer" : [("node_1" , "p_1" , "q_1" ), ("node_2" , "p_2" , "q_2" ), ("node_3" , "p_3" , "q_3" )],
1146
+ "transformer" : [
1147
+ ("from_node" , "p_from" , "q_from" ),
1148
+ ("to_node" , "p_to" , "q_to" ),
1149
+ ],
1150
+ "three_winding_transformer" : [
1151
+ ("node_1" , "p_1" , "q_1" ),
1152
+ ("node_2" , "p_2" , "q_2" ),
1153
+ ("node_3" , "p_3" , "q_3" ),
1154
+ ],
1117
1155
}
1118
1156
1119
1157
# Set the initial powers to zero
@@ -1229,7 +1267,8 @@ def _pp_ext_grids_output(self):
1229
1267
pgm_output_sources = self .pgm_output_data ["source" ]
1230
1268
1231
1269
pp_output_ext_grids = pd .DataFrame (
1232
- columns = ["p_mw" , "q_mvar" ], index = self ._get_pp_ids ("ext_grid" , pgm_output_sources ["id" ])
1270
+ columns = ["p_mw" , "q_mvar" ],
1271
+ index = self ._get_pp_ids ("ext_grid" , pgm_output_sources ["id" ]),
1233
1272
)
1234
1273
pp_output_ext_grids ["p_mw" ] = pgm_output_sources ["p" ] * 1e-6
1235
1274
pp_output_ext_grids ["q_mvar" ] = pgm_output_sources ["q" ] * 1e-6
@@ -1256,7 +1295,8 @@ def _pp_shunts_output(self):
1256
1295
at_nodes = self .pgm_nodes_lookup .loc [pgm_input_shunts ["node" ]]
1257
1296
1258
1297
pp_output_shunts = pd .DataFrame (
1259
- columns = ["p_mw" , "q_mvar" , "vm_pu" ], index = self ._get_pp_ids ("shunt" , pgm_output_shunts ["id" ])
1298
+ columns = ["p_mw" , "q_mvar" , "vm_pu" ],
1299
+ index = self ._get_pp_ids ("shunt" , pgm_output_shunts ["id" ]),
1260
1300
)
1261
1301
pp_output_shunts ["p_mw" ] = pgm_output_shunts ["p" ] * 1e-6
1262
1302
pp_output_shunts ["q_mvar" ] = pgm_output_shunts ["q" ] * 1e-6
@@ -1280,7 +1320,8 @@ def _pp_sgens_output(self):
1280
1320
pgm_output_sym_gens = self .pgm_output_data ["sym_gen" ]
1281
1321
1282
1322
pp_output_sgens = pd .DataFrame (
1283
- columns = ["p_mw" , "q_mvar" ], index = self ._get_pp_ids ("sgen" , pgm_output_sym_gens ["id" ])
1323
+ columns = ["p_mw" , "q_mvar" ],
1324
+ index = self ._get_pp_ids ("sgen" , pgm_output_sym_gens ["id" ]),
1284
1325
)
1285
1326
pp_output_sgens ["p_mw" ] = pgm_output_sym_gens ["p" ] * 1e-6
1286
1327
pp_output_sgens ["q_mvar" ] = pgm_output_sym_gens ["q" ] * 1e-6
@@ -1707,12 +1748,22 @@ def _pp_buses_output_3ph__accumulate_power(self, pp_output_buses_3ph: pd.DataFra
1707
1748
Returns:
1708
1749
accumulated power for each bus
1709
1750
"""
1710
- power_columns = ["p_a_mw" , "p_b_mw" , "p_c_mw" , "q_a_mvar" , "q_b_mvar" , "q_c_mvar" ]
1751
+ power_columns = [
1752
+ "p_a_mw" ,
1753
+ "p_b_mw" ,
1754
+ "p_c_mw" ,
1755
+ "q_a_mvar" ,
1756
+ "q_b_mvar" ,
1757
+ "q_c_mvar" ,
1758
+ ]
1711
1759
# Let's define all the components and sides where nodes can be connected
1712
1760
component_sides = {
1713
1761
"line" : [("from_node" , "p_from" , "q_from" ), ("to_node" , "p_to" , "q_to" )],
1714
1762
"link" : [("from_node" , "p_from" , "q_from" ), ("to_node" , "p_to" , "q_to" )],
1715
- "transformer" : [("from_node" , "p_from" , "q_from" ), ("to_node" , "p_to" , "q_to" )],
1763
+ "transformer" : [
1764
+ ("from_node" , "p_from" , "q_from" ),
1765
+ ("to_node" , "p_to" , "q_to" ),
1766
+ ],
1716
1767
}
1717
1768
1718
1769
# Set the initial powers to zero
@@ -1902,7 +1953,8 @@ def _pp_sgens_output_3ph(self):
1902
1953
pgm_output_sym_gens = self .pgm_output_data ["sym_gen" ]
1903
1954
1904
1955
pp_output_sgens = pd .DataFrame (
1905
- columns = ["p_mw" , "q_mvar" ], index = self ._get_pp_ids ("sgen" , pgm_output_sym_gens ["id" ])
1956
+ columns = ["p_mw" , "q_mvar" ],
1957
+ index = self ._get_pp_ids ("sgen" , pgm_output_sym_gens ["id" ]),
1906
1958
)
1907
1959
pp_output_sgens ["p_mw" ] = np .sum (pgm_output_sym_gens ["p" ], axis = 1 ) * 1e-6
1908
1960
pp_output_sgens ["q_mvar" ] = np .sum (pgm_output_sym_gens ["q" ], axis = 1 ) * 1e-6
@@ -1938,15 +1990,24 @@ def _pp_trafos_output_3ph(self): # pylint: disable=too-many-statements
1938
1990
loading = np .maximum (np .sum (ui_from , axis = 1 ), np .sum (ui_to , axis = 1 )) / pgm_input_transformers ["sn" ]
1939
1991
elif self .trafo_loading == "power" :
1940
1992
loading_a_percent = (
1941
- np .maximum (pgm_output_transformers ["s_from" ][:, 0 ], pgm_output_transformers ["s_to" ][:, 0 ])
1993
+ np .maximum (
1994
+ pgm_output_transformers ["s_from" ][:, 0 ],
1995
+ pgm_output_transformers ["s_to" ][:, 0 ],
1996
+ )
1942
1997
/ pgm_output_transformers ["s_n" ]
1943
1998
)
1944
1999
loading_b_percent = (
1945
- np .maximum (pgm_output_transformers ["s_from" ][:, 1 ], pgm_output_transformers ["s_to" ][:, 1 ])
2000
+ np .maximum (
2001
+ pgm_output_transformers ["s_from" ][:, 1 ],
2002
+ pgm_output_transformers ["s_to" ][:, 1 ],
2003
+ )
1946
2004
/ pgm_output_transformers ["s_n" ]
1947
2005
)
1948
2006
loading_c_percent = (
1949
- np .maximum (pgm_output_transformers ["s_from" ][:, 2 ], pgm_output_transformers ["s_to" ][:, 2 ])
2007
+ np .maximum (
2008
+ pgm_output_transformers ["s_from" ][:, 2 ],
2009
+ pgm_output_transformers ["s_to" ][:, 2 ],
2010
+ )
1950
2011
/ pgm_output_transformers ["s_n" ]
1951
2012
)
1952
2013
loading = pgm_output_transformers ["loading" ]
@@ -2136,7 +2197,10 @@ def _generate_ids(self, pp_table: str, pp_idx: pd.Index, name: Optional[str] = N
2136
2197
return pgm_idx
2137
2198
2138
2199
def _get_pgm_ids (
2139
- self , pp_table : str , pp_idx : Optional [Union [pd .Series , np .ndarray ]] = None , name : Optional [str ] = None
2200
+ self ,
2201
+ pp_table : str ,
2202
+ pp_idx : Optional [Union [pd .Series , np .ndarray ]] = None ,
2203
+ name : Optional [str ] = None ,
2140
2204
) -> pd .Series :
2141
2205
"""
2142
2206
Get numerical power-grid-model IDs for a PandaPower component
@@ -2155,7 +2219,12 @@ def _get_pgm_ids(
2155
2219
return self .idx [key ]
2156
2220
return self .idx [key ][pp_idx ]
2157
2221
2158
- def _get_pp_ids (self , pp_table : str , pgm_idx : Optional [pd .Series ] = None , name : Optional [str ] = None ) -> pd .Series :
2222
+ def _get_pp_ids (
2223
+ self ,
2224
+ pp_table : str ,
2225
+ pgm_idx : Optional [pd .Series ] = None ,
2226
+ name : Optional [str ] = None ,
2227
+ ) -> pd .Series :
2159
2228
"""
2160
2229
Get numerical PandaPower IDs for a PandaPower component
2161
2230
@@ -2348,7 +2417,12 @@ def get_trafo3w_switch_states(self, trafo3w: pd.DataFrame) -> pd.DataFrame:
2348
2417
pp_3_switches = self .get_individual_switch_states (trafo3w [["index" , bus3 ]], pp_switches , bus3 )
2349
2418
2350
2419
return pd .DataFrame (
2351
- data = {"side_1" : pp_1_switches , "side_2" : pp_2_switches , "side_3" : pp_3_switches }, index = trafo3w .index
2420
+ data = {
2421
+ "side_1" : pp_1_switches ,
2422
+ "side_2" : pp_2_switches ,
2423
+ "side_3" : pp_3_switches ,
2424
+ },
2425
+ index = trafo3w .index ,
2352
2426
)
2353
2427
2354
2428
def get_trafo_winding_types (self ) -> pd .DataFrame :
0 commit comments