power-grid-model-io 1.2.62__tar.gz → 1.2.64__tar.gz

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.

Files changed (125) hide show
  1. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/PKG-INFO +3 -2
  2. power-grid-model-io-1.2.64/PYPI_VERSION +1 -0
  3. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/pyproject.toml +2 -1
  4. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/converters/pandapower_converter.py +19 -14
  5. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/data_stores/excel_file_store.py +1 -1
  6. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/data_types/tabular_data.py +2 -2
  7. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io.egg-info/PKG-INFO +3 -2
  8. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io.egg-info/SOURCES.txt +3 -0
  9. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io.egg-info/requires.txt +2 -1
  10. power-grid-model-io-1.2.64/tests/conftest.py +7 -0
  11. power-grid-model-io-1.2.64/tests/data/pandapower/pgm_asym_output_data.json +43 -0
  12. power-grid-model-io-1.2.64/tests/data/pandapower/pgm_output_data.json +56 -0
  13. power-grid-model-io-1.2.64/tests/unit/conftest.py +8 -0
  14. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/converters/test_pandapower_converter_input.py +12 -5
  15. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/converters/test_tabular_converter.py +3 -3
  16. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/data_types/test_data_types.py +7 -4
  17. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/data_types/test_tabular_data.py +1 -1
  18. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/utils.py +25 -8
  19. power-grid-model-io-1.2.64/tests/validation/conftest.py +10 -0
  20. power-grid-model-io-1.2.62/PYPI_VERSION +0 -1
  21. power-grid-model-io-1.2.62/tests/data/pandapower/pgm_asym_output_data.json +0 -43
  22. power-grid-model-io-1.2.62/tests/data/pandapower/pgm_output_data.json +0 -56
  23. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/LICENSE +0 -0
  24. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/MANIFEST.in +0 -0
  25. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/README.md +0 -0
  26. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/VERSION +0 -0
  27. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/setup.cfg +0 -0
  28. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/setup.py +0 -0
  29. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/__init__.py +0 -0
  30. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/config/__init__.py +0 -0
  31. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/config/examples/__init__.py +0 -0
  32. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/config/examples/multipliers.yaml +0 -0
  33. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/config/excel/__init__.py +0 -0
  34. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/config/excel/vision_en.yaml +0 -0
  35. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/config/excel/vision_nl.yaml +0 -0
  36. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/converters/__init__.py +0 -0
  37. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/converters/base_converter.py +0 -0
  38. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/converters/pgm_json_converter.py +0 -0
  39. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/converters/tabular_converter.py +0 -0
  40. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/converters/vision_excel_converter.py +0 -0
  41. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/data_stores/__init__.py +0 -0
  42. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/data_stores/base_data_store.py +0 -0
  43. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/data_stores/csv_dir_store.py +0 -0
  44. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/data_stores/json_file_store.py +0 -0
  45. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/data_stores/vision_excel_file_store.py +0 -0
  46. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/data_types/__init__.py +0 -0
  47. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/data_types/_data_types.py +0 -0
  48. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/functions/__init__.py +0 -0
  49. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/functions/_functions.py +0 -0
  50. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/functions/phase_to_phase.py +0 -0
  51. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/mappings/__init__.py +0 -0
  52. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/mappings/field_mapping.py +0 -0
  53. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/mappings/multiplier_mapping.py +0 -0
  54. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/mappings/tabular_mapping.py +0 -0
  55. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/mappings/unit_mapping.py +0 -0
  56. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/mappings/value_mapping.py +0 -0
  57. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/utils/__init__.py +0 -0
  58. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/utils/auto_id.py +0 -0
  59. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/utils/dict.py +0 -0
  60. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/utils/download.py +0 -0
  61. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/utils/json.py +0 -0
  62. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/utils/modules.py +0 -0
  63. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/utils/parsing.py +0 -0
  64. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io/utils/zip.py +0 -0
  65. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io.egg-info/dependency_links.txt +0 -0
  66. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/src/power_grid_model_io.egg-info/top_level.txt +0 -0
  67. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/__init__.py +0 -0
  68. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/config/dummy_mapping.yaml +0 -0
  69. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/config/mapping.yaml +0 -0
  70. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/pandapower/pgm_asym_output_data.json.license +0 -0
  71. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/pandapower/pgm_input_data.json +0 -0
  72. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/pandapower/pgm_input_data.json.license +0 -0
  73. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/pandapower/pgm_output_data.json.license +0 -0
  74. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/pandapower/pp_validation.py +0 -0
  75. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/vision/pgm_input_data_en.json +0 -0
  76. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/vision/pgm_input_data_en.json.license +0 -0
  77. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/vision/pgm_input_data_nl.json +0 -0
  78. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/vision/pgm_input_data_nl.json.license +0 -0
  79. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/vision/vision_en.xlsx +0 -0
  80. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/vision/vision_en.xlsx.license +0 -0
  81. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/vision/vision_nl.xlsx +0 -0
  82. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/vision/vision_nl.xlsx.license +0 -0
  83. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/vision/vision_validation.vnf +0 -0
  84. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/vision/vision_validation.vnf.license +0 -0
  85. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/zip/foo-bar.zip +0 -0
  86. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/zip/foo-bar.zip.license +0 -0
  87. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/zip/foo.zip +0 -0
  88. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/data/zip/foo.zip.license +0 -0
  89. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/test_utils.py +0 -0
  90. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/__init__.py +0 -0
  91. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/converters/__init__.py +0 -0
  92. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/converters/test_base_converter.py +0 -0
  93. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/converters/test_pandapower_converter_output.py +0 -0
  94. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/converters/test_pgm_json_converter.py +0 -0
  95. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/converters/test_vision_excel_converter.py +0 -0
  96. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/data_stores/__init__.py +0 -0
  97. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/data_stores/test_base_data_store.py +0 -0
  98. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/data_stores/test_csv_dir_store.py +0 -0
  99. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/data_stores/test_excel_file_store.py +0 -0
  100. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/data_stores/test_json_file_store.py +0 -0
  101. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/data_stores/test_vision_excel_file_store.py +0 -0
  102. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/data_types/__init__.py +0 -0
  103. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/functions/__init__.py +0 -0
  104. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/functions/test_functions.py +0 -0
  105. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/functions/test_phase_to_phase.py +0 -0
  106. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/mappings/__init__.py +0 -0
  107. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/mappings/test_multiplier_mapping.py +0 -0
  108. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/mappings/test_tabular_mapping.py +0 -0
  109. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/mappings/test_unit_mapping.py +0 -0
  110. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/mappings/test_value_mapping.py +0 -0
  111. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/utils/__init__.py +0 -0
  112. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/utils/test_auto_id.py +0 -0
  113. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/utils/test_dict.py +0 -0
  114. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/utils/test_download.py +0 -0
  115. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/utils/test_json.py +0 -0
  116. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/utils/test_modules.py +0 -0
  117. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/utils/test_parsing.py +0 -0
  118. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/unit/utils/test_zip.py +0 -0
  119. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/validation/__init__.py +0 -0
  120. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/validation/converters/__init__.py +0 -0
  121. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/validation/converters/test_pandapower_converter_input.py +0 -0
  122. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/validation/converters/test_pandapower_converter_output.py +0 -0
  123. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/validation/converters/test_vision_excel_converter.py +0 -0
  124. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/validation/test_test_utils.py +0 -0
  125. {power-grid-model-io-1.2.62 → power-grid-model-io-1.2.64}/tests/validation/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: power-grid-model-io
