power-grid-model-io 1.3.12__py3-none-any.whl → 1.3.14__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.

@@ -99,7 +99,7 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
99
99
  self.idx_lookup = {}
100
100
  self.next_idx = 0
101
101
 
102
- # Set pandas data
102
+ # Set pandapower data
103
103
  self.pp_input_data = data
104
104
 
105
105
  # Convert
@@ -360,6 +360,9 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
360
360
  Furthermore, creates a global node lookup table, which stores nodes' voltage magnitude per unit and the voltage
361
361
  angle in degrees
362
362
  """
363
+ # TODO create output_data_3ph for remaining components
364
+ # Although Pandapower itself did not implmenet res_shunt_3ph
365
+ # Since results are avaiable in PGM output, these should be converted.
363
366
  self._pp_buses_output_3ph()
364
367
  self._pp_lines_output_3ph()
365
368
  self._pp_ext_grids_output_3ph()
@@ -376,6 +379,7 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
376
379
  Returns:
377
380
  a power-grid-model structured array for the Node component
378
381
  """
382
+ # TODO handle out-of-service buses, either here or in get_switch_states
379
383
  pp_busses = self.pp_input_data["bus"]
380
384
 
381
385
  if pp_busses.empty:
@@ -422,11 +426,12 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
422
426
  pgm_lines["x1"] = self._get_pp_attr("line", "x_ohm_per_km", expected_type="f8") * multiplier
423
427
  pgm_lines["c1"] = c_nf_per_km * length_km * parallel * 1e-9
424
428
  # The formula for tan1 = R_1 / Xc_1 = (g * 1e-6) / (2 * pi * f * c * 1e-9) = g / (2 * pi * f * c * 1e-3)
