power-grid-model-io 1.2.73__tar.gz → 1.2.74__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 (130) hide show
  1. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/PKG-INFO +1 -1
  2. power-grid-model-io-1.2.74/PYPI_VERSION +1 -0
  3. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/converters/vision_excel_converter.py +12 -6
  4. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/data_stores/base_data_store.py +15 -0
  5. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/data_stores/excel_file_store.py +54 -3
  6. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/data_stores/vision_excel_file_store.py +9 -2
  7. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/utils/uuid_excel_cvtr.py +35 -9
  8. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io.egg-info/PKG-INFO +1 -1
  9. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/utils/test_uuid_excel_cvtr.py +4 -1
  10. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/validation/converters/test_vision_excel_converter.py +16 -0
  11. power-grid-model-io-1.2.73/PYPI_VERSION +0 -1
  12. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/LICENSE +0 -0
  13. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/MANIFEST.in +0 -0
  14. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/README.md +0 -0
  15. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/VERSION +0 -0
  16. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/pyproject.toml +0 -0
  17. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/setup.cfg +0 -0
  18. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/setup.py +0 -0
  19. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/__init__.py +0 -0
  20. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/config/__init__.py +0 -0
  21. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/config/examples/__init__.py +0 -0
  22. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/config/examples/multipliers.yaml +0 -0
  23. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/config/excel/__init__.py +0 -0
  24. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/config/excel/vision_en.yaml +0 -0
  25. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/config/excel/vision_nl.yaml +0 -0
  26. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/converters/__init__.py +0 -0
  27. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/converters/base_converter.py +0 -0
  28. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/converters/pandapower_converter.py +0 -0
  29. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/converters/pgm_json_converter.py +0 -0
  30. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/converters/tabular_converter.py +0 -0
  31. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/data_stores/__init__.py +0 -0
  32. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/data_stores/csv_dir_store.py +0 -0
  33. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/data_stores/json_file_store.py +0 -0
  34. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/data_types/__init__.py +0 -0
  35. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/data_types/_data_types.py +0 -0
  36. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/data_types/tabular_data.py +0 -0
  37. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/functions/__init__.py +0 -0
  38. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/functions/_functions.py +0 -0
  39. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/functions/phase_to_phase.py +0 -0
  40. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/mappings/__init__.py +0 -0
  41. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/mappings/field_mapping.py +0 -0
  42. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/mappings/multiplier_mapping.py +0 -0
  43. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/mappings/tabular_mapping.py +0 -0
  44. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/mappings/unit_mapping.py +0 -0
  45. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/mappings/value_mapping.py +0 -0
  46. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/utils/__init__.py +0 -0
  47. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/utils/auto_id.py +0 -0
  48. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/utils/dict.py +0 -0
  49. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/utils/download.py +0 -0
  50. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/utils/json.py +0 -0
  51. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/utils/modules.py +0 -0
  52. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/utils/parsing.py +0 -0
  53. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io/utils/zip.py +0 -0
  54. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io.egg-info/SOURCES.txt +0 -0
  55. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io.egg-info/dependency_links.txt +0 -0
  56. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io.egg-info/requires.txt +0 -0
  57. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/src/power_grid_model_io.egg-info/top_level.txt +0 -0
  58. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/__init__.py +0 -0
  59. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/conftest.py +0 -0
  60. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/config/dummy_mapping.yaml +0 -0
  61. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/config/mapping.yaml +0 -0
  62. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/pandapower/pgm_asym_output_data.json +0 -0
  63. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/pandapower/pgm_asym_output_data.json.license +0 -0
  64. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/pandapower/pgm_input_data.json +0 -0
  65. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/pandapower/pgm_input_data.json.license +0 -0
  66. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/pandapower/pgm_output_data.json +0 -0
  67. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/pandapower/pgm_output_data.json.license +0 -0
  68. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/pandapower/pp_validation.py +0 -0
  69. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/vision/pgm_input_data_en.json +0 -0
  70. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/vision/pgm_input_data_en.json.license +0 -0
  71. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/vision/pgm_input_data_nl.json +0 -0
  72. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/vision/pgm_input_data_nl.json.license +0 -0
  73. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/vision/vision_97_en.xlsx +0 -0
  74. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/vision/vision_97_en.xlsx.license +0 -0
  75. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/vision/vision_9_5_en.yaml +0 -0
  76. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/vision/vision_9_5_nl.yaml +0 -0
  77. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/vision/vision_en.xlsx +0 -0
  78. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/vision/vision_en.xlsx.license +0 -0
  79. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/vision/vision_nl.xlsx +0 -0
  80. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/vision/vision_nl.xlsx.license +0 -0
  81. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/vision/vision_validation.vnf +0 -0
  82. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/vision/vision_validation.vnf.license +0 -0
  83. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/zip/foo-bar.zip +0 -0
  84. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/zip/foo-bar.zip.license +0 -0
  85. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/zip/foo.zip +0 -0
  86. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/data/zip/foo.zip.license +0 -0
  87. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/test_utils.py +0 -0
  88. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/__init__.py +0 -0
  89. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/conftest.py +0 -0
  90. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/converters/__init__.py +0 -0
  91. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/converters/test_base_converter.py +0 -0
  92. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/converters/test_pandapower_converter_input.py +0 -0
  93. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/converters/test_pandapower_converter_output.py +0 -0
  94. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/converters/test_pgm_json_converter.py +0 -0
  95. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/converters/test_tabular_converter.py +0 -0
  96. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/converters/test_vision_excel_converter.py +0 -0
  97. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/data_stores/__init__.py +0 -0
  98. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/data_stores/test_base_data_store.py +0 -0
  99. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/data_stores/test_csv_dir_store.py +0 -0
  100. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/data_stores/test_excel_file_store.py +0 -0
  101. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/data_stores/test_json_file_store.py +0 -0
  102. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/data_stores/test_vision_excel_file_store.py +0 -0
  103. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/data_types/__init__.py +0 -0
  104. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/data_types/test_data_types.py +0 -0
  105. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/data_types/test_tabular_data.py +0 -0
  106. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/functions/__init__.py +0 -0
  107. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/functions/test_functions.py +0 -0
  108. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/functions/test_phase_to_phase.py +0 -0
  109. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/mappings/__init__.py +0 -0
  110. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/mappings/test_field_mapping.py +0 -0
  111. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/mappings/test_multiplier_mapping.py +0 -0
  112. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/mappings/test_tabular_mapping.py +0 -0
  113. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/mappings/test_unit_mapping.py +0 -0
  114. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/mappings/test_value_mapping.py +0 -0
  115. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/utils/__init__.py +0 -0
  116. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/utils/test_auto_id.py +0 -0
  117. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/utils/test_dict.py +0 -0
  118. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/utils/test_download.py +0 -0
  119. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/utils/test_json.py +0 -0
  120. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/utils/test_modules.py +0 -0
  121. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/utils/test_parsing.py +0 -0
  122. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/unit/utils/test_zip.py +0 -0
  123. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/utils.py +0 -0
  124. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/validation/__init__.py +0 -0
  125. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/validation/conftest.py +0 -0
  126. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/validation/converters/__init__.py +0 -0
  127. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/validation/converters/test_pandapower_converter_input.py +0 -0
  128. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/validation/converters/test_pandapower_converter_output.py +0 -0
  129. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/tests/validation/test_test_utils.py +0 -0
  130. {power-grid-model-io-1.2.73 → power-grid-model-io-1.2.74}/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.73