3
- Version: 1.2.62
3
+ Version: 1.2.64
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
@@ -34,7 +34,8 @@ Requires-Dist: pre-commit; extra == "dev"
34
34
  Requires-Dist: pylint; extra == "dev"
35
35
  Requires-Dist: pytest; extra == "dev"
36
36
  Requires-Dist: pytest-cov; extra == "dev"
37
- Requires-Dist: pydantic; extra == "dev"
37
+ Requires-Dist: pydantic>2; extra == "dev"
38
+ Requires-Dist: numba; extra == "dev"
38
39
  Provides-Extra: examples
39
40
  Requires-Dist: pandapower>2.11.1; extra == "examples"
40
41
  Requires-Dist: pyarrow; extra == "examples"
@@ -0,0 +1 @@
1
+ 1.2.64
@@ -45,7 +45,8 @@ dev = [
45
45
  "pylint",
46
46
  "pytest",
47
47
  "pytest-cov",
48
- "pydantic", # Used in unit tests
48
+ "pydantic>2", # Used in unit tests
49
+ "numba",
49
50
  ]
50
51
  examples = [
51
52
  "pandapower>2.11.1",
@@ -699,7 +699,9 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
699
699
  mag0_percent = self._get_pp_attr("trafo", "mag0_percent", expected_type="f8", default=np.nan)
700
700
  mag0_rx = self._get_pp_attr("trafo", "mag0_rx", expected_type="f8", default=np.nan)
701
701
  # Calculate rx ratio of magnetising branch
702
- mag_g = pfe / (sn_mva * 1000)
702
+ valid = np.logical_and(np.not_equal(sn_mva, 0.0), np.isfinite(sn_mva))
703
+ mag_g = np.divide(pfe, sn_mva * 1000, where=valid)
704
+ mag_g[np.logical_not(valid)] = np.nan
703
705
  rx_mag = mag_g / np.sqrt(i_no_load * i_no_load * 1e-4 - mag_g * mag_g)
704
706
  # positive and zero sequence magnetising impedance must be equal.
705
707
  # mag0_percent = z0mag / z0.
@@ -727,8 +729,8 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
727
729
  # Default vector group for odd clocks = DYn and for even clocks = YNyn
728
730
  no_vector_groups = np.isnan(winding_types["winding_from"]) | np.isnan(winding_types["winding_to"])
729
731
  no_vector_groups_dyn = no_vector_groups & (clocks % 2)
730
- winding_types[no_vector_groups] = WindingType.wye_n
731
- winding_types["winding_from"][no_vector_groups_dyn] = WindingType.delta
732
+ winding_types.loc[no_vector_groups] = WindingType.wye_n
733
+ winding_types.loc[no_vector_groups_dyn, "winding_from"] = WindingType.delta
732
734
 
733
735
  # Create PGM array
734
736
  pgm_transformers = initialize_array(data_type="input", component_type="transformer", shape=len(pp_trafo))
@@ -838,8 +840,8 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
838
840
  no_vector_groups_ynd2 = no_vector_groups & (clocks_12 % 2)
839
841
  no_vector_groups_ynd3 = no_vector_groups & (clocks_13 % 2)
840
842
  winding_types[no_vector_groups] = WindingType.wye_n
841
- winding_types["winding_2"][no_vector_groups_ynd2] = WindingType.delta
842
- winding_types["winding_3"][no_vector_groups_ynd3] = WindingType.delta
843
+ winding_types.loc[no_vector_groups_ynd2, "winding_2"] = WindingType.delta
844
+ winding_types.loc[no_vector_groups_ynd3, "winding_3"] = WindingType.delta
843
845
 
844
846
  pgm_3wtransformers = initialize_array(
845
847
  data_type="input", component_type="three_winding_transformer", shape=len(pp_trafo3w)
@@ -1012,9 +1014,11 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
1012
1014
  * 1e6
1013
1015
  )
1014
1016
  p_spec = pgm_sym_loads_from_motor["p_specified"]
1015
- pgm_sym_loads_from_motor["q_specified"] = np.sqrt(
1016
- np.power(p_spec / self._get_pp_attr("motor", "cos_phi", expected_type="f8"), 2) - p_spec**2
1017
- )
1017
+ cos_phi = self._get_pp_attr("motor", "cos_phi", expected_type="f8")
1018
+ valid = np.logical_and(np.not_equal(cos_phi, 0.0), np.isfinite(cos_phi))
1019
+ q_spec = np.sqrt(np.power(np.divide(p_spec, cos_phi, where=valid), 2, where=valid) - p_spec**2, where=valid)
1020
+ q_spec[np.logical_not(valid)] = np.nan
1021
+ pgm_sym_loads_from_motor["q_specified"] = q_spec
1018
1022
 
1019
1023
  # If input data of loads has already been filled then extend it with data of motors. If it is empty and there
1020
1024
  # is no data about loads,then assign motor data to it
@@ -1613,7 +1617,7 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
1613
1617
  links = self.pgm_output_data["link"]
1614
1618
  # For links, i_from = i_to = i_ka / 1e3
1615
1619
  link_ids = self._get_pp_ids("switch", links["id"], "b2b_switches")
1616
- pp_switches_output["i_ka"][link_ids] = links["i_from"] * 1e-3
1620
+ pp_switches_output.loc[link_ids, "i_ka"] = links["i_from"] * 1e-3
1617
1621
 
1618
1622
  assert "res_switch" not in self.pp_output_data
1619
1623
  self.pp_output_data["res_switch"] = pp_switches_output
@@ -2247,7 +2251,7 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
2247
2251
  Returns:
2248
2252
  the "closed" value of a Switch
2249
2253
  """
2250
- switch_state = (
2254
+ switch_states = (
2251
2255
  component[["index", bus]]
2252
2256
  .merge(
2253
2257
  switches,
@@ -2255,10 +2259,11 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
2255
2259
  left_on=["index", bus],
2256
2260
  right_on=["element", "bus"],
2257
2261
  )
2258
- .fillna(True)
2259
- .set_index(component.index)
2262
+ .set_index(component.index)["closed"]
2260
2263
  )
2261
- return pd.Series(switch_state["closed"])
2264
+
2265
+ # no need to fill na because bool(NaN) == True
2266
+ return pd.Series(switch_states.astype(bool, copy=False))
2262
2267
 
2263
2268
  def get_switch_states(self, pp_table: str) -> pd.DataFrame:
2264
2269
  """
@@ -2414,7 +2419,7 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
2414
2419
  if any(nan_values):
2415
2420
  attr_data = attr_data.fillna(value=default, inplace=False)
2416
2421
 
2417
- return attr_data.to_numpy(dtype=exp_dtype)
2422
+ return attr_data.to_numpy(dtype=exp_dtype, copy=True)
2418
2423
 
2419
2424
  def get_id(self, pp_table: str, pp_idx: int, name: Optional[str] = None) -> int:
2420
2425
  """
@@ -140,7 +140,7 @@ class ExcelFileStore(BaseDataStore[TabularData]):
140
140
 
141
141
  to_rename = self._check_duplicate_values(sheet_name=sheet_name, data=data)
142
142
  if to_rename:
143
- columns = data.columns.values
143
+ columns = data.columns.values.copy()
144
144
  for col_idx, new_name in to_rename.items():
145
145
  self._log.warning(
146
146
  "Column is renamed",
@@ -80,12 +80,12 @@ class TabularData:
80
80
  # If the index 'column' is requested, but no column called 'index' exist,
81
81
  # return the index of the dataframe as if it were an actual column.
82
82
  if column_name == "index" and "index" not in table_data and hasattr(table_data, "index"):
83
- return pd.Series(table_data.index, name="index")
83
+ return pd.Series(table_data.index, name="index", copy=False)
84
84
 
85
85
  column_data = table_data[column_name]
86
86
 
87
87
  if isinstance(column_data, np.ndarray):
88
- column_data = pd.Series(column_data, name=column_name)
88
+ column_data = pd.Series(column_data, name=column_name, copy=False)
89
89
 
90
90
  # If unit information is available, convert the unit
91
91
  if not isinstance(column_data, pd.Series):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: power-grid-model-io
3
- Version: 1.2.62
3
+ Version: 1.2.64
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
@@ -34,7 +34,8 @@ Requires-Dist: pre-commit; extra == "dev"
34
34
  Requires-Dist: pylint; extra == "dev"
35
35
  Requires-Dist: pytest; extra == "dev"
36
36
  Requires-Dist: pytest-cov; extra == "dev"
37
- Requires-Dist: pydantic; extra == "dev"
37
+ Requires-Dist: pydantic>2; extra == "dev"
38
+ Requires-Dist: numba; extra == "dev"
38
39
  Provides-Extra: examples
39
40
  Requires-Dist: pandapower>2.11.1; extra == "examples"
40
41
  Requires-Dist: pyarrow; extra == "examples"
@@ -50,6 +50,7 @@ src/power_grid_model_io/utils/modules.py
50
50
  src/power_grid_model_io/utils/parsing.py
51
51
  src/power_grid_model_io/utils/zip.py
52
52
  tests/__init__.py
53
+ tests/conftest.py
53
54
  tests/test_utils.py
54
55
  tests/utils.py
55
56
  tests/data/config/dummy_mapping.yaml
@@ -76,6 +77,7 @@ tests/data/zip/foo-bar.zip.license
76
77
  tests/data/zip/foo.zip
77
78
  tests/data/zip/foo.zip.license
78
79
  tests/unit/__init__.py
80
+ tests/unit/conftest.py
79
81
  tests/unit/converters/__init__.py
80
82
  tests/unit/converters/test_base_converter.py
81
83
  tests/unit/converters/test_pandapower_converter_input.py
@@ -109,6 +111,7 @@ tests/unit/utils/test_modules.py
109
111
  tests/unit/utils/test_parsing.py
110
112
  tests/unit/utils/test_zip.py
111
113
  tests/validation/__init__.py
114
+ tests/validation/conftest.py
112
115
  tests/validation/test_test_utils.py
113
116
  tests/validation/utils.py
114
117
  tests/validation/converters/__init__.py
@@ -12,7 +12,8 @@ pre-commit
12
12
  pylint
13
13
  pytest
14
14
  pytest-cov
15
- pydantic
15
+ pydantic>2
16
+ numba
16
17
 
17
18
  [doc]
18
19
  sphinx
@@ -0,0 +1,7 @@
1
+ # SPDX-FileCopyrightText: Contributors to the Power Grid Model project <powergridmodel@lfenergy.org>
2
+ #
3
+ # SPDX-License-Identifier: MPL-2.0
4
+
5
+ import pandas as pd
6
+
7
+ pd.set_option("future.no_silent_downcasting", True)
@@ -0,0 +1,43 @@
1
+ {
2
+ "node":
3
+ [
4
+ {"id": 0, "energized": 1, "u_pu": [1.000000000042805, 1.000000000042805, 1.000000000040956], "u": [63508.52961357732, 63508.52961357732, 63508.52961345989], "u_angle": [-2.297462191765614e-10, -2.094395102622942, 2.094395102852041], "p": [765820.7217852274, 765820.7235734381, -1529485.490304183], "q": [-142683.6055350895, -142683.5967414472, -136520.3696246375], "id_reference": {"table": "bus", "index": 101}},
5
+ {"id": 1, "energized": 1, "u_pu": [0.9994132656313264, 0.9994132656313274, 1.002844167287654], "u": [11540.23035887859, 11540.2303588786, 11579.84699877547], "u_angle": [-0.002501623712801432, -2.096896726105997, 2.098735152107258], "p": [5.662039942836705e-08, 4.158749852077411e-07, 5.339208304447429e-08], "q": [-7.588863607722517e-08, -6.631148746093378e-08, 3.610845913546241e-07], "id_reference": {"table": "bus", "index": 102}},
6
+ {"id": 2, "energized": 1, "u_pu": [0.9987870960752929, 0.9987870960752938, 1.004418511811836], "u": [11532.9999756439, 11532.99997564391, 11598.02596347214], "u_angle": [-0.002966986920613948, -2.09736208931381, 2.099116406819713], "p": [-729999.9999998733, -730000.000000165, 1570000.000000135], "q": [189999.9999999996, 190000.0000003468, 189999.9999996292], "id_reference": {"table": "bus", "index": 103}},
7
+ {"id": 3, "energized": 1, "u_pu": [1.000000000042805, 1.000000000042805, 1.000000000040956], "u": [63508.52961357732, 63508.52961357732, 63508.52961345989], "u_angle": [-2.297462191765614e-10, -2.094395102622942, 2.094395102852041], "p": [0, 0, 0], "q": [0, 0, 0], "id_reference": {"table": "bus", "index": 106}}
8
+ ],
9
+ "line":
10
+ [
11
+ {"id": 4, "energized": 1, "loading": 1.265330032238072, "p_from": [-729999.9999998733, -730000.000000165, 1570000.000000135], "q_from": [189999.9999999996, 190000.0000003468, 189999.9999996292], "i_from": [65.40543555178559, 65.40543555181758, 136.3555342275158], "s_from": [754320.8866257217, 754320.8866260914, 1581455.026233842], "p_to": [730552.3008243673, 730552.3008246894, -1567616.527443881], "q_to": [-216633.7469513389, -216633.7469515898, -216173.5239478488], "i_to": [66.02947091323357, 66.02947091326645, 136.6556434817117], "s_to": [761995.3048135885, 761995.3048139686, 1582451.44303743], "id_reference": {"table": "line", "index": 101}, "pgm_input": {"from_node": 2, "to_node": 1, "i_n": 108.0}}
12
+ ],
13
+ "source":
14
+ [
15
+ {"id": 5, "energized": 1, "p": [765820.730621319, 765820.4766903995, -1529485.219644774], "q": [-142683.6428608279, -142684.1067247107, -136520.4031334404], "i": [12.26605892917178, 12.26605633625489, 24.17889348713215], "s": [778999.36674519, 778999.2020728515, 1535565.973048225], "pf": [0.9830826099654819, 0.9830824918082272, -0.9960400572100595], "id_reference": {"table": "ext_grid", "index": 0}, "pgm_input": {"node": 0}}
16
+ ],
17
+ "sym_load":
18
+ [
19
+ {"id": 6, "energized": 1, "p": [833333.3333333333, 833333.3333333333, 833333.3333333333], "q": [79999.99999999999, 79999.99999999999, 79999.99999999999], "i": [72.58861772969922, 72.58861772969915, 72.18163928458914], "s": [837164.5265086454, 837164.5265086454, 837164.5265086454], "pf": [0.9954236078405162, 0.9954236078405162, 0.9954236078405162], "id_reference": {"table": "load", "name": "const_power", "index": 101}, "pgm_input": {"node": 2}},
20
+ {"id": 7, "energized": 1, "p": [0, 0, 0], "q": [0, 0, 0], "i": [0, 0, 0], "s": [0, 0, 0], "pf": [0, 0, 0], "id_reference": {"table": "load", "name": "const_impedance", "index": 101}, "pgm_input": {"node": 2}},
21
+ {"id": 8, "energized": 1, "p": [0, 0, 0], "q": [0, 0, 0], "i": [0, 0, 0], "s": [0, 0, 0], "pf": [0, 0, 0], "id_reference": {"table": "load", "name": "const_current", "index": 101}, "pgm_input": {"node": 2}}
22
+ ],
23
+ "transformer":
24
+ [
25
+ {"id": 9, "energized": 1, "loading": 0.03883052565830863, "p_from": [765820.724989093, 765820.7249890427, -1529485.491438911], "q_from": [-142683.6001096883, -142683.6001099306, -136520.3668874493], "i_from": [12.26605871869048, 12.2660587186904, 24.17889769909201], "s_from": [778999.3533778327, 778999.3533778277, 1535566.240543602], "p_to": [-730552.3008242727, -730552.300824217, 1567616.527444104], "q_to": [216633.7469512629, 216633.7469515783, 216173.5239482207], "i_to": [66.02947091322386, 66.02947091322693, 136.6556434817352], "s_to": [761995.3048134763, 761995.3048135125, 1582451.443037701], "id_reference": {"table": "trafo", "index": 0}, "pgm_input": {"from_node": 0, "to_node": 1}, "pp_input": {"df": 1.0}}
26
+ ],
27
+ "sym_gen":
28
+ [
29
+ {"id": 10, "energized": 1, "p": [403333.3333333333, 403333.3333333333, 403333.3333333333], "q": [269999.9999999999, 269999.9999999999, 269999.9999999999], "i": [42.08476139753746, 42.08476139753742, 41.84880717644763], "s": [485363.5521727787, 485363.5521727787, 485363.5521727787], "pf": [0.8309922150680065, 0.8309922150680065, 0.8309922150680065], "id_reference": {"table": "sgen", "index": 31}, "pgm_input": {"node": 2}}
30
+ ],
31
+ "link":
32
+ [
33
+ {"id": 11, "energized": 1, "loading": 0, "p_from": [0, 0, 0], "q_from": [0, 0, 0], "i_from": [0, 0, 0], "s_from": [0, 0, 0], "p_to": [0, 0, 0], "q_to": [0, 0, 0], "i_to": [0, 0, 0], "s_to": [0, 0, 0], "id_reference": {"table": "switch", "name": "b2b_switches", "index": 3021}, "pgm_input": {"from_node": 0, "to_node": 3}}
34
+ ],
35
+ "asym_load":
36
+ [
37
+ {"id": 12, "energized": 1, "p": [399999.9999999999, 500000, 1000000], "q": [10000, 10000, 10000], "i": [34.69392016993495, 43.36252415313805, 86.22588032650638], "s": [400124.980474851, 500099.9900019995, 1000049.998750063], "pf": [0.9996876464081228, 0.999800059980007, 0.9999500037496875], "id_reference": {"table": "asymmetric_load", "index": 33}, "pgm_input": {"node": 2}}
38
+ ],
39
+ "asym_gen":
40
+ [
41
+ {"id": 13, "energized": 1, "p": [99999.99999999999, 200000, 3000000], "q": [10000, 10000, 10000], "i": [8.71401685801165, 17.3632050956306, 258.6661450895947], "s": [100498.7562112089, 200249.8439450078, 3000016.66662037], "pf": [0.9950371902099889, 0.9987523388778446, 0.9999944444907404], "id_reference": {"table": "asymmetric_sgen", "index": 32}, "pgm_input": {"node": 2}}
42
+ ]
43
+ }
@@ -0,0 +1,56 @@
1
+ {
2
+ "node":
3
+ [
4
+ {"id": 0, "energized": 1, "u_pu": 0.9999999996523372, "u": 109999.9999617571, "u_angle": -1.798666001063812e-10, "p": 1798665.98546505, "q": 3476628.82353626, "id_reference": {"table": "bus", "index": 101}},
5
+ {"id": 1, "energized": 1, "u_pu": 0.97374599364253, "u": 19474.9198728506, "u_angle": -0.5239008142519944, "p": 1.408570295181389e-07, "q": -3.370807360039286e-07, "id_reference": {"table": "bus", "index": 102}},
6
+ {"id": 2, "energized": 1, "u_pu": 0.9730137872763268, "u": 19460.27574552653, "u_angle": -0.5237223960629773, "p": -2414572.645273485, "q": -231798.9739460695, "id_reference": {"table": "bus", "index": 103}},
7
+ {"id": 3, "energized": 1, "u_pu": 0.9695497239124967, "u": 29183.44668976615, "u_angle": -1.04518706304991, "p": -8.295648914520637e-08, "q": 1.430200360429221e-07, "id_reference": {"table": "bus", "index": 104}},
8
+ {"id": 4, "energized": 1, "u_pu": 0.9719979160849105, "u": 58319.87496509463, "u_angle": -1.044828700708015, "p": 944410.894001629, "q": 581081.3221020879, "id_reference": {"table": "bus", "index": 105}},
9
+ {"id": 5, "energized": 1, "u_pu": 0.9999999996523372, "u": 109999.9999617571, "u_angle": -1.798666001063812e-10, "p": 0, "q": 0, "id_reference": {"table": "bus", "index": 106}}
10
+ ],
11
+ "line":
12
+ [
13
+ {"id": 6, "energized": 1, "loading": 0.5930290459172566, "p_from": -1763554.11350539, "q_from": -1245081.686597617, "i_from": 64.0471369590637, "s_from": 2158784.731640131, "p_to": 1765096.677117153, "q_to": 1169229.770073222, "i_to": 62.7670637419498, "s_to": 2117230.39246925, "id_reference": {"table": "line", "index": 101}, "pgm_input": {"from_node": 2, "to_node": 1, "i_n": 108.0}}
14
+ ],
15
+ "source":
16
+ [
17
+ {"id": 7, "energized": 1, "p": 1798666.000438483, "q": 3476627.872944676, "i": 20.54501257148846, "s": 3914350.616394652, "pf": 0.4595055928063901, "id_reference": {"table": "ext_grid", "index": 1}, "pgm_input": {"node": 0}}
18
+ ],
19
+ "sym_load":
20
+ [
21
+ {"id": 8, "energized": 1, "p": 575000, "q": 55200, "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.683543022, "q": 115882.9136201301, "i": 35.97746997710809, "s": 1212663.306390481, "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.85014942469511, "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.400031432537213, "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.322721625253674, "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}}
27
+ ],
28
+ "shunt":
29
+ [
30
+ {"id": 11, "energized": 1, "p": 282008.0001416396, "q": 1551044.000779018, "i": 31.18812237569019, "s": 1576472.646288691, "pf": 0.1788854381999832, "id_reference": {"table": "shunt", "index": 1201}, "pgm_input": {"node": 3}}
31
+ ],
32
+ "transformer":
33
+ [
34
+ {"id": 12, "energized": 1, "loading": 0.04892939318768632, "p_from": 1798665.9834271, "q_from": 3476628.825951878, "i_from": 20.54501697310328, "s_from": 3914351.455014905, "p_to": -1765096.677117184, "q_to": -1169229.770073524, "i_to": 62.76706374195551, "s_to": 2117230.392469442, "id_reference": {"table": "trafo", "index": 101}, "pgm_input": {"from_node": 0, "to_node": 1}, "pp_input": {"df": 1.0}}
35
+ ],
36
+ "sym_gen":
37
+ [
38
+ {"id": 13, "energized": 1, "p": 1210000, "q": 810000, "i": 14.414885714493, "s": 1456090.656518336, "pf": 0.8309922150680065, "id_reference": {"table": "sgen", "index": 31}, "pgm_input": {"node": 4}}
39
+ ],
40
+ "three_winding_transformer":
41
+ [
42
+ {"id": 14, "energized": 1, "loading": 0.03152945292576947, "p_1": -651018.5317680555, "q_1": 1013282.712651781, "i_1": 35.73216058618558, "s_1": 1204394.862353865, "p_2": 944410.894001629, "q_2": 581081.3221020879, "i_2": 10.97738675283968, "s_2": 1108858.62020587, "p_3": -282008.0001417859, "q_3": -1551044.00077877, "i_3": 31.18812237568588, "s_3": 1576472.646288473, "id_reference": {"table": "trafo3w", "index": 102}, "pgm_input": {"node_1": 2, "node_2": 4, "node_3": 3}}
43
+ ],
44
+ "link":
45
+ [
46
+ {"id": 15, "energized": 1, "loading": 0, "p_from": 0, "q_from": 0, "i_from": 0, "s_from": 0, "p_to": 0, "q_to": 0, "i_to": 0, "s_to": 0, "id_reference": {"table": "switch", "name": "b2b_switches", "index": 3021}, "pgm_input": {"from_node": 0, "to_node": 5}}
47
+ ],
48
+ "asym_load":
49
+ [
50
+ {"id": 16, "energized": 1, "p": 3300000, "q": 30000, "i": 32.67041668765106, "s": 3300136.36081905, "pf": 0.9999586802470745, "id_reference": {"table": "asymmetric_load", "index": 33}, "pgm_input": {"node": 4}}
51
+ ],
52
+ "asym_gen":
53
+ [
54
+ {"id": 17, "energized": 1, "p": 3300000, "q": 30000, "i": 32.67041668765106, "s": 3300136.36081905, "pf": 0.9999586802470745, "id_reference": {"table": "asymmetric_sgen", "index": 32}, "pgm_input": {"node": 4}}
55
+ ]
56
+ }
@@ -0,0 +1,8 @@
1
+ # SPDX-FileCopyrightText: Contributors to the Power Grid Model project <powergridmodel@lfenergy.org>
2
+ #
3
+ # SPDX-License-Identifier: MPL-2.0
4
+
5
+ import pandas as pd
6
+
7
+ # TODO(mgovers) We're ready for Pandas 3.x, but pandapower is not. Move to parent conftest when it is.
8
+ pd.set_option("mode.copy_on_write", True)
@@ -1,7 +1,7 @@
1
1
  # SPDX-FileCopyrightText: Contributors to the Power Grid Model project <powergridmodel@lfenergy.org>
2
2
  #
3
3
  # SPDX-License-Identifier: MPL-2.0
4
- import re
4
+
5
5
  from typing import Callable
6
6
  from unittest.mock import ANY, MagicMock, call, patch
7
7
 
@@ -562,8 +562,7 @@ def test_create_pgm_input_lines(mock_init_array: MagicMock, two_pp_objs, convert
562
562
  )
563
563
  pgm.assert_any_call(
564
564
  "i_n",
565
- _get_pp_attr("line", "max_i_ka", expected_type="f8", default=np.nan)
566
- * 1e3
565
+ (_get_pp_attr("line", "max_i_ka", expected_type="f8", default=np.nan) * 1e3)
567
566
  * _get_pp_attr("line", "df", expected_type="f8", default=1)
568
567
  * _get_pp_attr("line", "parallel", expected_type="u4", default=1),
569
568
  )
@@ -823,6 +822,11 @@ def test_create_pgm_input_shunts(mock_init_array: MagicMock, two_pp_objs, conver
823
822
 
824
823
  @patch("power_grid_model_io.converters.pandapower_converter.initialize_array")
825
824
  @patch("power_grid_model_io.converters.pandapower_converter.np.round", new=lambda x: x)
825
+ @patch("power_grid_model_io.converters.pandapower_converter.np.divide", new=lambda x, _, **kwargs: x)
826
+ @patch("power_grid_model_io.converters.pandapower_converter.np.bitwise_and", new=lambda x, _: x)
827
+ @patch("power_grid_model_io.converters.pandapower_converter.np.logical_and", new=lambda x, _: x)
828
+ @patch("power_grid_model_io.converters.pandapower_converter.np.allclose", new=lambda x, _: x)
829
+ @patch("power_grid_model_io.converters.pandapower_converter.np.isnan", new=lambda x: x)
826
830
  def test_create_pgm_input_transformers(mock_init_array: MagicMock, two_pp_objs, converter):
827
831
  # Arrange
828
832
  converter.pp_input_data["trafo"] = two_pp_objs
@@ -938,7 +942,7 @@ def test_create_pgm_input_transformers__default() -> None:
938
942
  pp_net, *args, tap_neutral=12.0, tap_pos=34.0, tap_step_percent=1, tap_side=None
939
943
  )
940
944
  tap_pos_trafo = pp.create_transformer_from_parameters(pp_net, *args, tap_neutral=12.0, tap_size=1, tap_side="hv")
941
- pp_net["trafo"]["tap_pos"][tap_pos_trafo] = np.nan
945
+ pp_net["trafo"].loc[tap_pos_trafo, "tap_pos"] = np.nan
942
946
  pp.create_transformer_from_parameters(pp_net, *args, tap_neutral=np.nan, tap_pos=34.0, tap_side="hv")
943
947
  pp.create_transformer_from_parameters(
944
948
  pp_net, *args, tap_neutral=12, tap_step_percent=np.nan, tap_pos=34.0, tap_side="hv"
@@ -1290,7 +1294,7 @@ def test_create_pgm_input_transformers3w__default() -> None:
1290
1294
  nan_trafo = pp.create_transformer3w_from_parameters(
1291
1295
  pp_net, *args, tap_neutral=12.0, tap_step_percent=1, tap_pos=np.nan, tap_side="hv"
1292
1296
  )
1293
- pp_net["trafo3w"]["tap_pos"][nan_trafo] = np.nan
1297
+ pp_net["trafo3w"].loc[nan_trafo, "tap_pos"] = np.nan
1294
1298
  pp.create_transformer3w_from_parameters(
1295
1299
  pp_net, *args, tap_neutral=12.0, tap_pos=34.0, tap_step_percent=np.nan, tap_side="hv"
1296
1300
  )
@@ -1615,6 +1619,9 @@ def test_create_pgm_input_dclines(mock_init_array: MagicMock, two_pp_objs, conve
1615
1619
 
1616
1620
 
1617
1621
  @patch("power_grid_model_io.converters.pandapower_converter.initialize_array")
1622
+ @patch("power_grid_model_io.converters.pandapower_converter.np.divide", new=lambda x, _, **kwargs: x)
1623
+ @patch("power_grid_model_io.converters.pandapower_converter.np.power", new=lambda x, _, **kwargs: x)
1624
+ @patch("power_grid_model_io.converters.pandapower_converter.np.sqrt", new=lambda x, **kwargs: x)
1618
1625
  def test_create_pgm_input_motors(mock_init_array: MagicMock, two_pp_objs, converter):
1619
1626
  # Arrange
1620
1627
  converter.pp_input_data["motor"] = two_pp_objs
@@ -980,9 +980,9 @@ def test_lookup_ids(converter: TabularConverter):
980
980
  reference,
981
981
  pd.DataFrame(
982
982
  [
983
- ["foo", None, 1, 2, None],
984
- ["node", None, 1, None, 2],
985
- ["node", "bar", 1, 2, None],
983
+ ["foo", np.nan, 1, 2, np.nan],
984
+ ["node", np.nan, 1, np.nan, 2],
985
+ ["node", "bar", 1, 2, np.nan],
986
986
  ],
987
987
  columns=["table", "name", "a", "b", "c"],
988
988
  index=[3, 2, 4],
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
 
5
- from pydantic import parse_obj_as
5
+ from pydantic import TypeAdapter
6
6
 
7
7
  from power_grid_model_io.data_types import ExtraInfo, StructuredData
8
8
 
@@ -11,14 +11,16 @@ def test_extra_info():
11
11
  extra_info = {1: {"a": 123, "b": 1.23}, 2: {"c": (1.2, 3.4, 5.6), "d": "foo"}}
12
12
 
13
13
  # Expect no exception
14
- parse_obj_as(ExtraInfo, extra_info)
14
+ adapter = TypeAdapter(ExtraInfo)
15
+ adapter.validate_python(extra_info)
15
16
 
16
17
 
17
18
  def test_structured_data__single():
18
19
  data = {"node": [{"id": 1}, {"id": 2}], "line": [{"id": 3, "node_from": 1, "node_to": 2}]}
19
20
 
20
21
  # Expect no exception
21
- assert isinstance(parse_obj_as(StructuredData, data), dict)
22
+ adapter = TypeAdapter(StructuredData)
23
+ assert isinstance(adapter.validate_python(data), dict)
22
24
 
23
25
 
24
26
  def test_structured_data__batch():
@@ -38,4 +40,5 @@ def test_structured_data__batch():
38
40
  ]
39
41
 
40
42
  # Expect no exception
41
- assert isinstance(parse_obj_as(StructuredData, data), list)
43
+ adapter = TypeAdapter(StructuredData)
44
+ assert isinstance(adapter.validate_python(data), list)
@@ -85,7 +85,7 @@ def test_get_column__numpy_is_a_reference(nodes_np: np.ndarray):
85
85
 
86
86
  # Act
87
87
  col_data = data.get_column(table_name="nodes", column_name="u_rated")
88
- col_data[0] = 123.0 # << should update the source data
88
+ col_data.loc[0] = 123.0 # << should update the source data
89
89
 
90
90
  # Assert
91
91
  np.testing.assert_array_equal(nodes_np["u_rated"], np.array([123.0, 10.5e3, 400.0]))
@@ -172,21 +172,38 @@ class MockFn:
172
172
  return False
173
173
 
174
174
  def eq(left, right) -> bool:
175
- if isinstance(left, pd.DataFrame):
176
- if left.columns != right.columns:
177
- return False
178
- if isinstance(left, pd.Series):
179
- if left.name != right.name:
180
- return False
175
+ if type(left) != type(right):
176
+ return False
177
+ if isinstance(left, pd.DataFrame) and left.columns != right.columns:
178
+ return False
179
+ if isinstance(left, pd.Series) and left.name != right.name:
180
+ return False
181
181
  if isinstance(left, NDFrame):
182
182
  return (left == right).all()
183
183
  if isinstance(right, NDFrame):
184
184
  return False
185
+
185
186
  if isinstance(left, np.ndarray) and left.size == 0:
186
187
  return isinstance(right, np.ndarray) and right.size == 0
187
- if isnan(left) and isnan(right):
188
+
189
+ if left == right:
190
+ return True
191
+
192
+ left_nans = isnan(left)
193
+ right_nans = isnan(right)
194
+
195
+ if np.any(left_nans != right_nans):
196
+ return False
197
+
198
+ infinite = np.logical_and(left_nans, right_nans)
199
+ if isinstance(left, np.ndarray):
200
+ finite = np.logical_not(infinite)
201
+ return bool(np.all(np.equal(left[finite], right[finite])))
202
+
203
+ if isinstance(infinite, np.ndarray) and np.any(infinite):
188
204
  return True
189
- return left == right
205
+
206
+ return infinite
190
207
 
191
208
  if not eq(self.fn, other.fn):
192
209
  return False
@@ -0,0 +1,10 @@
1
+ # SPDX-FileCopyrightText: Contributors to the Power Grid Model project <powergridmodel@lfenergy.org>
2
+ #
3
+ # SPDX-License-Identifier: MPL-2.0
4
+
5
+ import pandas as pd
6
+
7
+ pd.set_option("future.no_silent_downcasting", True)
8
+
9
+ # TODO(mgovers) We're ready for Pandas 3.x, but pandapower is not. Move to parent conftest when it is.
10
+ pd.set_option("mode.copy_on_write", False)
@@ -1 +0,0 @@
1
- 1.2.62
@@ -1,43 +0,0 @@
1
- {
2
- "asym_gen":
3
- [
4
- {"energized": 1, "i": [8.71401685801165, 17.363205095630597, 258.6661450895947], "id": 13, "p": [99999.99999999999, 199999.99999999997, 3000000], "pf": [0.9950371902099889, 0.9987523388778446, 0.9999944444907404], "q": [10000, 10000, 10000], "s": [100498.7562112089, 200249.84394500783, 3000016.6666203705], "id_reference": {"table": "asymmetric_sgen", "index": 32}, "pgm_input": {"node": 2}}
5
- ],
6
- "asym_load":
7
- [
8
- {"energized": 1, "i": [34.69392016993495, 43.36252415313805, 86.22588032650638], "id": 12, "p": [399999.99999999994, 500000, 1000000], "pf": [0.9996876464081228, 0.999800059980007, 0.9999500037496875], "q": [10000, 10000, 10000], "s": [400124.98047485104, 500099.9900019995, 1000049.9987500625], "id_reference": {"table": "asymmetric_load", "index": 33}, "pgm_input": {"node": 2}}
9
- ],
10
- "line":
11
- [
12
- {"energized": 1, "i_from": [65.40543555178559, 65.40543555181758, 136.35553422751582], "i_to": [66.02947091323357, 66.02947091326645, 136.65564348171173], "id": 4, "loading": 1.2653300322380716, "p_from": [-729999.9999998733, -730000.000000165, 1570000.0000001346], "p_to": [730552.3008243673, 730552.3008246894, -1567616.527443881], "q_from": [189999.99999999956, 190000.00000034677, 189999.9999996292], "q_to": [-216633.74695133892, -216633.74695158977, -216173.52394784882], "s_from": [754320.8866257217, 754320.8866260914, 1581455.0262338421], "s_to": [761995.3048135885, 761995.3048139686, 1582451.4430374296], "id_reference": {"table": "line", "index": 101}, "pgm_input": {"from_node": 2, "to_node": 1, "i_n": 108.0}}
13
- ],
14
- "link":
15
- [
16
- {"energized": 1, "i_from": [0, 0, 0], "i_to": [0, 0, 0], "id": 11, "loading": 0, "p_from": [0, 0, 0], "p_to": [0, 0, 0], "q_from": [0, 0, 0], "q_to": [0, 0, 0], "s_from": [0, 0, 0], "s_to": [0, 0, 0], "id_reference": {"table": "switch", "name": "b2b_switches", "index": 3021}, "pgm_input": {"from_node": 0, "to_node": 3}}
17
- ],
18
- "node":
19
- [
20
- {"energized": 1, "id": 0, "p": [765820.7217852274, 765820.7235734381, -1529485.4903041832], "q": [-142683.6055350895, -142683.59674144717, -136520.36962463753], "u": [63508.52961357732, 63508.52961357732, 63508.52961345989], "u_angle": [-2.297462191765614e-10, -2.0943951026229417, 2.094395102852041], "u_pu": [1.000000000042805, 1.000000000042805, 1.0000000000409561], "id_reference": {"table": "bus", "index": 101}},
21
- {"energized": 1, "id": 1, "p": [5.662039942836705e-08, 4.158749852077411e-07, 5.339208304447429e-08], "q": [-7.588863607722517e-08, -6.631148746093378e-08, 3.610845913546241e-07], "u": [11540.230358878585, 11540.230358878596, 11579.846998775465], "u_angle": [-0.002501623712801432, -2.096896726105997, 2.098735152107258], "u_pu": [0.9994132656313264, 0.9994132656313274, 1.0028441672876542], "id_reference": {"table": "bus", "index": 102}},
22
- {"energized": 1, "id": 2, "p": [-729999.9999998733, -730000.000000165, 1570000.0000001346], "q": [189999.99999999956, 190000.00000034677, 189999.9999996292], "u": [11532.9999756439, 11532.99997564391, 11598.025963472139], "u_angle": [-0.0029669869206139484, -2.09736208931381, 2.099116406819713], "u_pu": [0.9987870960752929, 0.9987870960752938, 1.0044185118118363], "id_reference": {"table": "bus", "index": 103}},
23
- {"energized": 1, "id": 3, "p": [0, 0, 0], "q": [0, 0, 0], "u": [63508.52961357732, 63508.52961357732, 63508.52961345989], "u_angle": [-2.297462191765614e-10, -2.0943951026229417, 2.094395102852041], "u_pu": [1.000000000042805, 1.000000000042805, 1.0000000000409561], "id_reference": {"table": "bus", "index": 106}}
24
- ],
25
- "source":
26
- [
27
- {"energized": 1, "i": [12.266058929171775, 12.266056336254893, 24.17889348713215], "id": 5, "p": [765820.730621319, 765820.4766903995, -1529485.2196447744], "pf": [0.9830826099654819, 0.9830824918082272, -0.9960400572100595], "q": [-142683.64286082785, -142684.1067247107, -136520.40313344038], "s": [778999.36674519, 778999.2020728515, 1535565.9730482248], "id_reference": {"table": "ext_grid", "index": 0}, "pgm_input": {"node": 0}}
28
- ],
29
- "sym_gen":
30
- [
31
- {"energized": 1, "i": [42.084761397537456, 42.08476139753742, 41.84880717644763], "id": 10, "p": [403333.3333333333, 403333.3333333333, 403333.3333333333], "pf": [0.8309922150680065, 0.8309922150680065, 0.8309922150680065], "q": [269999.99999999994, 269999.99999999994, 269999.99999999994], "s": [485363.5521727787, 485363.5521727787, 485363.5521727787], "id_reference": {"table": "sgen", "index": 31}, "pgm_input": {"node": 2}}
32
- ],
33
- "sym_load":
34
- [
35
- {"energized": 1, "i": [72.58861772969922, 72.58861772969915, 72.18163928458914], "id": 6, "p": [833333.3333333333, 833333.3333333333, 833333.3333333333], "pf": [0.9954236078405162, 0.9954236078405162, 0.9954236078405162], "q": [79999.99999999999, 79999.99999999999, 79999.99999999999], "s": [837164.5265086454, 837164.5265086454, 837164.5265086454], "id_reference": {"table": "load", "name": "const_power", "index": 101}, "pgm_input": {"node": 2}},
36
- {"energized": 1, "i": [0, 0, 0], "id": 7, "p": [0, 0, 0], "pf": [0, 0, 0], "q": [0, 0, 0], "s": [0, 0, 0], "id_reference": {"table": "load", "name": "const_impedance", "index": 101}, "pgm_input": {"node": 2}},
37
- {"energized": 1, "i": [0, 0, 0], "id": 8, "p": [0, 0, 0], "pf": [0, 0, 0], "q": [0, 0, 0], "s": [0, 0, 0], "id_reference": {"table": "load", "name": "const_current", "index": 101}, "pgm_input": {"node": 2}}
38
- ],
39
- "transformer":
40
- [
41
- {"energized": 1, "i_from": [12.266058718690484, 12.266058718690402, 24.17889769909201], "i_to": [66.02947091322386, 66.02947091322693, 136.6556434817352], "id": 9, "loading": 0.03883052565830863, "p_from": [765820.724989093, 765820.7249890427, -1529485.491438911], "p_to": [-730552.3008242727, -730552.300824217, 1567616.5274441042], "q_from": [-142683.60010968833, -142683.60010993064, -136520.3668874493], "q_to": [216633.7469512629, 216633.74695157827, 216173.52394822074], "s_from": [778999.3533778327, 778999.3533778277, 1535566.2405436018], "s_to": [761995.3048134763, 761995.3048135125, 1582451.4430377013], "id_reference": {"table": "trafo", "index": 0}, "pgm_input": {"from_node": 0, "to_node": 1}, "pp_input": {"df": 1.0}}
42
- ]
43
- }
@@ -1,56 +0,0 @@
1
- {
2
- "asym_gen":
3
- [
4
- {"energized": 1, "i": 32.670416687651056, "id": 17, "p": 3300000.0000000005, "pf": 0.9999586802470745, "q": 30000.000000000004, "s": 3300136.36081905, "id_reference": {"table": "asymmetric_sgen", "index": 32}, "pgm_input": {"node": 4}}
5
- ],
6
- "asym_load":
7
- [
8
- {"energized": 1, "i": 32.670416687651056, "id": 16, "p": 3300000.0000000005, "pf": 0.9999586802470745, "q": 30000.000000000004, "s": 3300136.36081905, "id_reference": {"table": "asymmetric_load", "index": 33}, "pgm_input": {"node": 4}}
9
- ],
10
- "line":
11
- [
12
- {"energized": 1, "i_from": 64.0471369590637, "i_to": 62.767063741949805, "id": 6, "loading": 0.5930290459172566, "p_from": -1763554.1135053905, "p_to": 1765096.6771171533, "q_from": -1245081.6865976173, "q_to": 1169229.7700732222, "s_from": 2158784.7316401307, "s_to": 2117230.39246925, "id_reference": {"table": "line", "index": 101}, "pgm_input": {"from_node": 2, "to_node": 1, "i_n": 108.0}}
13
- ],
14
- "link":
15
- [
16
- {"energized": 1, "i_from": 0, "i_to": 0, "id": 15, "loading": 0, "p_from": 0, "p_to": 0, "q_from": 0, "q_to": 0, "s_from": 0, "s_to": 0, "id_reference": {"table": "switch", "name": "b2b_switches", "index": 3021}, "pgm_input": {"from_node": 0, "to_node": 5}}
17
- ],
18
- "node":
19
- [
20
- {"energized": 1, "id": 0, "p": 1798665.98546505, "q": 3476628.8235362596, "u": 109999.99996175709, "u_angle": -1.798666001063812e-10, "u_pu": 0.9999999996523372, "id_reference": {"table": "bus", "index": 101}},
21
- {"energized": 1, "id": 1, "p": 1.4085702951813892e-07, "q": -3.3708073600392856e-07, "u": 19474.9198728506, "u_angle": -0.5239008142519944, "u_pu": 0.97374599364253, "id_reference": {"table": "bus", "index": 102}},
22
- {"energized": 1, "id": 2, "p": -2414572.6452734848, "q": -231798.9739460695, "u": 19460.275745526535, "u_angle": -0.5237223960629773, "u_pu": 0.9730137872763268, "id_reference": {"table": "bus", "index": 103}},
23
- {"energized": 1, "id": 3, "p": -8.295648914520637e-08, "q": 1.430200360429221e-07, "u": 29183.44668976615, "u_angle": -1.04518706304991, "u_pu": 0.9695497239124967, "id_reference": {"table": "bus", "index": 104}},
24
- {"energized": 1, "id": 4, "p": 944410.894001629, "q": 581081.3221020879, "u": 58319.87496509463, "u_angle": -1.044828700708015, "u_pu": 0.9719979160849105, "id_reference": {"table": "bus", "index": 105}},
25
- {"energized": 1, "id": 5, "p": 0, "q": 0, "u": 109999.99996175709, "u_angle": -1.798666001063812e-10, "u_pu": 0.9999999996523372, "id_reference": {"table": "bus", "index": 106}}
26
- ],
27
- "shunt":
28
- [
29
- {"energized": 1, "i": 31.188122375690188, "id": 11, "p": 282008.0001416396, "pf": 0.17888543819998318, "q": 1551044.0007790178, "s": 1576472.6462886913, "id_reference": {"table": "shunt", "index": 1201}, "pgm_input": {"node": 3}}
30
- ],
31
- "source":
32
- [
33
- {"energized": 1, "i": 20.545012571488463, "id": 7, "p": 1798666.0004384827, "pf": 0.4595055928063901, "q": 3476627.872944676, "s": 3914350.6163946516, "id_reference": {"table": "ext_grid", "index": 1}, "pgm_input": {"node": 0}}
34
- ],
35
- "sym_gen":
36
- [
37
- {"energized": 1, "i": 14.414885714493, "id": 13, "p": 1210000, "pf": 0.8309922150680065, "q": 810000, "s": 1456090.6565183362, "id_reference": {"table": "sgen", "index": 31}, "pgm_input": {"node": 4}}
38
- ],
39
- "sym_load":
40
- [
41
- {"energized": 1, "i": 17.13761141048308, "id": 8, "p": 575000, "pf": 0.9954236078405164, "q": 55200, "s": 577643.5232909652, "id_reference": {"table": "load", "name": "const_power", "index": 101}, "pgm_input": {"node": 2}},
42
- {"energized": 1, "i": 35.977469977108086, "id": 9, "p": 1207113.6835430216, "pf": 0.9954236078405161, "q": 115882.91362013007, "s": 1212663.3063904808, "id_reference": {"table": "load", "name": "const_impedance", "index": 101}, "pgm_input": {"node": 2}},
43
- {"energized": 1, "i": 18.850149424695108, "id": 10, "p": 632458.9617296124, "pf": 0.9954236078405163, "q": 60716.06032604279, "s": 635366.6486790245, "id_reference": {"table": "load", "name": "const_current", "index": 101}, "pgm_input": {"node": 2}},
44
- {"energized": 1, "i": 1.4000314325372134, "id": 18, "p": 99999.99999999999, "pf": 0.7071067811865475, "q": 99999.99999999999, "s": 141421.3562373095, "id_reference": {"table": "ward", "name": "ward_const_power_load", "index": 34}, "pgm_input": {"node": 4}},
45
- {"energized": 1, "i": 1.3227216252536735, "id": 19, "p": 94477.99488734086, "pf": 0.7071067811865475, "q": 94477.99488734086, "s": 133612.0617154934, "id_reference": {"table": "ward", "name": "ward_const_impedance_load", "index": 34}, "pgm_input": {"node": 4}},
46
- {"energized": 1, "i": 0.7821998773897324, "id": 20, "p": 71111.11111111111, "pf": 0.9, "q": 34440.68301069173, "s": 79012.34567901235, "id_reference": {"table": "motor", "name": "motor_load", "index": 12}, "pgm_input": {"node": 4}}
47
- ],
48
- "three_winding_transformer":
49
- [
50
- {"energized": 1, "i_1": 35.73216058618558, "i_2": 10.977386752839678, "i_3": 31.18812237568588, "id": 14, "loading": 0.03152945292576947, "p_1": -651018.5317680555, "p_2": 944410.894001629, "p_3": -282008.00014178595, "q_1": 1013282.7126517809, "q_2": 581081.3221020879, "q_3": -1551044.0007787698, "s_1": 1204394.8623538653, "s_2": 1108858.6202058704, "s_3": 1576472.6462884734, "id_reference": {"table": "trafo3w", "index": 102}, "pgm_input": {"node_1": 2, "node_2": 4, "node_3": 3}}
51
- ],
52
- "transformer":
53
- [
54
- {"energized": 1, "i_from": 20.545016973103277, "i_to": 62.76706374195551, "id": 12, "loading": 0.04892939318768632, "p_from": 1798665.9834270997, "p_to": -1765096.6771171836, "q_from": 3476628.8259518775, "q_to": -1169229.7700735242, "s_from": 3914351.4550149054, "s_to": 2117230.3924694424, "id_reference": {"table": "trafo", "index": 101}, "pgm_input": {"from_node": 0, "to_node": 1}, "pp_input": {"df": 1.0}}
55
- ]
56
- }