anemoi-datasets 0.3.6__tar.gz → 0.3.8__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 (247) hide show
  1. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/.pre-commit-config.yaml +1 -1
  2. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/PKG-INFO +2 -2
  3. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/conf.py +8 -0
  4. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/index.rst +2 -0
  5. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/configuration.rst +2 -1
  6. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/pyproject.toml +1 -1
  7. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/__init__.py +5 -2
  8. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/_version.py +2 -2
  9. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/commands/copy.py +87 -29
  10. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/__init__.py +12 -9
  11. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/accumulations.py +9 -1
  12. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/mars.py +74 -0
  13. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/loaders.py +96 -86
  14. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/statistics/__init__.py +6 -139
  15. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/__init__.py +7 -0
  16. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/dataset.py +3 -0
  17. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/forwards.py +7 -0
  18. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/masked.py +6 -2
  19. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/misc.py +3 -1
  20. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/select.py +8 -4
  21. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/statistics.py +4 -0
  22. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/stores.py +10 -1
  23. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi_datasets.egg-info/PKG-INFO +2 -2
  24. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi_datasets.egg-info/requires.txt +1 -1
  25. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/.github/workflows/python-publish.yml +0 -0
  26. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/.gitignore +0 -0
  27. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/.readthedocs.yaml +0 -0
  28. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/.vscode/spellright.dict +0 -0
  29. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/LICENSE +0 -0
  30. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/README.md +0 -0
  31. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/Makefile +0 -0
  32. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/_static/logo.png +0 -0
  33. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/_static/style.css +0 -0
  34. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/_templates/.gitkeep +0 -0
  35. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/apply-fmt.sh +0 -0
  36. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/filters/empty.rst +0 -0
  37. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/filters/noop.rst +0 -0
  38. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/filters/rename.rst +0 -0
  39. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/filters/rotate_winds.rst +0 -0
  40. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/filters/select.rst +0 -0
  41. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/filters/unrotate_winds.rst +0 -0
  42. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/filters.rst +0 -0
  43. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/handling-missing-dates.rst +0 -0
  44. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/handling-missing-values.rst +0 -0
  45. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/introduction.rst +0 -0
  46. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/naming-variables.rst +0 -0
  47. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/operations.rst +0 -0
  48. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/accumulations.rst +0 -0
  49. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/accumulations1.yaml +0 -0
  50. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/accumulations2.yaml +0 -0
  51. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/forcings.rst +0 -0
  52. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/forcings.yaml +0 -0
  53. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/grib.rst +0 -0
  54. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/hindcasts.rst +0 -0
  55. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/mars.rst +0 -0
  56. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/mars1.yaml +0 -0
  57. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/mars2.yaml +0 -0
  58. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/netcdf.rst +0 -0
  59. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/netcdf.yaml +0 -0
  60. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/opendap.rst +0 -0
  61. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/opendap.yaml +0 -0
  62. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/recentre.rst +0 -0
  63. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/yaml/grib1.yaml +0 -0
  64. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/yaml/grib2.yaml +0 -0
  65. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/yaml/grib3.yaml +0 -0
  66. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/yaml/grib4.yaml +0 -0
  67. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/yaml/hindcasts.yaml +0 -0
  68. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources/yaml/recentre.yaml +0 -0
  69. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/sources.rst +0 -0
  70. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/statistics.rst +0 -0
  71. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/syntax.rst +0 -0
  72. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/syntax.yaml +0 -0
  73. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/yaml/Makefile +0 -0
  74. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/yaml/building1.txt +0 -0
  75. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/yaml/building1.yaml +0 -0
  76. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/yaml/building2.txt +0 -0
  77. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/yaml/building2.yaml +0 -0
  78. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/yaml/building3.txt +0 -0
  79. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/yaml/building3.yaml +0 -0
  80. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/yaml/concat.yaml +0 -0
  81. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/yaml/hindcasts.yaml +0 -0
  82. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/yaml/input.yaml +0 -0
  83. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/yaml/missing_dates.yaml +0 -0
  84. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/yaml/nan.yaml +0 -0
  85. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/building/yaml/pipe.yaml +0 -0
  86. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/check-index.sh +0 -0
  87. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/cli/compare.rst +0 -0
  88. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/cli/copy.rst +0 -0
  89. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/cli/create.rst +0 -0
  90. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/cli/inspect.rst +0 -0
  91. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/cli/introduction.rst +0 -0
  92. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/cli/scan.rst +0 -0
  93. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/images.pptx +0 -0
  94. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/installing.rst +0 -0
  95. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/overview.rst +0 -0
  96. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/overview_.py +0 -0
  97. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/requirements.txt +0 -0
  98. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/schemas/matrix.excalidraw +0 -0
  99. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/schemas/matrix.png +0 -0
  100. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/schemas/overview.excalidraw +0 -0
  101. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/schemas/overview.png +0 -0
  102. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/schemas/recipe.excalidraw +0 -0
  103. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/schemas/recipe.png +0 -0
  104. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/test.ipynb +0 -0
  105. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/area1_.py +0 -0
  106. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/area2_.py +0 -0
  107. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/chain_.py +0 -0
  108. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/combine_example.py +0 -0
  109. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/concat1.py +0 -0
  110. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/cutout_.py +0 -0
  111. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/drop_.py +0 -0
  112. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/end_.py +0 -0
  113. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/ensembles1_.py +0 -0
  114. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/frequency_.py +0 -0
  115. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/grids1_.py +0 -0
  116. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/join1.py +0 -0
  117. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/matching0_.py +0 -0
  118. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/matching1_.py +0 -0
  119. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/matching2_.py +0 -0
  120. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/matching3_.py +0 -0
  121. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/matching4_.py +0 -0
  122. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/misc1.py +0 -0
  123. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/misc2.py +0 -0
  124. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/missing_.py +0 -0
  125. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/open_cloud.py +0 -0
  126. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/open_combine1_.py +0 -0
  127. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/open_combine2_.py +0 -0
  128. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/open_complex.py +0 -0
  129. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/open_dict_.py +0 -0
  130. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/open_first_.py +0 -0
  131. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/open_list_.py +0 -0
  132. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/open_name.py +0 -0
  133. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/open_other.py +0 -0
  134. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/open_path.py +0 -0
  135. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/open_yaml_.py +0 -0
  136. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/rename_.py +0 -0
  137. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/reorder1_.py +0 -0
  138. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/reorder2_.py +0 -0
  139. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/select1_.py +0 -0
  140. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/select2_.py +0 -0
  141. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/shuffle_.py +0 -0
  142. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/some_attributes_.py +0 -0
  143. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/start_.py +0 -0
  144. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/statistics_.py +0 -0
  145. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/subset_example.py +0 -0
  146. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/thinning_.py +0 -0
  147. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/zip1_.py +0 -0
  148. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/code/zip2_.py +0 -0
  149. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/combining.rst +0 -0
  150. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/configuration.toml +0 -0
  151. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/grids.rst +0 -0
  152. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/images/area-1.png +0 -0
  153. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/images/concat.png +0 -0
  154. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/images/cutout-1.png +0 -0
  155. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/images/cutout-2.png +0 -0
  156. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/images/cutout-3.png +0 -0
  157. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/images/cutout-4.png +0 -0
  158. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/images/join.png +0 -0
  159. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/images/overlay.png +0 -0
  160. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/images/thinning-after.png +0 -0
  161. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/images/thinning-before.png +0 -0
  162. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/introduction.rst +0 -0
  163. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/matching.rst +0 -0
  164. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/methods.rst +0 -0
  165. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/miscellaneous.rst +0 -0
  166. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/opening.rst +0 -0
  167. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/other.rst +0 -0
  168. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/selecting.rst +0 -0
  169. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/statistics.rst +0 -0
  170. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/docs/using/subsetting.rst +0 -0
  171. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/setup.cfg +0 -0
  172. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/__main__.py +0 -0
  173. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/commands/__init__.py +0 -0
  174. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/commands/compare.py +0 -0
  175. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/commands/create.py +0 -0
  176. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/commands/inspect.py +0 -0
  177. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/commands/scan.py +0 -0
  178. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/compute/__init__.py +0 -0
  179. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/compute/recentre.py +0 -0
  180. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/check.py +0 -0
  181. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/chunks.py +0 -0
  182. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/config.py +0 -0
  183. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/__init__.py +0 -0
  184. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/filters/__init__.py +0 -0
  185. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/filters/empty.py +0 -0
  186. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/filters/noop.py +0 -0
  187. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/filters/rename.py +0 -0
  188. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/filters/rotate_winds.py +0 -0
  189. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/filters/unrotate_winds.py +0 -0
  190. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/__init__.py +0 -0
  191. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/constants.py +0 -0
  192. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/empty.py +0 -0
  193. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/forcings.py +0 -0
  194. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/grib.py +0 -0
  195. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/hindcasts.py +0 -0
  196. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/netcdf.py +0 -0
  197. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/opendap.py +0 -0
  198. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/recentre.py +0 -0
  199. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/source.py +0 -0
  200. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/tendencies.py +0 -0
  201. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/input.py +0 -0
  202. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/patch.py +0 -0
  203. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/persistent.py +0 -0
  204. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/size.py +0 -0
  205. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/statistics/summary.py +0 -0
  206. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/template.py +0 -0
  207. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/utils.py +0 -0
  208. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/writer.py +0 -0
  209. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/zarr.py +0 -0
  210. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/concat.py +0 -0
  211. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/debug.css +0 -0
  212. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/debug.py +0 -0
  213. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/ensemble.py +0 -0
  214. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/grids.py +0 -0
  215. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/indexing.py +0 -0
  216. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/join.py +0 -0
  217. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/subset.py +0 -0
  218. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/unchecked.py +0 -0
  219. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/dates/__init__.py +0 -0
  220. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/dates/groups.py +0 -0
  221. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/grids.py +0 -0
  222. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi/datasets/utils/__init__.py +0 -0
  223. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi_datasets.egg-info/SOURCES.txt +0 -0
  224. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi_datasets.egg-info/dependency_links.txt +0 -0
  225. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi_datasets.egg-info/entry_points.txt +0 -0
  226. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/src/anemoi_datasets.egg-info/top_level.txt +0 -0
  227. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tests/create/concat.yaml +0 -0
  228. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tests/create/data_sources.yaml +0 -0
  229. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tests/create/join.yaml +0 -0
  230. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tests/create/missing.yaml +0 -0
  231. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tests/create/nan.yaml +0 -0
  232. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tests/create/pipe.yaml +0 -0
  233. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tests/create/recentre.yaml +0 -0
  234. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tests/create/test_create.py +0 -0
  235. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tests/create-perturbations-full.yaml +0 -0
  236. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tests/create-shift.yaml +0 -0
  237. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tests/test_chunks.py +0 -0
  238. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tests/test_data.py +0 -0
  239. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tests/test_dates.py +0 -0
  240. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tests/test_indexing.py +0 -0
  241. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tools/.gitignore +0 -0
  242. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tools/examples/Makefile +0 -0
  243. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tools/examples/an-oper-2023-2023-2p5-6h-v1.yaml +0 -0
  244. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tools/grids/Makefile +0 -0
  245. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tools/grids/grids.ipynb +0 -0
  246. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tools/grids/grids1.yaml +0 -0
  247. {anemoi_datasets-0.3.6 → anemoi_datasets-0.3.8}/tools/grids/grids2.yaml +0 -0
