power-grid-model-io 1.3.16__tar.gz → 1.3.18__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 (144) hide show
  1. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/PKG-INFO +1 -1
  2. power_grid_model_io-1.3.18/PYPI_VERSION +1 -0
  3. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/converters/pandapower_converter.py +44 -70
  4. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io.egg-info/PKG-INFO +1 -1
  5. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/converters/test_pandapower_converter_input.py +1 -1
  6. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/converters/test_pandapower_converter_output.py +68 -39
  7. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/validation/converters/test_pandapower_converter_output.py +164 -0
  8. power_grid_model_io-1.3.16/PYPI_VERSION +0 -1
  9. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/LICENSE +0 -0
  10. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/MANIFEST.in +0 -0
  11. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/README.md +0 -0
  12. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/VERSION +0 -0
  13. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/pyproject.toml +0 -0
  14. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/setup.cfg +0 -0
  15. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/setup.py +0 -0
  16. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/__init__.py +0 -0
  17. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/config/__init__.py +0 -0
  18. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/config/examples/__init__.py +0 -0
  19. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/config/examples/multipliers.yaml +0 -0
  20. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/config/excel/__init__.py +0 -0
  21. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/config/excel/vision_en.yaml +0 -0
  22. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/config/excel/vision_en_9_7.yaml +0 -0
  23. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/config/excel/vision_en_9_8.yaml +0 -0
  24. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/config/excel/vision_nl.yaml +0 -0
  25. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/converters/__init__.py +0 -0
  26. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/converters/base_converter.py +0 -0
  27. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/converters/pgm_json_converter.py +0 -0
  28. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/converters/tabular_converter.py +0 -0
  29. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/converters/vision_excel_converter.py +0 -0
  30. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/data_stores/__init__.py +0 -0
  31. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/data_stores/base_data_store.py +0 -0
  32. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/data_stores/csv_dir_store.py +0 -0
  33. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/data_stores/excel_file_store.py +0 -0
  34. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/data_stores/json_file_store.py +0 -0
  35. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/data_stores/vision_excel_file_store.py +0 -0
  36. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/data_types/__init__.py +0 -0
  37. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/data_types/_data_types.py +0 -0
  38. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/data_types/tabular_data.py +0 -0
  39. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/functions/__init__.py +0 -0
  40. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/functions/_functions.py +0 -0
  41. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/functions/filters.py +0 -0
  42. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/functions/phase_to_phase.py +0 -0
  43. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/mappings/__init__.py +0 -0
  44. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/mappings/field_mapping.py +0 -0
  45. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/mappings/multiplier_mapping.py +0 -0
  46. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/mappings/tabular_mapping.py +0 -0
  47. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/mappings/unit_mapping.py +0 -0
  48. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/mappings/value_mapping.py +0 -0
  49. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/py.typed +0 -0
  50. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/utils/__init__.py +0 -0
  51. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/utils/auto_id.py +0 -0
  52. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/utils/dict.py +0 -0
  53. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/utils/download.py +0 -0
  54. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/utils/excel_ambiguity_checker.py +0 -0
  55. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/utils/json.py +0 -0
  56. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/utils/modules.py +0 -0
  57. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/utils/parsing.py +0 -0
  58. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/utils/uuid_excel_cvtr.py +0 -0
  59. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io/utils/zip.py +0 -0
  60. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io.egg-info/SOURCES.txt +0 -0
  61. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io.egg-info/dependency_links.txt +0 -0
  62. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io.egg-info/requires.txt +0 -0
  63. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/src/power_grid_model_io.egg-info/top_level.txt +0 -0
  64. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/__init__.py +0 -0
  65. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/conftest.py +0 -0
  66. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/config/dummy_mapping.yaml +0 -0
  67. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/config/mapping.yaml +0 -0
  68. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/pandapower/pgm_asym_output_data.json +0 -0
  69. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/pandapower/pgm_asym_output_data.json.license +0 -0
  70. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/pandapower/pgm_input_data.json +0 -0
  71. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/pandapower/pgm_input_data.json.license +0 -0
  72. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/pandapower/pgm_output_data.json +0 -0
  73. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/pandapower/pgm_output_data.json.license +0 -0
  74. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/pandapower/pp_v2_net_3ph_output.json +0 -0
  75. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/pandapower/pp_v2_net_3ph_output.json.license +0 -0
  76. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/pandapower/pp_v2_net_3ph_output_current_loading.json +0 -0
  77. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/pandapower/pp_v2_net_3ph_output_current_loading.json.license +0 -0
  78. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/pandapower/pp_v2_net_output.json +0 -0
  79. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/pandapower/pp_v2_net_output.json.license +0 -0
  80. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/pandapower/pp_validation.py +0 -0
  81. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/vision/excel_ambiguity_check_data.xlsx +0 -0
  82. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/vision/excel_ambiguity_check_data.xlsx.license +0 -0
  83. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/vision/pgm_input_data_en.json +0 -0
  84. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/vision/pgm_input_data_en.json.license +0 -0
  85. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/vision/pgm_input_data_nl.json +0 -0
  86. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/vision/pgm_input_data_nl.json.license +0 -0
  87. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/vision/vision_9_5_en.yaml +0 -0
  88. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/vision/vision_9_5_nl.yaml +0 -0
  89. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/vision/vision_en.xlsx +0 -0
  90. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/vision/vision_en.xlsx.license +0 -0
  91. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/vision/vision_en_9_7.xlsx +0 -0
  92. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/vision/vision_en_9_7.xlsx.license +0 -0
  93. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/vision/vision_nl.xlsx +0 -0
  94. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/vision/vision_nl.xlsx.license +0 -0
  95. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/vision/vision_validation.vnf +0 -0
  96. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/vision/vision_validation.vnf.license +0 -0
  97. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/zip/foo-bar.zip +0 -0
  98. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/zip/foo-bar.zip.license +0 -0
  99. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/zip/foo.zip +0 -0
  100. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/data/zip/foo.zip.license +0 -0
  101. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/test_utils.py +0 -0
  102. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/__init__.py +0 -0
  103. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/conftest.py +0 -0
  104. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/converters/__init__.py +0 -0
  105. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/converters/test_base_converter.py +0 -0
  106. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/converters/test_pgm_json_converter.py +0 -0
  107. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/converters/test_tabular_converter.py +0 -0
  108. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/converters/test_vision_excel_converter.py +0 -0
  109. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/data_stores/__init__.py +0 -0
  110. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/data_stores/test_base_data_store.py +0 -0
  111. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/data_stores/test_csv_dir_store.py +0 -0
  112. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/data_stores/test_excel_file_store.py +0 -0
  113. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/data_stores/test_json_file_store.py +0 -0
  114. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/data_stores/test_vision_excel_file_store.py +0 -0
  115. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/data_types/__init__.py +0 -0
  116. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/data_types/test_data_types.py +0 -0
  117. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/data_types/test_tabular_data.py +0 -0
  118. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/functions/__init__.py +0 -0
  119. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/functions/test_filters.py +0 -0
  120. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/functions/test_functions.py +0 -0
  121. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/functions/test_phase_to_phase.py +0 -0
  122. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/mappings/__init__.py +0 -0
  123. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/mappings/test_field_mapping.py +0 -0
  124. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/mappings/test_multiplier_mapping.py +0 -0
  125. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/mappings/test_tabular_mapping.py +0 -0
  126. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/mappings/test_unit_mapping.py +0 -0
  127. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/mappings/test_value_mapping.py +0 -0
  128. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/utils/__init__.py +0 -0
  129. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/utils/test_auto_id.py +0 -0
  130. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/utils/test_dict.py +0 -0
  131. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/utils/test_download.py +0 -0
  132. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/utils/test_json.py +0 -0
  133. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/utils/test_modules.py +0 -0
  134. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/utils/test_parsing.py +0 -0
  135. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/utils/test_uuid_excel_cvtr.py +0 -0
  136. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/unit/utils/test_zip.py +0 -0
  137. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/utils.py +0 -0
  138. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/validation/__init__.py +0 -0
  139. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/validation/conftest.py +0 -0
  140. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/validation/converters/__init__.py +0 -0
  141. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/validation/converters/test_pandapower_converter_input.py +0 -0
  142. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/validation/converters/test_vision_excel_converter.py +0 -0
  143. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/validation/test_test_utils.py +0 -0
  144. {power_grid_model_io-1.3.16 → power_grid_model_io-1.3.18}/tests/validation/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: power-grid-model-io