3
+ Version: 1.2.74
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.74
@@ -11,6 +11,7 @@ from pathlib import Path
11
11
  from typing import Any, Mapping, Optional, Union
12
12
 
13
13
  from power_grid_model_io.converters.tabular_converter import TabularConverter
14
+ from power_grid_model_io.data_stores.base_data_store import LANGUAGE_EN
14
15
  from power_grid_model_io.data_stores.vision_excel_file_store import VisionExcelFileStore
15
16
 
16
17
  DEFAULT_MAPPING_FILE = Path(__file__).parent.parent / "config" / "excel" / "vision_{language:s}.yaml"
@@ -36,17 +37,22 @@ class VisionExcelConverter(TabularConverter):
36
37
  def __init__(
37
38
  self,
38
39
  source_file: Optional[Union[Path, str]] = None,
39
- language: str = "en",
40
- mapping_file: Optional[Path] = None,
40
+ language: str = LANGUAGE_EN,
41
+ terms_changed: Optional[dict] = None,
42
+ mapping_file: Optional[Union[Path, str]] = None,
41
43
  log_level: int = logging.INFO,
42
- ):
43
- _mapping_file = _mapping_file = (
44
- mapping_file if mapping_file is not None else Path(str(DEFAULT_MAPPING_FILE).format(language=language))
44
+ ): # pylint: disable=too-many-arguments
45
+ _mapping_file = Path(
46
+ mapping_file if mapping_file is not None else str(DEFAULT_MAPPING_FILE).format(language=language)
45
47
  )
