power-grid-model-io 1.2.95__tar.gz → 1.2.97__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 (136) hide show
  1. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/PKG-INFO +1 -1
  2. power_grid_model_io-1.2.97/PYPI_VERSION +1 -0
  3. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/pyproject.toml +1 -1
  4. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/converters/pandapower_converter.py +30 -9
  5. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/converters/pgm_json_converter.py +7 -4
  6. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/converters/tabular_converter.py +3 -1
  7. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io.egg-info/PKG-INFO +1 -1
  8. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/converters/test_pandapower_converter_input.py +18 -3
  9. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/converters/test_tabular_converter.py +29 -4
  10. power_grid_model_io-1.2.95/PYPI_VERSION +0 -1
  11. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/LICENSE +0 -0
  12. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/MANIFEST.in +0 -0
  13. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/README.md +0 -0
  14. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/VERSION +0 -0
  15. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/setup.cfg +0 -0
  16. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/setup.py +0 -0
  17. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/__init__.py +0 -0
  18. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/config/__init__.py +0 -0
  19. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/config/examples/__init__.py +0 -0
  20. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/config/examples/multipliers.yaml +0 -0
  21. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/config/excel/__init__.py +0 -0
  22. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/config/excel/vision_en.yaml +0 -0
  23. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/config/excel/vision_en_9_7.yaml +0 -0
  24. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/config/excel/vision_nl.yaml +0 -0
  25. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/converters/__init__.py +0 -0
  26. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/converters/base_converter.py +0 -0
  27. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/converters/vision_excel_converter.py +0 -0
  28. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/data_stores/__init__.py +0 -0
  29. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/data_stores/base_data_store.py +0 -0
  30. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/data_stores/csv_dir_store.py +0 -0
  31. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/data_stores/excel_file_store.py +0 -0
  32. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/data_stores/json_file_store.py +0 -0
  33. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/data_stores/vision_excel_file_store.py +0 -0
  34. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/data_types/__init__.py +0 -0
  35. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/data_types/_data_types.py +0 -0
  36. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/data_types/tabular_data.py +0 -0
  37. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/functions/__init__.py +0 -0
  38. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/functions/_functions.py +0 -0
  39. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/functions/filters.py +0 -0
  40. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/functions/phase_to_phase.py +0 -0
  41. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/mappings/__init__.py +0 -0
  42. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/mappings/field_mapping.py +0 -0
  43. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/mappings/multiplier_mapping.py +0 -0
  44. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/mappings/tabular_mapping.py +0 -0
  45. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/mappings/unit_mapping.py +0 -0
  46. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/mappings/value_mapping.py +0 -0
  47. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/utils/__init__.py +0 -0
  48. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/utils/auto_id.py +0 -0
  49. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/utils/dict.py +0 -0
  50. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/utils/download.py +0 -0
  51. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/utils/excel_ambiguity_checker.py +0 -0
  52. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/utils/json.py +0 -0
  53. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/utils/modules.py +0 -0
  54. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/utils/parsing.py +0 -0
  55. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/utils/uuid_excel_cvtr.py +0 -0
  56. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io/utils/zip.py +0 -0
  57. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io.egg-info/SOURCES.txt +0 -0
  58. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io.egg-info/dependency_links.txt +0 -0
  59. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io.egg-info/requires.txt +0 -0
  60. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/src/power_grid_model_io.egg-info/top_level.txt +0 -0
  61. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/__init__.py +0 -0
  62. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/conftest.py +0 -0
  63. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/config/dummy_mapping.yaml +0 -0
  64. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/config/mapping.yaml +0 -0
  65. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/pandapower/pgm_asym_output_data.json +0 -0
  66. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/pandapower/pgm_asym_output_data.json.license +0 -0
  67. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/pandapower/pgm_input_data.json +0 -0
  68. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/pandapower/pgm_input_data.json.license +0 -0
  69. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/pandapower/pgm_output_data.json +0 -0
  70. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/pandapower/pgm_output_data.json.license +0 -0
  71. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/pandapower/pp_validation.py +0 -0
  72. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/vision/excel_ambiguity_check_data.xlsx +0 -0
  73. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/vision/excel_ambiguity_check_data.xlsx.license +0 -0
  74. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/vision/pgm_input_data_en.json +0 -0
  75. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/vision/pgm_input_data_en.json.license +0 -0
  76. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/vision/pgm_input_data_nl.json +0 -0
  77. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/vision/pgm_input_data_nl.json.license +0 -0
  78. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/vision/vision_9_5_en.yaml +0 -0
  79. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/vision/vision_9_5_nl.yaml +0 -0
  80. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/vision/vision_en.xlsx +0 -0
  81. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/vision/vision_en.xlsx.license +0 -0
  82. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/vision/vision_en_9_7.xlsx +0 -0
  83. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/vision/vision_en_9_7.xlsx.license +0 -0
  84. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/vision/vision_nl.xlsx +0 -0
  85. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/vision/vision_nl.xlsx.license +0 -0
  86. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/vision/vision_validation.vnf +0 -0
  87. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/vision/vision_validation.vnf.license +0 -0
  88. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/zip/foo-bar.zip +0 -0
  89. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/zip/foo-bar.zip.license +0 -0
  90. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/zip/foo.zip +0 -0
  91. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/data/zip/foo.zip.license +0 -0
  92. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/test_utils.py +0 -0
  93. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/__init__.py +0 -0
  94. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/conftest.py +0 -0
  95. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/converters/__init__.py +0 -0
  96. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/converters/test_base_converter.py +0 -0
  97. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/converters/test_pandapower_converter_output.py +0 -0
  98. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/converters/test_pgm_json_converter.py +0 -0
  99. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/converters/test_vision_excel_converter.py +0 -0
  100. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/data_stores/__init__.py +0 -0
  101. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/data_stores/test_base_data_store.py +0 -0
  102. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/data_stores/test_csv_dir_store.py +0 -0
  103. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/data_stores/test_excel_file_store.py +0 -0
  104. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/data_stores/test_json_file_store.py +0 -0
  105. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/data_stores/test_vision_excel_file_store.py +0 -0
  106. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/data_types/__init__.py +0 -0
  107. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/data_types/test_data_types.py +0 -0
  108. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/data_types/test_tabular_data.py +0 -0
  109. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/functions/__init__.py +0 -0
  110. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/functions/test_filters.py +0 -0
  111. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/functions/test_functions.py +0 -0
  112. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/functions/test_phase_to_phase.py +0 -0
  113. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/mappings/__init__.py +0 -0
  114. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/mappings/test_field_mapping.py +0 -0
  115. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/mappings/test_multiplier_mapping.py +0 -0
  116. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/mappings/test_tabular_mapping.py +0 -0
  117. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/mappings/test_unit_mapping.py +0 -0
  118. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/mappings/test_value_mapping.py +0 -0
  119. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/utils/__init__.py +0 -0
  120. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/utils/test_auto_id.py +0 -0
  121. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/utils/test_dict.py +0 -0
  122. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/utils/test_download.py +0 -0
  123. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/utils/test_json.py +0 -0
  124. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/utils/test_modules.py +0 -0
  125. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/utils/test_parsing.py +0 -0
  126. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/utils/test_uuid_excel_cvtr.py +0 -0
  127. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/unit/utils/test_zip.py +0 -0
  128. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/utils.py +0 -0
  129. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/validation/__init__.py +0 -0
  130. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/validation/conftest.py +0 -0
  131. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/validation/converters/__init__.py +0 -0
  132. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/validation/converters/test_pandapower_converter_input.py +0 -0
  133. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/validation/converters/test_pandapower_converter_output.py +0 -0
  134. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/validation/converters/test_vision_excel_converter.py +0 -0
  135. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/tests/validation/test_test_utils.py +0 -0
  136. {power_grid_model_io-1.2.95 → power_grid_model_io-1.2.97}/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.95
