anemoi-datasets 0.3.7__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.7 → anemoi_datasets-0.3.8}/.pre-commit-config.yaml +1 -1
  2. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/PKG-INFO +1 -1
  3. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/conf.py +8 -0
  4. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/index.rst +2 -0
  5. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/configuration.rst +2 -1
  6. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/__init__.py +3 -2
  7. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/_version.py +2 -2
  8. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/commands/copy.py +35 -23
  9. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/__init__.py +12 -9
  10. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/accumulations.py +9 -1
  11. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/mars.py +74 -0
  12. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/loaders.py +96 -86
  13. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/statistics/__init__.py +6 -139
  14. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/misc.py +3 -1
  15. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/select.py +8 -4
  16. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi_datasets.egg-info/PKG-INFO +1 -1
  17. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/.github/workflows/python-publish.yml +0 -0
  18. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/.gitignore +0 -0
  19. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/.readthedocs.yaml +0 -0
  20. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/.vscode/spellright.dict +0 -0
  21. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/LICENSE +0 -0
  22. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/README.md +0 -0
  23. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/Makefile +0 -0
  24. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/_static/logo.png +0 -0
  25. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/_static/style.css +0 -0
  26. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/_templates/.gitkeep +0 -0
  27. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/apply-fmt.sh +0 -0
  28. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/filters/empty.rst +0 -0
  29. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/filters/noop.rst +0 -0
  30. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/filters/rename.rst +0 -0
  31. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/filters/rotate_winds.rst +0 -0
  32. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/filters/select.rst +0 -0
  33. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/filters/unrotate_winds.rst +0 -0
  34. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/filters.rst +0 -0
  35. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/handling-missing-dates.rst +0 -0
  36. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/handling-missing-values.rst +0 -0
  37. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/introduction.rst +0 -0
  38. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/naming-variables.rst +0 -0
  39. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/operations.rst +0 -0
  40. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/accumulations.rst +0 -0
  41. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/accumulations1.yaml +0 -0
  42. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/accumulations2.yaml +0 -0
  43. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/forcings.rst +0 -0
  44. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/forcings.yaml +0 -0
  45. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/grib.rst +0 -0
  46. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/hindcasts.rst +0 -0
  47. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/mars.rst +0 -0
  48. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/mars1.yaml +0 -0
  49. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/mars2.yaml +0 -0
  50. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/netcdf.rst +0 -0
  51. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/netcdf.yaml +0 -0
  52. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/opendap.rst +0 -0
  53. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/opendap.yaml +0 -0
  54. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/recentre.rst +0 -0
  55. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/yaml/grib1.yaml +0 -0
  56. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/yaml/grib2.yaml +0 -0
  57. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/yaml/grib3.yaml +0 -0
  58. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/yaml/grib4.yaml +0 -0
  59. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/yaml/hindcasts.yaml +0 -0
  60. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources/yaml/recentre.yaml +0 -0
  61. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/sources.rst +0 -0
  62. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/statistics.rst +0 -0
  63. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/syntax.rst +0 -0
  64. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/syntax.yaml +0 -0
  65. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/yaml/Makefile +0 -0
  66. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/yaml/building1.txt +0 -0
  67. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/yaml/building1.yaml +0 -0
  68. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/yaml/building2.txt +0 -0
  69. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/yaml/building2.yaml +0 -0
  70. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/yaml/building3.txt +0 -0
  71. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/yaml/building3.yaml +0 -0
  72. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/yaml/concat.yaml +0 -0
  73. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/yaml/hindcasts.yaml +0 -0
  74. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/yaml/input.yaml +0 -0
  75. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/yaml/missing_dates.yaml +0 -0
  76. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/yaml/nan.yaml +0 -0
  77. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/building/yaml/pipe.yaml +0 -0
  78. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/check-index.sh +0 -0
  79. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/cli/compare.rst +0 -0
  80. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/cli/copy.rst +0 -0
  81. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/cli/create.rst +0 -0
  82. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/cli/inspect.rst +0 -0
  83. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/cli/introduction.rst +0 -0
  84. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/cli/scan.rst +0 -0
  85. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/images.pptx +0 -0
  86. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/installing.rst +0 -0
  87. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/overview.rst +0 -0
  88. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/overview_.py +0 -0
  89. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/requirements.txt +0 -0
  90. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/schemas/matrix.excalidraw +0 -0
  91. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/schemas/matrix.png +0 -0
  92. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/schemas/overview.excalidraw +0 -0
  93. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/schemas/overview.png +0 -0
  94. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/schemas/recipe.excalidraw +0 -0
  95. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/schemas/recipe.png +0 -0
  96. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/test.ipynb +0 -0
  97. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/area1_.py +0 -0
  98. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/area2_.py +0 -0
  99. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/chain_.py +0 -0
  100. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/combine_example.py +0 -0
  101. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/concat1.py +0 -0
  102. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/cutout_.py +0 -0
  103. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/drop_.py +0 -0
  104. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/end_.py +0 -0
  105. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/ensembles1_.py +0 -0
  106. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/frequency_.py +0 -0
  107. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/grids1_.py +0 -0
  108. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/join1.py +0 -0
  109. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/matching0_.py +0 -0
  110. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/matching1_.py +0 -0
  111. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/matching2_.py +0 -0
  112. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/matching3_.py +0 -0
  113. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/matching4_.py +0 -0
  114. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/misc1.py +0 -0
  115. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/misc2.py +0 -0
  116. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/missing_.py +0 -0
  117. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/open_cloud.py +0 -0
  118. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/open_combine1_.py +0 -0
  119. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/open_combine2_.py +0 -0
  120. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/open_complex.py +0 -0
  121. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/open_dict_.py +0 -0
  122. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/open_first_.py +0 -0
  123. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/open_list_.py +0 -0
  124. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/open_name.py +0 -0
  125. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/open_other.py +0 -0
  126. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/open_path.py +0 -0
  127. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/open_yaml_.py +0 -0
  128. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/rename_.py +0 -0
  129. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/reorder1_.py +0 -0
  130. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/reorder2_.py +0 -0
  131. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/select1_.py +0 -0
  132. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/select2_.py +0 -0
  133. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/shuffle_.py +0 -0
  134. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/some_attributes_.py +0 -0
  135. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/start_.py +0 -0
  136. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/statistics_.py +0 -0
  137. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/subset_example.py +0 -0
  138. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/thinning_.py +0 -0
  139. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/zip1_.py +0 -0
  140. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/code/zip2_.py +0 -0
  141. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/combining.rst +0 -0
  142. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/configuration.toml +0 -0
  143. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/grids.rst +0 -0
  144. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/images/area-1.png +0 -0
  145. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/images/concat.png +0 -0
  146. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/images/cutout-1.png +0 -0
  147. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/images/cutout-2.png +0 -0
  148. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/images/cutout-3.png +0 -0
  149. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/images/cutout-4.png +0 -0
  150. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/images/join.png +0 -0
  151. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/images/overlay.png +0 -0
  152. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/images/thinning-after.png +0 -0
  153. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/images/thinning-before.png +0 -0
  154. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/introduction.rst +0 -0
  155. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/matching.rst +0 -0
  156. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/methods.rst +0 -0
  157. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/miscellaneous.rst +0 -0
  158. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/opening.rst +0 -0
  159. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/other.rst +0 -0
  160. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/selecting.rst +0 -0
  161. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/statistics.rst +0 -0
  162. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/docs/using/subsetting.rst +0 -0
  163. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/pyproject.toml +0 -0
  164. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/setup.cfg +0 -0
  165. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/__main__.py +0 -0
  166. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/commands/__init__.py +0 -0
  167. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/commands/compare.py +0 -0
  168. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/commands/create.py +0 -0
  169. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/commands/inspect.py +0 -0
  170. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/commands/scan.py +0 -0
  171. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/compute/__init__.py +0 -0
  172. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/compute/recentre.py +0 -0
  173. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/check.py +0 -0
  174. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/chunks.py +0 -0
  175. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/config.py +0 -0
  176. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/__init__.py +0 -0
  177. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/filters/__init__.py +0 -0
  178. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/filters/empty.py +0 -0
  179. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/filters/noop.py +0 -0
  180. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/filters/rename.py +0 -0
  181. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/filters/rotate_winds.py +0 -0
  182. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/filters/unrotate_winds.py +0 -0
  183. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/__init__.py +0 -0
  184. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/constants.py +0 -0
  185. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/empty.py +0 -0
  186. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/forcings.py +0 -0
  187. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/grib.py +0 -0
  188. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/hindcasts.py +0 -0
  189. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/netcdf.py +0 -0
  190. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/opendap.py +0 -0
  191. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/recentre.py +0 -0
  192. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/source.py +0 -0
  193. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/functions/sources/tendencies.py +0 -0
  194. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/input.py +0 -0
  195. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/patch.py +0 -0
  196. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/persistent.py +0 -0
  197. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/size.py +0 -0
  198. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/statistics/summary.py +0 -0
  199. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/template.py +0 -0
  200. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/utils.py +0 -0
  201. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/writer.py +0 -0
  202. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/create/zarr.py +0 -0
  203. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/__init__.py +0 -0
  204. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/concat.py +0 -0
  205. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/dataset.py +0 -0
  206. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/debug.css +0 -0
  207. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/debug.py +0 -0
  208. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/ensemble.py +0 -0
  209. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/forwards.py +0 -0
  210. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/grids.py +0 -0
  211. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/indexing.py +0 -0
  212. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/join.py +0 -0
  213. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/masked.py +0 -0
  214. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/statistics.py +0 -0
  215. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/stores.py +0 -0
  216. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/subset.py +0 -0
  217. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/data/unchecked.py +0 -0
  218. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/dates/__init__.py +0 -0
  219. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/dates/groups.py +0 -0
  220. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/grids.py +0 -0
  221. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi/datasets/utils/__init__.py +0 -0
  222. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi_datasets.egg-info/SOURCES.txt +0 -0
  223. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi_datasets.egg-info/dependency_links.txt +0 -0
  224. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi_datasets.egg-info/entry_points.txt +0 -0
  225. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi_datasets.egg-info/requires.txt +0 -0
  226. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/src/anemoi_datasets.egg-info/top_level.txt +0 -0
  227. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tests/create/concat.yaml +0 -0
  228. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tests/create/data_sources.yaml +0 -0
  229. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tests/create/join.yaml +0 -0
  230. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tests/create/missing.yaml +0 -0
  231. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tests/create/nan.yaml +0 -0
  232. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tests/create/pipe.yaml +0 -0
  233. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tests/create/recentre.yaml +0 -0
  234. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tests/create/test_create.py +0 -0
  235. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tests/create-perturbations-full.yaml +0 -0
  236. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tests/create-shift.yaml +0 -0
  237. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tests/test_chunks.py +0 -0
  238. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tests/test_data.py +0 -0
  239. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tests/test_dates.py +0 -0
  240. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tests/test_indexing.py +0 -0
  241. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tools/.gitignore +0 -0
  242. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tools/examples/Makefile +0 -0
  243. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tools/examples/an-oper-2023-2023-2p5-6h-v1.yaml +0 -0
  244. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tools/grids/Makefile +0 -0
  245. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tools/grids/grids.ipynb +0 -0
  246. {anemoi_datasets-0.3.7 → anemoi_datasets-0.3.8}/tools/grids/grids1.yaml +0 -0
  247. {anemoi_datasets-0.3.7 → 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.7
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
@@ -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
@@ -13,9 +13,10 @@ from .data import list_dataset_names
13
13
  from .data import open_dataset
14
14
 
15
15
  __all__ = [
16
- "open_dataset",
17
- "MissingDateError",
16
+ "__version__",
18
17
  "add_dataset_path",
19
18
  "add_named_dataset",
20
19
  "list_dataset_names",
20
+ "MissingDateError",
21
+ "open_dataset",
21
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.7'
16
- __version_tuple__ = version_tuple = (0, 3, 7)
15
+ __version__ = version = '0.3.8'
16
+ __version_tuple__ = version_tuple = (0, 3, 8)
@@ -7,6 +7,7 @@
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
@@ -26,54 +27,61 @@ except AttributeError:
26
27
 
27
28
 
28
29
  class S3Downloader:
29
- def __init__(self, source, target, transfers, overwrite, resume, progress, **kwargs):
30
+ def __init__(self, source, target, transfers, overwrite, resume, verbosity, **kwargs):
30
31
  self.source = source
31
32
  self.target = target
32
33
  self.transfers = transfers
33
34
  self.overwrite = overwrite
34
35
  self.resume = resume
35
- self.progress = progress
36
+ self.verbosity = verbosity
36
37
 
37
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
+
38
46
  download(
39
47
  self.source + "/" if not self.source.endswith("/") else self.source,
40
48
  self.target,
41
49
  overwrite=self.overwrite,
42
- ignore_existing=self.resume,
50
+ resume=self.resume,
51
+ verbosity=self.verbosity,
43
52
  threads=self.transfers,
44
- show_progress=self.progress,
45
53
  )
46
54
 
47
55
 
48
56
  class S3Uploader:
49
- def __init__(self, source, target, transfers, overwrite, resume, progress, **kwargs):
57
+ def __init__(self, source, target, transfers, overwrite, resume, verbosity, **kwargs):
50
58
  self.source = source
51
59
  self.target = target
52
60
  self.transfers = transfers
53
61
  self.overwrite = overwrite
54
62
  self.resume = resume
55
- self.progress = progress
63
+ self.verbosity = verbosity
56
64
 
57
65
  def run(self):
58
66
  upload(
59
67
  self.source,
60
68
  self.target,
61
69
  overwrite=self.overwrite,
62
- ignore_existing=self.resume,
70
+ resume=self.resume,
71
+ verbosity=self.verbosity,
63
72
  threads=self.transfers,
64
- show_progress=self.progress,
65
73
  )
66
74
 
67
75
 
68
76
  class DefaultCopier:
69
- def __init__(self, source, target, transfers, block_size, overwrite, resume, progress, nested, rechunk, **kwargs):
77
+ def __init__(self, source, target, transfers, block_size, overwrite, resume, verbosity, nested, rechunk, **kwargs):
70
78
  self.source = source
71
79
  self.target = target
72
80
  self.transfers = transfers
73
81
  self.block_size = block_size
74
82
  self.overwrite = overwrite
75
83
  self.resume = resume
76
- self.progress = progress
84
+ self.verbosity = verbosity
77
85
  self.nested = nested
78
86
  self.rechunk = rechunk
79
87
 
@@ -86,7 +94,7 @@ class DefaultCopier:
86
94
  return zarr.storage.NestedDirectoryStore(path)
87
95
  return path
88
96
 
89
- def copy_chunk(self, n, m, source, target, _copy, progress):
97
+ def copy_chunk(self, n, m, source, target, _copy, verbosity):
90
98
  if _copy[n:m].all():
91
99
  LOG.info(f"Skipping {n} to {m}")
92
100
  return None
@@ -106,7 +114,7 @@ class DefaultCopier:
106
114
  range(n, m),
107
115
  desc=f"Copying {n} to {m}",
108
116
  leave=False,
109
- disable=not isatty and not progress,
117
+ disable=not isatty and not verbosity,
110
118
  ):
111
119
  target[i] = source[i]
112
120
 
@@ -131,7 +139,7 @@ class DefaultCopier:
131
139
  # raise NotImplementedError("Rechunking with multiple transfers is not implemented")
132
140
  return chunks
133
141
 
134
- def copy_data(self, source, target, _copy, progress):
142
+ def copy_data(self, source, target, _copy, verbosity):
135
143
  LOG.info("Copying data")
136
144
  source_data = source["data"]
137
145
 
@@ -145,6 +153,7 @@ class DefaultCopier:
145
153
  shape=source_data.shape,
146
154
  chunks=self.data_chunks,
147
155
  dtype=source_data.dtype,
156
+ fill_value=source_data.fill_value,
148
157
  )