46
48
  if not _mapping_file.exists():
47
49
  raise FileNotFoundError(f"No Vision Excel mapping available for language '{language}'")
48
50
  self._id_reference: Optional[IdReferenceFields] = None
49
- source = VisionExcelFileStore(file_path=Path(source_file)) if source_file else None
51
+ source = (
52
+ VisionExcelFileStore(file_path=Path(source_file), language=language, terms_changed=terms_changed)
53
+ if source_file
54
+ else None
55
+ )
50
56
  super().__init__(mapping_file=_mapping_file, source=source, log_level=log_level)
51
57
 
52
58
  def set_mapping(self, mapping: Mapping[str, Any]) -> None:
@@ -12,6 +12,21 @@ import structlog
12
12
 
13
13
  T = TypeVar("T")
14
14
 
15
+ LANGUAGE_EN = "en"
16
+ LANGUAGE_NL = "nl"
17
+ DICT_KEY_NUMBER = "key_number"
18
+ DICT_KEY_SUBNUMBER = "key_subnumber"
19
+ VISION_EXCEL_LAN_DICT = {
20
+ LANGUAGE_EN: {
21
+ DICT_KEY_NUMBER: "Number",
22
+ DICT_KEY_SUBNUMBER: "Subnumber",
23
+ },
24
+ LANGUAGE_NL: {
25
+ DICT_KEY_NUMBER: "Nummer",
26
+ DICT_KEY_SUBNUMBER: "Subnummer",
27
+ },
28
+ }
29
+
15
30
 
16
31
  class BaseDataStore(Generic[T], ABC):
17
32
  """
@@ -11,8 +11,21 @@ from typing import Dict, List, Optional, Set, Tuple, Union
11
11
 
12
12
  import pandas as pd
13
13
 
14
- from power_grid_model_io.data_stores.base_data_store import BaseDataStore
14
+ from power_grid_model_io.data_stores.base_data_store import (
15
+ DICT_KEY_NUMBER,
16
+ DICT_KEY_SUBNUMBER,
17
+ VISION_EXCEL_LAN_DICT,
18
+ BaseDataStore,
19
+ )
15
20
  from power_grid_model_io.data_types import LazyDataFrame, TabularData
21
+ from power_grid_model_io.utils.uuid_excel_cvtr import (
22
+ UUID2IntCvtr,
23
+ add_guid_values_to_cvtr,
24
+ get_special_key_map,
25
+ special_nodes_en,
26
+ special_nodes_nl,
27
+ update_column_names,
28
+ )
16
29
 
17
30
 
18
31
  class ExcelFileStore(BaseDataStore[TabularData]):
@@ -28,9 +41,15 @@ class ExcelFileStore(BaseDataStore[TabularData]):
28
41
 
29
42
  _unnamed_pattern: re.Pattern = re.compile(r"Unnamed: \d+_level_\d+")
30
43
 
31
- def __init__(self, file_path: Optional[Path] = None, **extra_paths: Path):
44
+ def __init__(
45
+ self,
46
+ file_path: Optional[Path] = None,
47
+ *,
48
+ language: str = "en",
49
+ terms_changed: Optional[dict] = None,
50
+ **extra_paths: Path,
51
+ ):
32
52
  super().__init__()
33
-
34
53
  # Create a dictionary of all supplied file paths:
35
54
  # {"": file_path, extra_name[0]: extra_path[0], extra_name[1]: extra_path[1], ...}
36
55
  self._file_paths: Dict[str, Path] = {}
@@ -45,6 +64,10 @@ class ExcelFileStore(BaseDataStore[TabularData]):
45
64
  raise ValueError(f"{name} file should be a .xls or .xlsx file, {path.suffix} provided.")
46
65
 
47
66
  self._header_rows: List[int] = [0]
67
+ self._language = language
68
+ self._vision_excel_key_mapping = VISION_EXCEL_LAN_DICT[self._language]
69
+ self._terms_changed = terms_changed if terms_changed is not None else {}
70
+ self._uuid_cvtr = UUID2IntCvtr()
48
71
 
49
72
  def files(self) -> Dict[str, Path]:
50
73
  """
