anemoi-datasets 0.3.10__tar.gz → 0.4.2__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.
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/.github/workflows/python-publish.yml +2 -2
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/.gitignore +1 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/.pre-commit-config.yaml +2 -2
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/.readthedocs.yaml +0 -1
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/PKG-INFO +24 -8
- anemoi_datasets-0.4.2/docs/building/advanced-options.rst +3 -0
- anemoi_datasets-0.4.2/docs/building/sources/xarray.rst +6 -0
- anemoi_datasets-0.4.2/docs/building/sources/xarray.yaml +3 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources.rst +1 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/index.rst +1 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/subsetting.rst +2 -2
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/pyproject.toml +32 -8
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/_version.py +2 -2
- anemoi_datasets-0.4.2/src/anemoi/datasets/commands/compare.py +105 -0
- anemoi_datasets-0.4.2/src/anemoi/datasets/commands/create.py +114 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/commands/inspect.py +9 -9
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/commands/scan.py +4 -4
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/compute/recentre.py +14 -9
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/__init__.py +44 -17
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/check.py +6 -5
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/chunks.py +1 -1
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/config.py +6 -27
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/functions/__init__.py +3 -3
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/functions/filters/empty.py +4 -4
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/functions/filters/rename.py +14 -6
- anemoi_datasets-0.4.2/src/anemoi/datasets/create/functions/filters/rotate_winds.py +89 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/functions/filters/unrotate_winds.py +14 -64
- anemoi_datasets-0.4.2/src/anemoi/datasets/create/functions/sources/__init__.py +47 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/functions/sources/accumulations.py +38 -56
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/functions/sources/constants.py +11 -4
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/functions/sources/empty.py +2 -2
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/functions/sources/forcings.py +3 -3
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/functions/sources/grib.py +8 -4
- anemoi_datasets-0.4.2/src/anemoi/datasets/create/functions/sources/hindcasts.py +105 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/functions/sources/mars.py +57 -26
- anemoi_datasets-0.4.2/src/anemoi/datasets/create/functions/sources/netcdf.py +14 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/functions/sources/opendap.py +3 -2
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/functions/sources/source.py +3 -3
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/functions/sources/tendencies.py +7 -7
- anemoi_datasets-0.4.2/src/anemoi/datasets/create/functions/sources/xarray/__init__.py +73 -0
- anemoi_datasets-0.4.2/src/anemoi/datasets/create/functions/sources/xarray/coordinates.py +234 -0
- anemoi_datasets-0.4.2/src/anemoi/datasets/create/functions/sources/xarray/field.py +109 -0
- anemoi_datasets-0.4.2/src/anemoi/datasets/create/functions/sources/xarray/fieldlist.py +171 -0
- anemoi_datasets-0.4.2/src/anemoi/datasets/create/functions/sources/xarray/flavour.py +330 -0
- anemoi_datasets-0.4.2/src/anemoi/datasets/create/functions/sources/xarray/grid.py +46 -0
- anemoi_datasets-0.4.2/src/anemoi/datasets/create/functions/sources/xarray/metadata.py +161 -0
- anemoi_datasets-0.4.2/src/anemoi/datasets/create/functions/sources/xarray/time.py +98 -0
- anemoi_datasets-0.4.2/src/anemoi/datasets/create/functions/sources/xarray/variable.py +198 -0
- anemoi_datasets-0.4.2/src/anemoi/datasets/create/functions/sources/xarray_kerchunk.py +42 -0
- anemoi_datasets-0.3.10/src/anemoi/datasets/create/functions/sources/__init__.py → anemoi_datasets-0.4.2/src/anemoi/datasets/create/functions/sources/xarray_zarr.py +7 -0
- anemoi_datasets-0.4.2/src/anemoi/datasets/create/functions/sources/zenodo.py +40 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/input.py +309 -191
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/loaders.py +155 -77
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/patch.py +17 -14
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/persistent.py +1 -1
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/size.py +4 -5
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/statistics/__init__.py +51 -17
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/template.py +11 -61
- anemoi_datasets-0.4.2/src/anemoi/datasets/create/trace.py +91 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/utils.py +5 -52
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/zarr.py +24 -10
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/data/dataset.py +4 -4
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/data/misc.py +9 -37
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/data/stores.py +37 -14
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/dates/__init__.py +7 -1
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/dates/groups.py +3 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi_datasets.egg-info/PKG-INFO +24 -8
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi_datasets.egg-info/SOURCES.txt +20 -1
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi_datasets.egg-info/requires.txt +24 -7
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tests/create/test_create.py +9 -9
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tests/test_data.py +7 -1
- anemoi_datasets-0.4.2/tests/xarray/test_kerchunk.py +36 -0
- anemoi_datasets-0.4.2/tests/xarray/test_netcdf.py +55 -0
- anemoi_datasets-0.4.2/tests/xarray/test_opendap.py +24 -0
- anemoi_datasets-0.4.2/tests/xarray/test_zarr.py +54 -0
- anemoi_datasets-0.3.10/docs/requirements.txt +0 -10
- anemoi_datasets-0.3.10/src/anemoi/datasets/commands/compare.py +0 -46
- anemoi_datasets-0.3.10/src/anemoi/datasets/commands/create.py +0 -33
- anemoi_datasets-0.3.10/src/anemoi/datasets/create/functions/filters/rotate_winds.py +0 -133
- anemoi_datasets-0.3.10/src/anemoi/datasets/create/functions/sources/hindcasts.py +0 -437
- anemoi_datasets-0.3.10/src/anemoi/datasets/create/functions/sources/netcdf.py +0 -72
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/.vscode/spellright.dict +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/LICENSE +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/README.md +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/Makefile +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/_static/logo.png +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/_static/style.css +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/_templates/.gitkeep +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/apply-fmt.sh +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/filters/empty.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/filters/noop.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/filters/rename.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/filters/rotate_winds.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/filters/select.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/filters/unrotate_winds.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/filters.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/handling-missing-dates.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/handling-missing-values.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/introduction.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/naming-variables.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/operations.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/accumulations.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/accumulations1.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/accumulations2.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/forcings.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/forcings.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/grib.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/hindcasts.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/mars.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/mars1.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/mars2.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/netcdf.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/netcdf.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/opendap.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/opendap.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/recentre.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/yaml/grib1.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/yaml/grib2.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/yaml/grib3.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/yaml/grib4.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/yaml/hindcasts.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/sources/yaml/recentre.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/statistics.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/syntax.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/syntax.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/yaml/Makefile +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/yaml/building1.txt +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/yaml/building1.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/yaml/building2.txt +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/yaml/building2.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/yaml/building3.txt +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/yaml/building3.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/yaml/concat.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/yaml/hindcasts.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/yaml/input.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/yaml/missing_dates.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/yaml/nan.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/building/yaml/pipe.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/check-index.sh +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/cli/compare.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/cli/copy.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/cli/create.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/cli/inspect.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/cli/introduction.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/cli/scan.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/conf.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/images.pptx +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/installing.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/overview.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/overview_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/schemas/matrix.excalidraw +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/schemas/matrix.png +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/schemas/overview.excalidraw +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/schemas/overview.png +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/schemas/recipe.excalidraw +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/schemas/recipe.png +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/test.ipynb +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/area1_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/area2_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/chain_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/combine_example.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/concat1.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/cutout_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/drop_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/end_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/ensembles1_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/frequency_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/grids1_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/join1.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/matching0_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/matching1_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/matching2_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/matching3_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/matching4_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/misc1.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/misc2.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/missing_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/open_cloud.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/open_combine1_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/open_combine2_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/open_complex.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/open_dict_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/open_first_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/open_list_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/open_name.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/open_other.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/open_path.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/open_yaml_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/rename_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/reorder1_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/reorder2_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/select1_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/select2_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/shuffle_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/some_attributes_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/start_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/statistics_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/subset_example.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/thinning_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/zip1_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/code/zip2_.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/combining.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/configuration.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/configuration.toml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/grids.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/images/area-1.png +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/images/concat.png +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/images/cutout-1.png +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/images/cutout-2.png +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/images/cutout-3.png +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/images/cutout-4.png +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/images/join.png +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/images/overlay.png +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/images/thinning-after.png +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/images/thinning-before.png +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/introduction.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/matching.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/methods.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/miscellaneous.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/opening.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/other.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/selecting.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/docs/using/statistics.rst +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/setup.cfg +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/__init__.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/__main__.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/commands/__init__.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/commands/copy.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/compute/__init__.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/functions/filters/__init__.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/functions/filters/noop.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/functions/sources/recentre.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/statistics/summary.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/create/writer.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/data/__init__.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/data/concat.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/data/debug.css +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/data/debug.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/data/ensemble.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/data/forwards.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/data/grids.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/data/indexing.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/data/join.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/data/masked.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/data/select.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/data/statistics.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/data/subset.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/data/unchecked.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/grids.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi/datasets/utils/__init__.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi_datasets.egg-info/dependency_links.txt +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi_datasets.egg-info/entry_points.txt +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/src/anemoi_datasets.egg-info/top_level.txt +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tests/create/concat.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tests/create/data_sources.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tests/create/join.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tests/create/missing.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tests/create/nan.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tests/create/pipe.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tests/create/recentre.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tests/create-perturbations-full.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tests/create-shift.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tests/test_chunks.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tests/test_dates.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tests/test_indexing.py +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tools/.gitignore +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tools/examples/Makefile +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tools/examples/an-oper-2023-2023-2p5-6h-v1.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tools/grids/Makefile +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tools/grids/grids.ipynb +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tools/grids/grids1.yaml +0 -0
- {anemoi_datasets-0.3.10 → anemoi_datasets-0.4.2}/tools/grids/grids2.yaml +0 -0
|
@@ -37,8 +37,8 @@ repos:
|
|
|
37
37
|
rev: v0.4.6
|
|
38
38
|
hooks:
|
|
39
39
|
- id: ruff
|
|
40
|
-
# Next line
|
|
41
|
-
exclude: '
|
|
40
|
+
# Next line is to exclude for documentation code snippets
|
|
41
|
+
exclude: 'docs/(.*/)?[a-z]\w+_.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
|
+
Version: 0.4.2
|
|
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,49 +223,65 @@ 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.11
|
|
227
227
|
Requires-Dist: numpy
|
|
228
228
|
Requires-Dist: pyyaml
|
|
229
229
|
Requires-Dist: semantic-version
|
|
230
230
|
Requires-Dist: tqdm
|
|
231
|
-
Requires-Dist: zarr
|
|
231
|
+
Requires-Dist: zarr
|
|
232
232
|
Provides-Extra: all
|
|
233
|
+
Requires-Dist: aiohttp; extra == "all"
|
|
233
234
|
Requires-Dist: boto3; extra == "all"
|
|
234
|
-
Requires-Dist:
|
|
235
|
+
Requires-Dist: earthkit-data[mars]>=0.9; extra == "all"
|
|
236
|
+
Requires-Dist: earthkit-geo>=0.2; extra == "all"
|
|
235
237
|
Requires-Dist: earthkit-meteo; extra == "all"
|
|
236
238
|
Requires-Dist: ecmwflibs>=0.6.3; extra == "all"
|
|
237
239
|
Requires-Dist: entrypoints; extra == "all"
|
|
240
|
+
Requires-Dist: gcsfs; extra == "all"
|
|
241
|
+
Requires-Dist: kerchunk; extra == "all"
|
|
238
242
|
Requires-Dist: pyproj; extra == "all"
|
|
239
243
|
Requires-Dist: requests; extra == "all"
|
|
240
244
|
Requires-Dist: s3fs; extra == "all"
|
|
241
245
|
Provides-Extra: create
|
|
242
|
-
Requires-Dist:
|
|
246
|
+
Requires-Dist: earthkit-data[mars]>=0.9; extra == "create"
|
|
247
|
+
Requires-Dist: earthkit-geo>=0.2; extra == "create"
|
|
243
248
|
Requires-Dist: earthkit-meteo; extra == "create"
|
|
244
249
|
Requires-Dist: ecmwflibs>=0.6.3; extra == "create"
|
|
245
250
|
Requires-Dist: entrypoints; extra == "create"
|
|
246
251
|
Requires-Dist: pyproj; extra == "create"
|
|
247
252
|
Provides-Extra: dev
|
|
253
|
+
Requires-Dist: aiohttp; extra == "dev"
|
|
248
254
|
Requires-Dist: boto3; extra == "dev"
|
|
249
|
-
Requires-Dist:
|
|
255
|
+
Requires-Dist: earthkit-data[mars]>=0.9; extra == "dev"
|
|
256
|
+
Requires-Dist: earthkit-geo>=0.2; extra == "dev"
|
|
250
257
|
Requires-Dist: earthkit-meteo; extra == "dev"
|
|
251
258
|
Requires-Dist: ecmwflibs>=0.6.3; extra == "dev"
|
|
252
259
|
Requires-Dist: entrypoints; extra == "dev"
|
|
260
|
+
Requires-Dist: gcsfs; extra == "dev"
|
|
261
|
+
Requires-Dist: kerchunk; extra == "dev"
|
|
253
262
|
Requires-Dist: nbsphinx; extra == "dev"
|
|
254
263
|
Requires-Dist: pandoc; extra == "dev"
|
|
255
264
|
Requires-Dist: pyproj; extra == "dev"
|
|
256
265
|
Requires-Dist: pytest; extra == "dev"
|
|
257
266
|
Requires-Dist: requests; extra == "dev"
|
|
267
|
+
Requires-Dist: rstfmt; extra == "dev"
|
|
258
268
|
Requires-Dist: s3fs; extra == "dev"
|
|
259
269
|
Requires-Dist: sphinx; extra == "dev"
|
|
260
|
-
Requires-Dist: sphinx-argparse; extra == "dev"
|
|
270
|
+
Requires-Dist: sphinx-argparse<0.5; extra == "dev"
|
|
261
271
|
Requires-Dist: sphinx-rtd-theme; extra == "dev"
|
|
262
272
|
Provides-Extra: docs
|
|
263
273
|
Requires-Dist: nbsphinx; extra == "docs"
|
|
264
274
|
Requires-Dist: pandoc; extra == "docs"
|
|
275
|
+
Requires-Dist: rstfmt; extra == "docs"
|
|
265
276
|
Requires-Dist: sphinx; extra == "docs"
|
|
266
|
-
Requires-Dist: sphinx-argparse; extra == "docs"
|
|
277
|
+
Requires-Dist: sphinx-argparse<0.5; extra == "docs"
|
|
267
278
|
Requires-Dist: sphinx-rtd-theme; extra == "docs"
|
|
279
|
+
Provides-Extra: kerchunk
|
|
280
|
+
Requires-Dist: gcsfs; extra == "kerchunk"
|
|
281
|
+
Requires-Dist: kerchunk; extra == "kerchunk"
|
|
282
|
+
Requires-Dist: s3fs; extra == "kerchunk"
|
|
268
283
|
Provides-Extra: remote
|
|
284
|
+
Requires-Dist: aiohttp; extra == "remote"
|
|
269
285
|
Requires-Dist: boto3; extra == "remote"
|
|
270
286
|
Requires-Dist: requests; extra == "remote"
|
|
271
287
|
Requires-Dist: s3fs; extra == "remote"
|
|
@@ -40,9 +40,9 @@ while ``end="2020"`` is equivalent to ``end="2020-12-31"``.
|
|
|
40
40
|
|
|
41
41
|
Note also how the ``frequency`` of the dataset will change how the
|
|
42
42
|
``end`` option is interpreted: - ``end="2020"`` with a ``frequency`` of
|
|
43
|
-
one hour is equivalent to ``end="2020-12-31 23:00"`` - ``end="2020"``
|
|
43
|
+
one hour is equivalent to ``end="2020-12-31 23:00:00"`` - ``end="2020"``
|
|
44
44
|
with a ``frequency`` of 6 hours is equivalent to ``end="2020-12-31
|
|
45
|
-
18:00"``
|
|
45
|
+
18:00:00"``
|
|
46
46
|
|
|
47
47
|
.. _frequency:
|
|
48
48
|
|
|
@@ -50,26 +50,32 @@ dynamic = [
|
|
|
50
50
|
"version",
|
|
51
51
|
]
|
|
52
52
|
dependencies = [
|
|
53
|
-
"anemoi-utils[provenance]>=0.3.
|
|
53
|
+
"anemoi-utils[provenance]>=0.3.11",
|
|
54
54
|
"numpy",
|
|
55
55
|
"pyyaml",
|
|
56
56
|
"semantic-version",
|
|
57
57
|
"tqdm",
|
|
58
|
-
"zarr
|
|
58
|
+
"zarr",
|
|
59
59
|
]
|
|
60
60
|
|
|
61
61
|
optional-dependencies.all = [
|
|
62
|
+
"aiohttp",
|
|
62
63
|
"boto3",
|
|
63
|
-
"
|
|
64
|
+
"earthkit-data[mars]>=0.9",
|
|
65
|
+
"earthkit-geo>=0.2",
|
|
64
66
|
"earthkit-meteo",
|
|
65
67
|
"ecmwflibs>=0.6.3",
|
|
66
68
|
"entrypoints",
|
|
69
|
+
"gcsfs",
|
|
70
|
+
"kerchunk",
|
|
67
71
|
"pyproj",
|
|
68
72
|
"requests",
|
|
69
73
|
"s3fs",
|
|
70
74
|
]
|
|
75
|
+
|
|
71
76
|
optional-dependencies.create = [
|
|
72
|
-
"
|
|
77
|
+
"earthkit-data[mars]>=0.9",
|
|
78
|
+
"earthkit-geo>=0.2",
|
|
73
79
|
"earthkit-meteo",
|
|
74
80
|
"ecmwflibs>=0.6.3",
|
|
75
81
|
"entrypoints",
|
|
@@ -77,41 +83,59 @@ optional-dependencies.create = [
|
|
|
77
83
|
]
|
|
78
84
|
|
|
79
85
|
optional-dependencies.dev = [
|
|
86
|
+
"aiohttp",
|
|
80
87
|
"boto3",
|
|
81
|
-
"
|
|
88
|
+
"earthkit-data[mars]>=0.9",
|
|
89
|
+
"earthkit-geo>=0.2",
|
|
82
90
|
"earthkit-meteo",
|
|
83
91
|
"ecmwflibs>=0.6.3",
|
|
84
92
|
"entrypoints",
|
|
93
|
+
"gcsfs",
|
|
94
|
+
"kerchunk",
|
|
85
95
|
"nbsphinx",
|
|
86
96
|
"pandoc",
|
|
87
97
|
"pyproj",
|
|
88
98
|
"pytest",
|
|
89
99
|
"requests",
|
|
100
|
+
"rstfmt",
|
|
90
101
|
"s3fs",
|
|
91
102
|
"sphinx",
|
|
92
|
-
"sphinx-argparse",
|
|
103
|
+
"sphinx-argparse<0.5",
|
|
93
104
|
"sphinx-rtd-theme",
|
|
94
105
|
]
|
|
106
|
+
|
|
95
107
|
optional-dependencies.docs = [
|
|
96
108
|
"nbsphinx",
|
|
97
109
|
"pandoc",
|
|
110
|
+
"rstfmt",
|
|
98
111
|
"sphinx",
|
|
99
|
-
"sphinx-argparse",
|
|
112
|
+
"sphinx-argparse<0.5",
|
|
100
113
|
"sphinx-rtd-theme",
|
|
101
114
|
]
|
|
115
|
+
|
|
116
|
+
optional-dependencies.kerchunk = [
|
|
117
|
+
"gcsfs",
|
|
118
|
+
"kerchunk",
|
|
119
|
+
"s3fs",
|
|
120
|
+
]
|
|
121
|
+
|
|
102
122
|
optional-dependencies.remote = [
|
|
123
|
+
"aiohttp",
|
|
103
124
|
"boto3",
|
|
104
125
|
"requests",
|
|
105
126
|
"s3fs",
|
|
106
127
|
]
|
|
128
|
+
|
|
107
129
|
optional-dependencies.tests = [
|
|
108
130
|
"pytest",
|
|
109
131
|
]
|
|
132
|
+
|
|
110
133
|
urls.Documentation = "https://anemoi-datasets.readthedocs.io/"
|
|
111
134
|
urls.Homepage = "https://github.com/ecmwf/anemoi-datasets/"
|
|
112
135
|
urls.Issues = "https://github.com/ecmwf/anemoi-datasets/issues"
|
|
113
|
-
# Changelog = "https://github.com/ecmwf/anemoi-datasets/CHANGELOG.md"
|
|
114
136
|
urls.Repository = "https://github.com/ecmwf/anemoi-datasets/"
|
|
137
|
+
# Changelog = "https://github.com/ecmwf/anemoi-datasets/CHANGELOG.md"
|
|
138
|
+
|
|
115
139
|
scripts.anemoi-datasets = "anemoi.datasets.__main__:main"
|
|
116
140
|
|
|
117
141
|
[tool.setuptools.package-data]
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# (C) Copyright 2024 ECMWF.
|
|
3
|
+
#
|
|
4
|
+
# This software is licensed under the terms of the Apache Licence Version 2.0
|
|
5
|
+
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
|
|
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
|
+
import numpy as np
|
|
12
|
+
import tqdm
|
|
13
|
+
import zarr
|
|
14
|
+
|
|
15
|
+
from anemoi.datasets import open_dataset
|
|
16
|
+
|
|
17
|
+
from . import Command
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class Compare(Command):
|
|
21
|
+
"""Compare two datasets. This command compares the variables in two datasets and prints the mean of the common variables. It does not compare the data itself (yet)."""
|
|
22
|
+
|
|
23
|
+
def add_arguments(self, command_parser):
|
|
24
|
+
command_parser.add_argument("dataset1")
|
|
25
|
+
command_parser.add_argument("dataset2")
|
|
26
|
+
command_parser.add_argument("--data", action="store_true", help="Compare the data.")
|
|
27
|
+
command_parser.add_argument("--statistics", action="store_true", help="Compare the statistics.")
|
|
28
|
+
|
|
29
|
+
def run(self, args):
|
|
30
|
+
ds1 = open_dataset(args.dataset1)
|
|
31
|
+
ds2 = open_dataset(args.dataset2)
|
|
32
|
+
|
|
33
|
+
v1 = set(ds1.variables)
|
|
34
|
+
v2 = set(ds2.variables)
|
|
35
|
+
|
|
36
|
+
print("Only in dataset 1:", ", ".join(sorted(v1 - v2)))
|
|
37
|
+
print("Only in dataset 2:", ", ".join(sorted(v2 - v1)))
|
|
38
|
+
print()
|
|
39
|
+
common = sorted(v1 & v2)
|
|
40
|
+
print("Common:")
|
|
41
|
+
print("-------")
|
|
42
|
+
print()
|
|
43
|
+
|
|
44
|
+
for v in common:
|
|
45
|
+
print(
|
|
46
|
+
f"{v:14}",
|
|
47
|
+
f"{ds1.statistics['mean'][ds1.name_to_index[v]]:14g}",
|
|
48
|
+
f"{ds2.statistics['mean'][ds2.name_to_index[v]]:14g}",
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
if args.data:
|
|
52
|
+
print()
|
|
53
|
+
print("Data:")
|
|
54
|
+
print("-----")
|
|
55
|
+
print()
|
|
56
|
+
|
|
57
|
+
diff = 0
|
|
58
|
+
for a, b in tqdm.tqdm(zip(ds1, ds2)):
|
|
59
|
+
if not np.array_equal(a, b, equal_nan=True):
|
|
60
|
+
diff += 1
|
|
61
|
+
|
|
62
|
+
print(f"Number of different rows: {diff}/{len(ds1)}")
|
|
63
|
+
|
|
64
|
+
if args.data:
|
|
65
|
+
print()
|
|
66
|
+
print("Data 2:")
|
|
67
|
+
print("-----")
|
|
68
|
+
print()
|
|
69
|
+
|
|
70
|
+
ds1 = zarr.open(args.dataset1, mode="r")
|
|
71
|
+
ds2 = zarr.open(args.dataset2, mode="r")
|
|
72
|
+
|
|
73
|
+
for name in (
|
|
74
|
+
"data",
|
|
75
|
+
"count",
|
|
76
|
+
"sums",
|
|
77
|
+
"squares",
|
|
78
|
+
"mean",
|
|
79
|
+
"stdev",
|
|
80
|
+
"minimum",
|
|
81
|
+
"maximum",
|
|
82
|
+
"latitudes",
|
|
83
|
+
"longitudes",
|
|
84
|
+
):
|
|
85
|
+
a1 = ds1[name]
|
|
86
|
+
a2 = ds2[name]
|
|
87
|
+
|
|
88
|
+
if len(a1) != len(a2):
|
|
89
|
+
print(f"{name}: lengths mismatch {len(a1)} != {len(a2)}")
|
|
90
|
+
continue
|
|
91
|
+
|
|
92
|
+
diff = 0
|
|
93
|
+
for a, b in tqdm.tqdm(zip(a1, a2), leave=False):
|
|
94
|
+
if not np.array_equal(a, b, equal_nan=True):
|
|
95
|
+
if diff == 0:
|
|
96
|
+
print(f"\n{name}: first different row:")
|
|
97
|
+
print(a[a != b])
|
|
98
|
+
print(b[a != b])
|
|
99
|
+
|
|
100
|
+
diff += 1
|
|
101
|
+
|
|
102
|
+
print(f"{name}: {diff} different rows out of {len(a1)}")
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
command = Compare
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import datetime
|
|
2
|
+
import logging
|
|
3
|
+
import time
|
|
4
|
+
from concurrent.futures import ProcessPoolExecutor
|
|
5
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
6
|
+
from concurrent.futures import as_completed
|
|
7
|
+
|
|
8
|
+
import tqdm
|
|
9
|
+
from anemoi.utils.humanize import seconds_to_human
|
|
10
|
+
|
|
11
|
+
from anemoi.datasets.create.trace import enable_trace
|
|
12
|
+
|
|
13
|
+
from . import Command
|
|
14
|
+
|
|
15
|
+
LOG = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def task(what, options, *args, **kwargs):
|
|
19
|
+
"""
|
|
20
|
+
Make sure `import Creator` is done in the sub-processes, and not in the main one.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
now = datetime.datetime.now()
|
|
24
|
+
LOG.debug(f"Task {what}({args},{kwargs}) starting")
|
|
25
|
+
|
|
26
|
+
from anemoi.datasets.create import Creator
|
|
27
|
+
|
|
28
|
+
if "trace" in options:
|
|
29
|
+
enable_trace(options["trace"])
|
|
30
|
+
|
|
31
|
+
c = Creator(**options)
|
|
32
|
+
result = getattr(c, what)(*args, **kwargs)
|
|
33
|
+
|
|
34
|
+
LOG.debug(f"Task {what}({args},{kwargs}) completed ({datetime.datetime.now()-now})")
|
|
35
|
+
return result
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class Create(Command):
|
|
39
|
+
"""Create a dataset."""
|
|
40
|
+
|
|
41
|
+
internal = True
|
|
42
|
+
timestamp = True
|
|
43
|
+
|
|
44
|
+
def add_arguments(self, command_parser):
|
|
45
|
+
command_parser.add_argument(
|
|
46
|
+
"--overwrite",
|
|
47
|
+
action="store_true",
|
|
48
|
+
help="Overwrite existing files. This will delete the target dataset if it already exists.",
|
|
49
|
+
)
|
|
50
|
+
command_parser.add_argument(
|
|
51
|
+
"--test",
|
|
52
|
+
action="store_true",
|
|
53
|
+
help="Build a small dataset, using only the first dates. And, when possible, using low resolution and less ensemble members.",
|
|
54
|
+
)
|
|
55
|
+
command_parser.add_argument("config", help="Configuration yaml file defining the recipe to create the dataset.")
|
|
56
|
+
command_parser.add_argument("path", help="Path to store the created data.")
|
|
57
|
+
group = command_parser.add_mutually_exclusive_group()
|
|
58
|
+
group.add_argument("--threads", help="Use `n` parallel thread workers.", type=int, default=0)
|
|
59
|
+
group.add_argument("--processes", help="Use `n` parallel process workers.", type=int, default=0)
|
|
60
|
+
command_parser.add_argument("--trace", action="store_true")
|
|
61
|
+
|
|
62
|
+
def run(self, args):
|
|
63
|
+
now = time.time()
|
|
64
|
+
if args.threads + args.processes:
|
|
65
|
+
self.parallel_create(args)
|
|
66
|
+
else:
|
|
67
|
+
self.serial_create(args)
|
|
68
|
+
LOG.info(f"Create completed in {seconds_to_human(time.time()-now)}")
|
|
69
|
+
|
|
70
|
+
def serial_create(self, args):
|
|
71
|
+
from anemoi.datasets.create import Creator
|
|
72
|
+
|
|
73
|
+
options = vars(args)
|
|
74
|
+
c = Creator(**options)
|
|
75
|
+
c.create()
|
|
76
|
+
|
|
77
|
+
def parallel_create(self, args):
|
|
78
|
+
"""Some modules, like fsspec do not work well with fork()
|
|
79
|
+
Other modules may not be thread safe. So we implement
|
|
80
|
+
parallel loadining using multiprocessing before any
|
|
81
|
+
of the modules are imported.
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
options = vars(args)
|
|
85
|
+
parallel = args.threads + args.processes
|
|
86
|
+
args.use_threads = args.threads > 0
|
|
87
|
+
|
|
88
|
+
if args.use_threads:
|
|
89
|
+
ExecutorClass = ThreadPoolExecutor
|
|
90
|
+
else:
|
|
91
|
+
ExecutorClass = ProcessPoolExecutor
|
|
92
|
+
|
|
93
|
+
with ExecutorClass(max_workers=1) as executor:
|
|
94
|
+
total = executor.submit(task, "init", options).result()
|
|
95
|
+
|
|
96
|
+
futures = []
|
|
97
|
+
|
|
98
|
+
with ExecutorClass(max_workers=parallel) as executor:
|
|
99
|
+
for n in range(total):
|
|
100
|
+
futures.append(executor.submit(task, "load", options, parts=f"{n+1}/{total}"))
|
|
101
|
+
|
|
102
|
+
for future in tqdm.tqdm(
|
|
103
|
+
as_completed(futures), desc="Loading", total=len(futures), colour="green", position=parallel + 1
|
|
104
|
+
):
|
|
105
|
+
future.result()
|
|
106
|
+
|
|
107
|
+
with ExecutorClass(max_workers=1) as executor:
|
|
108
|
+
executor.submit(task, "statistics", options).result()
|
|
109
|
+
executor.submit(task, "additions", options).result()
|
|
110
|
+
executor.submit(task, "cleanup", options).result()
|
|
111
|
+
executor.submit(task, "verify", options).result()
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
command = Create
|
|
@@ -16,7 +16,7 @@ import numpy as np
|
|
|
16
16
|
import semantic_version
|
|
17
17
|
import tqdm
|
|
18
18
|
from anemoi.utils.humanize import bytes
|
|
19
|
-
from anemoi.utils.humanize import
|
|
19
|
+
from anemoi.utils.humanize import bytes_to_human
|
|
20
20
|
from anemoi.utils.humanize import when
|
|
21
21
|
from anemoi.utils.text import dotted_line
|
|
22
22
|
from anemoi.utils.text import progress
|
|
@@ -215,9 +215,9 @@ class Version:
|
|
|
215
215
|
total_size, n = compute_directory_size(self.path)
|
|
216
216
|
|
|
217
217
|
if total_size is not None:
|
|
218
|
-
print(f"💽 Size : {bytes(total_size)} ({
|
|
218
|
+
print(f"💽 Size : {bytes(total_size)} ({bytes_to_human(total_size)})")
|
|
219
219
|
if n is not None:
|
|
220
|
-
print(f"📁 Files : {
|
|
220
|
+
print(f"📁 Files : {n:,}")
|
|
221
221
|
|
|
222
222
|
@property
|
|
223
223
|
def statistics(self):
|
|
@@ -382,7 +382,7 @@ class NoVersion(Version):
|
|
|
382
382
|
@property
|
|
383
383
|
def last_date(self):
|
|
384
384
|
monthly = find(self.metadata, "monthly")
|
|
385
|
-
time = max([int(t) for t in find(self.metadata["
|
|
385
|
+
time = max([int(t) for t in find(self.metadata["earthkit-data"], "time")])
|
|
386
386
|
assert isinstance(time, int), (time, type(time))
|
|
387
387
|
if time > 100:
|
|
388
388
|
time = time // 100
|
|
@@ -390,7 +390,7 @@ class NoVersion(Version):
|
|
|
390
390
|
|
|
391
391
|
@property
|
|
392
392
|
def frequency(self):
|
|
393
|
-
time = find(self.metadata["
|
|
393
|
+
time = find(self.metadata["earthkit-data"], "time")
|
|
394
394
|
return 24 // len(time)
|
|
395
395
|
|
|
396
396
|
@property
|
|
@@ -444,9 +444,9 @@ class Version0_4(Version):
|
|
|
444
444
|
z = self.zarr
|
|
445
445
|
|
|
446
446
|
# for backward compatibility
|
|
447
|
-
if "
|
|
448
|
-
|
|
449
|
-
print(f"
|
|
447
|
+
if "earthkit-data" in z.attrs:
|
|
448
|
+
ekd_version = z.attrs["earthkit-data"].get("versions", {}).get("earthkit-data", "unkwown")
|
|
449
|
+
print(f"earthkit-data version used to create this zarr: {ekd_version}. Not supported.")
|
|
450
450
|
return
|
|
451
451
|
|
|
452
452
|
version = z.attrs.get("version")
|
|
@@ -455,7 +455,7 @@ class Version0_4(Version):
|
|
|
455
455
|
print(" Cannot find metadata information about versions.")
|
|
456
456
|
else:
|
|
457
457
|
print(f"Zarr format (version {version})", end="")
|
|
458
|
-
print(f" created by
|
|
458
|
+
print(f" created by earthkit-data={versions.pop('earthkit-data')}", end="")
|
|
459
459
|
timestamp = z.attrs.get("creation_timestamp")
|
|
460
460
|
timestamp = datetime.datetime.fromisoformat(timestamp)
|
|
461
461
|
print(f" on {timestamp}", end="")
|
|
@@ -3,7 +3,7 @@ import os
|
|
|
3
3
|
import sys
|
|
4
4
|
from collections import defaultdict
|
|
5
5
|
|
|
6
|
-
import
|
|
6
|
+
import earthkit.data as ekd
|
|
7
7
|
import tqdm
|
|
8
8
|
import yaml
|
|
9
9
|
|
|
@@ -50,9 +50,9 @@ class Scan(Command):
|
|
|
50
50
|
for path in tqdm.tqdm(paths, leave=False):
|
|
51
51
|
if not match(path):
|
|
52
52
|
continue
|
|
53
|
-
for field in tqdm.tqdm(
|
|
54
|
-
dates.add(field.
|
|
55
|
-
mars = field.
|
|
53
|
+
for field in tqdm.tqdm(ekd.from_source("file", path), leave=False):
|
|
54
|
+
dates.add(field.datetime()["valid_time"])
|
|
55
|
+
mars = field.metadata(namespace="mars")
|
|
56
56
|
keys = tuple(mars.get(k) for k in KEYS)
|
|
57
57
|
gribs[keys].add(path)
|
|
58
58
|
for k, v in mars.items():
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
import logging
|
|
11
11
|
|
|
12
12
|
import numpy as np
|
|
13
|
-
from
|
|
14
|
-
from
|
|
13
|
+
from earthkit.data.core.temporary import temp_file
|
|
14
|
+
from earthkit.data.readers.grib.output import new_grib_output
|
|
15
15
|
|
|
16
|
-
from anemoi.datasets.create.functions import
|
|
16
|
+
from anemoi.datasets.create.functions import assert_is_fieldlist
|
|
17
17
|
|
|
18
18
|
LOG = logging.getLogger(__name__)
|
|
19
19
|
|
|
@@ -96,7 +96,7 @@ def recentre(
|
|
|
96
96
|
|
|
97
97
|
for i, centre_field in enumerate(centre):
|
|
98
98
|
param = centre_field.metadata("param")
|
|
99
|
-
centre_field_as_mars = centre_field.
|
|
99
|
+
centre_field_as_mars = centre_field.metadata(namespace="mars")
|
|
100
100
|
|
|
101
101
|
# load the centre field
|
|
102
102
|
centre_np = centre_field.to_numpy()
|
|
@@ -106,8 +106,13 @@ def recentre(
|
|
|
106
106
|
|
|
107
107
|
for j in range(n_numbers):
|
|
108
108
|
ensemble_field = members[i * n_numbers + j]
|
|
109
|
-
ensemble_field_as_mars = ensemble_field.
|
|
110
|
-
check_compatible(
|
|
109
|
+
ensemble_field_as_mars = ensemble_field.metadata(namespace="mars")
|
|
110
|
+
check_compatible(
|
|
111
|
+
centre_field,
|
|
112
|
+
ensemble_field,
|
|
113
|
+
centre_field_as_mars,
|
|
114
|
+
ensemble_field_as_mars,
|
|
115
|
+
)
|
|
111
116
|
members_np[j] = ensemble_field.to_numpy()
|
|
112
117
|
|
|
113
118
|
ensemble_field_as_mars = tuple(sorted(ensemble_field_as_mars.items()))
|
|
@@ -149,10 +154,10 @@ def recentre(
|
|
|
149
154
|
if output is not None:
|
|
150
155
|
return path
|
|
151
156
|
|
|
152
|
-
from
|
|
157
|
+
from earthkit.data import from_source
|
|
153
158
|
|
|
154
|
-
ds =
|
|
155
|
-
|
|
159
|
+
ds = from_source("file", path)
|
|
160
|
+
assert_is_fieldlist(ds)
|
|
156
161
|
# save a reference to the tmp file so it is deleted
|
|
157
162
|
# only when the dataset is not used anymore
|
|
158
163
|
ds._tmp = tmp
|