power-grid-model-io 1.3.22__py3-none-any.whl → 1.3.23__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of power-grid-model-io might be problematic. Click here for more details.

@@ -8,11 +8,13 @@ Panda Power Converter
8
8
 
9
9
  import logging
10
10
  from functools import lru_cache
11
+ from importlib.metadata import PackageNotFoundError, version
11
12
  from typing import Dict, List, MutableMapping, Optional, Tuple, Type
12
13
 
13
14
  import numpy as np
14
15
  import pandas as pd
15
16
  import structlog
17
+ from packaging.version import Version
16
18
  from power_grid_model import (
17
19
  Branch3Side,
18
20
  BranchSide,
@@ -34,6 +36,20 @@ PandaPowerData = MutableMapping[str, pd.DataFrame]
34
36
 
35
37
  logger = structlog.get_logger(__file__)
36
38
 
39
+ PP_COMPATIBILITY_VERSION_3_2_0 = Version("3.2.0")
40
+ try:
41
+ PP_CONVERSION_VERSION = Version(version("pandapower"))
42
+ except PackageNotFoundError:
43
+ PP_CONVERSION_VERSION = PP_COMPATIBILITY_VERSION_3_2_0 # assume latest compatible version by default
44
+
45
+
46
+ def get_loss_params_3ph():
47
+ if PP_CONVERSION_VERSION < PP_COMPATIBILITY_VERSION_3_2_0:
48
+ loss_params = ["p_a_l_mw", "q_a_l_mvar", "p_b_l_mw", "q_b_l_mvar", "p_c_l_mw", "q_c_l_mvar"]
49
+ else:
50
+ loss_params = ["pl_a_mw", "ql_a_mvar", "pl_b_mw", "ql_b_mvar", "pl_c_mw", "ql_c_mvar"]
51
+ return loss_params
52
+
37
53
 
38
54
  # pylint: disable=too-many-instance-attributes
39
55
  class PandaPowerConverter(BaseConverter[PandaPowerData]):
@@ -631,34 +647,53 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
631
647
  data_type=DatasetType.input, component_type=ComponentType.sym_load, shape=3 * n_loads
632
648
  )
633
649
 
634
- const_i_multiplier = (
635
- self._get_pp_attr("load", "const_i_percent", expected_type="f8", default=0) * scaling * (1e-2 * 1e6)
636
- )
637
- const_z_multiplier = (
638
- self._get_pp_attr("load", "const_z_percent", expected_type="f8", default=0) * scaling * (1e-2 * 1e6)
639
- )
640
- const_p_multiplier = (1e6 - const_i_multiplier - const_z_multiplier) * scaling
650
+ if PP_CONVERSION_VERSION < PP_COMPATIBILITY_VERSION_3_2_0:
651
+ const_i_p_multiplier = (
652
+ self._get_pp_attr("load", "const_i_percent", expected_type="f8", default=0) * scaling * (1e-2 * 1e6)
653
+ )
654
+ const_z_p_multiplier = (
655
+ self._get_pp_attr("load", "const_z_percent", expected_type="f8", default=0) * scaling * (1e-2 * 1e6)
656
+ )
657
+ const_p_multiplier = (1e6 - const_i_p_multiplier - const_z_p_multiplier) * scaling
658
+ const_q_multiplier = const_p_multiplier
659
+ const_i_q_multiplier = const_i_p_multiplier
660
+ const_z_q_multiplier = const_z_p_multiplier
661
+ else:
662
+ const_i_p_multiplier = (
663
+ self._get_pp_attr("load", "const_i_p_percent", expected_type="f8", default=0) * scaling * (1e-2 * 1e6)
664
+ )
665
+ const_z_p_multiplier = (
666
+ self._get_pp_attr("load", "const_z_p_percent", expected_type="f8", default=0) * scaling * (1e-2 * 1e6)
667
+ )
668
+ const_p_multiplier = (1e6 - const_i_p_multiplier - const_z_p_multiplier) * scaling
669
+ const_i_q_multiplier = (
670
+ self._get_pp_attr("load", "const_i_q_percent", expected_type="f8", default=0) * scaling * (1e-2 * 1e6)
671
+ )
672
+ const_z_q_multiplier = (
673
+ self._get_pp_attr("load", "const_z_q_percent", expected_type="f8", default=0) * scaling * (1e-2 * 1e6)
674
+ )
675
+ const_q_multiplier = (1e6 - const_i_q_multiplier - const_z_q_multiplier) * scaling
641
676
 