3
+ Version: 1.2.97
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.2.97
@@ -80,7 +80,7 @@ power_grid_model_io = ["config/**/*.yaml"]
80
80
 
81
81
  [tool.pytest.ini_options]
82
82
  testpaths = ["tests/unit"]
83
- addopts = ["--cov=power_grid_model_io", "--cov-report=term", "--cov-report=html:cov_html", "--cov-fail-under=99"]
83
+ addopts = ["--cov=power_grid_model_io", "--cov-report=term", "--cov-report=html:cov_html", "--cov-fail-under=98.5"]
84
84
 
85
85
  [tool.black]
86
86
  line-length = 120
@@ -12,7 +12,15 @@ from typing import Dict, List, MutableMapping, Optional, Tuple, Type, Union
12
12
  import numpy as np
13
13
  import pandas as pd
14
14
  import structlog
15
- from power_grid_model import Branch3Side, BranchSide, LoadGenType, WindingType, initialize_array, power_grid_meta_data
15
+ from power_grid_model import (
16
+ Branch3Side,
17
+ BranchSide,
18
+ DatasetType,
19
+ LoadGenType,
20
+ WindingType,
21
+ initialize_array,
22
+ power_grid_meta_data,
23
+ )
16
24
  from power_grid_model.data_types import Dataset, SingleDataset