3
- Version: 1.3.16
3
+ Version: 1.3.18
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
@@ -0,0 +1 @@
1
+ 1.3.18
@@ -342,13 +342,13 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
342
342
  self._pp_buses_output()
343
343
  self._pp_lines_output()
344
344
  self._pp_ext_grids_output()
345
- self._pp_loads_output()
345
+ self._pp_load_elements_output(element="load", symmetric=True)
346
+ self._pp_load_elements_output(element="ward", symmetric=True)
347
+ self._pp_load_elements_output(element="motor", symmetric=True)
346
348
  self._pp_shunts_output()
347
349
  self._pp_trafos_output()
348
350
  self._pp_sgens_output()
349
351
  self._pp_trafos3w_output()
350
- self._pp_ward_output()
351
- self._pp_motor_output()
352
352
  self._pp_asym_gens_output()
353
353
  self._pp_asym_loads_output()
354
354
  # Switches derive results from branches pp_output_data and pgm_output_data of links. Hence, placed in the end.
@@ -360,13 +360,14 @@ 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
+ # TODO create output_data_3ph for trafos3w, switches
366
364
  self._pp_buses_output_3ph()
367
365
  self._pp_lines_output_3ph()
368
366
  self._pp_ext_grids_output_3ph()
369
- self._pp_loads_output_3ph()
367
+ self._pp_load_elements_output(element="load", symmetric=False)
368
+ self._pp_load_elements_output(element="ward", symmetric=False)
369
+ self._pp_load_elements_output(element="motor", symmetric=False)
370
+ self._pp_shunts_output_3ph()
370
371
  self._pp_trafos_output_3ph()
