anemoi-datasets 0.5.11__tar.gz → 0.5.13__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.
Files changed (374) hide show
  1. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/.pre-commit-config.yaml +1 -1
  2. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/CHANGELOG.md +10 -2
  3. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/PKG-INFO +2 -2
  4. anemoi_datasets-0.5.13/docs/building/filters/orog_to_z.rst +17 -0
  5. anemoi_datasets-0.5.13/docs/building/filters/sum.rst +13 -0
  6. anemoi_datasets-0.5.13/docs/building/filters/wz_to_w.rst +12 -0
  7. anemoi_datasets-0.5.13/docs/building/filters/yaml/orog_to_z.yaml +10 -0
  8. anemoi_datasets-0.5.13/docs/building/filters/yaml/sum.yaml +13 -0
  9. anemoi_datasets-0.5.13/docs/building/filters/yaml/wz_to_w.yaml +10 -0
  10. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/filters.rst +3 -0
  11. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/introduction.rst +33 -32
  12. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/accumulations1.yaml +1 -1
  13. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/accumulations2.yaml +1 -1
  14. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/index.rst +4 -0
  15. anemoi_datasets-0.5.13/docs/naming_conventions.rst +8 -0
  16. anemoi_datasets-0.5.13/docs/using/code/complement1_.py +6 -0
  17. anemoi_datasets-0.5.13/docs/using/code/complement2_.py +12 -0
  18. anemoi_datasets-0.5.13/docs/using/code/complement3_.py +4 -0
  19. anemoi_datasets-0.5.13/docs/using/code/number1_.py +4 -0
  20. anemoi_datasets-0.5.13/docs/using/code/number2_.py +4 -0
  21. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/combining.rst +29 -0
  22. anemoi_datasets-0.5.13/docs/using/ensembles.rst +27 -0
  23. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/selecting.rst +25 -1
  24. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/_version.py +2 -2
  25. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/__init__.py +8 -4
  26. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/check.py +1 -1
  27. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/__init__.py +15 -1
  28. anemoi_datasets-0.5.13/src/anemoi/datasets/create/functions/filters/orog_to_z.py +58 -0
  29. anemoi_datasets-0.5.13/src/anemoi/datasets/create/functions/filters/sum.py +71 -0
  30. anemoi_datasets-0.5.13/src/anemoi/datasets/create/functions/filters/wz_to_w.py +79 -0
  31. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/accumulations.py +1 -0
  32. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/xarray/__init__.py +3 -3
  33. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/xarray/field.py +5 -1
  34. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/xarray/fieldlist.py +10 -1
  35. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/xarray/metadata.py +5 -11
  36. anemoi_datasets-0.5.13/src/anemoi/datasets/create/functions/sources/xarray/patch.py +44 -0
  37. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/xarray/time.py +15 -0
  38. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/xarray/variable.py +18 -2
  39. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/input/repeated_dates.py +18 -0
  40. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/statistics/__init__.py +2 -2
  41. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/utils.py +4 -0
  42. anemoi_datasets-0.5.13/src/anemoi/datasets/data/complement.py +164 -0
  43. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/dataset.py +74 -6
  44. anemoi_datasets-0.5.13/src/anemoi/datasets/data/ensemble.py +93 -0
  45. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/grids.py +6 -4
  46. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/join.py +7 -1
  47. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/merge.py +3 -0
  48. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/misc.py +10 -1
  49. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/grids.py +23 -10
  50. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi_datasets.egg-info/PKG-INFO +2 -2
  51. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi_datasets.egg-info/SOURCES.txt +18 -0
  52. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/xarray/test_samples.py +1 -1
  53. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/xarray/test_zarr.py +3 -3
  54. anemoi_datasets-0.5.11/src/anemoi/datasets/data/ensemble.py +0 -38
  55. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/.gitattributes +0 -0
  56. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/.github/CODEOWNERS +0 -0
  57. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  58. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/.github/ci-config.yml +0 -0
  59. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/.github/ci-hpc-config.yml +0 -0
  60. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/.github/workflows/changelog-pr-update.yml +0 -0
  61. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/.github/workflows/changelog-release-update.yml +0 -0
  62. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/.github/workflows/ci.yml +0 -0
  63. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/.github/workflows/label-public-pr.yml +0 -0
  64. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/.github/workflows/push-to-private.yml +0 -0
  65. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/.github/workflows/python-publish.yml +0 -0
  66. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/.github/workflows/python-pull-request.yml +0 -0
  67. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/.github/workflows/readthedocs-pr-update.yml +0 -0
  68. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/.gitignore +0 -0
  69. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/.readthedocs.yaml +0 -0
  70. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/.vscode/spellright.dict +0 -0
  71. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/CONTRIBUTORS.md +0 -0
  72. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/LICENSE +0 -0
  73. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/README.md +0 -0
  74. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/Makefile +0 -0
  75. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/_static/logo.png +0 -0
  76. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/_static/style.css +0 -0
  77. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/_templates/.gitkeep +0 -0
  78. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/apply-fmt.sh +0 -0
  79. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/advanced-options.rst +0 -0
  80. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/filters/empty.rst +0 -0
  81. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/filters/noop.rst +0 -0
  82. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/filters/rename.rst +0 -0
  83. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/filters/rotate_winds.rst +0 -0
  84. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/filters/select.rst +0 -0
  85. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/filters/unrotate_winds.rst +0 -0
  86. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/filters/yaml/rename.yaml +0 -0
  87. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/handling-missing-dates.rst +0 -0
  88. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/handling-missing-values.rst +0 -0
  89. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/incremental.rst +0 -0
  90. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/naming-variables.rst +0 -0
  91. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/operations.rst +0 -0
  92. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/accumulations.rst +0 -0
  93. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/forcings.rst +0 -0
  94. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/grib.rst +0 -0
  95. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/hindcasts.rst +0 -0
  96. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/mars.rst +0 -0
  97. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/netcdf.rst +0 -0
  98. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/opendap.rst +0 -0
  99. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/recentre.rst +0 -0
  100. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/repeated_dates.rst +0 -0
  101. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/xarray-based.rst +0 -0
  102. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/xarray-kerchunk.py +0 -0
  103. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/xarray-kerchunk.rst +0 -0
  104. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/xarray-zarr.rst +0 -0
  105. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/forcings.yaml +0 -0
  106. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/grib1.yaml +0 -0
  107. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/grib2.yaml +0 -0
  108. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/grib3.yaml +0 -0
  109. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/grib4.yaml +0 -0
  110. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/hindcasts.yaml +0 -0
  111. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/mars1.yaml +0 -0
  112. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/mars2.yaml +0 -0
  113. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/netcdf.yaml +0 -0
  114. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/opendap.yaml +0 -0
  115. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/recentre.yaml +0 -0
  116. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/repeated_dates1.yaml +0 -0
  117. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/repeated_dates2.yaml +0 -0
  118. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/repeated_dates3.yaml +0 -0
  119. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/repeated_dates4.yaml +0 -0
  120. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/xarray-based.yaml +0 -0
  121. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/xarray-kerchunk.yaml +0 -0
  122. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/xarray-zarr.yaml +0 -0
  123. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/yaml/zenodo.yaml +0 -0
  124. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources/zenodo.rst +0 -0
  125. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/sources.rst +0 -0
  126. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/statistics.rst +0 -0
  127. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/syntax.yaml +0 -0
  128. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/yaml/Makefile +0 -0
  129. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/yaml/building1.txt +0 -0
  130. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/yaml/building1.yaml +0 -0
  131. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/yaml/building2.txt +0 -0
  132. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/yaml/building2.yaml +0 -0
  133. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/yaml/building3.txt +0 -0
  134. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/yaml/building3.yaml +0 -0
  135. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/yaml/concat.yaml +0 -0
  136. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/yaml/hindcasts.yaml +0 -0
  137. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/yaml/input.yaml +0 -0
  138. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/yaml/missing_dates.yaml +0 -0
  139. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/yaml/nan.yaml +0 -0
  140. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/building/yaml/pipe.yaml +0 -0
  141. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/check-index.sh +0 -0
  142. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/cli/compare.rst +0 -0
  143. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/cli/copy.rst +0 -0
  144. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/cli/create.rst +0 -0
  145. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/cli/inspect.rst +0 -0
  146. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/cli/introduction.rst +0 -0
  147. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/cli/scan.rst +0 -0
  148. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/conf.py +0 -0
  149. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/images.pptx +0 -0
  150. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/installing.rst +0 -0
  151. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/overview.rst +0 -0
  152. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/overview_.py +0 -0
  153. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/schemas/matrix.excalidraw +0 -0
  154. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/schemas/matrix.png +0 -0
  155. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/schemas/overview.excalidraw +0 -0
  156. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/schemas/overview.png +0 -0
  157. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/schemas/recipe.excalidraw +0 -0
  158. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/schemas/recipe.png +0 -0
  159. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/area1_.py +0 -0
  160. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/area2_.py +0 -0
  161. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/chain_.py +0 -0
  162. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/combine_example.py +0 -0
  163. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/concat1.py +0 -0
  164. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/cutout_.py +0 -0
  165. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/drop_.py +0 -0
  166. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/end_.py +0 -0
  167. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/ensembles1_.py +0 -0
  168. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/fill_missing_dates1_.py +0 -0
  169. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/fill_missing_dates2_.py +0 -0
  170. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/fill_missing_gaps_.py +0 -0
  171. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/frequency1_.py +0 -0
  172. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/frequency2_.py +0 -0
  173. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/grids1_.py +0 -0
  174. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/iterating_missing_dates1_.py +0 -0
  175. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/iterating_missing_dates2_.py +0 -0
  176. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/iterating_missing_dates3_.py +0 -0
  177. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/join1.py +0 -0
  178. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/matching0_.py +0 -0
  179. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/matching1_.py +0 -0
  180. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/matching2_.py +0 -0
  181. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/matching3_.py +0 -0
  182. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/matching4_.py +0 -0
  183. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/misc1.py +0 -0
  184. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/misc2.py +0 -0
  185. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/missing_.py +0 -0
  186. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/open_cloud.py +0 -0
  187. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/open_combine1_.py +0 -0
  188. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/open_combine2_.py +0 -0
  189. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/open_complex.py +0 -0
  190. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/open_dict_.py +0 -0
  191. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/open_first_.py +0 -0
  192. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/open_list_.py +0 -0
  193. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/open_name.py +0 -0
  194. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/open_other.py +0 -0
  195. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/open_path.py +0 -0
  196. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/open_yaml_.py +0 -0
  197. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/rename_.py +0 -0
  198. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/reorder1_.py +0 -0
  199. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/reorder2_.py +0 -0
  200. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/rescale_.py +0 -0
  201. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/select1_.py +0 -0
  202. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/select2_.py +0 -0
  203. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/set_missing_dates_.py +0 -0
  204. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/shuffle_.py +0 -0
  205. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/some_attributes_.py +0 -0
  206. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/start_.py +0 -0
  207. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/statistics_.py +0 -0
  208. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/subset_example.py +0 -0
  209. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/thinning_.py +0 -0
  210. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/xy1_.py +0 -0
  211. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/xy2_.py +0 -0
  212. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/zip1_.py +0 -0
  213. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/zip2_.py +0 -0
  214. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/code/zip_xy_.py +0 -0
  215. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/configuration.rst +0 -0
  216. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/configuration.toml +0 -0
  217. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/grids.rst +0 -0
  218. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/images/area-1.png +0 -0
  219. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/images/concat.png +0 -0
  220. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/images/cutout-1.png +0 -0
  221. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/images/cutout-2.png +0 -0
  222. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/images/cutout-3.png +0 -0
  223. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/images/cutout-4.png +0 -0
  224. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/images/cutout-5.png +0 -0
  225. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/images/cutout-6.png +0 -0
  226. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/images/join.png +0 -0
  227. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/images/overlay.png +0 -0
  228. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/images/skip-missing.png +0 -0
  229. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/images/thinning-after.png +0 -0
  230. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/images/thinning-before.png +0 -0
  231. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/introduction.rst +0 -0
  232. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/matching.rst +0 -0
  233. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/methods.rst +0 -0
  234. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/miscellaneous.rst +0 -0
  235. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/missing.rst +0 -0
  236. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/opening.rst +0 -0
  237. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/other.rst +0 -0
  238. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/statistics.rst +0 -0
  239. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/subsetting.rst +0 -0
  240. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/docs/using/zip.rst +0 -0
  241. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/pyproject.toml +0 -0
  242. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/setup.cfg +0 -0
  243. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/__init__.py +0 -0
  244. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/__main__.py +0 -0
  245. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/commands/__init__.py +0 -0
  246. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/commands/cleanup.py +0 -0
  247. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/commands/compare.py +0 -0
  248. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/commands/copy.py +0 -0
  249. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/commands/create.py +0 -0
  250. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/commands/finalise-additions.py +0 -0
  251. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/commands/finalise.py +0 -0
  252. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/commands/init-additions.py +0 -0
  253. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/commands/init.py +0 -0
  254. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/commands/inspect.py +0 -0
  255. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/commands/load-additions.py +0 -0
  256. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/commands/load.py +0 -0
  257. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/commands/patch.py +0 -0
  258. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/commands/publish.py +0 -0
  259. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/commands/scan.py +0 -0
  260. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/compute/__init__.py +0 -0
  261. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/compute/recentre.py +0 -0
  262. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/chunks.py +0 -0
  263. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/config.py +0 -0
  264. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/filters/__init__.py +0 -0
  265. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/filters/empty.py +0 -0
  266. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/filters/noop.py +0 -0
  267. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/filters/pressure_level_relative_humidity_to_specific_humidity.py +0 -0
  268. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/filters/pressure_level_specific_humidity_to_relative_humidity.py +0 -0
  269. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/filters/rename.py +0 -0
  270. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/filters/rotate_winds.py +0 -0
  271. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/filters/single_level_dewpoint_to_relative_humidity.py +0 -0
  272. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/filters/single_level_relative_humidity_to_dewpoint.py +0 -0
  273. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/filters/single_level_relative_humidity_to_specific_humidity.py +0 -0
  274. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/filters/single_level_specific_humidity_to_relative_humidity.py +0 -0
  275. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/filters/speeddir_to_uv.py +0 -0
  276. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/filters/unrotate_winds.py +0 -0
  277. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/filters/uv_to_speeddir.py +0 -0
  278. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/__init__.py +0 -0
  279. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/constants.py +0 -0
  280. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/empty.py +0 -0
  281. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/forcings.py +0 -0
  282. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/grib.py +0 -0
  283. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/hindcasts.py +0 -0
  284. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/mars.py +0 -0
  285. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/netcdf.py +0 -0
  286. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/opendap.py +0 -0
  287. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/recentre.py +0 -0
  288. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/source.py +0 -0
  289. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/tendencies.py +0 -0
  290. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/xarray/coordinates.py +0 -0
  291. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/xarray/flavour.py +0 -0
  292. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/xarray/grid.py +0 -0
  293. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/xarray_kerchunk.py +0 -0
  294. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/xarray_zarr.py +0 -0
  295. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/functions/sources/zenodo.py +0 -0
  296. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/input/__init__.py +0 -0
  297. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/input/action.py +0 -0
  298. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/input/concat.py +0 -0
  299. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/input/context.py +0 -0
  300. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/input/data_sources.py +0 -0
  301. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/input/empty.py +0 -0
  302. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/input/filter.py +0 -0
  303. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/input/function.py +0 -0
  304. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/input/join.py +0 -0
  305. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/input/misc.py +0 -0
  306. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/input/pipe.py +0 -0
  307. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/input/result.py +0 -0
  308. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/input/step.py +0 -0
  309. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/input/template.py +0 -0
  310. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/input/trace.py +0 -0
  311. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/patch.py +0 -0
  312. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/persistent.py +0 -0
  313. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/size.py +0 -0
  314. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/statistics/summary.py +0 -0
  315. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/writer.py +0 -0
  316. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/create/zarr.py +0 -0
  317. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/__init__.py +0 -0
  318. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/concat.py +0 -0
  319. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/debug.css +0 -0
  320. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/debug.py +0 -0
  321. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/fill_missing.py +0 -0
  322. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/forwards.py +0 -0
  323. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/indexing.py +0 -0
  324. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/interpolate.py +0 -0
  325. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/masked.py +0 -0
  326. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/missing.py +0 -0
  327. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/rescale.py +0 -0
  328. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/select.py +0 -0
  329. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/statistics.py +0 -0
  330. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/stores.py +0 -0
  331. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/subset.py +0 -0
  332. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/unchecked.py +0 -0
  333. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/data/xy.py +0 -0
  334. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/dates/__init__.py +0 -0
  335. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/dates/groups.py +0 -0
  336. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/testing.py +0 -0
  337. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/utils/__init__.py +0 -0
  338. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi/datasets/utils/fields.py +0 -0
  339. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi_datasets.egg-info/dependency_links.txt +0 -0
  340. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi_datasets.egg-info/entry_points.txt +0 -0
  341. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi_datasets.egg-info/requires.txt +0 -0
  342. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/src/anemoi_datasets.egg-info/top_level.txt +0 -0
  343. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/create/concat.yaml +0 -0
  344. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/create/join.yaml +0 -0
  345. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/create/missing.yaml +0 -0
  346. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/create/nan.yaml +0 -0
  347. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/create/pipe.yaml +0 -0
  348. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/create/recentre.yaml +0 -0
  349. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/create/run.sh +0 -0
  350. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/create/test_create.py +0 -0
  351. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/create-perturbations-full.yaml +0 -0
  352. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/create-shift.yaml +0 -0
  353. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/test_chunks.py +0 -0
  354. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/test_data.py +0 -0
  355. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/test_dates.py +0 -0
  356. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/test_indexing.py +0 -0
  357. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/xarray/test_kerchunk.py +0 -0
  358. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/xarray/test_netcdf.py +0 -0
  359. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tests/xarray/test_opendap.py +0 -0
  360. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tools/.gitignore +0 -0
  361. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tools/examples/Makefile +0 -0
  362. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tools/examples/an-oper-2023-2023-2p5-6h-v1.yaml +0 -0
  363. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tools/grids/Makefile +0 -0
  364. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tools/grids/grids.ipynb +0 -0
  365. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tools/grids/grids1.yaml +0 -0
  366. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tools/grids/grids2.yaml +0 -0
  367. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tools/grids/grids3.yaml +0 -0
  368. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tools/grids/grids4.yaml +0 -0
  369. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tools/grids/grids5.yaml +0 -0
  370. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tools/grids/grids6.yaml +0 -0
  371. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tools/grids/grids7.yaml +0 -0
  372. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tools/grids/grids_multilam.ipynb +0 -0
  373. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tools/make-sample-dataset.py +0 -0
  374. {anemoi_datasets-0.5.11 → anemoi_datasets-0.5.13}/tools/upload-sample-dataset.py +0 -0