17
25
 
18
26
  from power_grid_model_io.converters.base_converter import BaseConverter
@@ -113,10 +121,10 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
113
121
  self._extra_info_to_pgm_input_data(extra_info)
114
122
 
115
123
  # Convert
116
- def pgm_output_dtype_checker(check_type: str) -> bool:
124
+ def pgm_output_dtype_checker(check_type: DatasetType | str) -> bool:
117
125
  return all(
118
126
  (
119
- comp_array.dtype == power_grid_meta_data[check_type][component]
127
+ comp_array.dtype == power_grid_meta_data[DatasetType[check_type]][component]
120
128
  for component, comp_array in self.pgm_output_data.items()
121
129
  )
122
130
  )
@@ -248,7 +256,10 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
248
256
  nan = np.iinfo(dtype).min
249
257
  all_other_cols = ["i_n"]
250
258
  for component, data in self.pgm_output_data.items():
251
- input_cols = power_grid_meta_data["input"][component].dtype.names
259
+ input_cols = power_grid_meta_data[DatasetType.input][component].dtype.names
260
+ if input_cols is None:
261
+ input_cols = tuple()
262
+
252
263
  node_cols = [col for col in input_cols if is_node_ref(col)]
253
264
  other_cols = [col for col in input_cols if col in all_other_cols]
254
265
  if not node_cols + other_cols:
@@ -747,8 +758,12 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
747
758
  pgm_transformers["sn"] = sn_mva * parallel * 1e6
748
759
  pgm_transformers["uk"] = vk_percent * 1e-2
749
760
  pgm_transformers["pk"] = vkr_percent * sn_mva * parallel * (1e6 * 1e-2)
750
- pgm_transformers["i0"] = i_no_load * 1e-2
751
761
  pgm_transformers["p0"] = pfe * parallel * 1e3
762
+ pgm_transformers["i0"] = i_no_load * 1e-2
763
+ i0_min_threshold = pgm_transformers["p0"] / pgm_transformers["sn"]
764
+ if any(np.less(pgm_transformers["i0"], i0_min_threshold)):
765
+ logger.warning("Minimum value of i0_percent is clipped to p0/sn")
766
+ pgm_transformers["i0"] = np.clip(pgm_transformers["i0"], a_min=i0_min_threshold, a_max=None)
752
767
  pgm_transformers["clock"] = clocks
753
768
  pgm_transformers["winding_from"] = winding_types["winding_from"]
754
769
  pgm_transformers["winding_to"] = winding_types["winding_to"]
@@ -875,8 +890,12 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
875
890
  pgm_3wtransformers["pk_13"] = vkr_lv_percent * np.minimum(sn_hv_mva, sn_lv_mva) * (1e-2 * 1e6)