642
677
  pgm_sym_loads["id"][:n_loads] = self._generate_ids("load", pp_loads.index, name="const_power")
643
678
  pgm_sym_loads["node"][:n_loads] = self._get_pgm_ids("bus", bus)
644
679
  pgm_sym_loads["status"][:n_loads] = in_service
645
680
  pgm_sym_loads["type"][:n_loads] = LoadGenType.const_power
646
681
  pgm_sym_loads["p_specified"][:n_loads] = const_p_multiplier * p_mw
647
- pgm_sym_loads["q_specified"][:n_loads] = const_p_multiplier * q_mvar
682
+ pgm_sym_loads["q_specified"][:n_loads] = const_q_multiplier * q_mvar
648
683
 
649
684
  pgm_sym_loads["id"][n_loads : 2 * n_loads] = self._generate_ids("load", pp_loads.index, name="const_impedance")
650
685
  pgm_sym_loads["node"][n_loads : 2 * n_loads] = self._get_pgm_ids("bus", bus)
651
686
  pgm_sym_loads["status"][n_loads : 2 * n_loads] = in_service
652
687
  pgm_sym_loads["type"][n_loads : 2 * n_loads] = LoadGenType.const_impedance
653
- pgm_sym_loads["p_specified"][n_loads : 2 * n_loads] = const_z_multiplier * p_mw
654
- pgm_sym_loads["q_specified"][n_loads : 2 * n_loads] = const_z_multiplier * q_mvar
688
+ pgm_sym_loads["p_specified"][n_loads : 2 * n_loads] = const_z_p_multiplier * p_mw
689
+ pgm_sym_loads["q_specified"][n_loads : 2 * n_loads] = const_z_q_multiplier * q_mvar
655
690
 
656
691
  pgm_sym_loads["id"][-n_loads:] = self._generate_ids("load", pp_loads.index, name="const_current")
657
692
  pgm_sym_loads["node"][-n_loads:] = self._get_pgm_ids("bus", bus)
658
693
  pgm_sym_loads["status"][-n_loads:] = in_service
659
694
  pgm_sym_loads["type"][-n_loads:] = LoadGenType.const_current
660
- pgm_sym_loads["p_specified"][-n_loads:] = const_i_multiplier * p_mw
661
- pgm_sym_loads["q_specified"][-n_loads:] = const_i_multiplier * q_mvar
695
+ pgm_sym_loads["p_specified"][-n_loads:] = const_i_p_multiplier * p_mw
696
+ pgm_sym_loads["q_specified"][-n_loads:] = const_i_q_multiplier * q_mvar
662
697
 
663
698
  assert ComponentType.sym_load not in self.pgm_input_data
664
699
  self.pgm_input_data[ComponentType.sym_load] = pgm_sym_loads
@@ -1846,6 +1881,7 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
1846
1881
  i_from = (pgm_output_lines["p_from"] + 1j * pgm_output_lines["q_from"]) / u_complex.iloc[from_nodes, :]
1847
1882
  i_to = (pgm_output_lines["p_to"] + 1j * pgm_output_lines["q_to"]) / u_complex.iloc[to_nodes, :]
1848
1883
 
