anemoi-datasets 0.5.20__py3-none-any.whl → 0.5.22__py3-none-any.whl

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 (29) hide show
  1. anemoi/datasets/_version.py +2 -2
  2. anemoi/datasets/check.py +93 -0
  3. anemoi/datasets/commands/check.py +101 -0
  4. anemoi/datasets/commands/copy.py +43 -3
  5. anemoi/datasets/commands/create.py +2 -3
  6. anemoi/datasets/commands/grib-index.py +0 -3
  7. anemoi/datasets/commands/inspect.py +2 -2
  8. anemoi/datasets/commands/scan.py +17 -5
  9. anemoi/datasets/create/__init__.py +19 -8
  10. anemoi/datasets/create/check.py +19 -1
  11. anemoi/datasets/create/input/action.py +2 -0
  12. anemoi/datasets/create/input/result.py +6 -2
  13. anemoi/datasets/create/sources/accumulations.py +400 -34
  14. anemoi/datasets/create/sources/forcings.py +1 -1
  15. anemoi/datasets/create/sources/grib.py +27 -181
  16. anemoi/datasets/create/sources/xarray_support/metadata.py +6 -0
  17. anemoi/datasets/create/sources/xarray_zarr.py +1 -1
  18. anemoi/datasets/create/writer.py +1 -1
  19. anemoi/datasets/data/complement.py +28 -11
  20. anemoi/datasets/data/forwards.py +4 -0
  21. anemoi/datasets/data/grids.py +3 -3
  22. anemoi/datasets/data/misc.py +1 -1
  23. anemoi/datasets/data/stores.py +36 -4
  24. {anemoi_datasets-0.5.20.dist-info → anemoi_datasets-0.5.22.dist-info}/METADATA +5 -3
  25. {anemoi_datasets-0.5.20.dist-info → anemoi_datasets-0.5.22.dist-info}/RECORD +29 -27
  26. {anemoi_datasets-0.5.20.dist-info → anemoi_datasets-0.5.22.dist-info}/WHEEL +1 -1
  27. {anemoi_datasets-0.5.20.dist-info → anemoi_datasets-0.5.22.dist-info}/entry_points.txt +0 -0
  28. {anemoi_datasets-0.5.20.dist-info → anemoi_datasets-0.5.22.dist-info}/licenses/LICENSE +0 -0
  29. {anemoi_datasets-0.5.20.dist-info → anemoi_datasets-0.5.22.dist-info}/top_level.txt +0 -0
@@ -17,9 +17,11 @@ from typing import Optional
17
17
  from typing import Union
18
18
 
19
19
  import earthkit.data as ekd
20
+ from anemoi.transform.fields import new_field_from_grid
21
+ from anemoi.transform.fields import new_fieldlist_from_list
20
22
  from anemoi.transform.flavour import RuleBasedFlavour
23
+ from anemoi.transform.grids import grid_registry
21
24
  from earthkit.data import from_source
22
- from earthkit.data.indexing.fieldlist import FieldArray
23
25
  from earthkit.data.utils.patterns import Pattern
24
26
 
25
27
  from .legacy import legacy_source
@@ -27,169 +29,6 @@ from .legacy import legacy_source
27
29
  LOG = logging.getLogger(__name__)
28
30
 
29
31
 
30
- def _load(context: Any, name: str, record: Dict[str, Any]) -> tuple:
31
- """Load data from a given source.
32
-
33
- Parameters
34
- ----------
35
- context : Any
36
- The context in which the function is executed.
37
- name : str
38
- The name of the data source.
39
- record : dict of str to Any
40
- The record containing source information.
41
-
42
- Returns
43
- -------
44
- tuple
45
- A tuple containing the data as a numpy array and the UUID of the HGrid.
46
- """
47
- ds = None
48
-
49
- param = record["param"]
50
-
51
- if "path" in record:
52
- context.info(f"Using {name} from {record['path']} (param={param})")
53
- ds = from_source("file", record["path"])
54
-
55
- if "url" in record:
56
- context.info(f"Using {name} from {record['url']} (param={param})")
57
- ds = from_source("url", record["url"])
58
-
59
- ds = ds.sel(param=param)
60
-
61
- assert len(ds) == 1, f"{name} {param}, expected one field, got {len(ds)}"
62
- ds = ds[0]
63
-
64
- return ds.to_numpy(flatten=True), ds.metadata("uuidOfHGrid")
65
-
66
-
67
- class Geography:
68
- """This class retrieves the latitudes and longitudes of unstructured grids,
69
- and checks if the fields are compatible with the grid.
70
-
71
- Parameters
72
- ----------
73
- context : Any
74
- The context in which the function is executed.
75
- latitudes : dict of str to Any
76
- Latitude information.
77
- longitudes : dict of str to Any
78
- Longitude information.
79
- """
80
-
81
- def __init__(self, context: Any, latitudes: Dict[str, Any], longitudes: Dict[str, Any]) -> None:
82
- """Initialize the Geography class.
83
-
84
- Parameters
85
- ----------
86
- context : Any
87
- The context in which the function is executed.
88
- latitudes : dict of str to Any
89
- Latitude information.
90
- longitudes : dict of str to Any
91
- Longitude information.
92
- """
93
- latitudes, uuidOfHGrid_lat = _load(context, "latitudes", latitudes)
94
- longitudes, uuidOfHGrid_lon = _load(context, "longitudes", longitudes)
95
-
96
- assert (
97
- uuidOfHGrid_lat == uuidOfHGrid_lon
98
- ), f"uuidOfHGrid mismatch: lat={uuidOfHGrid_lat} != lon={uuidOfHGrid_lon}"
99
-
100
- context.info(f"Latitudes: {len(latitudes)}, Longitudes: {len(longitudes)}")
101
- assert len(latitudes) == len(longitudes)
102
-
103
- self.uuidOfHGrid = uuidOfHGrid_lat
104
- self.latitudes = latitudes
105
- self.longitudes = longitudes
106
- self.first = True
107
-
108
- def check(self, field: Any) -> None:
109
- """Check if the field is compatible with the grid.
110
-
111
- Parameters
112
- ----------
113
- field : Any
114
- The field to check.
115
- """
116
- if self.first:
117
- # We only check the first field, for performance reasons
118
- assert (
119
- field.metadata("uuidOfHGrid") == self.uuidOfHGrid
120
- ), f"uuidOfHGrid mismatch: {field.metadata('uuidOfHGrid')} != {self.uuidOfHGrid}"
121
- self.first = False
122
-
123
-
124
- class AddGrid:
125
- """An earth-kit.data.Field wrapper that adds grid information.
126
-
127
- Parameters
128
- ----------
129
- field : Any
130
- The field to wrap.
131
- geography : Geography
132
- The geography information.
133
- """
134
-
135
- def __init__(self, field: Any, geography: Geography) -> None:
136
- """Initialize the AddGrid class.
137
-
138
- Parameters
139
- ----------
140
- field : Any
141
- The field to wrap.
142
- geography : Geography
143
- The geography information.
144
- """
145
- self._field = field
146
-
147
- geography.check(field)
148
-
149
- self._latitudes = geography.latitudes
150
- self._longitudes = geography.longitudes
151
-
152
- def __getattr__(self, name: str) -> Any:
153
- """Get an attribute from the wrapped field.
154
-
155
- Parameters
156
- ----------
157
- name : str
158
- The name of the attribute.
159
-
160
- Returns
161
- -------
162
- Any
163
- The attribute value.
164
- """
165
- return getattr(self._field, name)
166
-
167
- def __repr__(self) -> str:
168
- """Get the string representation of the wrapped field.
169
-
170
- Returns
171
- -------
172
- str
173
- The string representation.
174
- """
175
- return repr(self._field)
176
-
177
- def grid_points(self) -> tuple:
178
- """Get the grid points (latitudes and longitudes).
179
-
180
- Returns
181
- -------
182
- tuple
183
- The latitudes and longitudes.
184
- """
185
- return self._latitudes, self._longitudes
186
-
187
- @property
188
- def resolution(self) -> str:
189
- """Get the resolution of the grid."""
190
- return "unknown"
191
-
192
-
193
32
  def check(ds: Any, paths: List[str], **kwargs: Any) -> None:
194
33
  """Check if the dataset matches the expected number of fields.
195
34
 
@@ -243,23 +82,29 @@ def execute(
243
82
  context: Any,
244
83
  dates: List[Any],
245
84
  path: Union[str, List[str]],
246
- latitudes: Optional[Dict[str, Any]] = None,
247
- longitudes: Optional[Dict[str, Any]] = None,
248
85
  flavour: Optional[Union[str, Dict[str, Any]]] = None,
86
+ grid_definition: Optional[Dict[str, Any]] = None,
249
87
  *args: Any,
250
88
  **kwargs: Any,
251
89
  ) -> ekd.FieldList:
252
- """Execute the function to load data from GRIB files.
90
+ """Executes the function to load data from GRIB files.
253
91
 
254
- Args:
255
- context (Any): The context in which the function is executed.
256
- dates (List[Any]): List of dates.
257
- path (Union[str, List[str]]): Path or list of paths to the GRIB files.
258
- latitudes (Optional[Dict[str, Any]], optional): Latitude information. Defaults to None.
259
- longitudes (Optional[Dict[str, Any]], optional): Longitude information. Defaults to None.
260
- flavour (Optional[Union[str, Dict[str, Any]]], optional): Flavour information. Defaults to None.
261
- *args (Any): Additional arguments.
262
- **kwargs (Any): Additional keyword arguments.
92
+ Parameters
93
+ ----------
94
+ context : Any
95
+ The context in which the function is executed.
96
+ dates : list of Any
97
+ List of dates.
98
+ path : str or list of str
99
+ Path or list of paths to the GRIB files.
100
+ flavour : str or dict of str to Any, optional
101
+ Flavour information, by default None.
102
+ grid_definition : dict of str to Any, optional
103
+ Grid definition configuration to create a Grid object, by default None.
104
+ *args : Any
105
+ Additional positional arguments.
106
+ **kwargs : Any
107
+ Additional keyword arguments.
263
108
 
264
109
  Returns
265
110
  -------
@@ -270,9 +115,10 @@ def execute(
270
115
  if flavour is not None:
271
116
  flavour = RuleBasedFlavour(flavour)
272
117
 
273
- geography = None
274
- if latitudes is not None and longitudes is not None:
275
- geography = Geography(context, latitudes, longitudes)
118
+ if grid_definition is not None:
119
+ grid = grid_registry.from_config(grid_definition)
120
+ else:
121
+ grid = None
276
122
 
277
123
  ds = from_source("empty")
278
124
  dates = [d.isoformat() for d in dates]
@@ -295,8 +141,8 @@ def execute(
295
141
  if kwargs and not context.partial_ok:
296
142
  check(ds, given_paths, valid_datetime=dates, **kwargs)
297
143
 
298
- if geography is not None:
299
- ds = FieldArray([AddGrid(_, geography) for _ in ds])
144
+ if grid is not None:
145
+ ds = new_fieldlist_from_list([new_field_from_grid(f, grid) for f in ds])
300
146
 
301
147
  if len(ds) == 0:
302
148
  LOG.warning(f"No fields found for {dates} in {given_paths} (kwargs={kwargs})")
@@ -209,6 +209,12 @@ class XArrayMetadata(RawMetadata):
209
209
  Any
210
210
  The value for the specified key, optionally cast to the specified type.
211
211
  """
212
+
213
+ if key == "levelist":
214
+ # Special case for levelist, for compatibility with GRIB
215
+ if key not in self._d and "level" in self._d:
216
+ key = "level"
217
+
212
218
  if key in self._d:
213
219
  if astype is not None:
214
220
  return astype(self._d[key])
@@ -38,4 +38,4 @@ def execute(context: Any, dates: List[str], url: str, *args: Any, **kwargs: Any)
38
38
  ekd.FieldList
39
39
  The loaded data.
