55"""
66Panda Power Converter
77"""
8+
89import logging
910from functools import lru_cache
1011from typing import Dict , List , MutableMapping , Optional , Tuple , Type , Union
@@ -39,9 +40,21 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
3940 Panda Power Converter
4041 """
4142
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+ )
4351
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+ ):
4558 """
4659 Prepare some member variables
4760
@@ -60,7 +73,12 @@ def __init__(self, system_frequency: float = 50.0, trafo_loading: str = "current
6073 self .idx_lookup : Dict [Tuple [str , Optional [str ]], pd .Series ] = {}
6174 self .next_idx = 0
6275
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 :
6482 """
6583 Set up for conversion from PandaPower to power-grid-model
6684
@@ -172,7 +190,13 @@ def _fill_pgm_extra_info(self, extra_info: ExtraInfo):
172190 for (pp_table , name ), indices in self .idx_lookup .items ():
173191 for pgm_id , pp_idx in zip (indices .index , indices ):
174192 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+ }
176200 else :
177201 extra_info [pgm_id ] = {"id_reference" : {"table" : pp_table , "index" : pp_idx }}
178202
@@ -850,8 +874,8 @@ def _create_pgm_input_three_winding_transformers(self):
850874 # Default vector group for odd clocks_12 = Yndx, for odd clocks_13 = Ynxd and for even clocks = YNxyn or YNynx
851875 no_vector_groups = (
852876 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" ])
855879 )
856880 no_vector_groups_ynd2 = no_vector_groups & (clocks_12 % 2 )
857881 no_vector_groups_ynd3 = no_vector_groups & (clocks_13 % 2 )
@@ -860,7 +884,9 @@ def _create_pgm_input_three_winding_transformers(self):
860884 winding_types .loc [no_vector_groups_ynd3 , "winding_3" ] = WindingType .delta
861885
862886 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 ),
864890 )
865891 pgm_3wtransformers ["id" ] = self ._generate_ids ("trafo3w" , pp_trafo3w .index )
866892
@@ -995,7 +1021,8 @@ def _create_pgm_input_wards(self):
9951021 if "sym_load" in self .pgm_input_data :
9961022 symload_dtype = self .pgm_input_data ["sym_load" ].dtype
9971023 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 ,
9991026 )
10001027 else :
10011028 self .pgm_input_data ["sym_load" ] = pgm_sym_loads_from_ward
@@ -1036,7 +1063,10 @@ def _create_pgm_input_motors(self):
10361063 p_spec = pgm_sym_loads_from_motor ["p_specified" ]
10371064 cos_phi = self ._get_pp_attr ("motor" , "cos_phi" , expected_type = "f8" )
10381065 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+ )
10401070 q_spec [np .logical_not (valid )] = np .nan
10411071 pgm_sym_loads_from_motor ["q_specified" ] = q_spec
10421072
@@ -1045,7 +1075,8 @@ def _create_pgm_input_motors(self):
10451075 if "sym_load" in self .pgm_input_data :
10461076 symload_dtype = self .pgm_input_data ["sym_load" ].dtype
10471077 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 ,
10491080 )
10501081 else :
10511082 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):
11121143 component_sides = {
11131144 "line" : [("from_node" , "p_from" , "q_from" ), ("to_node" , "p_to" , "q_to" )],
11141145 "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+ ],
11171155 }
11181156
11191157 # Set the initial powers to zero
@@ -1229,7 +1267,8 @@ def _pp_ext_grids_output(self):
12291267 pgm_output_sources = self .pgm_output_data ["source" ]
12301268
12311269 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" ]),
12331272 )
12341273 pp_output_ext_grids ["p_mw" ] = pgm_output_sources ["p" ] * 1e-6
12351274 pp_output_ext_grids ["q_mvar" ] = pgm_output_sources ["q" ] * 1e-6
@@ -1256,7 +1295,8 @@ def _pp_shunts_output(self):
12561295 at_nodes = self .pgm_nodes_lookup .loc [pgm_input_shunts ["node" ]]
12571296
12581297 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" ]),
12601300 )
12611301 pp_output_shunts ["p_mw" ] = pgm_output_shunts ["p" ] * 1e-6
12621302 pp_output_shunts ["q_mvar" ] = pgm_output_shunts ["q" ] * 1e-6
@@ -1280,7 +1320,8 @@ def _pp_sgens_output(self):
12801320 pgm_output_sym_gens = self .pgm_output_data ["sym_gen" ]
12811321
12821322 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" ]),
12841325 )
12851326 pp_output_sgens ["p_mw" ] = pgm_output_sym_gens ["p" ] * 1e-6
12861327 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
17071748 Returns:
17081749 accumulated power for each bus
17091750 """
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+ ]
17111759 # Let's define all the components and sides where nodes can be connected
17121760 component_sides = {
17131761 "line" : [("from_node" , "p_from" , "q_from" ), ("to_node" , "p_to" , "q_to" )],
17141762 "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+ ],
17161767 }
17171768
17181769 # Set the initial powers to zero
@@ -1902,7 +1953,8 @@ def _pp_sgens_output_3ph(self):
19021953 pgm_output_sym_gens = self .pgm_output_data ["sym_gen" ]
19031954
19041955 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" ]),
19061958 )
19071959 pp_output_sgens ["p_mw" ] = np .sum (pgm_output_sym_gens ["p" ], axis = 1 ) * 1e-6
19081960 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
19381990 loading = np .maximum (np .sum (ui_from , axis = 1 ), np .sum (ui_to , axis = 1 )) / pgm_input_transformers ["sn" ]
19391991 elif self .trafo_loading == "power" :
19401992 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+ )
19421997 / pgm_output_transformers ["s_n" ]
19431998 )
19441999 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+ )
19462004 / pgm_output_transformers ["s_n" ]
19472005 )
19482006 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+ )
19502011 / pgm_output_transformers ["s_n" ]
19512012 )
19522013 loading = pgm_output_transformers ["loading" ]
@@ -2136,7 +2197,10 @@ def _generate_ids(self, pp_table: str, pp_idx: pd.Index, name: Optional[str] = N
21362197 return pgm_idx
21372198
21382199 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 ,
21402204 ) -> pd .Series :
21412205 """
21422206 Get numerical power-grid-model IDs for a PandaPower component
@@ -2155,7 +2219,12 @@ def _get_pgm_ids(
21552219 return self .idx [key ]
21562220 return self .idx [key ][pp_idx ]
21572221
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 :
21592228 """
21602229 Get numerical PandaPower IDs for a PandaPower component
21612230
@@ -2348,7 +2417,12 @@ def get_trafo3w_switch_states(self, trafo3w: pd.DataFrame) -> pd.DataFrame:
23482417 pp_3_switches = self .get_individual_switch_states (trafo3w [["index" , bus3 ]], pp_switches , bus3 )
23492418
23502419 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 ,
23522426 )
23532427
23542428 def get_trafo_winding_types (self ) -> pd .DataFrame :
0 commit comments