1884
+ loss_params = get_loss_params_3ph()
1849
1885
  pp_output_lines_3ph = pd.DataFrame(
1850
1886
  columns=[
1851
1887
  "p_a_from_mw",
@@ -1860,12 +1896,12 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
1860
1896
  "q_b_to_mvar",
1861
1897
  "p_c_to_mw",
1862
1898
  "q_c_to_mvar",
1863
- "p_a_l_mw",
1864
- "q_a_l_mvar",
1865
- "p_b_l_mw",
1866
- "q_b_l_mvar",
1867
- "p_c_l_mw",
1868
- "q_c_l_mvar",
1899
+ loss_params[0],
1900
+ loss_params[1],
1901
+ loss_params[2],
1902
+ loss_params[3],
1903
+ loss_params[4],
1904
+ loss_params[5],
1869
1905
  "i_a_from_ka",
1870
1906
  "i_b_from_ka",
1871
1907
  "i_c_from_ka",
@@ -1898,12 +1934,12 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
1898
1934
  pp_output_lines_3ph["q_b_to_mvar"] = pgm_output_lines["q_to"][:, 1] * 1e-6
1899
1935
  pp_output_lines_3ph["p_c_to_mw"] = pgm_output_lines["p_to"][:, 2] * 1e-6
1900
1936
  pp_output_lines_3ph["q_c_to_mvar"] = pgm_output_lines["q_to"][:, 2] * 1e-6
1901
- pp_output_lines_3ph["p_a_l_mw"] = (pgm_output_lines["p_from"][:, 0] + pgm_output_lines["p_to"][:, 0]) * 1e-6
1902
- pp_output_lines_3ph["q_a_l_mvar"] = (pgm_output_lines["q_from"][:, 0] + pgm_output_lines["q_to"][:, 0]) * 1e-6
1903
- pp_output_lines_3ph["p_b_l_mw"] = (pgm_output_lines["p_from"][:, 1] + pgm_output_lines["p_to"][:, 1]) * 1e-6
1904
- pp_output_lines_3ph["q_b_l_mvar"] = (pgm_output_lines["q_from"][:, 1] + pgm_output_lines["q_to"][:, 1]) * 1e-6
1905
- pp_output_lines_3ph["p_c_l_mw"] = (pgm_output_lines["p_from"][:, 2] + pgm_output_lines["p_to"][:, 2]) * 1e-6
1906
- pp_output_lines_3ph["q_c_l_mvar"] = (pgm_output_lines["q_from"][:, 2] + pgm_output_lines["q_to"][:, 2]) * 1e-6
1937
+ pp_output_lines_3ph[loss_params[0]] = (pgm_output_lines["p_from"][:, 0] + pgm_output_lines["p_to"][:, 0]) * 1e-6
1938
+ pp_output_lines_3ph[loss_params[1]] = (pgm_output_lines["q_from"][:, 0] + pgm_output_lines["q_to"][:, 0]) * 1e-6
1939
+ pp_output_lines_3ph[loss_params[2]] = (pgm_output_lines["p_from"][:, 1] + pgm_output_lines["p_to"][:, 1]) * 1e-6
1940
+ pp_output_lines_3ph[loss_params[3]] = (pgm_output_lines["q_from"][:, 1] + pgm_output_lines["q_to"][:, 1]) * 1e-6
1941
+ pp_output_lines_3ph[loss_params[4]] = (pgm_output_lines["p_from"][:, 2] + pgm_output_lines["p_to"][:, 2]) * 1e-6
1942
+ pp_output_lines_3ph[loss_params[5]] = (pgm_output_lines["q_from"][:, 2] + pgm_output_lines["q_to"][:, 2]) * 1e-6
1907
1943
  pp_output_lines_3ph["i_a_from_ka"] = pgm_output_lines["i_from"][:, 0] * 1e-3
1908
1944
  pp_output_lines_3ph["i_b_from_ka"] = pgm_output_lines["i_from"][:, 1] * 1e-3
1909
1945
  pp_output_lines_3ph["i_c_from_ka"] = pgm_output_lines["i_from"][:, 2] * 1e-3
@@ -2026,6 +2062,7 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
2026
2062
 
2027
2063
  loading = np.maximum(np.maximum(loading_a_percent, loading_b_percent), loading_c_percent)
2028
2064
 
2065
+ loss_params = get_loss_params_3ph()
2029
2066
  pp_output_trafos_3ph = pd.DataFrame(
2030
2067
  columns=[
2031
2068
  "p_a_hv_mw",
@@ -2040,12 +2077,12 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
2040
2077
  "q_b_lv_mvar",
2041
2078
  "p_c_lv_mw",
2042
2079
  "q_c_lv_mvar",
2043
- "p_a_l_mw",
2044
- "q_a_l_mvar",
2045
- "p_b_l_mw",
2046
- "q_b_l_mvar",
2047
- "p_c_l_mw",
2048
- "q_c_l_mvar",
2080
+ loss_params[0],
2081
+ loss_params[1],
2082
+ loss_params[2],
2083
+ loss_params[3],
2084
+ loss_params[4],
2085
+ loss_params[5],
2049
2086
  "i_a_hv_ka",
2050
2087
  "i_a_lv_ka",
2051
2088
  "i_b_hv_ka",
@@ -2071,22 +2108,22 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
2071
2108
  pp_output_trafos_3ph["q_b_lv_mvar"] = pgm_output_transformers["q_to"][:, 1] * 1e-6
2072
2109
  pp_output_trafos_3ph["p_c_lv_mw"] = pgm_output_transformers["p_to"][:, 2] * 1e-6
2073
2110
  pp_output_trafos_3ph["q_c_lv_mvar"] = pgm_output_transformers["q_to"][:, 2] * 1e-6
2074
- pp_output_trafos_3ph["p_a_l_mw"] = (
2111
+ pp_output_trafos_3ph[loss_params[0]] = (
2075
2112
  pgm_output_transformers["p_from"][:, 0] + pgm_output_transformers["p_to"][:, 0]
2076
2113
  ) * 1e-6
2077
- pp_output_trafos_3ph["q_a_l_mvar"] = (
2114
+ pp_output_trafos_3ph[loss_params[1]] = (
2078
2115
  pgm_output_transformers["q_from"][:, 0] + pgm_output_transformers["q_to"][:, 0]
2079
2116
  ) * 1e-6
2080
- pp_output_trafos_3ph["p_b_l_mw"] = (
2117
+ pp_output_trafos_3ph[loss_params[2]] = (
2081
2118
  pgm_output_transformers["p_from"][:, 1] + pgm_output_transformers["p_to"][:, 1]
2082
2119
  ) * 1e-6
2083
- pp_output_trafos_3ph["q_b_l_mvar"] = (
2120
+ pp_output_trafos_3ph[loss_params[3]] = (
2084
2121
  pgm_output_transformers["q_from"][:, 1] + pgm_output_transformers["q_to"][:, 1]
2085
2122
  ) * 1e-6
2086
- pp_output_trafos_3ph["p_c_l_mw"] = (
2123
+ pp_output_trafos_3ph[loss_params[4]] = (
2087
2124
  pgm_output_transformers["p_from"][:, 2] + pgm_output_transformers["p_to"][:, 2]
2088
2125
  ) * 1e-6
2089
- pp_output_trafos_3ph["q_c_l_mvar"] = (
2126
+ pp_output_trafos_3ph[loss_params[5]] = (
2090
2127
  pgm_output_transformers["q_from"][:, 2] + pgm_output_transformers["q_to"][:, 2]
2091
2128
  ) * 1e-6
2092
2129
  pp_output_trafos_3ph["i_a_hv_ka"] = pgm_output_transformers["i_from"][:, 0] * 1e-3
@@ -2396,7 +2433,7 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
2396
2433
  else:
2397
2434
  raise KeyError(f"Can't get switch states for {pp_table}")
2398
2435
 
2399
- component = self.pp_input_data[pp_table]
2436
+ component = self.pp_input_data[pp_table].copy()
2400
2437
  component["index"] = component.index
2401
2438
 
2402
2439
  # Select the appropriate switches and columns
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: power-grid-model-io
3
- Version: 1.3.22
3
+ Version: 1.3.23
4
4
  Summary: Power Grid Model Input/Output
5
5
  Author-email: Contributors to the Power Grid Model project <powergridmodel@lfenergy.org>
6
6
  License: MPL-2.0
@@ -36,6 +36,7 @@ Requires-Dist: pytest-cov; extra == "dev"
36
36
  Requires-Dist: ruff; extra == "dev"
37
37
  Requires-Dist: pydantic>2; extra == "dev"
38
38
  Requires-Dist: pandapower>2.11.1; extra == "dev"
39
+ Requires-Dist: lxml; extra == "dev"
39
40
  Provides-Extra: examples
40
41
  Requires-Dist: power-grid-model>1.9.80; extra == "examples"
41
42
  Requires-Dist: pandapower>2.11.1; extra == "examples"
@@ -10,7 +10,7 @@ power_grid_model_io/config/excel/vision_en_9_8.yaml,sha256=yCa4v5VUK1xCZ0PrHG2Zf
10
10
  power_grid_model_io/config/excel/vision_nl.yaml,sha256=0IOh5Ug9QwP2dgNMsl90RARV_v-xxcA6rv8Ya0WCPuI,21426
11
11
  power_grid_model_io/converters/__init__.py,sha256=qng1-O8kfpgalPms_C_zAwBuiuKUoquf27u6JkVH-9k,487
12
12
  power_grid_model_io/converters/base_converter.py,sha256=ifF-U1kmJIW9Tj9uW7d0XJlsBrmvpUZoi3WxNPAbKO4,6170
13
- power_grid_model_io/converters/pandapower_converter.py,sha256=in2O0cP4fTodJxjpqFYvOxQ8aWEA5adP9k8yDuMHeQ4,117827
13
+ power_grid_model_io/converters/pandapower_converter.py,sha256=cueyZMYP5BteA4xpTQ9jJ1xP6jaIfGL2aSRA6fVUluc,119823
14
14
  power_grid_model_io/converters/pgm_json_converter.py,sha256=7Z1Qmoxn0qo4fkLXvmNTWNMHOJHhnyGTvxlRlcHbMLg,14210
15
15
  power_grid_model_io/converters/tabular_converter.py,sha256=XmUDVthYyJQiHXxzspVCjUo3ZGsv4XXwZ_VRQLn4bvs,35666
16
16
  power_grid_model_io/converters/vision_excel_converter.py,sha256=hiEOqXgfM3XbHDJ-ri-Os2a4Dh5lZFqF0m9_YFBaYs4,4166
@@ -43,8 +43,8 @@ power_grid_model_io/utils/modules.py,sha256=DJLmYKt9cV_GvqJI8wkXppNycqD4b8n5-o_8
43
43
  power_grid_model_io/utils/parsing.py,sha256=cw6d3S89BvB8dncN0SeFHDhFG7ZlDNx9iGYWjZk5fVU,4684
44
44
  power_grid_model_io/utils/uuid_excel_cvtr.py,sha256=FFsfnvELVTkIXE_qfEPjFlphsikAr7GyjnNwsDZ-AgY,7581
45
45
  power_grid_model_io/utils/zip.py,sha256=VXHX4xWPPZbhOlZUAbMDy3MgQFzK6_l7sRvGXihNUY4,3875
46
- power_grid_model_io-1.3.22.dist-info/licenses/LICENSE,sha256=7Pm2fWFFHHUG5lDHed1vl5CjzxObIXQglnYsEdtjo_k,14907
47
- power_grid_model_io-1.3.22.dist-info/METADATA,sha256=__m1o849emF9cCQlXLRB6ImEbyEBU-kxwSBaqCd_idk,8195
48
- power_grid_model_io-1.3.22.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
49
- power_grid_model_io-1.3.22.dist-info/top_level.txt,sha256=7sq9VveemMm2R0RgTBa4tH8y_xF4_1hxbufmX9OjCTo,20
50
- power_grid_model_io-1.3.22.dist-info/RECORD,,
46
+ power_grid_model_io-1.3.23.dist-info/licenses/LICENSE,sha256=7Pm2fWFFHHUG5lDHed1vl5CjzxObIXQglnYsEdtjo_k,14907
47
+ power_grid_model_io-1.3.23.dist-info/METADATA,sha256=N2gfmJvtgeWTOnBBt9D_P32KFPab3exW1y3beAzYUUA,8231
48
+ power_grid_model_io-1.3.23.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
49
+ power_grid_model_io-1.3.23.dist-info/top_level.txt,sha256=7sq9VveemMm2R0RgTBa4tH8y_xF4_1hxbufmX9OjCTo,20
50
+ power_grid_model_io-1.3.23.dist-info/RECORD,,