40
40
  """
41
- return load_many("🇿", context, url, *args, **kwargs).execute(dates)
41
+ return load_many("🇿", context, dates, url, *args, **kwargs)
@@ -20,7 +20,7 @@ LOG = logging.getLogger(__name__)
20
20
  class ViewCacheArray:
21
21
  """A class that provides a caching mechanism for writing to a NumPy-like array.
22
22
 
23
- The is initialized with a NumPy-like array, a shape and a list to reindex the first
23
+ The is initialised with a NumPy-like array, a shape and a list to reindex the first
24
24
  dimension. The array is used to store the final data, while the cache is used to
25
25
  temporarily store the data before flushing it to the array.
26
26
 
@@ -8,12 +8,14 @@
8
8
  # nor does it submit to any jurisdiction.
9
9
 
10
10
 
11
+ import datetime
11
12
  import logging
12
13
  from abc import abstractmethod
13
14
  from functools import cached_property
14
15
  from typing import Any
15
16
  from typing import Dict
16
17
  from typing import List
18
+ from typing import Optional
17
19
  from typing import Set
18
20
  from typing import Tuple
19
21
 
@@ -30,7 +32,7 @@ from .indexing import apply_index_to_slices_changes
30
32
  from .indexing import index_to_slices
31
33
  from .indexing import update_tuple
32
34
  from .misc import _auto_adjust
33
- from .misc import _open
35
+ from .misc import _open_dataset
34
36
 
35
37
  LOG = logging.getLogger(__name__)
36
38
 
@@ -92,6 +94,18 @@ class Complement(Combined):
92
94
  """Returns the list of variables to be added to the target dataset."""
93
95
  return self._variables
94
96
 
97
+ @property
98
+ def statistics(self) -> Dict[str, NDArray[Any]]:
99
+ """Returns the statistics of the complemented dataset."""
100
+ index = [self._source.name_to_index[v] for v in self._variables]
101
+ return {k: v[index] for k, v in self._source.statistics.items()}
102
+
103
+ def statistics_tendencies(self, delta: Optional[datetime.timedelta] = None) -> Dict[str, NDArray[Any]]:
104
+ index = [self._source.name_to_index[v] for v in self._variables]
105
+ if delta is None:
106
+ delta = self.frequency
107
+ return {k: v[index] for k, v in self._source.statistics_tendencies(delta).items()}
108
+
95
109
  @property
96
110
  def name_to_index(self) -> Dict[str, int]:
97
111
  """Returns a dictionary mapping variable names to their indices."""
@@ -170,6 +184,16 @@ class Complement(Combined):
170
184
  """
171
185
  pass
172
186
 
187
+ def forwards_subclass_metadata_specific(self) -> dict[str, Any]:
188
+ """Get the metadata specific to the forwards subclass.
189
+
190
+ Returns
191
+ -------
192
+ dict[str, Any]
193
+ The metadata specific to the forwards subclass.
194
+ """
195
+ return dict(complement=self._source.dataset_metadata())
196
+
173
197
 
174
198
  class ComplementNone(Complement):
175
199
  """A class to complement a target dataset with variables from a source dataset without interpolation."""
@@ -281,7 +305,6 @@ def complement_factory(args: Tuple, kwargs: dict) -> Dataset:
281
305
  Dataset
282
306
  The complemented dataset.
283
307
  """
284
- from .select import Select
285
308
 
286
309
  assert len(args) == 0, args
287
310
 
@@ -296,8 +319,8 @@ def complement_factory(args: Tuple, kwargs: dict) -> Dataset:
296
319
  if interpolation not in ("none", "nearest"):
297
320
  raise NotImplementedError(f"Complement method={interpolation} not implemented")
298
321
 
299
- source = _open(source)
300
- target = _open(target)
322
+ source = _open_dataset(source)
323
+ target = _open_dataset(target)
301
324
  # `select` is the same as `variables`
302
325
  (source, target), kwargs = _auto_adjust([source, target], kwargs, exclude=["select"])
303
326
 
@@ -309,10 +332,4 @@ def complement_factory(args: Tuple, kwargs: dict) -> Dataset:
309
332
 
310
333
  complement = Class(target=target, source=source)._subset(**kwargs)
311
334
 
312
- # Will join the datasets along the variables axis
313
- reorder = source.variables
314
- complemented = _open([target, complement])
315
- ordered = (
316
- Select(complemented, complemented._reorder_to_columns(reorder), {"reoder": reorder})._subset(**kwargs).mutate(),
317
- )
318
- return ordered
335
+ return _open_dataset([target, complement], reorder=source.variables)
@@ -290,6 +290,10 @@ class Combined(Forwards):
290
290
  ValueError
291
291
  If the resolutions are not the same.