@@ -68,6 +91,8 @@ class ExcelFileStore(BaseDataStore[TabularData]):
68
91
  sheet_data = xls_file.parse(xls_sheet_name, header=self._header_rows)
69
92
  sheet_data = self._remove_unnamed_column_placeholders(data=sheet_data)
70
93
  sheet_data = self._handle_duplicate_columns(data=sheet_data, sheet_name=xls_sheet_name)
94
+ sheet_data = self._process_uuid_columns(data=sheet_data, sheet_name=xls_sheet_name)
95
+ sheet_data = self._update_column_names(data=sheet_data)
71
96
  return sheet_data
72
97
 
73
98
  return sheet_loader
@@ -197,6 +222,32 @@ class ExcelFileStore(BaseDataStore[TabularData]):
197
222
 
198
223
  return to_rename
199
224
 
225
+ def _process_uuid_columns(self, data: pd.DataFrame, sheet_name: str) -> pd.DataFrame:
226
+ first_level = data.columns.get_level_values(0)
227
+ guid_columns = first_level[first_level.str.endswith("GUID")]
228
+
229
+ sheet_key_mapping = get_special_key_map(
230
+ sheet_name=sheet_name, nodes_en=special_nodes_en, nodes_nl=special_nodes_nl
231
+ )
232
+
233
+ for guid_column in guid_columns:
234
+ nr = VISION_EXCEL_LAN_DICT[self._language][DICT_KEY_NUMBER]
235
+ add_guid_values_to_cvtr(data, guid_column, self._uuid_cvtr)
236
+ new_column_name = guid_column.replace("GUID", nr)
237
+ if guid_column == "GUID" and sheet_key_mapping not in (None, {}):
238
+ new_column_name = guid_column.replace("GUID", sheet_key_mapping[DICT_KEY_SUBNUMBER])
239
+ guid_column_pos = first_level.tolist().index(guid_column)
240
+ try:
241
+ data.insert(guid_column_pos + 1, new_column_name, data[guid_column].apply(self._uuid_cvtr.query))
242
+ except ValueError:
243
+ data[new_column_name] = data[guid_column].apply(self._uuid_cvtr.query)
244
+
245
+ return data
246
+
247
+ def _update_column_names(self, data: pd.DataFrame) -> pd.DataFrame:
248
+ update_column_names(data, self._terms_changed)
249
+ return data
250
+
200
251
  @staticmethod
201
252
  def _group_columns_by_index(data: pd.DataFrame) -> Dict[Union[str, Tuple[str, ...]], Set[int]]:
202
253
  grouped: Dict[Union[str, Tuple[str, ...]], Set[int]] = {}
@@ -5,7 +5,9 @@
5
5
  Vision Excel file store
6
6
  """
7
7
  from pathlib import Path
8
+ from typing import Optional
8
9
 
10
+ from power_grid_model_io.data_stores.base_data_store import LANGUAGE_EN
9
11
  from power_grid_model_io.data_stores.excel_file_store import ExcelFileStore
10
12
 
11
13
 
@@ -17,10 +19,15 @@ class VisionExcelFileStore(ExcelFileStore):
17
19
  Therefore, row 1 (which is row 2 in Excel) is added to the header_rows in the constructor.
18
20
  """
19
21
 
20
- def __init__(self, file_path: Path):
22
+ def __init__(
23
+ self,
24
+ file_path: Path,
25
+ language: str = LANGUAGE_EN,
26
+ terms_changed: Optional[dict] = None,
27
+ ):
21
28
  """
22
29
  Args:
23
30
  file_path: The main Vision Excel export file
24
31
  """
25
- super().__init__(file_path)
32
+ super().__init__(file_path, language=language, terms_changed=terms_changed)
26
33
  self._header_rows.append(1) # Units are stored in the row below the column names