371
372
  self._pp_sgens_output_3ph()
372
373
  self._pp_asym_gens_output_3ph()
@@ -426,7 +427,6 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
426
427
  pgm_lines["x1"] = self._get_pp_attr("line", "x_ohm_per_km", expected_type="f8") * multiplier
427
428
  pgm_lines["c1"] = c_nf_per_km * length_km * parallel * 1e-9
428
429
  # The formula for tan1 = R_1 / Xc_1 = (g * 1e-6) / (2 * pi * f * c * 1e-9) = g / (2 * pi * f * c * 1e-3)
429
- pgm_lines["tan1"] = 0.0
430
430
  pgm_lines["tan1"] = np.divide(
431
431
  self._get_pp_attr("line", "g_us_per_km", expected_type="f8", default=0),
432
432
  c_nf_per_km * (2 * np.pi * self.system_frequency * 1e-3),
@@ -440,7 +440,6 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
440
440
  pgm_lines["r0"] = self._get_pp_attr("line", "r0_ohm_per_km", expected_type="f8", default=np.nan) * multiplier
441
441
  pgm_lines["x0"] = self._get_pp_attr("line", "x0_ohm_per_km", expected_type="f8", default=np.nan) * multiplier
442
442
  pgm_lines["c0"] = c0_nf_per_km * length_km * parallel * 1e-9
443
- pgm_lines["tan0"] = 0.0
444
443
  pgm_lines["tan0"] = np.divide(
445
444
  self._get_pp_attr("line", "g0_us_per_km", expected_type="f8", default=0),
446
445
  c0_nf_per_km * (2 * np.pi * self.system_frequency * 1e-3),
@@ -1562,64 +1561,35 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
1562
1561
 
1563
1562
  self.pp_output_data["res_asymmetric_sgen"] = pp_output_asym_gens
1564
1563
 
1565
- def _pp_loads_output(self):
1564
+ def _pp_load_elements_output(self, element, symmetric):
1566
1565
  """
1567
- This function converts a power-grid-model Symmetrical Load output array to a Load Dataframe of PandaPower.
1568
-
1569
- Returns:
1570
- a PandaPower Dataframe for the Load component
1566
+ Utility function to convert output of elements represented as load
1567
+ in power grid model.
1568
+ element: "load", "motor" or "ward"
1569
+ symmetric: True or False
1571
1570
  """
1572
- load_id_names = ["const_power", "const_impedance", "const_current"]
1573
- assert "res_load" not in self.pp_output_data
1574
-
1575
- if (
1576
- ComponentType.sym_load not in self.pgm_output_data
1577
- or self.pgm_output_data[ComponentType.sym_load].size == 0
1578
- or ("load", load_id_names[0]) not in self.idx
1579
- ):
1580
- return
1581
-
1582
- # Store the results, while assuring that we are not overwriting any data
1583
- assert "res_load" not in self.pp_output_data
1584
- self.pp_output_data["res_load"] = self._pp_load_result_accumulate(
1585
- pp_component_name="load", load_id_names=load_id_names
1586
- )
1587
-
1588
- def _pp_ward_output(self):
1589
- load_id_names = ["ward_const_power_load", "ward_const_impedance_load"]
1590
- assert "res_ward" not in self.pp_output_data
1591
-
1592
- if (
1593
- ComponentType.sym_load not in self.pgm_output_data
1594
- or self.pgm_output_data[ComponentType.sym_load].size == 0
1595
- or ("ward", load_id_names[0]) not in self.idx
1596
- ):
1597
- return
1598
-
1599
- accumulated_loads = self._pp_load_result_accumulate(pp_component_name="ward", load_id_names=load_id_names)
1600
- # TODO Find a better way for mapping vm_pu from bus
1601
- # accumulated_loads["vm_pu"] = np.nan
1602
-
1603
- # Store the results, while assuring that we are not overwriting any data
1604
- assert "res_ward" not in self.pp_output_data
1605
- self.pp_output_data["res_ward"] = accumulated_loads
1606
-
1607
- def _pp_motor_output(self):
1608
- load_id_names = ["motor_load"]
1571
+ if symmetric:
1572
+ res_table = "res_" + element
1573
+ else:
1574
+ res_table = "res_" + element + "_3ph"
1609
1575
 
1610
- assert "res_motor" not in self.pp_output_data
1576
+ if element == "load":
1577
+ load_id_names = ["const_power", "const_impedance", "const_current"]
1578
+ elif element == "ward":
1579
+ load_id_names = ["ward_const_power_load", "ward_const_impedance_load"]
1580
+ elif element == "motor":
1581
+ load_id_names = ["motor_load"]
1611
1582
 
1612
1583
  if (
1613
1584
  ComponentType.sym_load not in self.pgm_output_data
1614
1585
  or self.pgm_output_data[ComponentType.sym_load].size == 0
1615
- or ("motor", load_id_names[0]) not in self.idx
1586
+ or (element, load_id_names[0]) not in self.idx
1616
1587
  ):
1617
1588
  return
1618
-
1619
1589
  # Store the results, while assuring that we are not overwriting any data
1620
- assert "res_motor" not in self.pp_output_data
1621
- self.pp_output_data["res_motor"] = self._pp_load_result_accumulate(
1622
- pp_component_name="motor", load_id_names=load_id_names
1590
+ assert res_table not in self.pp_output_data
1591
+ self.pp_output_data[res_table] = self._pp_load_result_accumulate(
1592
+ pp_component_name=element, load_id_names=load_id_names
1623
1593
  )
1624
1594
 
1625
1595
  def _pp_load_result_accumulate(self, pp_component_name: str, load_id_names: List[str]) -> pd.DataFrame:
@@ -2133,26 +2103,30 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
2133
2103
  assert "res_trafo_3ph" not in self.pp_output_data
2134
2104
  self.pp_output_data["res_trafo_3ph"] = pp_output_trafos_3ph
2135
2105
 
2136
- def _pp_loads_output_3ph(self):
2106
+ def _pp_shunts_output_3ph(self):
2137
2107
  """
2138
- This function converts a power-grid-model Symmetrical Load output array to a Load Dataframe of PandaPower.
2108
+ This function converts a power-grid-model Shunt output array to a Shunt Dataframe of PandaPower.
2139
2109
 
2140
2110
  Returns:
2141
- a PandaPower Dataframe for the Load component
2111
+ a PandaPower Dataframe for the Shunt component
2142
2112
  """
2143
- load_id_names = ["const_power", "const_impedance", "const_current"]
2144
- if (
2145
- ComponentType.sym_load not in self.pgm_output_data
2146
- or self.pgm_output_data[ComponentType.sym_load].size == 0
2147
- or ("load", load_id_names[0]) not in self.idx
2148
- ):
2113
+ # TODO: create unit tests for the function
2114
+ assert "res_shunt_3ph" not in self.pp_output_data
2115
+
2116
+ if ComponentType.shunt not in self.pgm_output_data or self.pgm_output_data[ComponentType.shunt].size == 0:
2149
2117
  return
2150
2118
 
2151
- # Store the results, while assuring that we are not overwriting any data
2152
- assert "res_load_3ph" not in self.pp_output_data
2153
- self.pp_output_data["res_load_3ph"] = self._pp_load_result_accumulate(
2154
- pp_component_name="load", load_id_names=load_id_names
2119
+ pgm_output_shunts = self.pgm_output_data[ComponentType.shunt]
2120
+
2121
+ pp_output_shunts = pd.DataFrame(
2122
+ columns=["p_mw", "q_mvar", "vm_pu"],
2123
+ index=self._get_pp_ids("shunt", pgm_output_shunts["id"]),
2155
2124
  )
2125
+ pp_output_shunts["p_mw"] = pgm_output_shunts["p"].sum() * 1e-6
2126
+ pp_output_shunts["q_mvar"] = pgm_output_shunts["q"].sum() * 1e-6
2127
+ # TODO Find a better way for mapping vm_pu from bus
2128
+ # pp_output_shunts["vm_pu"] = np.nan
2129
+ self.pp_output_data["res_shunt_3ph"] = pp_output_shunts
2156
2130
 
2157
2131
  def _pp_asym_loads_output_3ph(self):
2158
2132
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: power-grid-model-io
3
- Version: 1.3.16
3
+ Version: 1.3.18
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
@@ -596,7 +596,7 @@ def test_create_pgm_input_lines(mock_init_array: MagicMock, two_pp_objs, convert
596
596
  pgm.assert_any_call("r0", ANY)
597
597
  pgm.assert_any_call("x0", ANY)
598
598
  pgm.assert_any_call("c0", ANY)
599
- assert len(pgm.call_args_list) == 16
599
+ assert len(pgm.call_args_list) == 14
600
600
 
601
601
  # result
602
602
  assert converter.pgm_input_data[ComponentType.line] == mock_init_array.return_value
@@ -2,8 +2,8 @@
2
2
  #
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
 
5
- from typing import Callable, List
6
- from unittest.mock import ANY, MagicMock, patch
5
+ from typing import Any, Callable, Dict, List
6
+ from unittest.mock import ANY, MagicMock, call, patch
7
7
 
8
8
  import numpy as np
9
9
  import pandas as pd
@@ -38,11 +38,14 @@ def test_create_output_data():
38
38
  converter._pp_sgens_output.assert_called_once_with()
39
39
  converter._pp_trafos_output.assert_called_once_with()
40
40
  converter._pp_trafos3w_output.assert_called_once_with()
41
- converter._pp_loads_output.assert_called_once_with()
41
+ expected_calls = [
42
+ call(element="load", symmetric=True),
43
+ call(element="ward", symmetric=True),
44
+ call(element="motor", symmetric=True),
45
+ ]
46
+ converter._pp_load_elements_output.assert_has_calls(expected_calls)
42
47
  converter._pp_asym_loads_output.assert_called_once_with()
43
48
  converter._pp_asym_gens_output.assert_called_once_with()
44
- converter._pp_motor_output.assert_called_once_with()
45
- converter._pp_ward_output.assert_called_once_with()
46
49
  converter._pp_switches_output.assert_called_once_with()
47
50
 
48
51
 
@@ -54,50 +57,57 @@ def test_create_output_data_3ph():
54
57
  PandaPowerConverter._create_output_data_3ph(self=converter) # type: ignore
55
58
 
56
59
  # Assert
57
- assert len(converter.method_calls) == 8
60
+ assert len(converter.method_calls) == 11
58
61
  converter._pp_buses_output_3ph.assert_called_once_with()
59
62
  converter._pp_lines_output_3ph.assert_called_once_with()
60
63
  converter._pp_ext_grids_output_3ph.assert_called_once_with()
61
64
  converter._pp_sgens_output_3ph.assert_called_once_with()
62
65
  converter._pp_trafos_output_3ph.assert_called_once_with()
63
- converter._pp_loads_output_3ph.assert_called_once_with()
66
+ expected_calls = [
67
+ call(element="load", symmetric=False),
68
+ call(element="ward", symmetric=False),
69
+ call(element="motor", symmetric=False),
70
+ ]
71
+ converter._pp_load_elements_output.assert_has_calls(expected_calls)
64
72
  converter._pp_asym_loads_output_3ph.assert_called_once_with()
65
73
  converter._pp_asym_gens_output_3ph.assert_called_once_with()
66
74
 
67
75
 
68
76
  @pytest.mark.parametrize(
69
- ("create_fn", "table"),
77
+ ("create_fn", "table", "create_fn_kwargs"),
70
78
  [
71
- (PandaPowerConverter._pp_buses_output, "node"),
72
- (PandaPowerConverter._pp_lines_output, "line"),
73
- (PandaPowerConverter._pp_ext_grids_output, "source"),
74
- (PandaPowerConverter._pp_shunts_output, "shunt"),
75
- (PandaPowerConverter._pp_sgens_output, "sym_gen"),
76
- (PandaPowerConverter._pp_trafos_output, "transformer"),
77
- (PandaPowerConverter._pp_trafos3w_output, "three_winding_transformer"),
78
- (PandaPowerConverter._pp_loads_output, "sym_load"),
79
- (PandaPowerConverter._pp_asym_loads_output, "asym_load"),
80
- (PandaPowerConverter._pp_asym_gens_output, "asym_gen"),
81
- (PandaPowerConverter._pp_ward_output, "ward"),
82
- (PandaPowerConverter._pp_motor_output, "motor"),
83
- (PandaPowerConverter._pp_switches_output, "link"),
84
- (PandaPowerConverter._pp_buses_output_3ph, "node"),
85
- (PandaPowerConverter._pp_lines_output_3ph, "line"),
86
- (PandaPowerConverter._pp_ext_grids_output_3ph, "source"),
87
- (PandaPowerConverter._pp_sgens_output_3ph, "sym_gen"),
88
- (PandaPowerConverter._pp_trafos_output_3ph, "transformer"),
89
- (PandaPowerConverter._pp_loads_output_3ph, "sym_load"),
90
- (PandaPowerConverter._pp_asym_loads_output_3ph, "asym_load"),
91
- (PandaPowerConverter._pp_asym_gens_output_3ph, "asym_gen"),
79
+ (PandaPowerConverter._pp_buses_output, "node", {}),
80
+ (PandaPowerConverter._pp_lines_output, "line", {}),
81
+ (PandaPowerConverter._pp_ext_grids_output, "source", {}),
82
+ (PandaPowerConverter._pp_shunts_output, "shunt", {}),
83
+ (PandaPowerConverter._pp_sgens_output, "sym_gen", {}),
84
+ (PandaPowerConverter._pp_trafos_output, "transformer", {}),
85
+ (PandaPowerConverter._pp_trafos3w_output, "three_winding_transformer", {}),
86
+ (PandaPowerConverter._pp_load_elements_output, "load", {"symmetric": True, "element": "sym_load"}),
87
+ (PandaPowerConverter._pp_load_elements_output, "ward", {"symmetric": True, "element": "ward"}),
88
+ (PandaPowerConverter._pp_load_elements_output, "motor", {"symmetric": True, "element": "motor"}),
89
+ (PandaPowerConverter._pp_asym_loads_output, "asym_load", {}),
90
+ (PandaPowerConverter._pp_asym_gens_output, "asym_gen", {}),
91
+ (PandaPowerConverter._pp_switches_output, "link", {}),
92
+ (PandaPowerConverter._pp_buses_output_3ph, "node", {}),
93
+ (PandaPowerConverter._pp_lines_output_3ph, "line", {}),
94
+ (PandaPowerConverter._pp_ext_grids_output_3ph, "source", {}),
95
+ (PandaPowerConverter._pp_sgens_output_3ph, "sym_gen", {}),
96
+ (PandaPowerConverter._pp_trafos_output_3ph, "transformer", {}),
97
+ (PandaPowerConverter._pp_load_elements_output, "load", {"symmetric": False, "element": "sym_load"}),
98
+ (PandaPowerConverter._pp_load_elements_output, "ward", {"symmetric": False, "element": "ward"}),
99
+ (PandaPowerConverter._pp_load_elements_output, "motor", {"symmetric": False, "element": "motor"}),
100
+ (PandaPowerConverter._pp_asym_loads_output_3ph, "asym_load", {}),
101
+ (PandaPowerConverter._pp_asym_gens_output_3ph, "asym_gen", {}),
92
102
  ],
93
103
  )
94
- def test_create_pp_output_object__empty(create_fn: Callable[[PandaPowerConverter], None], table: str):
104
+ def test_create_pp_output_object__empty(create_fn: Callable[..., None], table: str, create_fn_kwargs: Dict[str, Any]):
95
105
  # Arrange: No table
96
106
  converter = PandaPowerConverter()
97
107
 
98
108
  # Act / Assert
99
109
  with patch("power_grid_model_io.converters.pandapower_converter.pd.DataFrame") as mock_df:
100
- create_fn(converter)
110
+ create_fn(converter, **create_fn_kwargs)
101
111
  mock_df.assert_not_called()
102
112
 
103
113
  # Arrange: Empty table
@@ -105,7 +115,7 @@ def test_create_pp_output_object__empty(create_fn: Callable[[PandaPowerConverter
105
115
 
106
116
  # Act / Assert
107
117
  with patch("power_grid_model_io.converters.pandapower_converter.pd.DataFrame") as mock_df:
108
- create_fn(converter)
118
+ create_fn(converter, **create_fn_kwargs)
109
119
  mock_df.assert_not_called()
110
120
 
111
121
 
@@ -532,15 +542,34 @@ def test_pp_load_result_accumulate__asym():
532
542
 
533
543
 
534
544
  @pytest.mark.parametrize(
535
- ("output_fn", "table", "load_id_names", "result_suffix"),
545
+ ("output_fn", "element", "symmetric", "table", "load_id_names", "result_suffix"),
536
546
  [
537
- (PandaPowerConverter._pp_loads_output, "load", ["const_power", "const_impedance", "const_current"], ""),
538
- (PandaPowerConverter._pp_motor_output, "motor", ["motor_load"], ""),
539
- (PandaPowerConverter._pp_loads_output_3ph, "load", ["const_power", "const_impedance", "const_current"], "_3ph"),
547
+ (
548
+ PandaPowerConverter._pp_load_elements_output,
549
+ "load",
550
+ True,
551
+ "load",
552
+ ["const_power", "const_impedance", "const_current"],
553
+ "",
554
+ ),
555
+ (PandaPowerConverter._pp_load_elements_output, "motor", True, "motor", ["motor_load"], ""),
556
+ (
557
+ PandaPowerConverter._pp_load_elements_output,
558
+ "load",
559
+ False,
560
+ "load",
561
+ ["const_power", "const_impedance", "const_current"],
562
+ "_3ph",
563
+ ),
540
564
  ],
541
565
  )
542
566
  def test_output_load_types(
543
- output_fn: Callable[[PandaPowerConverter], None], table: str, load_id_names: List[str], result_suffix: str
567
+ output_fn: Callable[[PandaPowerConverter, str, bool], None],
568
+ element: str,
569
+ symmetric: bool,
570
+ table: str,
571
+ load_id_names: List[str],
572
+ result_suffix: str,
544
573
  ):
545
574
  # Arrange
546
575
  converter = PandaPowerConverter()
@@ -551,7 +580,7 @@ def test_output_load_types(
551
580
  converter._pp_load_result_accumulate = MagicMock() # type: ignore
552
581
 
553
582
  # Act
554
- output_fn(converter)
583
+ output_fn(converter, element, symmetric)
555
584
 
556
585
  # Assert
557
586
  converter._pp_load_result_accumulate.assert_called_once_with(pp_component_name=table, load_id_names=load_id_names)
@@ -570,7 +599,7 @@ def test_output_load_ward():
570
599
  converter._pp_load_result_accumulate = MagicMock()
571
600
 
572
601
  # Act
573
- converter._pp_ward_output()
602
+ converter._pp_load_elements_output(element="ward", symmetric=True)
574
603
 
575
604
  # Assert
576
605
  converter._pp_load_result_accumulate.assert_called_once_with(pp_component_name="ward", load_id_names=load_id_names)
@@ -8,8 +8,12 @@ from functools import lru_cache
8
8
  from pathlib import Path
9
9
  from typing import Tuple
10
10
 
11
+ import numpy as np
12
+ import pandapower.networks as pp_networks
11
13
  import pandas as pd
12
14
  import pytest
15
+ from pandapower.results import reset_results
16
+ from power_grid_model import PowerGridModel
13
17
  from power_grid_model.validation import assert_valid_input_data
14
18
 
15
19
  from power_grid_model_io.converters import PandaPowerConverter
@@ -278,3 +282,163 @@ def test_attributes_3ph(output_data_3ph: Tuple[PandaPowerData, PandaPowerData],
278
282
 
279
283
  # Assert
280
284
  pd.testing.assert_series_equal(actual_values, expected_values, atol=5e-4, rtol=1e-4)
285
+
286
+
287
+ def _get_total_powers_3ph(net):
288
+ """
289
+ Calculates total complex power for sources, loads and losses
290
+ Input: Pandapower Network
291
+ Output: [s_ext_grid, s_load, s_loss]
292
+ """
293
+ s_ext_grid = (
294
+ net.res_ext_grid_3ph.loc[:, ["p_a_mw", "p_b_mw", "p_c_mw"]].sum().sum()
295
+ + 1j * net.res_ext_grid_3ph.loc[:, ["q_a_mvar", "q_b_mvar", "q_c_mvar"]].sum().sum()
296
+ )
297
+
298
+ if "res_asymmetric_load_3ph" in net:
299
+ s_load_asym = (
300
+ net.res_asymmetric_load_3ph.loc[:, ["p_a_mw", "p_b_mw", "p_c_mw"]].sum().sum()
301
+ + 1j * net.res_asymmetric_load_3ph.loc[:, ["q_a_mvar", "q_b_mvar", "q_c_mvar"]].sum().sum()
302
+ )
303
+ else:
304
+ s_load_asym = np.complex128()
305
+
306
+ if "res_load_3ph" in net:
307
+ s_load_sym = net.res_load_3ph.loc[:, "p_mw"].sum() + 1j * net.res_load_3ph.loc[:, "q_mvar"].sum()
308
+ else:
309
+ s_load_sym = np.complex128()
310
+
311
+ if "res_motor_3ph" in net:
312
+ s_motor = net.res_motor_3ph.loc[:, "p_mw"].sum() + 1j * net.res_motor_3ph.loc[:, "q_mvar"].sum()
313
+ else:
314
+ s_motor = np.complex128()
315
+
316
+ if ("res_ward_3ph" in net) and (not net.res_ward_3ph.empty):
317
+ s_ward = net.res_ward_3ph.loc[:, "p_mw"].sum() + 1j * net.res_ward_3ph.loc[:, "q_mvar"].sum()
318
+ else:
319
+ s_ward = np.complex128()
320
+
321
+ if ("res_shunt_3ph" in net) and (not net.res_shunt_3ph.empty):
322
+ s_shunt = net.res_shunt_3ph.loc[:, "p_mw"].sum() + 1j * net.res_shunt_3ph.loc[:, "q_mvar"].sum()
323
+ else:
324
+ s_shunt = np.complex128()
325
+
326
+ s_load = s_load_sym + s_load_asym + s_motor + s_ward + s_shunt
327
+
328
+ if "res_line_3ph" in net:
329
+ s_loss_line = (
330
+ net.res_line_3ph.loc[:, ["p_a_l_mw", "p_b_l_mw", "p_c_l_mw"]].sum().sum()
331
+ + 1j * net.res_line_3ph.loc[:, ["q_a_l_mvar", "q_b_l_mvar", "q_c_l_mvar"]].sum().sum()
332
+ )
333
+ else:
334
+ s_loss_line = np.complex128()
335
+
336
+ if "res_trafo_3ph" in net:
337
+ s_loss_trafo = (
338
+ net.res_trafo_3ph.loc[:, ["p_a_l_mw", "p_b_l_mw", "p_c_l_mw"]].sum().sum()
339
+ + 1j * net.res_trafo_3ph.loc[:, ["q_a_l_mvar", "q_b_l_mvar", "q_c_l_mvar"]].sum().sum()
340
+ )
341
+ else:
342
+ s_loss_trafo = np.complex128()
343
+
344
+ s_loss = s_loss_line + s_loss_trafo
345
+ return [s_ext_grid, s_load, s_loss]
346
+
347
+
348
+ def test_output_data_3ph__powers():
349
+ def run_pf_asym_with_pgm(net):
350
+ reset_results(net, "pf_3ph")
351
+ pgm_converter = PandaPowerConverter()
352
+ input_data, _ = pgm_converter.load_input_data(net, make_extra_info=False)
353
+ pgm = PowerGridModel(input_data)
354
+ output_data = pgm.calculate_power_flow(symmetric=False)
355
+ output_tables = pgm_converter.convert(output_data)
356
+ for table in output_tables.keys():
357
+ net[table] = output_tables[table]
358
+
359
+ net = pp_networks.ieee_european_lv_asymmetric()
360
+ pp.create_load(net, 50, 0.1, 0.05)
361
+ run_pf_asym_with_pgm(net)
362
+ s_ext_grid, s_load, s_loss = _get_total_powers_3ph(net)
363
+ assert np.isclose(s_ext_grid, (s_load + s_loss))
364
+
365
+ pp.create_motor(net, 100, 0.1, 0.9)
366
+ pp.create_ward(net, 200, 0.1, 0.05, 0.1, 0.05)
367
+ pp.create_shunt_as_capacitor(net, 150, 0.09, 0)
368
+ run_pf_asym_with_pgm(net)
369
+ s_ext_grid, s_load, s_loss = _get_total_powers_3ph(net)
370
+ assert np.isclose(s_ext_grid, (s_load + s_loss))
371
+
372
+
373
+ def _get_total_powers(net):
374
+ """
375
+ Calculates total complex power for sources, loads and losses
376
+ Input: Pandapower Network
377
+ Output: [s_ext_grid, s_load, s_loss]
378
+ """
379
+ s_ext_grid = net.res_ext_grid.loc[:, "p_mw"].sum() + 1j * net.res_ext_grid.loc[:, "q_mvar"].sum()
380
+
381
+ if "res_asymmetric_load" in net:
382
+ s_load_asym = net.res_asymmetric_load.loc[:, "p_mw"].sum() + 1j * net.res_asymmetric_load.loc[:, "q_mvar"].sum()
383
+ else:
384
+ s_load_asym = np.complex128()
385
+
386
+ if "res_load" in net:
387
+ s_load_sym = net.res_load.loc[:, "p_mw"].sum() + 1j * net.res_load.loc[:, "q_mvar"].sum()
388
+ else:
389
+ s_load_sym = np.complex128()
390
+
391
+ if "res_motor" in net:
392
+ s_motor = net.res_motor.loc[:, "p_mw"].sum() + 1j * net.res_motor.loc[:, "q_mvar"].sum()
393
+ else:
394
+ s_motor = np.complex128()
395
+
396
+ if "res_ward" in net:
397
+ s_ward = net.res_ward.loc[:, "p_mw"].sum() + 1j * net.res_ward.loc[:, "q_mvar"].sum()
398
+ else:
399
+ s_ward = np.complex128()
400
+
401
+ if "res_shunt" in net:
402
+ s_shunt = net.res_shunt.loc[:, "p_mw"].sum() + 1j * net.res_shunt.loc[:, "q_mvar"].sum()
403
+ else:
404
+ s_shunt = np.complex128()
405
+
406
+ s_load = s_load_sym + s_load_asym + s_motor + s_ward + s_shunt
407
+
408
+ if "res_line" in net:
409
+ s_loss_line = net.res_line.loc[:, "pl_mw"].sum() + 1j * net.res_line.loc[:, "ql_mvar"].sum()
410
+ else:
411
+ s_loss_line = np.complex128()
412
+
413
+ if "res_trafo" in net:
414
+ s_loss_trafo = net.res_trafo.loc[:, "pl_mw"].sum() + 1j * net.res_trafo.loc[:, "ql_mvar"].sum()
415
+ else:
416
+ s_loss_trafo = np.complex128()
417
+
418
+ s_loss = s_loss_line + s_loss_trafo
419
+ return [s_ext_grid, s_load, s_loss]
420
+
421
+
422
+ def test_output_data__powers():
423
+ def run_pf_sym_with_pgm(net):
424
+ reset_results(net, "pf")
425
+ pgm_converter = PandaPowerConverter()
426
+ input_data, _ = pgm_converter.load_input_data(net, make_extra_info=False)
427
+ pgm = PowerGridModel(input_data)
428
+ output_data = pgm.calculate_power_flow(symmetric=True)
429
+ output_tables = pgm_converter.convert(output_data)
430
+ for table in output_tables.keys():
431
+ net[table] = output_tables[table]
432
+
433
+ net = pp_networks.ieee_european_lv_asymmetric()
434
+ pp.create_load(net, 50, 0.1, 0.05)
435
+ run_pf_sym_with_pgm(net)
436
+ s_ext_grid, s_load, s_loss = _get_total_powers(net)
437
+ assert np.isclose(s_ext_grid, (s_load + s_loss))
438
+
439
+ pp.create_motor(net, 100, 0.1, 0.9)
440
+ pp.create_ward(net, 200, 0.1, 0.05, 0.1, 0.05)
441
+ pp.create_shunt_as_capacitor(net, 150, 0.09, 0)
442
+ run_pf_sym_with_pgm(net)
443
+ s_ext_grid, s_load, s_loss = _get_total_powers(net)
444
+ assert np.isclose(s_ext_grid, (s_load + s_loss))
@@ -1 +0,0 @@
1
- 1.3.16