292
292
  """
293
+ if d1.resolution is None or d2.resolution is None:
294
+ LOG.warning("One of the datasets has no resolution, cannot check compatibility")
295
+ return
296
+
293
297
  if d1.resolution != d2.resolution:
294
298
  raise ValueError(f"Incompatible resolutions: {d1.resolution} and {d2.resolution} ({d1} {d2})")
295
299
 
@@ -344,7 +344,7 @@ class Cutout(GridsBase):
344
344
  self.cropping_distance = cropping_distance
345
345
  self.neighbours = neighbours
346
346
  self.min_distance_km = min_distance_km
347
- self.plot = plot
347
+ self._plot = plot
348
348
  self.masks = [] # To store the masks for each LAM dataset
349
349
  self.global_mask = np.ones(self.globe.shape[-1], dtype=bool)
350
350
 
@@ -373,7 +373,7 @@ class Cutout(GridsBase):
373
373
  lam.longitudes,
374
374
  self.globe.latitudes,
375
375
  self.globe.longitudes,
376
- plot=False,
376
+ plot=self._plot,
377
377
  min_distance_km=self.min_distance_km,
378
378
  cropping_distance=self.cropping_distance,
379
379
  neighbours=self.neighbours,
@@ -399,7 +399,7 @@ class Cutout(GridsBase):
399
399
  prev_lam_lons,
400
400
  lam_lats,
401
401
  lam_lons,
402
- plot=False,
402
+ plot=self._plot,
403
403
  min_distance_km=self.min_distance_km,
404
404
  cropping_distance=self.cropping_distance,
405
405
  neighbours=self.neighbours,
@@ -677,7 +677,7 @@ def _save_dataset(recipe: Dict[str, Any], zarr_path: str, n_workers: int = 1) ->
677
677
  # Workers return (date, subset) tuples.
678
678
  root = zarr.open(zarr_path, mode="a")
679
679
  initialize_zarr_store(root, full_ds, recipe)
680
- print("Zarr store initialized.", flush=True)
680
+ print("Zarr store initialised.", flush=True)
681
681
 
682
682
  existing_dates = np.array(sorted(root["dates"]), dtype="datetime64[s]")
683
683
  all_dates = full_ds.dates
@@ -11,6 +11,7 @@
11
11
  import datetime
12
12
  import logging
13
13
  import os
14
+ import tempfile
14
15
  import warnings
15
16
  from functools import cached_property
16
17
  from typing import Any
@@ -185,10 +186,30 @@ def name_to_zarr_store(path_or_url: str) -> ReadOnlyStore:
185
186
  store = path_or_url
186
187
 
187
188
  if store.startswith("s3://"):
188
- store = S3Store(store)
189
+ return S3Store(store)
190
+
191
+ if store.startswith("http://") or store.startswith("https://"):
189
192
 
190
- elif store.startswith("http://") or store.startswith("https://"):
191
193
  parsed = urlparse(store)
194
+
195
+ if store.endswith(".zip"):
196
+ import multiurl
197
+
198
+ # Zarr cannot handle zip files over HTTP
199
+ tmpdir = tempfile.gettempdir()
200
+ name = os.path.basename(parsed.path)
201
+ path = os.path.join(tmpdir, name)
202
+ LOG.warning("Zarr does not support zip files over HTTP, downloading to %s", path)
203
+ if os.path.exists(path):
204
+ LOG.warning("File %s already exists, reusing it", path)
205
+ return name_to_zarr_store(path)
206
+
207
+ LOG.warning("Downloading %s", store)
208
+
209
+ multiurl.download(store, path + ".tmp")
210
+ os.rename(path + ".tmp", path)
211
+ return name_to_zarr_store(path)
212
+
192
213
  bits = parsed.netloc.split(".")
193
214
  if len(bits) == 5 and (bits[1], bits[3], bits[4]) == ("s3", "amazonaws", "com"):
194
215
  s3_url = f"s3://{bits[0]}{parsed.path}"
@@ -540,10 +561,21 @@ QUIET = set()
540
561
 
541
562
  def zarr_lookup(name: str, fail: bool = True) -> Optional[str]:
542
563
  """Look up a zarr dataset by name."""
543
- if name.endswith(".zarr") or name.endswith(".zip"):
544
- return name
545
564
 
546
565
  config = load_config()["datasets"]
566
+ use_search_path_not_found = config.get("use_search_path_not_found", False)
567
+
568
+ if name.endswith(".zarr") or name.endswith(".zip"):
569
+
570
+ if os.path.exists(name):
571
+ return name
572
+
573
+ if not use_search_path_not_found:
574
+ # There will be an error triggered by the open_zarr
575
+ return name
576
+
577
+ LOG.warning("File %s not found, trying to search in the search path", name)
578
+ name = os.path.splitext(os.path.basename(name))[0]
547
579
 
548
580
  if name in config["named"]:
549
581
  if name not in QUIET:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: anemoi-datasets
3
- Version: 0.5.20
3
+ Version: 0.5.22
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
@@ -225,9 +225,10 @@ Classifier: Programming Language :: Python :: Implementation :: CPython
225
225
  Classifier: Programming Language :: Python :: Implementation :: PyPy
226
226
  Requires-Python: >=3.9
227
227
  License-File: LICENSE
228
- Requires-Dist: anemoi-transform>=0.1.6
229
- Requires-Dist: anemoi-utils[provenance]>=0.4.18
228
+ Requires-Dist: anemoi-transform>=0.1.9
229
+ Requires-Dist: anemoi-utils[provenance]>=0.4.21
230
230
  Requires-Dist: cfunits
231
+ Requires-Dist: numcodecs<0.16
231
232
  Requires-Dist: numpy
232
233
  Requires-Dist: pyyaml
233
234
  Requires-Dist: semantic-version
@@ -268,4 +269,5 @@ Requires-Dist: kerchunk; extra == "xarray"
268
269
  Requires-Dist: pandas; extra == "xarray"
269
270
  Requires-Dist: planetary-computer; extra == "xarray"
270
271
  Requires-Dist: pystac-client; extra == "xarray"
272
+ Requires-Dist: s3fs>=0.5; extra == "xarray"
271
273
  Dynamic: license-file
@@ -1,29 +1,31 @@
1
1
  anemoi/datasets/__init__.py,sha256=i_wsAT3ezEYF7o5dpqGrpoG4wmLS-QIBug18uJbSYMs,1065
2
2
  anemoi/datasets/__main__.py,sha256=ErwAqE3rBc7OaNO2JRsEOhWpB8ldjAt7BFSuRhbnlqQ,936
3
- anemoi/datasets/_version.py,sha256=0Ib1b9ijC26N78gsH6oTzFbmTu3c8De1ac8TlFGaEZU,513
3
+ anemoi/datasets/_version.py,sha256=KERiCy5SlogIpKH0HhOSfNJ6Gz_dzHHWww2moJQR1BQ,513
4
+ anemoi/datasets/check.py,sha256=hbEMUurl2IjZbp56dBgOfAEsAmmgymgRM5ySaMJSTdk,2755
4
5
  anemoi/datasets/grids.py,sha256=Hhj1aOXHvDjmI46M_UlLSjCs1qYqxH-uqd_kapDSdbU,18134
5
6
  anemoi/datasets/testing.py,sha256=fy_JzavUwLlK_2rtXAT-UGUyo5gjyQW2y826zf334Wg,2645
6
7
  anemoi/datasets/commands/__init__.py,sha256=O5W3yHZywRoAqmRUioAr3zMCh0hGVV18wZYGvc00ioM,698
8
+ anemoi/datasets/commands/check.py,sha256=zEJqE5XkNLsebemg5XIvvZTv2bA6R49zVaka9HRySKU,2655
7
9
  anemoi/datasets/commands/cleanup.py,sha256=FX082xkHKCSd8d-FUN5zDBSiKA-QYQEeUZ6dCUD-Ob8,1816
8
10
  anemoi/datasets/commands/compare-lam.py,sha256=F5GYRsKOtdhDePhifgf1TCj5L2T8EVIA2N8AdO-AKKY,14857
9
11
  anemoi/datasets/commands/compare.py,sha256=jzhjbbt1U-YANTVRBhrwSh2CcYgk4qX2IiTMJtcn82s,3678
10
- anemoi/datasets/commands/copy.py,sha256=UlvW9YIlP7jwKAY7TikVAfhkrjaQ9Kkxqfx8jEut-Jg,16010
11
- anemoi/datasets/commands/create.py,sha256=5BXdPZMO-ZULBnEVgyeSS-IMy4p84HSyFVG855gqj3k,6598
12
+ anemoi/datasets/commands/copy.py,sha256=hP7BSqkGzK8-n3BA2vlpFcbO3INHmShPZ75Aw_K_g4Y,17302
13
+ anemoi/datasets/commands/create.py,sha256=3myohTCLsM6oUuZHIfLaTlDaq-DOcJZRM4Vks007fZg,6543
12
14
  anemoi/datasets/commands/finalise-additions.py,sha256=2LqU7ke3i-yRQbjkgldX6e2QlyE-tKqp0b6QOhJF19g,1985
13
15
  anemoi/datasets/commands/finalise.py,sha256=-YtN9wFFDrM_i_V9YHoXZsajF3eAax-73Zsi4uHAFCI,1709
14
- anemoi/datasets/commands/grib-index.py,sha256=1aO4Lm_7ZpRF_lRRF-OEMZ37ByYPZfUAIFW7jOsIf7Q,3161
16
+ anemoi/datasets/commands/grib-index.py,sha256=H9snsk1w2tL6ObBhlHVxFXxCm5sB-eUGrX772G8Nb2s,3057
15
17
  anemoi/datasets/commands/init-additions.py,sha256=2vMom5L38UvLLopzP2z-R_Fq31fU2uMvKXoDq5d8oI4,1931
16
18
  anemoi/datasets/commands/init.py,sha256=5IKyJ_hJA4lLIbpT88XtcGzXccHLSGwSoqVSvVJGxPg,2852
17
- anemoi/datasets/commands/inspect.py,sha256=dGx_3IQTNaV3iGfwhHp_G1fIecBWeRbOLU9ckrZ7epg,26578
19
+ anemoi/datasets/commands/inspect.py,sha256=kaDHXP8Cv8PsGqEXUF5Yruf5OQHwOIkjCS0SNxMs6eg,26578
18
20
  anemoi/datasets/commands/load-additions.py,sha256=zqmRherIHXb5WIB4cnAuCBEsxFJmUpGjafvm6RtQ7Co,2004
19
21
  anemoi/datasets/commands/load.py,sha256=U1Y8qByjreu7H9WeX4G8-tyKsz48va10fkW1L4U4wWg,2034
20
22
  anemoi/datasets/commands/patch.py,sha256=Q9FDabWxlvK1QaeH4D9zhNpoSGB4h7EliWgcV76iFBs,1599
21
23
  anemoi/datasets/commands/publish.py,sha256=7YusLCWYdVLuexZzvyh8ztYoBOBzVmve3uJs-XKeMAE,1469
22
- anemoi/datasets/commands/scan.py,sha256=e5t_oxSi-II38TVQiMlWMJ8AZhDEBk5PcPD22DDbHfU,4008
24
+ anemoi/datasets/commands/scan.py,sha256=6Uoyd7WkM4ypoqmZargXIG50uRKzHE3AlvkAr7sCBy4,4262
23
25
  anemoi/datasets/compute/__init__.py,sha256=hCW0QcLHJmE-C1r38P27_ZOvCLNewex5iQEtZqx2ckI,393
24
26
  anemoi/datasets/compute/recentre.py,sha256=kwxDB8qpgOCFZSQJvjAmVcpH5zWsfk5FSoIureqNHd4,5915
25
- anemoi/datasets/create/__init__.py,sha256=D0a5Q-xv5_mtBTzEO_6IaWHCQUbZyH0NjHwEtixMCXs,50699
26
- anemoi/datasets/create/check.py,sha256=FrgyZP3Xyx4qXHl8_ZfM31fgNhcxMqxlE5oLweMDGU0,10003
27
+ anemoi/datasets/create/__init__.py,sha256=8TJwN_t7Epg6yBSbbRW2L039Xh_aqUsUgZBNR3U2yl0,51165
28
+ anemoi/datasets/create/check.py,sha256=xqobSfh3655ZoKs-CjHWBiEpIfrHU_vkqwiIsAOrqvs,10795
27
29
  anemoi/datasets/create/chunks.py,sha256=kZV3dWoCuv3Bttc0wysJB7OPbXsD99exKyrrj4HGFwQ,4025
28
30
  anemoi/datasets/create/config.py,sha256=xrSlaY2p5zssfLIt8A1CP9WwJReSXVWBMQM7bT1aFbU,13448
29
31
  anemoi/datasets/create/filter.py,sha256=Hu4o3Z2omIdcu5ycJqmBkY_ZSKTG5JkjbIuxXM8ADfs,1254
@@ -34,7 +36,7 @@ anemoi/datasets/create/source.py,sha256=xoV8uH_y6aBSE4_PWuy5w7Q7cX-tGm8e-2xC9flS
34
36
  anemoi/datasets/create/testing.py,sha256=FzTSsbv_JBGViGrD1jT6z_T2yaA0KCrbJ3SCgp-rFPQ,2406
35
37
  anemoi/datasets/create/typing.py,sha256=Hs2uDG8ZVtQ-Q-5I9-W0Pik2p1hZH5-JPVjpJXRXP7M,484
36
38
  anemoi/datasets/create/utils.py,sha256=94JKPYcNSurA62yFAytW5dUFVz-r-fdwiPOkmu121pM,5572
37
- anemoi/datasets/create/writer.py,sha256=yjgic7FfVWuVKysi3HbaW6i2j4e831oCUdyD48Ua-MA,2203
39
+ anemoi/datasets/create/writer.py,sha256=nZBJvYZ63g_c9FfL65bAeG10Y6bX2R7CgtZvY0kW3fI,2203
38
40
  anemoi/datasets/create/zarr.py,sha256=N9PGGD-dYvcc97BZjLVWm5XQeYTiK9gwvhtreRiQzBI,9437
39
41
  anemoi/datasets/create/filters/__init__.py,sha256=rhetUFPZKe-vwDIfMY33SbYrJMq909dUJRgBzuX6Q6E,901
40
42
  anemoi/datasets/create/filters/empty.py,sha256=Dw1kUnAlFt6b5ds0kmrw9Gak09XjSqF8m1_MpHZNV9I,1013
@@ -56,7 +58,7 @@ anemoi/datasets/create/filters/unrotate_winds.py,sha256=3AJf0crnVVySLlXLIdfEUxRR
56
58
  anemoi/datasets/create/filters/uv_to_speeddir.py,sha256=Zdc34AG5Bsz-Z7JGuznyRJr6F-BnWKXPiI3mjmOpbek,2883
57
59
  anemoi/datasets/create/filters/wz_to_w.py,sha256=slOiX5RibG48Zrkss8Qjpb-8ZTnvSvmKlk1Hy45_wzU,2812
58
60
  anemoi/datasets/create/input/__init__.py,sha256=XeURpmbReQvpELltGFKzg3oZFXWRdUxW9SK3K662SBQ,3364
59
- anemoi/datasets/create/input/action.py,sha256=WmRPe5ZYQz8vxAtOr6hLYGLzikcldyps6dG3BwHiBp8,7709
61
+ anemoi/datasets/create/input/action.py,sha256=pc_2RPbs3laF8vBhNkbFdib40kTcF5QW6QL0p8VLNzA,7778
60
62
  anemoi/datasets/create/input/concat.py,sha256=bU8SWfBVfK8bRAmmN4UO9zpIGxwQvRUk9_vwrKPOTE4,5355
61
63
  anemoi/datasets/create/input/context.py,sha256=qrLccxMe9UkyQxsNuR6JSK7oLzZq21dt38AxZ9kYzsY,2714
62
64
  anemoi/datasets/create/input/data_sources.py,sha256=4xUUShM0pCXIZVPJW_cSNMUwCO_wLx996MLFpTLChm0,4385
@@ -67,19 +69,19 @@ anemoi/datasets/create/input/join.py,sha256=RAdgE4lVcC71_J47dNa1weJuWdTXSQIvo06G
67
69
  anemoi/datasets/create/input/misc.py,sha256=FVaH_ym52RZI_fnLSMM_dKTQmWTrInucP780E3gGqvw,3357
68
70
  anemoi/datasets/create/input/pipe.py,sha256=-tCz161IwXoI8pl1hilA9T_j5eHSr-sgbijFLp9HHNc,2083
69
71
  anemoi/datasets/create/input/repeated_dates.py,sha256=HaPzDCNHQBY1VVp6gvd3drwjWjYpSBh-GLgHqBRJTz0,12012
70
- anemoi/datasets/create/input/result.py,sha256=wX5iAAtm50ezLn2QsIDIQnGEGmgE08lWltRwnkFWSLw,24220
72
+ anemoi/datasets/create/input/result.py,sha256=BmeZVN63ZnUkiOwT0mkE4DdB06OmVwdRZkiV4ACPNrI,24309
71
73
  anemoi/datasets/create/input/step.py,sha256=WcR9NgRvUKF60Fo5veLvRCAQMrOd55x1gOEAmd2t2r4,5948
72
74
  anemoi/datasets/create/input/template.py,sha256=Iycw9VmfA0WEIDP_Of8bp-8HsV0EUfwbnm0WjxiO4GA,4092
73
75
  anemoi/datasets/create/input/trace.py,sha256=dakPYMmwKq6s17Scww1CN-xYBD3btJTGeDknOhAcnEM,3320
74
76
  anemoi/datasets/create/sources/__init__.py,sha256=XNiiGaC6NbxnGfl6glPw-gTJASi3vsGKwVlfkMqYGk4,950
75
- anemoi/datasets/create/sources/accumulations.py,sha256=ZA8F8RJPMHok5RpIHH4x-txwiSll8zuWwqJ3rn95JHk,20295
77
+ anemoi/datasets/create/sources/accumulations.py,sha256=ifnUtbvmA8s7KOEL7ZOgbkiPxL3pa0FclGsZWZN3eyE,32782
76
78
  anemoi/datasets/create/sources/accumulations2.py,sha256=iBORRrH0N7r3gMWm3mCkJ6XmB-dO_lEckHPwvmk9fu0,20673
77
79
  anemoi/datasets/create/sources/anemoi_dataset.py,sha256=2xJJTmKlv87F_2ECMKeehaeW7_oWLlDcLt8C_Prp1RI,2017
78
80
  anemoi/datasets/create/sources/constants.py,sha256=5O6d9tEuAmVjl5vNkNfmkaAjKXFlw1UjeueTsF1GZCI,1528
79
81
  anemoi/datasets/create/sources/eccc_fstd.py,sha256=8HK38f444HcWMvBhooP0XqTfMXYoCbN_8G9RI_Ne5rc,659
80
82
  anemoi/datasets/create/sources/empty.py,sha256=5mVIVRUwnBfE3zp-bvNA_imXCSpyds-4mewcI8HXAiY,1020
81
- anemoi/datasets/create/sources/forcings.py,sha256=877OZoXUoJncQ2_AAGSijwWqM-4kJJdxdIa6SFvZBUw,1216
82
- anemoi/datasets/create/sources/grib.py,sha256=nGjrKTQZB8GQCvfX7SgfdmcVJVSXF9kpb2GmSX7H7bM,8731
83
+ anemoi/datasets/create/sources/forcings.py,sha256=PmcAd-nFZzILRxfvrptb45VLD9Nd2vjy0xeToeoKl1Y,1222
84
+ anemoi/datasets/create/sources/grib.py,sha256=wh1kx2IbzeHDzqSEKB-gaM3Cs3Z_oVa7pyHZiOzF3-s,4278
83
85
  anemoi/datasets/create/sources/grib_index.py,sha256=Pnm0RLga9lpD4MqVaZr7IqXMBlw1DtTIWZRfz7fq30Q,19026
84
86
  anemoi/datasets/create/sources/hindcasts.py,sha256=_4880rgd4AsRxlDXVi6dkh8mlKXrz2i27btVlmlMFjY,2611
85
87
  anemoi/datasets/create/sources/legacy.py,sha256=RJce-9TwmUUCFbgC8A3Dp61nSBfB8_lWti8WNoOMIcU,2652
@@ -92,7 +94,7 @@ anemoi/datasets/create/sources/source.py,sha256=x8k---A2_3AglYqNsXLlv1ti4f9n_gVK
92
94
  anemoi/datasets/create/sources/tendencies.py,sha256=saHGYl-MnvBEeZX-n1zgT8lehA7LC2G5dMNnxklI9-U,5590
93
95
  anemoi/datasets/create/sources/xarray.py,sha256=zBuWCmBidEY3Wz6DDRZStBcrkw646AXpIM8B1nHV55c,2555
94
96
  anemoi/datasets/create/sources/xarray_kerchunk.py,sha256=vdFaFzze8VLjYUgIX8Lc39ELvwmgfT3ioyxBHAt4nrs,1136
95
- anemoi/datasets/create/sources/xarray_zarr.py,sha256=McY-vgXmUbGAkBViAfYwBUeVmGUU-Qr8UW-jUGu5-9s,1209
97
+ anemoi/datasets/create/sources/xarray_zarr.py,sha256=5eQOpB3sBD49RarTME81s0ynIVkha2pP0ymA4TNnLYY,1201
96
98
  anemoi/datasets/create/sources/zenodo.py,sha256=KEetFEk5GzGFpoos8rbBQBTa2XElWG7oTYjfZXgbu0Q,2065
97
99
  anemoi/datasets/create/sources/xarray_support/README.md,sha256=56olM9Jh0vI0_bU9GI-IqbBcz4DZXWONqvdzN_VeAFE,78
98
100
  anemoi/datasets/create/sources/xarray_support/__init__.py,sha256=8Dv7KQW8O3VvHOsSbqYdjaaomYIhXIKgSGatnNEweNU,5564
@@ -101,42 +103,42 @@ anemoi/datasets/create/sources/xarray_support/field.py,sha256=YRxx6kh1qO2qQ6I_Vy
101
103
  anemoi/datasets/create/sources/xarray_support/fieldlist.py,sha256=UyUljq2Ax-PpQ-bvG4Dsi_lkZucuPgCy120EadDeUMU,8271
102
104
  anemoi/datasets/create/sources/xarray_support/flavour.py,sha256=UyfzBjYMNfugMCq-r5Ie3qDuorLwaalPi_0oZHckZcg,32073
103
105
  anemoi/datasets/create/sources/xarray_support/grid.py,sha256=lsE8bQwBH9pflzvsJ89Z6ExYPdHJd54xorMNzL2gTd0,6181
104
- anemoi/datasets/create/sources/xarray_support/metadata.py,sha256=WRO86l-ZB7iJ7pG5Vz9kVv5h1MokfF0fuy0bNSNBRIc,10687
106
+ anemoi/datasets/create/sources/xarray_support/metadata.py,sha256=OJ35Y4m9BpPmnrabD9qiuHUEfejc6YfTIWPm8prHokk,10876
105
107
  anemoi/datasets/create/sources/xarray_support/patch.py,sha256=Snk8bz7gp0HrG0MrY5hrXu7VC0tKgtoiWXByi2sBYJc,2037
106
108
  anemoi/datasets/create/sources/xarray_support/time.py,sha256=Y_lZTUOXWJH4jcSgyL4WTDwrtPXi7MUiumaXfRoqqAY,12486
107
109
  anemoi/datasets/create/sources/xarray_support/variable.py,sha256=fcazws9vuizmx55JCXwbkwffg4WxJllPrEg2US1VysE,9163
108
110
  anemoi/datasets/create/statistics/__init__.py,sha256=_BuPcuUrwQAEcMQVds93EV9M5ys2ao8jCWKV4OVoSSA,18291
109
111
  anemoi/datasets/create/statistics/summary.py,sha256=JdtChTmsr1Y958_nka36HltTbeZkawuGbprbfZD7Ux8,4790
110
112
  anemoi/datasets/data/__init__.py,sha256=wzhk_7VQImge12Xkg99xuiFOC7DAjBW1mu446y0Iq60,3057
111
- anemoi/datasets/data/complement.py,sha256=QcbcAW3HaG1g4QBrEzH6Lzk8YEdnK9hJP4OpxW_oU2E,9835
113
+ anemoi/datasets/data/complement.py,sha256=N1vJAO2bijrWAxXQi9AFAPVEBe4vikSIKEXcX1EqQHI,10590
112
114
  anemoi/datasets/data/concat.py,sha256=eY5rujcdal00BJCv00mKSlxp0FKVvPQd7uqrBnL9fj4,8996
113
115
  anemoi/datasets/data/dataset.py,sha256=d-LZPCczG2-ZAua29FGP3_QWzwdnWPHhKpG1dHFQKio,31290
114
116
  anemoi/datasets/data/debug.css,sha256=z2X_ZDSnZ9C3pyZPWnQiEyAxuMxUaxJxET4oaCImTAQ,211
115
117
  anemoi/datasets/data/debug.py,sha256=hVa1jAQ-TK7CoKJNyyUC0eZPobFG-FpkVXEaO_3B-MA,10796
116
118
  anemoi/datasets/data/ensemble.py,sha256=-36kMjuT2y5jUeSnjCRTCyE4um6DLAADBVSKSTkHZZg,5352
117
119
  anemoi/datasets/data/fill_missing.py,sha256=ceONpzD-PWLMTtG4WOw6USw-Cd1O55VYzfpAiEsROK8,8797
118
- anemoi/datasets/data/forwards.py,sha256=d0LL0AORQApGmuPIfMWevOOZuePlgZ6GldHUKmqnTtg,19732
119
- anemoi/datasets/data/grids.py,sha256=vTAfGq3SaTU4tQzzfeRpFAKlmfL-JVvpjP4e3nGWO3s,22045
120
+ anemoi/datasets/data/forwards.py,sha256=3DHmjed5lDG-4tUIafvbAE5z7bJ-odVT6yG68EdQzoY,19904
121
+ anemoi/datasets/data/grids.py,sha256=8fZSitKTStBT-fsQWwTXiTgyrmYjh_jQ5dJi1U3lRz0,22056
120
122
  anemoi/datasets/data/indexing.py,sha256=DasVd1j0FB0iTw6eqvhiLka4ztf2zJcI5NgWxmtxzCw,7526
121
123
  anemoi/datasets/data/interpolate.py,sha256=-kSYwdjKH7zJtfITdbqdH6KyOFGVZDyHg4TaFk9shEI,9279
122
124
  anemoi/datasets/data/join.py,sha256=ZEHOsCecKBkKKH-vki404Sm7r7cV368ECO7PXPpay3s,9212
123
125
  anemoi/datasets/data/masked.py,sha256=giOvHLcGbLf6mZPqZjAxQd1kvydmkepDFh2EqchXLTQ,10213
124
126
  anemoi/datasets/data/merge.py,sha256=SvQhJHf-C-Kn7hEjFqomienk-epPPjMtoccRNCJpMtw,8733
125
- anemoi/datasets/data/misc.py,sha256=l8ZJwEjUf9CoPn-RhnilVDVTGypkVIzJ5xV77h8zzkc,20951
127
+ anemoi/datasets/data/misc.py,sha256=6JOag2VJBJhz-eEEWL9F5nriEJyKz9aZL2P3FYcOSJo,20951
126
128
  anemoi/datasets/data/missing.py,sha256=ogfVDponbs0bGHMxps32Fj_fq4gT26R70yEMco5gdK8,12593
127
129
  anemoi/datasets/data/rescale.py,sha256=nGfJ5tWCncMJ7NMXkLbmt6z0ELrD6FxpbjJreQ3W91g,7004
128
130
  anemoi/datasets/data/select.py,sha256=Xs6uOzJL0CoOGeWA_E5_ukr8Jav2kXbZ41vhk7Vr8PE,8277
129
131
  anemoi/datasets/data/statistics.py,sha256=Hi9tPtNPBFaD0jcBa5vxoZp1radEMS-1RXwA3RbWrK8,3173
130
- anemoi/datasets/data/stores.py,sha256=-1WSQDYCMJVZlcvBim7Ay_h-VLJffbJ3v7N0uB2VfXc,18918
132
+ anemoi/datasets/data/stores.py,sha256=9RuNKbBv3SeEKRME63GZKzlJonMlvvyQk6F4xhSheL4,20023
131
133
  anemoi/datasets/data/subset.py,sha256=3h3Y7Mcw-fxs9-S0z8WNk6TcV5Hk5u9ZWfpJCTAZt4g,8804
132
134
  anemoi/datasets/data/unchecked.py,sha256=c7YIa9gFxOOjqyyOqrhGaFWQ1pN7_0W1Q8ABUTkI8e8,7311
133
135
  anemoi/datasets/data/xy.py,sha256=-jWzYismrK3eI3YCKIBpU1BCmraRncmVn0_2IUY--lk,7579
134
136
  anemoi/datasets/dates/__init__.py,sha256=pEArHDQ7w5E0WC8Vvf9ypyKSdm6gnhoN9TmooITB7C4,13617
135
137
  anemoi/datasets/dates/groups.py,sha256=IOveL6IyTXZwEdXZEnRAnpu9pINY95VN7LzcpLfJ09E,10105
136
138
  anemoi/datasets/utils/__init__.py,sha256=hCW0QcLHJmE-C1r38P27_ZOvCLNewex5iQEtZqx2ckI,393
137
- anemoi_datasets-0.5.20.dist-info/licenses/LICENSE,sha256=8HznKF1Vi2IvfLsKNE5A2iVyiri3pRjRPvPC9kxs6qk,11354
138
- anemoi_datasets-0.5.20.dist-info/METADATA,sha256=iGcUiyvv_JjdtsXo_oq_WgwweD1nPE0xAM8n5d0qeQU,16039
139
- anemoi_datasets-0.5.20.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
140
- anemoi_datasets-0.5.20.dist-info/entry_points.txt,sha256=yR-o-4uiPEA_GLBL81SkMYnUoxq3CAV3hHulQiRtGG0,66
141
- anemoi_datasets-0.5.20.dist-info/top_level.txt,sha256=DYn8VPs-fNwr7fNH9XIBqeXIwiYYd2E2k5-dUFFqUz0,7
142
- anemoi_datasets-0.5.20.dist-info/RECORD,,
139
+ anemoi_datasets-0.5.22.dist-info/licenses/LICENSE,sha256=8HznKF1Vi2IvfLsKNE5A2iVyiri3pRjRPvPC9kxs6qk,11354
140
+ anemoi_datasets-0.5.22.dist-info/METADATA,sha256=69SMdVpJ30oSexpKZRQnt8wh1-Y_SqG2blHvW0XByVY,16113
141
+ anemoi_datasets-0.5.22.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
142
+ anemoi_datasets-0.5.22.dist-info/entry_points.txt,sha256=yR-o-4uiPEA_GLBL81SkMYnUoxq3CAV3hHulQiRtGG0,66
143
+ anemoi_datasets-0.5.22.dist-info/top_level.txt,sha256=DYn8VPs-fNwr7fNH9XIBqeXIwiYYd2E2k5-dUFFqUz0,7
144
+ anemoi_datasets-0.5.22.dist-info/RECORD,,