425
- pgm_lines["tan1"] = (
426
- self._get_pp_attr("line", "g_us_per_km", expected_type="f8", default=0)
427
- / c_nf_per_km
428
- / (2 * np.pi * self.system_frequency * 1e-3)
429
+ pgm_lines["tan1"] = np.divide(
430
+ self._get_pp_attr("line", "g_us_per_km", expected_type="f8", default=0),
431
+ c_nf_per_km * (2 * np.pi * self.system_frequency * 1e-3),
432
+ where=c_nf_per_km != 0.0,
429
433
  )
434
+ pgm_lines["tan1"][np.equal(c_nf_per_km, 0.0)] = 0.0
430
435
  pgm_lines["i_n"] = (
431
436
  (self._get_pp_attr("line", "max_i_ka", expected_type="f8", default=np.nan) * 1e3)
432
437
  * self._get_pp_attr("line", "df", expected_type="f8", default=1)
@@ -435,11 +440,12 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
435
440
  pgm_lines["r0"] = self._get_pp_attr("line", "r0_ohm_per_km", expected_type="f8", default=np.nan) * multiplier
436
441
  pgm_lines["x0"] = self._get_pp_attr("line", "x0_ohm_per_km", expected_type="f8", default=np.nan) * multiplier
437
442
  pgm_lines["c0"] = c0_nf_per_km * length_km * parallel * 1e-9
438
- pgm_lines["tan0"] = (
439
- self._get_pp_attr("line", "g0_us_per_km", expected_type="f8", default=0)
440
- / c0_nf_per_km
441
- / (2 * np.pi * self.system_frequency * 1e-3)
443
+ pgm_lines["tan0"] = np.divide(
444
+ self._get_pp_attr("line", "g0_us_per_km", expected_type="f8", default=0),
445
+ c0_nf_per_km * (2 * np.pi * self.system_frequency * 1e-3),
446
+ where=c0_nf_per_km != 0.0,
442
447
  )
448
+ pgm_lines["tan0"][np.equal(c0_nf_per_km, 0.0)] = 0.0
443
449
  assert ComponentType.line not in self.pgm_input_data
444
450
  self.pgm_input_data[ComponentType.line] = pgm_lines
445
451
 
@@ -755,7 +761,10 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
755
761
  valid = np.logical_and(np.not_equal(sn_mva, 0.0), np.isfinite(sn_mva))
756
762
  mag_g = np.divide(pfe, sn_mva * 1000, where=valid)
757
763
  mag_g[np.logical_not(valid)] = np.nan
758
- rx_mag = mag_g / np.sqrt(i_no_load * i_no_load * 1e-4 - mag_g * mag_g)
764
+ z_squared = i_no_load * i_no_load * 1e-4 - mag_g * mag_g
765
+ valid = np.logical_and(np.greater(z_squared, 0), np.isfinite(z_squared))
766
+ rx_mag = np.divide(mag_g, np.sqrt(z_squared, where=valid), where=valid)
767
+ rx_mag[np.logical_not(valid)] = np.inf
759
768
  # positive and zero sequence magnetising impedance must be equal.
760
769
  # mag0_percent = z0mag / z0.
761
770
  checks = {
@@ -1382,7 +1391,9 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
1382
1391
  if self.trafo_loading == "current":
1383
1392
  ui_from = pgm_output_transformers["i_from"] * pgm_input_transformers["u1"]
1384
1393
  ui_to = pgm_output_transformers["i_to"] * pgm_input_transformers["u2"]
1385
- loading = np.maximum(ui_from, ui_to) / pgm_input_transformers["sn"] * loading_multiplier * 1e2
1394
+ loading = (
1395
+ (np.sqrt(3) * np.maximum(ui_from, ui_to) / pgm_input_transformers["sn"]) * loading_multiplier * 1e2
1396
+ )
1386
1397
  elif self.trafo_loading == "power":
1387
1398
  loading = pgm_output_transformers["loading"] * loading_multiplier * 1e2
1388
1399
  else:
@@ -1704,7 +1715,6 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
1704
1715
  )
1705
1716
  pp_switches_output = pp_switches_output[["i_ka"]]
1706
1717
  pp_switches_output.set_index(pp_switches_output_index, inplace=True)
1707
- pp_switches_output["loading_percent"] = np.nan
1708
1718
 
1709
1719
  # For et=b, ie bus to bus switches, links are created. get result from them
1710
1720
  if not links_absent:
@@ -1712,6 +1722,9 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
1712
1722
  # For links, i_from = i_to = i_ka / 1e3
1713
1723
  link_ids = self._get_pp_ids("switch", links["id"], "b2b_switches")
1714
1724
  pp_switches_output.loc[link_ids, "i_ka"] = links["i_from"] * 1e-3
1725
+ in_ka = self.pp_input_data["switch"]["in_ka"].values
1726
+ pp_switches_output["loading_percent"] = np.nan
1727
+ pp_switches_output["loading_percent"] = np.divide(pp_switches_output["i_ka"], in_ka, where=in_ka != 0)
1715
1728
 
1716
1729
  assert "res_switch" not in self.pp_output_data
1717
1730
  self.pp_output_data["res_switch"] = pp_switches_output
@@ -1942,7 +1955,10 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
1942
1955
  pp_output_lines_3ph["loading_c_percent"] = (
1943
1956
  np.maximum(pp_output_lines_3ph["i_c_from_ka"], pp_output_lines_3ph["i_c_to_ka"]) / pgm_input_lines["i_n"]
1944
1957
  ) * 1e5
1945
- pp_output_lines_3ph["loading_percent"] = pgm_output_lines["loading"] * 1e2
1958
+ pp_output_lines_3ph["loading_percent"] = np.maximum(
1959
+ np.maximum(pp_output_lines_3ph["loading_a_percent"], pp_output_lines_3ph["loading_b_percent"]),
1960
+ pp_output_lines_3ph["loading_c_percent"],
1961
+ )
1946
1962
 
1947
1963
  assert "res_line_3ph" not in self.pp_output_data
1948
1964
  self.pp_output_data["res_line_3ph"] = pp_output_lines_3ph
@@ -2017,38 +2033,29 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
2017
2033
  # Only derating factor used here. Sn is already being multiplied by parallel
2018
2034
  loading_multiplier = pp_input_transformers["df"] * 1e2
2019
2035
  if self.trafo_loading == "current":
2020
- ui_from = pgm_output_transformers["i_from"] * pgm_input_transformers["u1"]
2021
- ui_to = pgm_output_transformers["i_to"] * pgm_input_transformers["u2"]
2022
- loading_a_percent = np.maximum(ui_from[:, 0], ui_to[:, 0]) / pgm_input_transformers["sn"]
2023
- loading_b_percent = np.maximum(ui_from[:, 1], ui_to[:, 1]) / pgm_input_transformers["sn"]
2024
- loading_c_percent = np.maximum(ui_from[:, 2], ui_to[:, 2]) / pgm_input_transformers["sn"]
2025
- loading = np.maximum(np.sum(ui_from, axis=1), np.sum(ui_to, axis=1)) / pgm_input_transformers["sn"]
2036
+ ui_from = pgm_output_transformers["i_from"] * pgm_input_transformers["u1"][:, None]
2037
+ ui_to = pgm_output_transformers["i_to"] * pgm_input_transformers["u2"][:, None]
2038
+ loading_a_percent = np.sqrt(3) * np.maximum(ui_from[:, 0], ui_to[:, 0]) / pgm_input_transformers["sn"]
2039
+ loading_b_percent = np.sqrt(3) * np.maximum(ui_from[:, 1], ui_to[:, 1]) / pgm_input_transformers["sn"]
2040
+ loading_c_percent = np.sqrt(3) * np.maximum(ui_from[:, 2], ui_to[:, 2]) / pgm_input_transformers["sn"]
2026
2041
  elif self.trafo_loading == "power":
2027
- loading_a_percent = (
2028
- np.maximum(
2029
- pgm_output_transformers["s_from"][:, 0],
2030
- pgm_output_transformers["s_to"][:, 0],
2031
- )
2032
- / pgm_output_transformers["s_n"]
2033
- )
2034
- loading_b_percent = (
2035
- np.maximum(
2036
- pgm_output_transformers["s_from"][:, 1],
2037
- pgm_output_transformers["s_to"][:, 1],
2038
- )
2039
- / pgm_output_transformers["s_n"]
2040
- )
2041
- loading_c_percent = (
2042
- np.maximum(
2043
- pgm_output_transformers["s_from"][:, 2],
2044
- pgm_output_transformers["s_to"][:, 2],
2045
- )
2046
- / pgm_output_transformers["s_n"]
2047
- )
2048
- loading = pgm_output_transformers["loading"]
2042
+ loading_a_percent = np.maximum(
2043
+ pgm_output_transformers["s_from"][:, 0],
2044
+ pgm_output_transformers["s_to"][:, 0],
2045
+ ) / (pgm_input_transformers["sn"] / 3)
2046
+ loading_b_percent = np.maximum(
2047
+ pgm_output_transformers["s_from"][:, 1],
2048
+ pgm_output_transformers["s_to"][:, 1],
2049
+ ) / (pgm_input_transformers["sn"] / 3)
2050
+ loading_c_percent = np.maximum(
2051
+ pgm_output_transformers["s_from"][:, 2],
2052
+ pgm_output_transformers["s_to"][:, 2],
2053
+ ) / (pgm_input_transformers["sn"] / 3)
2049
2054
  else:
2050
2055
  raise ValueError(f"Invalid transformer loading type: {str(self.trafo_loading)}")
2051
2056
 
2057
+ loading = np.maximum(np.maximum(loading_a_percent, loading_b_percent), loading_c_percent)
2058
+
2052
2059
  pp_output_trafos_3ph = pd.DataFrame(
2053
2060
  columns=[
2054
2061
  "p_a_hv_mw",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: power-grid-model-io
3
- Version: 1.3.12
3
+ Version: 1.3.14
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
@@ -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=ccD1zBpY2UiKealTF3f1nnwraNKeGdwNzk_cMN6RE2Y,117805
13
+ power_grid_model_io/converters/pandapower_converter.py,sha256=mW4k1VaJjkK2duuFI7Y4hwKVxkXDTcz-FcYSQ8-5FRM,118674
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.12.dist-info/licenses/LICENSE,sha256=7Pm2fWFFHHUG5lDHed1vl5CjzxObIXQglnYsEdtjo_k,14907
47
- power_grid_model_io-1.3.12.dist-info/METADATA,sha256=I90RaB83pxz1kQ0mIMCZJwCk6OMcjVOwZdQeBHw5iWo,8196
48
- power_grid_model_io-1.3.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
49
- power_grid_model_io-1.3.12.dist-info/top_level.txt,sha256=7sq9VveemMm2R0RgTBa4tH8y_xF4_1hxbufmX9OjCTo,20
50
- power_grid_model_io-1.3.12.dist-info/RECORD,,
46
+ power_grid_model_io-1.3.14.dist-info/licenses/LICENSE,sha256=7Pm2fWFFHHUG5lDHed1vl5CjzxObIXQglnYsEdtjo_k,14907
47
+ power_grid_model_io-1.3.14.dist-info/METADATA,sha256=ftBJigRRgbBr8zYqpock3Lxe6z29_mUCoGWjZleNmtw,8196
48
+ power_grid_model_io-1.3.14.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
49
+ power_grid_model_io-1.3.14.dist-info/top_level.txt,sha256=7sq9VveemMm2R0RgTBa4tH8y_xF4_1hxbufmX9OjCTo,20
50
+ power_grid_model_io-1.3.14.dist-info/RECORD,,