@@ -38,7 +38,7 @@ repos:
38
38
  hooks:
39
39
  - id: ruff
40
40
  # Next line if for documenation cod snippets
41
- exclude: '^(dev/.*|[A-Za-z].*_)\.py$'
41
+ exclude: '^[^_].*_\.py$'
42
42
  args:
43
43
  - --line-length=120
44
44
  - --fix
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: anemoi-datasets
3
- Version: 0.3.6
3
+ Version: 0.3.8
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
@@ -223,7 +223,7 @@ Classifier: Programming Language :: Python :: Implementation :: CPython
223
223
  Classifier: Programming Language :: Python :: Implementation :: PyPy
224
224
  Requires-Python: >=3.9
225
225
  License-File: LICENSE
226
- Requires-Dist: anemoi-utils[provenance]>=0.3
226
+ Requires-Dist: anemoi-utils[provenance]>=0.3.4
227
227
  Requires-Dist: numpy
228
228
  Requires-Dist: pyyaml
229
229
  Requires-Dist: semantic-version
@@ -99,6 +99,14 @@ intersphinx_mapping = {
99
99
  "https://anemoi-inference.readthedocs.io/en/latest/",
100
100
  ("../../anemoi-inference/docs/_build/html/objects.inv", None),
101
101
  ),