149
158
  )
150
159
 
@@ -160,7 +169,7 @@ class DefaultCopier:
160
169
  source_data,
161
170
  target_data,
162
171
  _copy,
163
- progress,
172
+ verbosity,
164
173
  )
165
174
  )
166
175
  n += self.block_size
@@ -175,7 +184,7 @@ class DefaultCopier:
175
184
 
176
185
  LOG.info("Copied data")
177
186
 
178
- def copy_array(self, name, source, target, _copy, progress):
187
+ def copy_array(self, name, source, target, _copy, verbosity):
179
188
  for k, v in source.attrs.items():
180
189
  target.attrs[k] = v
181
190
 
@@ -183,14 +192,14 @@ class DefaultCopier:
183
192
  return
184
193
 
185
194
  if name == "data":
186
- self.copy_data(source, target, _copy, progress)
195
+ self.copy_data(source, target, _copy, verbosity)
187
196
  return
188
197
 
189
198
  LOG.info(f"Copying {name}")
190
199
  target[name] = source[name]
191
200
  LOG.info(f"Copied {name}")
192
201
 
193
- def copy_group(self, source, target, _copy, progress):
202
+ def copy_group(self, source, target, _copy, verbosity):
194
203
  import zarr
195
204
 
196
205
  for k, v in source.attrs.items():