876
891
  pgm_3wtransformers["pk_23"] = vkr_mv_percent * np.minimum(sn_mv_mva, sn_lv_mva) * (1e-2 * 1e6)
877
892
 
878
- pgm_3wtransformers["i0"] = self._get_pp_attr("trafo3w", "i0_percent", expected_type="f8") * 1e-2
879
893
  pgm_3wtransformers["p0"] = self._get_pp_attr("trafo3w", "pfe_kw", expected_type="f8") * 1e3
894
+ pgm_3wtransformers["i0"] = self._get_pp_attr("trafo3w", "i0_percent", expected_type="f8") * 1e-2
895
+ i0_min_threshold = pgm_3wtransformers["p0"] / pgm_3wtransformers["sn_1"]
896
+ if any(np.less(pgm_3wtransformers["i0"], i0_min_threshold)):
897
+ logger.warning("Minimum value of i0_percent is clipped to p0/sn_1")
898
+ pgm_3wtransformers["i0"] = np.clip(pgm_3wtransformers["i0"], a_min=i0_min_threshold, a_max=None)
880
899
  pgm_3wtransformers["clock_12"] = clocks_12
881
900
  pgm_3wtransformers["clock_13"] = clocks_13
882
901
  pgm_3wtransformers["winding_1"] = winding_types["winding_1"]
@@ -1594,9 +1613,11 @@ class PandaPowerConverter(BaseConverter[PandaPowerData]):
1594
1613
  # Combine all branch bus, current and et in one dataframe