102
+ "anemoi-graphs": (
103
+ "https://anemoi-graphs.readthedocs.io/en/latest/",
104
+ ("../../anemoi-graphs/docs/_build/html/objects.inv", None),
105
+ ),
106
+ "anemoi-registry": (
107
+ "https://anemoi-registry.readthedocs.io/en/latest/",
108
+ ("../../anemoi-registry/docs/_build/html/objects.inv", None),
109
+ ),
102
110
  }
103
111
 
104
112
 
@@ -116,8 +116,10 @@ datasets <building-introduction>`.
116
116
  - :ref:`anemoi-utils <anemoi-utils:index-page>`
117
117
  - :ref:`anemoi-datasets <anemoi-datasets:index-page>`
118
118
  - :ref:`anemoi-models <anemoi-models:index-page>`
119
+ - :ref:`anemoi-graphs <anemoi-graphs:index-page>`
119
120
  - :ref:`anemoi-training <anemoi-training:index-page>`
120
121
  - :ref:`anemoi-inference <anemoi-inference:index-page>`
122
+ - :ref:`anemoi-registry <anemoi-registry:index-page>`
121
123
 
122
124
  *********
123
125
  License
@@ -9,7 +9,8 @@ end with ``.zarr`` or ``.zip``, it is considered a dataset name and not
9
9
  a path or a URL.
10
10
 
11
11
  In that case, the *Anemoi* configuration is read from
12
- ``~/.anemoi.toml``. Below is an example of such a configuration:
12
+ ``~/.config/anemoi/settings.toml``. Below is an example of such a
13
+ configuration:
13
14
 
14
15
  .. literalinclude:: configuration.toml
15
16
  :language: toml
@@ -50,7 +50,7 @@ dynamic = [
50
50
  "version",
51
51
  ]
52
52
  dependencies = [
53
- "anemoi-utils[provenance]>=0.3",
53
+ "anemoi-utils[provenance]>=0.3.4",
54
54
  "numpy",
55
55
  "pyyaml",
56
56
  "semantic-version",
@@ -9,11 +9,14 @@ from ._version import __version__
9
9
  from .data import MissingDateError
10
10
  from .data import add_dataset_path
11
11
  from .data import add_named_dataset
12
+ from .data import list_dataset_names
12
13
  from .data import open_dataset
13
14
 
14
15
  __all__ = [
15
- "open_dataset",
16
- "MissingDateError",
16
+ "__version__",
17
17
  "add_dataset_path",
18
18
  "add_named_dataset",
19
+ "list_dataset_names",
20
+ "MissingDateError",
21
+ "open_dataset",
19
22
  ]
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.3.6'
16
- __version_tuple__ = version_tuple = (0, 3, 6)
15
+ __version__ = version = '0.3.8'
16
+ __version_tuple__ = version_tuple = (0, 3, 8)
@@ -7,11 +7,14 @@
7
7
 
8
8
  import logging
9
9
  import os
10
+ import shutil
10
11
  import sys
11
12
  from concurrent.futures import ThreadPoolExecutor
12
13
  from concurrent.futures import as_completed
13
14
 
14
15
  import tqdm
16
+ from anemoi.utils.s3 import download
17
+ from anemoi.utils.s3 import upload
15
18
 
16
19
  from . import Command
17
20
 
@@ -22,34 +25,63 @@ try:
22
25
  except AttributeError:
23
26
  isatty = False
24
27
 
25
- """
26
28
 
27
- ~/.aws/credentials
29
+ class S3Downloader:
30
+ def __init__(self, source, target, transfers, overwrite, resume, verbosity, **kwargs):
31
+ self.source = source
32
+ self.target = target
33
+ self.transfers = transfers
34
+ self.overwrite = overwrite
35
+ self.resume = resume
36
+ self.verbosity = verbosity
28
37
 
29
- [default]
30
- endpoint_url = https://object-store.os-api.cci1.ecmwf.int
31
- aws_access_key_id=xxx
32
- aws_secret_access_key=xxxx
38
+ def run(self):
39
+ if self.target == ".":
40
+ self.target = os.path.basename(self.source)
41
+
42
+ if self.overwrite and os.path.exists(self.target):
43
+ LOG.info(f"Deleting {self.target}")
44
+ shutil.rmtree(self.target)
45
+
46
+ download(
47
+ self.source + "/" if not self.source.endswith("/") else self.source,
48
+ self.target,
49
+ overwrite=self.overwrite,
50
+ resume=self.resume,
51
+ verbosity=self.verbosity,
52
+ threads=self.transfers,
53
+ )
33
54
 
34
- Then:
35
55
 
36
- anemoi-datasets copy aifs-ea-an-oper-0001-mars-o96-1979-2022-1h-v3.zarr/
37
- s3://ml-datasets/stable/aifs-ea-an-oper-0001-mars-o96-1979-2022-1h-v3.zarr
56
+ class S3Uploader:
57
+ def __init__(self, source, target, transfers, overwrite, resume, verbosity, **kwargs):
58
+ self.source = source
59
+ self.target = target
60
+ self.transfers = transfers
61
+ self.overwrite = overwrite
62
+ self.resume = resume
63
+ self.verbosity = verbosity
38
64
 
39
- zinfo https://object-store.os-api.cci1.ecmwf.int/
40
- ml-datasets/stable/aifs-ea-an-oper-0001-mars-o96-1979-2022-1h-v3.zarr
41
- """
65
+ def run(self):
66
+ upload(
67
+ self.source,
68
+ self.target,
69
+ overwrite=self.overwrite,
70
+ resume=self.resume,
71
+ verbosity=self.verbosity,
72
+ threads=self.transfers,
73
+ )
42
74
 
43
75
 
44
- class Copier:
45
- def __init__(self, source, target, transfers, block_size, overwrite, resume, progress, nested, rechunk, **kwargs):
76
+ class DefaultCopier:
77
+ def __init__(self, source, target, transfers, block_size, overwrite, resume, verbosity, nested, rechunk, **kwargs):
46
78
  self.source = source
47
79
  self.target = target
48
80
  self.transfers = transfers
49
81
  self.block_size = block_size
50
82
  self.overwrite = overwrite
51
83
  self.resume = resume
52
- self.progress = progress
84
+ self.verbosity = verbosity
53
85
  self.nested = nested
54
86
  self.rechunk = rechunk
55
87
 
@@ -62,7 +94,7 @@ class Copier:
62
94
  return zarr.storage.NestedDirectoryStore(path)
63
95
  return path
64
96
 
65
- def copy_chunk(self, n, m, source, target, _copy, progress):
97
+ def copy_chunk(self, n, m, source, target, _copy, verbosity):
66
98
  if _copy[n:m].all():
67
99
  LOG.info(f"Skipping {n} to {m}")
68
100
  return None
@@ -82,7 +114,7 @@ class Copier:
82
114
  range(n, m),
83
115
  desc=f"Copying {n} to {m}",
84
116
  leave=False,
85
- disable=not isatty and not progress,
117
+ disable=not isatty and not verbosity,
86
118
  ):
87
119
  target[i] = source[i]
88
120
 
@@ -107,7 +139,7 @@ class Copier:
107
139
  # raise NotImplementedError("Rechunking with multiple transfers is not implemented")
108
140
  return chunks
109
141
 
110
- def copy_data(self, source, target, _copy, progress):
142
+ def copy_data(self, source, target, _copy, verbosity):
111
143
  LOG.info("Copying data")
112
144
  source_data = source["data"]
113
145
 
@@ -121,6 +153,7 @@ class Copier:
121
153
  shape=source_data.shape,
122
154
  chunks=self.data_chunks,
123
155
  dtype=source_data.dtype,
156
+ fill_value=source_data.fill_value,
124
157
  )
125
158
  )
126
159
 
@@ -136,7 +169,7 @@ class Copier:
136
169
  source_data,
137
170
  target_data,
138
171
  _copy,
139
- progress,
172
+ verbosity,
140
173
  )
141
174
  )
142
175
  n += self.block_size
@@ -151,7 +184,7 @@ class Copier:
151
184
 
152
185
  LOG.info("Copied data")
153
186
 
154
- def copy_array(self, name, source, target, _copy, progress):
187
+ def copy_array(self, name, source, target, _copy, verbosity):
155
188
  for k, v in source.attrs.items():
156
189
  target.attrs[k] = v
157
190
 
@@ -159,14 +192,14 @@ class Copier:
159
192
  return
160
193
 
161
194
  if name == "data":
162
- self.copy_data(source, target, _copy, progress)
195
+ self.copy_data(source, target, _copy, verbosity)
163
196
  return
164
197
 
165
198
  LOG.info(f"Copying {name}")
166
199
  target[name] = source[name]
167
200
  LOG.info(f"Copied {name}")
168
201
 
169
- def copy_group(self, source, target, _copy, progress):
202
+ def copy_group(self, source, target, _copy, verbosity):
170
203
  import zarr
171
204
 
172
205
  for k, v in source.attrs.items():
@@ -179,7 +212,7 @@ class Copier:
179
212
  source[name],
180
213
  group,
181
214
  _copy,
182
- progress,
215
+ verbosity,
183
216
  )
184
217
  else:
185
218
  self.copy_array(
@@ -187,10 +220,10 @@ class Copier:
187
220
  source,
188
221
  target,
189
222
  _copy,
190
- progress,
223
+ verbosity,
191
224
  )
192
225
 
193
- def copy(self, source, target, progress):
226
+ def copy(self, source, target, verbosity):
194
227
  import zarr
195
228
 
196
229
  if "_copy" not in target:
@@ -201,7 +234,7 @@ class Copier:
201
234
  _copy = target["_copy"]
202
235
  _copy_np = _copy[:]
203
236
 
204
- self.copy_group(source, target, _copy_np, progress)
237
+ self.copy_group(source, target, _copy_np, verbosity)
205
238
  del target["_copy"]
206
239
 
207
240
  def run(self):
@@ -260,7 +293,7 @@ class Copier:
260
293
  assert target is not None, target
261
294
 
262
295
  source = zarr.open(self._store(self.source), mode="r")
263
- self.copy(source, target, self.progress)
296
+ self.copy(source, target, self.verbosity)
264
297
 
265
298
 
266
299
  class CopyMixin:
@@ -279,7 +312,10 @@ class CopyMixin:
279
312
  )
280
313
  command_parser.add_argument("--transfers", type=int, default=8, help="Number of parallel transfers.")
281
314
  command_parser.add_argument(
282
- "--progress", action="store_true", help="Force show progress bar, even if not in an interactive shell."
315
+ "--verbosity",
316
+ type=int,
317
+ help="Verbosity level. 0 is silent, 1 is normal, 2 is verbose.",
318
+ default=1,
283
319
  )
284
320
  command_parser.add_argument("--nested", action="store_true", help="Use ZARR's nested directpry backend.")
285
321
  command_parser.add_argument(
@@ -295,7 +331,29 @@ class CopyMixin:
295
331
  command_parser.add_argument("target", help="Target location.")
296
332
 
297
333
  def run(self, args):
298
- Copier(**vars(args)).run()
334
+ if args.source == args.target:
335
+ raise ValueError("Source and target are the same.")
336
+
337
+ kwargs = vars(args)
338
+
339
+ if args.overwrite and args.resume:
340
+ raise ValueError("Cannot use --overwrite and --resume together.")
341
+
342
+ source_in_s3 = args.source.startswith("s3://")
343
+ target_in_s3 = args.target.startswith("s3://")
344
+
345
+ copier = None
346
+
347
+ if args.rechunk or (source_in_s3 and target_in_s3):
348
+ copier = DefaultCopier(**kwargs)
349
+ else:
350
+ if source_in_s3:
351
+ copier = S3Downloader(**kwargs)
352
+
353
+ if target_in_s3:
354
+ copier = S3Uploader(**kwargs)
355
+
356
+ copier.run()
299
357
 
300
358
 
301
359
  class Copy(CopyMixin, Command):
@@ -97,13 +97,14 @@ class Creator:
97
97
 
98
98
  apply_patch(self.path, **kwargs)
99
99
 
100
- def init_additions(self, delta=[1, 3, 6, 12, 24]):
100
+ def init_additions(self, delta=[1, 3, 6, 12, 24], statistics=True):
101
101
  from .loaders import StatisticsAddition
102
102
  from .loaders import TendenciesStatisticsAddition
103
103
  from .loaders import TendenciesStatisticsDeltaNotMultipleOfFrequency
104
104
 
105
- a = StatisticsAddition.from_dataset(path=self.path, print=self.print)
106
- a.initialise()
105
+ if statistics:
106
+ a = StatisticsAddition.from_dataset(path=self.path, print=self.print)
107
+ a.initialise()
107
108
 
108
109
  for d in delta:
109
110
  try:
@@ -112,13 +113,14 @@ class Creator:
112
113
  except TendenciesStatisticsDeltaNotMultipleOfFrequency:
113
114
  self.print(f"Skipping delta={d} as it is not a multiple of the frequency.")
114
115
 
115
- def run_additions(self, parts=None, delta=[1, 3, 6, 12, 24]):
116
+ def run_additions(self, parts=None, delta=[1, 3, 6, 12, 24], statistics=True):
116
117
  from .loaders import StatisticsAddition
117
118
  from .loaders import TendenciesStatisticsAddition
118
119
  from .loaders import TendenciesStatisticsDeltaNotMultipleOfFrequency
119
120
 
120
- a = StatisticsAddition.from_dataset(path=self.path, print=self.print)
121
- a.run(parts)
121
+ if statistics:
122
+ a = StatisticsAddition.from_dataset(path=self.path, print=self.print)
123
+ a.run(parts)
122
124
 
123
125
  for d in delta:
124
126
  try:
@@ -127,13 +129,14 @@ class Creator:
127
129
  except TendenciesStatisticsDeltaNotMultipleOfFrequency:
128
130
  self.print(f"Skipping delta={d} as it is not a multiple of the frequency.")
129
131
 
130
- def finalise_additions(self, delta=[1, 3, 6, 12, 24]):
132
+ def finalise_additions(self, delta=[1, 3, 6, 12, 24], statistics=True):
131
133
  from .loaders import StatisticsAddition
132
134
  from .loaders import TendenciesStatisticsAddition
133
135
  from .loaders import TendenciesStatisticsDeltaNotMultipleOfFrequency
134
136
 
135
- a = StatisticsAddition.from_dataset(path=self.path, print=self.print)
136
- a.finalise()
137
+ if statistics:
138
+ a = StatisticsAddition.from_dataset(path=self.path, print=self.print)
139
+ a.finalise()
137
140
 
138
141
  for d in delta:
139
142
  try:
@@ -19,6 +19,8 @@ from climetlab.utils.availability import Availability
19
19
 
20
20
  from anemoi.datasets.create.utils import to_datetime_list
21
21
 
22
+ from .mars import use_grib_paramid
23
+
22
24
  LOG = logging.getLogger(__name__)
23
25
 
24
26
 
@@ -85,6 +87,7 @@ class Accumulation:
85
87
  stepType="accum",
86
88
  startStep=self.startStep,
87
89
  endStep=self.endStep,
90
+ check_nans=True,
88
91
  )
89
92
  self.values = None
90
93
  self.done = True
@@ -230,6 +233,7 @@ def identity(x):
230
233
 
231
234
 
232
235
  def compute_accumulations(
236
+ context,
233
237
  dates,
234
238
  request,
235
239
  user_accumulation_period=6,
@@ -306,7 +310,10 @@ def compute_accumulations(
306
310
  ds = cml.load_source("empty")
307
311
  for r in compressed.iterate():
308
312
  request.update(r)
313
+ if context.use_grib_paramid and "param" in request:
314
+ request = use_grib_paramid(request)
309
315
  print("🌧️", request)
316
+
310
317
  ds = ds + cml.load_source("mars", **request)
311
318
 
312
319
  accumulations = {}
@@ -395,7 +402,7 @@ def accumulations(context, dates, **request):
395
402
  class_ = request.get("class", "od")
396
403
  stream = request.get("stream", "oper")
397
404
 
398
- user_accumulation_period = request.get("accumulation_period", 6)
405
+ user_accumulation_period = request.pop("accumulation_period", 6)
399
406
 
400
407
  KWARGS = {
401
408
  ("od", "oper"): dict(patch=scda),
@@ -409,6 +416,7 @@ def accumulations(context, dates, **request):
409
416
  context.trace("🌧️", f"accumulations {request} {user_accumulation_period} {kwargs}")
410
417
 
411
418
  return compute_accumulations(
419
+ context,
412
420
  dates,
413
421
  request,
414
422
  user_accumulation_period=user_accumulation_period,
@@ -9,6 +9,7 @@
9
9
  import datetime
10
10
  from copy import deepcopy
11
11
 
12
+ from anemoi.utils.humanize import did_you_mean
12
13
  from climetlab import load_source
13
14
  from climetlab.utils.availability import Availability
14
15
 
@@ -102,6 +103,74 @@ def use_grib_paramid(r):
102
103
  return r
103
104
 
104
105
 
106
+ MARS_KEYS = [
107
+ "accuracy",
108
+ "activity",
109
+ "anoffset",
110
+ "area",
111
+ "bitmap",
112
+ "channel",
113
+ "class",
114
+ "database",
115
+ "dataset",
116
+ "date",
117
+ "diagnostic",
118
+ "direction",
119
+ "domain",
120
+ "expect",
121
+ "experiment",
122
+ "expver",
123
+ "fcmonth",
124
+ "fcperiod",
125
+ "fieldset",
126
+ "filter",
127
+ "format",
128
+ "frame",
129
+ "frequency",
130
+ "gaussian",
131
+ "generation",
132
+ "grid",
133
+ "hdate",
134
+ "ident",
135
+ "instrument",
136
+ "interpolation",
137
+ "intgrid",
138
+ "iteration",
139
+ "level",
140
+ "levelist",
141
+ "levtype",
142
+ "method",
143
+ "model",
144
+ "month",
145
+ "number",
146
+ "obsgroup",
147
+ "obstype",
148
+ "offsetdate",
149
+ "offsettime",
150
+ "optimise",
151
+ "origin",
152
+ "packing",
153
+ "padding",
154
+ "param",
155
+ "quantile",
156
+ "realization",
157
+ "reference",
158
+ "reportype",
159
+ "repres",
160
+ "resol",
161
+ "resolution",
162
+ "rotation",
163
+ "step",
164
+ "stream",
165
+ "system",
166
+ "target",
167
+ "time",
168
+ "truncation",
169
+ "type",
170
+ "year",
171
+ ]
172
+
173
+
105
174
  def mars(context, dates, *requests, date_key="date", **kwargs):
106
175
  if not requests:
107
176
  requests = [kwargs]
@@ -117,6 +186,11 @@ def mars(context, dates, *requests, date_key="date", **kwargs):
117
186
  if DEBUG:
118
187
  context.trace("✅", f"load_source(mars, {r}")
119
188
 
189
+ for k, v in r.items():
190
+ if k not in MARS_KEYS:
191
+ raise ValueError(
192
+ f"⚠️ Unknown key {k}={v} in MARS request. Did you mean '{did_you_mean(k, MARS_KEYS)}' ?"
193
+ )
120
194
  ds = ds + load_source("mars", **r)
121
195
  return ds
122
196