@@ -203,7 +212,7 @@ class DefaultCopier:
203
212
  source[name],
204
213
  group,
205
214
  _copy,
206
- progress,
215
+ verbosity,
207
216
  )
208
217
  else:
209
218
  self.copy_array(
@@ -211,10 +220,10 @@ class DefaultCopier:
211
220
  source,
212
221
  target,
213
222
  _copy,
214
- progress,
223
+ verbosity,
215
224
  )
216
225
 
217
- def copy(self, source, target, progress):
226
+ def copy(self, source, target, verbosity):
218
227
  import zarr
219
228
 
220
229
  if "_copy" not in target:
@@ -225,7 +234,7 @@ class DefaultCopier:
225
234
  _copy = target["_copy"]
226
235
  _copy_np = _copy[:]
227
236
 
228
- self.copy_group(source, target, _copy_np, progress)
237
+ self.copy_group(source, target, _copy_np, verbosity)
229
238
  del target["_copy"]
230
239
 
231
240
  def run(self):
@@ -284,7 +293,7 @@ class DefaultCopier:
284
293
  assert target is not None, target
285
294
 
286
295
  source = zarr.open(self._store(self.source), mode="r")
287
- self.copy(source, target, self.progress)
296
+ self.copy(source, target, self.verbosity)
288
297
 
289
298
 
290
299
  class CopyMixin:
@@ -303,7 +312,10 @@ class CopyMixin:
303
312
  )
304
313
  command_parser.add_argument("--transfers", type=int, default=8, help="Number of parallel transfers.")
305
314
  command_parser.add_argument(
306
- "--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,
307
319
  )
308
320
  command_parser.add_argument("--nested", action="store_true", help="Use ZARR's nested directpry backend.")
309
321
  command_parser.add_argument(
@@ -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