@@ -15,10 +15,19 @@
15
15
 
16
16
  import os
17
17
  import re
18
- from typing import Optional
18
+ from pathlib import Path
19
+ from typing import Optional, Union
19
20
 
20
21
  import pandas as pd
21
22
 
23
+ from power_grid_model_io.data_stores.base_data_store import (
24
+ DICT_KEY_NUMBER,
25
+ DICT_KEY_SUBNUMBER,
26
+ LANGUAGE_EN,
27
+ LANGUAGE_NL,
28
+ VISION_EXCEL_LAN_DICT,
29
+ )
30
+
22
31
  special_nodes_en = [
23
32
  "Transformer loads",
24
33
  "Sources",
@@ -111,7 +120,7 @@ class UUID2IntCvtr:
111
120
  return self._counter
112
121
 
113
122
 
114
- def load_excel_file(file_name: str) -> pd.ExcelFile:
123
+ def load_excel_file(file_name: Union[Path, str]) -> pd.ExcelFile:
115
124
  """Load an excel file
116
125
 
117
126
  Args:
@@ -147,6 +156,20 @@ def add_guid_values_to_cvtr(df: pd.DataFrame, guid_column: str, cvtr: UUID2IntCv
147
156
  cvtr.add_list(df[guid_column].tolist())
148
157
 
149
158
 
159
+ def get_special_key_map(sheet_name: str, nodes_en: list[str], nodes_nl: list[str]) -> dict:
160
+ """Get the special nodes for English and Dutch
161
+
162
+ Args:
163
+ sheet_name (str): the sheet name
164
+ mapping (dict): the mapping dictionary
165
+ """
166
+ if sheet_name in nodes_en:
167
+ return VISION_EXCEL_LAN_DICT[LANGUAGE_EN]
168
+ if sheet_name in nodes_nl:
169
+ return VISION_EXCEL_LAN_DICT[LANGUAGE_NL]
170
+ return {}
171
+
172
+
150
173
  def insert_or_update_number_column(
151
174
  df: pd.DataFrame, guid_column: str, sheet_name: str, cvtr: UUID2IntCvtr, number: str
152
175
  ) -> None:
@@ -159,11 +182,10 @@ def insert_or_update_number_column(
159
182
  number (str): "Number" or "Nummer" depending on the language
160
183
  """
161
184
  new_column_name = guid_column.replace("GUID", number)
162
- if guid_column == "GUID":
163
- if sheet_name in special_nodes_en:
164
- new_column_name = guid_column.replace("GUID", "Subnumber")
165
- elif sheet_name in special_nodes_nl:
166
- new_column_name = guid_column.replace("GUID", "Subnummer")
185
+ special_key_mapping = get_special_key_map(sheet_name, special_nodes_en, special_nodes_nl)
186
+
187
+ if guid_column == "GUID" and special_key_mapping not in (None, {}):
188
+ new_column_name = guid_column.replace("GUID", special_key_mapping[DICT_KEY_SUBNUMBER])
167
189
  try:
168
190
  df.insert(df.columns.get_loc(guid_column) + 1, new_column_name, df[guid_column].apply(cvtr.query))
169
191
  except ValueError:
@@ -196,11 +218,15 @@ def save_df_to_excel(df: pd.DataFrame, file_name: str, sheet_name: str, i: int)
196
218
  df.to_excel(writer, sheet_name=sheet_name, index=False)
197
219
 
198
220
 
199
- def convert_guid_vision_excel(excel_file: str, number: str = "Number", terms_changed: Optional[dict] = None) -> str:
221
+ def convert_guid_vision_excel(
222
+ excel_file: Union[Path, str],
223
+ number: str = VISION_EXCEL_LAN_DICT[LANGUAGE_EN][DICT_KEY_NUMBER],
224
+ terms_changed: Optional[dict] = None,
225
+ ) -> str:
200
226
  """Main entry function. Convert the GUID based Vision excel files to a number based format
201
227
 
202
228
  Args:
203
- excel_file (str): Vision excel file name
229
+ excel_file (Path | str): Vision excel file name
204
230
  number (str): "Number" or "Nummer" depending on the language. Defaults to "Number".
205
231
  terms_changed (dict): the dictionary containing the terms to be changed. Defaults to {}.
206
232
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: power-grid-model-io
3
- Version: 1.2.73
3
+ Version: 1.2.74
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
@@ -5,6 +5,7 @@
5
5
  from pathlib import Path
6
6
 
7
7
  from power_grid_model_io.converters import VisionExcelConverter
8
+ from power_grid_model_io.data_stores.base_data_store import DICT_KEY_NUMBER, LANGUAGE_EN, VISION_EXCEL_LAN_DICT
8
9
  from power_grid_model_io.utils.uuid_excel_cvtr import convert_guid_vision_excel
9
10
 
10
11
  terms_chaged = {"Grounding1": "N1", "Grounding2": "N2", "Grounding3": "N3", "Load.Behaviour": "Behaviour"}
@@ -15,7 +16,9 @@ REFERENCE_FILE = DATA_DIR / "vision_en.xlsx"
15
16
 
16
17
 
17
18
  def test_convert_guid_vision_excel():
18
- new_file = convert_guid_vision_excel(SOURCE_FILE, number="Number", terms_changed=terms_chaged)
19
+ new_file = convert_guid_vision_excel(
20
+ SOURCE_FILE, number=VISION_EXCEL_LAN_DICT[LANGUAGE_EN][DICT_KEY_NUMBER], terms_changed=terms_chaged
21
+ )
19
22
  vision_cvtr_new = VisionExcelConverter(source_file=new_file)
20
23
  vision_cvtr_ref = VisionExcelConverter(source_file=REFERENCE_FILE)
21
24
 
@@ -13,17 +13,22 @@ import pytest
13
13
  from power_grid_model.data_types import SingleDataset
14
14
 
15
15
  from power_grid_model_io.converters import VisionExcelConverter
16
+ from power_grid_model_io.data_stores.base_data_store import DICT_KEY_NUMBER, LANGUAGE_EN, VISION_EXCEL_LAN_DICT
16
17
  from power_grid_model_io.data_types import ExtraInfo
17
18
  from power_grid_model_io.utils.json import JsonEncoder
19
+ from power_grid_model_io.utils.uuid_excel_cvtr import convert_guid_vision_excel
18
20
 
19
21
  from ..utils import compare_extra_info, component_attributes, component_objects, load_json_single_dataset, select_values
20
22
 
21
23
  DATA_PATH = Path(__file__).parents[2] / "data" / "vision"
22
24
  SOURCE_FILE = DATA_PATH / "vision_{language:s}.xlsx"
25
+ SOURCE_FILE_97 = DATA_PATH / "vision_97_{language:s}.xlsx"
23
26
  VALIDATION_FILE = DATA_PATH / "pgm_input_data_{language:s}.json"
24
27
  LANGUAGES = ["en", "nl"]
28
+ LANGUAGES_97 = ["en"]
25
29
  VALIDATION_EN = Path(str(VALIDATION_FILE).format(language="en"))
26
30
  CUSTOM_MAPPING_FILE = DATA_PATH / "vision_9_5_{language:s}.yaml"
31
+ terms_changed = {"Grounding1": "N1", "Grounding2": "N2", "Grounding3": "N3", "Load.Behaviour": "Behaviour"}
27
32
 
28
33
 
29
34
  @lru_cache
@@ -297,3 +302,14 @@ def test_log_levels(capsys):
297
302
  cvtr5.set_log_level(logging.CRITICAL)
298
303
  outerr = capsys.readouterr()
299
304
  assert "debug" not in outerr.out
305
+
306
+
307
+ def test_uuid_excel_input():
308
+ source_file = Path(str(SOURCE_FILE_97).format(language=LANGUAGE_EN))
309
+ ref_file_97 = convert_guid_vision_excel(
310
+ excel_file=source_file, number=VISION_EXCEL_LAN_DICT[LANGUAGE_EN][DICT_KEY_NUMBER], terms_changed=terms_changed
311
+ )
312
+ data_native, _ = VisionExcelConverter(source_file, language="en", terms_changed=terms_changed).load_input_data()
313
+ data_convtd, _ = VisionExcelConverter(source_file=ref_file_97).load_input_data()
314
+
315
+ assert len(data_native) == len(data_convtd)
@@ -1 +0,0 @@
1
- 1.2.73