1595
1614
  all_i_df = pd.concat(
1596
1615
  [
1597
- join_currents(table, bus_name, i_name)
1598
- if not rest_switches_absent[table]
1599
- else pd.DataFrame(columns=["bus", "element", "et", "i_ka"])
1616
+ (
1617
+ join_currents(table, bus_name, i_name)
1618
+ if not rest_switches_absent[table]
1619
+ else pd.DataFrame(columns=["bus", "element", "et", "i_ka"])
1620
+ )
1600
1621
  for table, attr_names in switch_attrs.items()
1601
1622
  for bus_name, i_name in attr_names.items()
1602
1623
  ]
@@ -151,9 +151,12 @@ class PgmJsonConverter(BaseConverter[StructuredData]):
151
151
 
152
152
  # If an attribute doesn't exist, it is added to the extra_info lookup table
153
153
  elif extra_info is not None:
154
- if obj["id"] not in extra_info:
155
- extra_info[obj["id"]] = {}
156
- extra_info[obj["id"]][attribute] = value
154
+ obj_id = obj["id"]
155
+ if not isinstance(obj_id, int):
156
+ raise ValueError(f"Invalid 'id' value for {component} {data_type} data")
157
+ if obj_id not in extra_info:
158
+ extra_info[obj_id] = {}
159
+ extra_info[obj_id][attribute] = value
157
160
  return array
158
161
 
159
162
  def _serialize_data(self, data: Dataset, extra_info: Optional[ExtraInfo]) -> StructuredData:
@@ -271,7 +274,7 @@ class PgmJsonConverter(BaseConverter[StructuredData]):
271
274
  self._extract_extra_component_info(component, entry, reserialized_data, extra_info)
272
275
 
273
276
  def _extract_extra_component_info(
274
- self, component: str, attributes: Dict[str, Any], reserialized_data: SingleDataset, extra_info: ExtraInfo
277
+ self, component: str, attributes: Dict[str, Any], reserialized_data: SinglePythonDataset, extra_info: ExtraInfo
275
278
  ):
276
279
  entry_id = attributes["id"]
277
280
  reserialized_entry = self._get_first_by(reserialized_data[component], "id", entry_id)
@@ -180,6 +180,8 @@ class TabularConverter(BaseConverter[TabularData]):
180
180
 
181
181
  if "filters" in attributes:
182
182
  table_mask = self._parse_table_filters(data=data, table=table, filtering_functions=attributes["filters"])
183
+ if table_mask is not None and not table_mask.any():
184
+ return None
183
185
  else:
184
186
  table_mask = None
185
187
 
@@ -219,7 +221,7 @@ class TabularConverter(BaseConverter[TabularData]):
219
221
  for filtering_fn in filtering_functions:
220
222
  for fn_name, kwargs in filtering_fn.items():
221
223
  fn_ptr = get_function(fn_name)
222
- table_mask &= data[table].apply(fn_ptr, axis=1, **kwargs).values
224
+ table_mask &= cast(pd.DataFrame, data[table]).apply(fn_ptr, axis=1, **kwargs).values
223
225
  return table_mask
224
226
 
225
227
  # pylint: disable = too-many-arguments
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: power-grid-model-io
3
- Version: 1.2.95
3
+ Version: 1.2.97
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
@@ -822,6 +822,7 @@ def test_create_pgm_input_shunts(mock_init_array: MagicMock, two_pp_objs, conver
822
822
 
823
823
  @patch("power_grid_model_io.converters.pandapower_converter.initialize_array")
824
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.less", new=lambda x, _, **kwargs: x)
825
826
  @patch("power_grid_model_io.converters.pandapower_converter.np.divide", new=lambda x, _, **kwargs: x)
826
827
  @patch("power_grid_model_io.converters.pandapower_converter.np.bitwise_and", new=lambda x, _: x)
827
828
  @patch("power_grid_model_io.converters.pandapower_converter.np.logical_and", new=lambda x, _: x)
@@ -1031,7 +1032,14 @@ def test_create_pgm_input_sym_gens(mock_init_array: MagicMock, two_pp_objs, conv
1031
1032
 
1032
1033
  @pytest.mark.parametrize(
1033
1034
  "kwargs",
1034
- [{"vk0_percent": 2}, {"vkr0_percent": 1}, {"mag0_percent": 5}, {"mag0_rx": 0.2}, {"si0_hv_partial": 0.3}],
1035
+ [
1036
+ {"pfe_kw": 2},
1037
+ {"vk0_percent": 2},
1038
+ {"vkr0_percent": 1},
1039
+ {"mag0_percent": 5},
1040
+ {"mag0_rx": 0.2},
1041
+ {"si0_hv_partial": 0.3},
1042
+ ],
1035
1043
  )
1036
1044
  @patch(
1037
1045
  "power_grid_model_io.converters.pandapower_converter.PandaPowerConverter.get_switch_states",
@@ -1049,11 +1057,14 @@ def test_create_pgm_input_sym_gens(mock_init_array: MagicMock, two_pp_objs, conv
1049
1057
  "power_grid_model_io.converters.pandapower_converter.PandaPowerConverter._get_pgm_ids",
1050
1058
  new=MagicMock(return_value=pd.Series([0])),
1051
1059
  )
1052
- def test_create_pgm_input_transformers__zero_sequence(kwargs) -> None:
1060
+ def test_create_pgm_input_transformers__warnings(kwargs) -> None:
1053
1061
  # Arrange
1054
1062
  pp_net: pp.pandapowerNet = pp.create_empty_network()
1055
1063
  pp.create_bus(net=pp_net, vn_kv=0.0)
1056
1064
  args = [0, 0, 0, 0, 0, 0, 0, 0, 0]
1065
+ if "pfe_kw" in kwargs:
1066
+ args[-2] = kwargs["pfe_kw"]
1067
+ kwargs = {}
1057
1068
  pp.create_transformer_from_parameters(pp_net, *args, **kwargs)
1058
1069
 
1059
1070
  converter = PandaPowerConverter()
@@ -1387,6 +1398,7 @@ def test_create_pgm_input_transformers3w__default() -> None:
1387
1398
  @pytest.mark.parametrize(
1388
1399
  "kwargs",
1389
1400
  [
1401
+ {"pfe_kw": 2},
1390
1402
  {"vk0_hv_percent": 1},
1391
1403
  {"vkr0_hv_percent": 2},
1392
1404
  {"vk0_mv_percent": 3},
@@ -1411,11 +1423,14 @@ def test_create_pgm_input_transformers3w__default() -> None:
1411
1423
  "power_grid_model_io.converters.pandapower_converter.PandaPowerConverter._get_pgm_ids",
1412
1424
  new=MagicMock(return_value=pd.Series([0])),
1413
1425
  )
1414
- def test_create_pgm_input_transformers3w__zero_sequence(kwargs) -> None:
1426
+ def test_create_pgm_input_transformers3w__warnings(kwargs) -> None:
1415
1427
  # Arrange
1416
1428
  pp_net: pp.pandapowerNet = pp.create_empty_network()
1417
1429
  pp.create_bus(net=pp_net, vn_kv=0.0)
1418
1430
  args = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
1431
+ if "pfe_kw" in kwargs:
1432
+ args[-2] = kwargs["pfe_kw"]
1433
+ kwargs = {}
1419
1434
  pp.create_transformer3w_from_parameters(pp_net, *args, **kwargs)
1420
1435
 
1421
1436
  converter = PandaPowerConverter()
@@ -51,16 +51,16 @@ def tabular_data():
51
51
  )
52
52
  lines = pd.DataFrame(data=[[1, 100], [2, 200]], columns=["id_number", "from_node_side"])
53
53
  loads = pd.DataFrame(data=[[1, 1, 1], [2, 2, 0]], columns=["id_number", "node_id", "switching_status"])
54
- tabular_data = TabularData(nodes=nodes, lines=lines, loads=loads)
55
- return tabular_data
54
+ sources = pd.DataFrame(columns=["id_number", "node_side"])
55
+ return TabularData(nodes=nodes, lines=lines, loads=loads, sources=sources)
56
56
 
57
57
 
58
58
  @pytest.fixture
59
59
  def tabular_data_no_units_no_substitutions():
60
60
  nodes = pd.DataFrame(data=[[1, 10.5e3], [2, 400.0]], columns=["id_number", "u_nom"])
61
61
  lines = pd.DataFrame(data=[[1, 2], [3, 1]], columns=["id_number", "from_node_side"])
62
- tabular_data = TabularData(nodes=nodes, lines=lines)
63
- return tabular_data
62
+ sources = pd.DataFrame(columns=["id_number", "node_side"])
63
+ return TabularData(nodes=nodes, lines=lines, sources=sources)
64
64
 
65
65
 
66
66
  def test_set_mapping_file(converter: TabularConverter):
@@ -175,6 +175,31 @@ def test_convert_table_to_component__filters(
175
175
  )
176
176
 
177
177
 
178
+ def test_convert_table_to_component__filters_all_false(
179
+ converter: TabularConverter, tabular_data_no_units_no_substitutions: TabularData
180
+ ):
181
+ converter._convert_col_def_to_attribute = MagicMock()
182
+ converter._parse_table_filters = MagicMock()
183
+ converter._parse_table_filters.side_effect = np.array([False, False])
184
+ node_attributes_with_filter = {"id": "id_number", "u_rated": "u_nom", "filters": [{"test_fn": {}}]}
185
+ actual = converter._convert_table_to_component(
186
+ data=tabular_data_no_units_no_substitutions,
187
+ data_type="input",
188
+ table="nodes",
189
+ component="node",
190
+ attributes=node_attributes_with_filter,
191
+ extra_info=None,
192
+ )
193
+
194
+ assert actual is None
195
+ converter._parse_table_filters.assert_called_once_with(
196
+ data=tabular_data_no_units_no_substitutions,
197
+ table="nodes",
198
+ filtering_functions=node_attributes_with_filter["filters"],
199
+ )
200
+ converter._convert_col_def_to_attribute.assert_not_called()
201
+
202
+
178
203
  def test_convert_col_def_to_attribute(
179
204
  converter: TabularConverter,
180
205
  tabular_data_no_units_no_substitutions: TabularData,
@@ -1 +0,0 @@
1
- 1.2.95