@@ -40,7 +40,7 @@ repos:
40
40
  - --force-single-line-imports
41
41
  - --profile black
42
42
  - repo: https://github.com/astral-sh/ruff-pre-commit
43
- rev: v0.7.2
43
+ rev: v0.8.1
44
44
  hooks:
45
45
  - id: ruff
46
46
  args:
@@ -10,12 +10,20 @@ Keep it human-readable, your future self will thank you!
10
10
 
11
11
  ## [Unreleased](https://github.com/ecmwf/anemoi-datasets/compare/0.5.8...HEAD)
12
12
 
13
+ ## Changed
14
+
15
+ - Fix metadata serialization handling of numpy.integer (#140)
16
+ - Fix negative variance for constant variables (#148)
17
+ - Fix cutout slicing of grid dimension (#145)
18
+ - Use cKDTree instead of KDTree
19
+ - Implement 'complement' feature
20
+ - Add ability to patch xarrays (#160)
13
21
 
14
22
  ### Added
15
23
 
16
24
  - Call filters from anemoi-transform
17
- - make test optional when adls is not installed Pull request #110
18
-
25
+ - Make test optional when adls is not installed Pull request #110
26
+ - Add wz_to_w, orog_to_z, and sum filters (#149)
19
27
 
20
28
  ## [0.5.8](https://github.com/ecmwf/anemoi-datasets/compare/0.5.7...0.5.8) - 2024-10-26
21
29
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: anemoi-datasets
3
- Version: 0.5.11
3
+ Version: 0.5.13
4
4
  Summary: A package to hold various functions to support training of ML models on ECMWF data.
5
5
  Author-email: "European Centre for Medium-Range Weather Forecasts (ECMWF)" <software.support@ecmwf.int>
6
6
  License: Apache License
@@ -0,0 +1,17 @@
1
+ ###########
2
+ orog_to_z
3
+ ###########
4
+
5
+ The ``orog_to_z`` filter converts orography (in meters) to surface
6
+ geopotential height (m^2/s^2) using the equation:
7
+
8
+ .. math::
9
+
10
+ z &= g \cdot \textrm{orog}\\
11
+ g &= 9.80665\ m \cdot s^{-1}
12
+
13
+ This filter needs to follow a source that provides orography, which is
14
+ replaced by surface geopotential height.
15
+
16
+ .. literalinclude:: yaml/orog_to_z.yaml
17
+ :language: yaml
@@ -0,0 +1,13 @@
1
+ #####
2
+ sum
3
+ #####
4
+
5
+ The ``sum`` filter computes the sum over multiple variables. This can be
6
+ useful for computing total precipitation from its components (snow,
7
+ rain) or summing the components of total column integrated water. This
8
+ filter needs to follow a source that provides the list of variables to
9
+ be summed up. These variables are removed by the filter and replaced by
10
+ a single summed variable.
11
+
12
+ .. literalinclude:: yaml/sum.yaml
13
+ :language: yaml
@@ -0,0 +1,12 @@
1
+ #########
2
+ wz_to_w
3
+ #########
4
+
5
+ The ``wz_to_w`` filter converts geometric vertical velocity (provided in
6
+ m/s) to vertical velocity in pressure coordinates (Pa/s). This filter
7
+ needs to follow a source that provides geometric vertical velocity.
8
+ Geometric vertical velocity is removed by the filter and pressure
9
+ vertical velocity is added.
10
+
11
+ .. literalinclude:: yaml/wz_to_w.yaml
12
+ :language: yaml
@@ -0,0 +1,10 @@
1
+ input:
2
+ pipe:
3
+ - source: # mars, grib, netcdf, etc.
4
+ # source attributes here
5
+ # ...
6
+ # Must load an orography variable
7
+
8
+ - orog_to_z:
9
+ orog: orog # Name of orography (input) variable
10
+ z: z # Name of z (output) variable
@@ -0,0 +1,13 @@
1
+ input:
2
+ pipe:
3
+ - source: # mars, grib, netcdf, etc.
4
+ # source attributes here
5
+ # ...
6
+ # Must load the variables to be summed
7
+
8
+ - sum:
9
+ params: # List of input variables
10
+ variable1
11
+ variable2
12
+ variable3
13
+ output: variable_total # Name of output variable
@@ -0,0 +1,10 @@
1
+ input:
2
+ pipe:
3
+ - source: # mars, grib, netcdf, etc.
4
+ # source attributes here
5
+ # ...
6
+ # Must load geometric vertical velocity
7
+
8
+ - wz_to_w:
9
+ wz: wz # Name of geometric vertical velocity (input) variable
10
+ x: z # Name of pressure vertical velocity (output) variable
@@ -15,8 +15,11 @@ Filters are used to modify the data or metadata in a dataset.
15
15
  :maxdepth: 1
16
16
 
17
17
  filters/select
18
+ filters/orog_to_z
18
19
  filters/rename
19
20
  filters/rotate_winds
21
+ filters/sum
20
22
  filters/unrotate_winds
23
+ filters/wz_to_w
21
24
  filters/noop
22
25
  filters/empty
@@ -10,7 +10,7 @@ file, which is a YAML file that describes sources of meteorological
10
10
  fields as well as the operations to perform on them, before they are
11
11
  written to a zarr file. The input of the process is a range of dates and
12
12
  some options to control the layout of the output. Statistics will be
13
- computed as the dataset is build, and stored in the metadata, with other
13
+ computed as the dataset is built, and stored in the metadata, with other
14
14
  information such as the the locations of the grid points, the list of
15
15
  variables, etc.
16
16
 
@@ -24,35 +24,35 @@ variables, etc.
24
24
 
25
25
  date
26
26
  Throughout this document, the term `date` refers to a date and time,
27
- not just a date. A training dataset is covers a continuous range of
27
+ not just a date. A training dataset covers a continuous range of
28
28
  dates with a given frequency. Missing dates are still part of the
29
- dataset, but the data are missing and marked as such using NaNs.
30
- Dates are always in UTC, and refer to date at which the data is
31
- valid. For accumulations and fluxes, that would be the end of the
32
- accumulation period.
29
+ dataset, but missing data are marked as such using NaNs. Dates are
30
+ always in UTC, and refer to date at which the data is valid. For
31
+ accumulations and fluxes, that would be the end of the accumulation
32
+ period.
33
33
 
34
34
  variable
35
- A `variable` is meteorological parameter, such as temperature, wind,
36
- etc. Multilevel parameters are treated as separate variables, one for
37
- each level. For example, temperature at 850 hPa and temperature at
38
- 500 hPa will be treated as two separate variables (`t_850` and
39
- `t_500`).
35
+ A `variable` is a meteorological parameter, such as temperature,
36
+ wind, etc. Multilevel parameters are treated as separate variables,
37
+ one for each level. For example, temperature at 850 hPa and
38
+ temperature at 500 hPa will be treated as two separate variables
39
+ (`t_850` and `t_500`).
40
40
 
41
41
  field
42
- A `field` is a variable at a given date. It is represented by a array
43
- of values at each grid point.
42
+ A `field` is a variable at a given date. It is represented by an
43
+ array of values at each grid point.
44
44
 
45
45
  source
46
- The `source` is a software component that given a list of dates and
47
- variables will return the corresponding fields. A example of source
46
+ The `source` is a software component that, given a list of dates and
47
+ variables will return the corresponding fields. An example of source
48
48
  is ECMWF's MARS archive, a collection of GRIB or NetCDF files, a
49
49
  database, etc. See :ref:`sources` for more information.
50
50
 
51
51
  filter
52
52
  A `filter` is a software component that takes as input the output of
53
- a source or the output of another filter can modify the fields and/or
54
- their metadata. For example, typical filters are interpolations,
55
- renaming of variables, etc. See :ref:`filters` for more information.
53
+ a source or another filter and can modify the fields and/or their
54
+ metadata. For example, typical filters are interpolations, renaming
55
+ of variables, etc. See :ref:`filters` for more information.
56
56
 
57
57
  ************
58
58
  Operations
@@ -62,19 +62,20 @@ In order to build a training dataset, sources and filters are combined
62
62
  using the following operations:
63
63
 
64
64
  join
65
- The join is the process of combining several sources data. Each
66
- source is expected to provide different variables at the same dates.
65
+ The join is the process of combining several sources of data. Each
66
+ source is expected to provide different variables for the same of
67
+ dates.
67
68
 
68
69
  pipe
69
70
  The pipe is the process of transforming fields using filters. The
70
- first step of a pipe is typically a source, a join or another pipe.
71
- The following steps are filters.
71
+ first step of a pipe is typically a source, a join, or another pipe.
72
+ This can subsequently followed by more filters.
72
73
 
73
74
  concat
74
75
  The concatenation is the process of combining different sets of
75
- operation that handle different dates. This is typically used to
76
- build a dataset that spans several years, when the several sources
77
- are involved, each providing a different period.
76
+ operations that handle different dates. This is typically used to
77
+ build a dataset that spans several years, when several sources are
78
+ involved, each providing data for different period.
78
79
 
79
80
  Each operation is considered as a :ref:`source <sources>`, therefore
80
81
  operations can be combined to build complex datasets.
@@ -87,7 +88,7 @@ First recipe
87
88
  ============
88
89
 
89
90
  The simplest `recipe` file must contain a ``dates`` section and an
90
- ``input`` section. The latter must contain a `source` In that case, the
91
+ ``input`` section. The latter must contain a `source`. In that case, the
91
92
  source is ``mars``
92
93
 
93
94
  .. literalinclude:: yaml/building1.yaml
@@ -132,15 +133,15 @@ This will build the following dataset:
132
133
  Adding some forcing variables
133
134
  =============================
134
135
 
135
- When training a data-driven models, some forcing variables may be
136
+ When training a data-driven model, some forcing variables may be
136
137
  required such as the solar radiation, the time of day, the day in the
137
138
  year, etc.
138
139
 
139
- These are provided by the ``forcings`` source. In that example, we add a
140
- few of them. The `template` option is used to point to another source,
141
- in that case the first instance of ``mars``. This source is used to get
142
- information about the grid points, as some of the forcing variables are
143
- grid dependent.
140
+ These are provided by the ``forcings`` source. Let us add a few of them
141
+ to the above example. The `template` option is used to point to another
142
+ source, in that case the first instance of ``mars``. This source is used
143
+ to get information about the grid points, as some of the forcing
144
+ variables are grid dependent.
144
145
 
145
146
  .. literalinclude:: yaml/building3.yaml
146
147
  :language: yaml
@@ -1,6 +1,6 @@
1
1
  input:
2
2
  accumulations:
3
- accumulations_period: 6
3
+ accumulation_period: 6
4
4
  class: ea
5
5
  param: [tp, cp, sf]
6
6
  levtype: sfc
@@ -1,6 +1,6 @@
1
1
  input:
2
2
  accumulations:
3
- accumulations_period: [6, 12]
3
+ accumulation_period: [6, 12]
4
4
  class: od
5
5
  param: [tp, cp, sf]
6
6
  levtype: sfc
@@ -27,6 +27,7 @@ datasets <building-introduction>`.
27
27
 
28
28
  - :doc:`overview`
29
29
  - :doc:`installing`
30
+ - :doc:`naming_conventions`
30
31
 
31
32
  .. toctree::
32
33
  :maxdepth: 1
@@ -34,6 +35,7 @@ datasets <building-introduction>`.
34
35
 
35
36
  overview
36
37
  installing
38
+ naming_conventions
37
39
 
38
40
  **Using training datasets**
39
41
 
@@ -43,6 +45,7 @@ datasets <building-introduction>`.
43
45
  - :doc:`using/subsetting`
44
46
  - :doc:`using/combining`
45
47
  - :doc:`using/selecting`
48
+ - :doc:`using/ensembles`
46
49
  - :doc:`using/grids`
47
50
  - :doc:`using/zip`
48
51
  - :doc:`using/statistics`
@@ -63,6 +66,7 @@ datasets <building-introduction>`.
63
66
  using/subsetting
64
67
  using/combining
65
68
  using/selecting
69
+ using/ensembles
66
70
  using/grids
67
71
  using/zip
68
72
  using/statistics
@@ -0,0 +1,8 @@
1
+ ####################
2
+ Naming conventions
3
+ ####################
4
+
5
+ This is the current naming conventions for datasets :
6
+
7
+ `Anemoi Naming Conventions
8
+ <https://anemoi-registry.readthedocs.io/en/latest/naming-conventions.html>`_
@@ -0,0 +1,6 @@
1
+ open_dataset(
2
+ complement=dataset1,
3
+ source=dataset2,
4
+ what="variables",
5
+ interpolate="nearest",
6
+ )
@@ -0,0 +1,12 @@
1
+ open_dataset(
2
+ cutout=[
3
+ {
4
+ "complement": lam_dataset,
5
+ "source": global_dataset,
6
+ "interpolate": "nearest",
7
+ },
8
+ {
9
+ "dataset": global_dataset,
10
+ },
11
+ ]
12
+ )
@@ -0,0 +1,4 @@
1
+ open_dataset(
2
+ complement=dataset1,
3
+ source=dataset2,
4
+ )
@@ -0,0 +1,4 @@
1
+ ds = open_dataset(
2
+ dataset,
3
+ number=1,
4
+ )
@@ -0,0 +1,4 @@
1
+ ds = open_dataset(
2
+ dataset,
3
+ number=[1, 3, 5],
4
+ )
@@ -182,3 +182,32 @@ The difference can be seen at the boundary between the two grids:
182
182
  To debug the combination, you can pass `plot=True` to the `cutout`
183
183
  function (when running from a Notebook), of use `plot="prefix"` to save
184
184
  the plots to series of PNG files in the current directory.
185
+
186
+ .. _complement:
187
+
188
+ ************
189
+ complement
190
+ ************
191
+
192
+ That feature will interpolate the variables of `dataset2` that are not
193
+ in `dataset1` to the grid of `dataset1` , add them to the list of
194
+ variable of `dataset1` and return the result.
195
+
196
+ .. literalinclude:: code/complement1_.py
197
+
198
+ Currently ``what`` can only be ``variables`` and can be omitted.
199
+
200
+ The value for ``interpolate`` can be one of ``none`` (default) or
201
+ ``nearest``. In the case of ``none``, the grids of the two datasets must
202
+ match.
203
+
204
+ This feature was originally designed to be used in conjunction with
205
+ ``cutout``, where `dataset1` is the lam, and `dataset2` is the global
206
+ dataset.
207
+
208
+ .. literalinclude:: code/complement2_.py
209
+
210
+ Another use case is to simply bring all non-overlapping variables of a
211
+ dataset into an other:
212
+
213
+ .. literalinclude:: code/complement3_.py
@@ -0,0 +1,27 @@
1
+ .. _selecting-members:
2
+
3
+ ###################
4
+ Selecting members
5
+ ###################
6
+
7
+ This section describes how to subset data that are part of an ensemble.
8
+ To combine ensembles, see :ref:`ensembles` in the
9
+ :ref:`combining-datasets` section.
10
+
11
+ .. _number:
12
+
13
+ If a dataset is an ensemble, you can select one or more specific members
14
+ using the `number` option. You can also use ``numbers`` (which is an
15
+ alias for ``number``), and ``member`` (or ``members``). The difference
16
+ between the two is that ``number`` is **1-based**, while ``member`` is
17
+ **0-based**.
18
+
19
+ Select a single element:
20
+
21
+ .. literalinclude:: code/number1_.py
22
+ :language: python
23
+
24
+ ... or a list:
25
+
26
+ .. literalinclude:: code/number2_.py
27
+ :language: python
@@ -67,6 +67,28 @@ You can also rename variables:
67
67
  This will be useful when you join datasets and do not want variables
68
68
  from one dataset to override the ones from the other.
69
69
 
70
+ ********
71
+ number
72
+ ********
73
+
74
+ If a dataset is an ensemble, you can select one or more specific members
75
+ using the `number` option. You can also use ``numbers`` (which is an
76
+ alias for ``number``), and ``member`` (or ``members``). The difference
77
+ between the two is that ``number`` is **1-based**, while ``member`` is
78
+ **0-based**.
79
+
80
+ Select a single element:
81
+
82
+ .. literalinclude:: code/number1_.py
83
+ :language: python
84
+
85
+ ... or a list:
86
+
87
+ .. literalinclude:: code/number2_.py
88
+ :language: python
89
+
90
+ .. _rescale:
91
+
70
92
  *********
71
93
  rescale
72
94
  *********
@@ -87,7 +109,9 @@ rescale the data.
87
109
  .. warning::
88
110
 
89
111
  When providing units, the library assumes that the mapping between
90
- them is a linear transformation. No check is does to ensure this is
112
+ them is a linear transformation. No check is done to ensure this is
91
113
  the case.
92
114
 
93
115
  .. _cfunits: https://github.com/NCAS-CMS/cfunits
116
+
117
+ .. _number:
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.5.11'
16
- __version_tuple__ = version_tuple = (0, 5, 11)
15
+ __version__ = version = '0.5.13'
16
+ __version_tuple__ = version_tuple = (0, 5, 13)
@@ -622,10 +622,14 @@ class Load(Actor, HasRegistryMixin, HasStatisticTempMixin, HasElementForDataMixi
622
622
 
623
623
  check_shape(cube, dates, dates_in_data)
624
624
 
625
- def check_dates_in_data(lst, lst2):
626
- lst2 = [np.datetime64(_) for _ in lst2]
627
- lst = [np.datetime64(_) for _ in lst]
628
- assert lst == lst2, ("Dates in data are not the requested ones:", lst, lst2)
625
+ def check_dates_in_data(dates_in_data, requested_dates):
626
+ requested_dates = [np.datetime64(_) for _ in requested_dates]
627
+ dates_in_data = [np.datetime64(_) for _ in dates_in_data]
628
+ assert dates_in_data == requested_dates, (
629
+ "Dates in data are not the requested ones:",
630
+ dates_in_data,
631
+ requested_dates,
632
+ )
629
633
 
630
634
  check_dates_in_data(dates_in_data, dates)
631
635
 
@@ -58,7 +58,7 @@ class DatasetName:
58
58
  raise ValueError(self.error_message)
59
59
 
60
60
  def _parse(self, name):
61
- pattern = r"^(\w+)-([\w-]+)-(\w+)-(\w+)-(\d\d\d\d)-(\d\d\d\d)-(\d+h)-v(\d+)-?([a-zA-Z0-9-]+)?$"
61
+ pattern = r"^(\w+)-([\w-]+)-(\w+)-(\w+)-(\d\d\d\d)-(\d\d\d\d)-(\d+h|\d+m)-v(\d+)-?([a-zA-Z0-9-]+)?$"
62
62
  match = re.match(pattern, name)
63
63
 
64
64
  if not match:
@@ -22,6 +22,7 @@ def assert_is_fieldlist(obj):
22
22
  def import_function(name, kind):
23
23
 
24
24
  from anemoi.transform.filters import filter_registry
25
+ from anemoi.transform.sources import source_registry
25
26
 
26
27
  name = name.replace("-", "_")
27
28
 
@@ -45,7 +46,20 @@ def import_function(name, kind):
45
46
  if filter_registry.lookup(name, return_none=True):
46
47
 
47
48
  def proc(context, data, *args, **kwargs):
48
- return filter_registry.create(name, *args, **kwargs)(data)
49
+ filter = filter_registry.create(name, *args, **kwargs)
50
+ filter.context = context
51
+ # filter = filter_registry.create(context, name, *args, **kwargs)
52
+ return filter.forward(data)
53
+
54
+ return proc
55
+
56
+ if kind == "sources":
57
+ if source_registry.lookup(name, return_none=True):
58
+
59
+ def proc(context, data, *args, **kwargs):
60
+ source = source_registry.create(name, *args, **kwargs)
61
+ # source = source_registry.create(context, name, *args, **kwargs)
62
+ return source.forward(data)
49
63
 
50
64
  return proc
51
65
 
@@ -0,0 +1,58 @@
1
+ # (C) Copyright 2024 Anemoi contributors.
2
+ #
3
+ # This software is licensed under the terms of the Apache Licence Version 2.0
4
+ # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
5
+ #
6
+ # In applying this licence, ECMWF does not waive the privileges and immunities
7
+ # granted to it by virtue of its status as an intergovernmental organisation
8
+ # nor does it submit to any jurisdiction.
9
+
10
+
11
+ from collections import defaultdict
12
+
13
+ from earthkit.data.indexing.fieldlist import FieldArray
14
+
15
+
16
+ class NewDataField:
17
+ def __init__(self, field, data, new_name):
18
+ self.field = field
19
+ self.data = data
20
+ self.new_name = new_name
21
+
22
+ def to_numpy(self, *args, **kwargs):
23
+ return self.data
24
+
25
+ def metadata(self, key=None, **kwargs):
26
+ if key is None:
27
+ return self.field.metadata(**kwargs)
28
+
29
+ value = self.field.metadata(key, **kwargs)
30
+ if key == "param":
31
+ return self.new_name
32
+ return value
33
+
34
+ def __getattr__(self, name):
35
+ return getattr(self.field, name)
36
+
37
+
38
+ def execute(context, input, orog, z="z"):
39
+ """Convert orography [m] to z (geopotential height)"""
40
+ result = FieldArray()
41
+
42
+ processed_fields = defaultdict(dict)
43
+
44
+ for f in input:
45
+ key = f.metadata(namespace="mars")
46
+ param = key.pop("param")
47
+ if param == orog:
48
+ key = tuple(key.items())
49
+
50
+ if param in processed_fields[key]:
51
+ raise ValueError(f"Duplicate field {param} for {key}")
52
+
53
+ output = f.to_numpy(flatten=True) * 9.80665
54
+ result.append(NewDataField(f, output, z))
55
+ else:
56
+ result.append(f)
57
+
58
+ return result
@@ -0,0 +1,71 @@
1
+ # (C) Copyright 2024 Anemoi contributors.
2
+ #
3
+ # This software is licensed under the terms of the Apache Licence Version 2.0
4
+ # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
5
+ #
6
+ # In applying this licence, ECMWF does not waive the privileges and immunities
7
+ # granted to it by virtue of its status as an intergovernmental organisation
8
+ # nor does it submit to any jurisdiction.
9
+
10
+
11
+ from collections import defaultdict
12
+
13
+ from earthkit.data.indexing.fieldlist import FieldArray
14
+
15
+
16
+ class NewDataField:
17
+ def __init__(self, field, data, new_name):
18
+ self.field = field
19
+ self.data = data
20
+ self.new_name = new_name
21
+
22
+ def to_numpy(self, *args, **kwargs):
23
+ return self.data
24
+
25
+ def metadata(self, key=None, **kwargs):
26
+ if key is None:
27
+ return self.field.metadata(**kwargs)
28
+
29
+ value = self.field.metadata(key, **kwargs)
30
+ if key == "param":
31
+ return self.new_name
32
+ return value
33
+
34
+ def __getattr__(self, name):
35
+ return getattr(self.field, name)
36
+
37
+
38
+ def execute(context, input, params, output):
39
+ """Computes the sum over a set of variables"""
40
+ result = FieldArray()
41
+
42
+ needed_fields = defaultdict(dict)
43
+
44
+ for f in input:
45
+ key = f.metadata(namespace="mars")
46
+ param = key.pop("param")
47
+ if param in params:
48
+ key = tuple(key.items())
49
+
50
+ if param in needed_fields[key]:
51
+ raise ValueError(f"Duplicate field {param} for {key}")
52
+
53
+ needed_fields[key][param] = f
54
+ else:
55
+ result.append(f)
56
+
57
+ for keys, values in needed_fields.items():
58
+
59
+ if len(values) != len(params):
60
+ raise ValueError("Missing fields")
61
+
62
+ s = None
63
+ for k, v in values.items():
64
+ c = v.to_numpy(flatten=True)
65
+ if s is None:
66
+ s = c
67
+ else:
68
+ s += c
69
+ result.append(NewDataField(values[list(values.keys())[0]], s, output))
70
+
71
+ return result