anemoi-datasets 0.5.15__py3-none-any.whl → 0.5.17__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 (155) hide show
  1. anemoi/datasets/__init__.py +4 -1
  2. anemoi/datasets/__main__.py +12 -2
  3. anemoi/datasets/_version.py +9 -4
  4. anemoi/datasets/commands/cleanup.py +17 -2
  5. anemoi/datasets/commands/compare.py +18 -2
  6. anemoi/datasets/commands/copy.py +196 -14
  7. anemoi/datasets/commands/create.py +50 -7
  8. anemoi/datasets/commands/finalise-additions.py +17 -2
  9. anemoi/datasets/commands/finalise.py +17 -2
  10. anemoi/datasets/commands/init-additions.py +17 -2
  11. anemoi/datasets/commands/init.py +16 -2
  12. anemoi/datasets/commands/inspect.py +283 -62
  13. anemoi/datasets/commands/load-additions.py +16 -2
  14. anemoi/datasets/commands/load.py +16 -2
  15. anemoi/datasets/commands/patch.py +17 -2
  16. anemoi/datasets/commands/publish.py +17 -2
  17. anemoi/datasets/commands/scan.py +31 -3
  18. anemoi/datasets/compute/recentre.py +47 -11
  19. anemoi/datasets/create/__init__.py +612 -85
  20. anemoi/datasets/create/check.py +142 -20
  21. anemoi/datasets/create/chunks.py +64 -4
  22. anemoi/datasets/create/config.py +185 -21
  23. anemoi/datasets/create/filter.py +50 -0
  24. anemoi/datasets/create/filters/__init__.py +33 -0
  25. anemoi/datasets/create/filters/empty.py +37 -0
  26. anemoi/datasets/create/filters/legacy.py +93 -0
  27. anemoi/datasets/create/filters/noop.py +37 -0
  28. anemoi/datasets/create/filters/orog_to_z.py +58 -0
  29. anemoi/datasets/create/{functions/filters → filters}/pressure_level_relative_humidity_to_specific_humidity.py +33 -10
  30. anemoi/datasets/create/{functions/filters → filters}/pressure_level_specific_humidity_to_relative_humidity.py +32 -8
  31. anemoi/datasets/create/filters/rename.py +205 -0
  32. anemoi/datasets/create/{functions/filters → filters}/rotate_winds.py +43 -28
  33. anemoi/datasets/create/{functions/filters → filters}/single_level_dewpoint_to_relative_humidity.py +32 -9
  34. anemoi/datasets/create/{functions/filters → filters}/single_level_relative_humidity_to_dewpoint.py +33 -9
  35. anemoi/datasets/create/{functions/filters → filters}/single_level_relative_humidity_to_specific_humidity.py +55 -7
  36. anemoi/datasets/create/{functions/filters → filters}/single_level_specific_humidity_to_relative_humidity.py +98 -37
  37. anemoi/datasets/create/filters/speeddir_to_uv.py +95 -0
  38. anemoi/datasets/create/{functions/filters → filters}/sum.py +24 -27
  39. anemoi/datasets/create/filters/transform.py +53 -0
  40. anemoi/datasets/create/{functions/filters → filters}/unrotate_winds.py +27 -18
  41. anemoi/datasets/create/filters/uv_to_speeddir.py +94 -0
  42. anemoi/datasets/create/{functions/filters → filters}/wz_to_w.py +51 -33
  43. anemoi/datasets/create/input/__init__.py +76 -5
  44. anemoi/datasets/create/input/action.py +149 -13
  45. anemoi/datasets/create/input/concat.py +81 -10
  46. anemoi/datasets/create/input/context.py +39 -4
  47. anemoi/datasets/create/input/data_sources.py +72 -6
  48. anemoi/datasets/create/input/empty.py +21 -3
  49. anemoi/datasets/create/input/filter.py +60 -12
  50. anemoi/datasets/create/input/function.py +154 -37
  51. anemoi/datasets/create/input/join.py +86 -14
  52. anemoi/datasets/create/input/misc.py +67 -17
  53. anemoi/datasets/create/input/pipe.py +33 -6
  54. anemoi/datasets/create/input/repeated_dates.py +189 -41
  55. anemoi/datasets/create/input/result.py +202 -87
  56. anemoi/datasets/create/input/step.py +119 -22
  57. anemoi/datasets/create/input/template.py +100 -13
  58. anemoi/datasets/create/input/trace.py +62 -7
  59. anemoi/datasets/create/patch.py +52 -4
  60. anemoi/datasets/create/persistent.py +134 -17
  61. anemoi/datasets/create/size.py +15 -1
  62. anemoi/datasets/create/source.py +51 -0
  63. anemoi/datasets/create/sources/__init__.py +36 -0
  64. anemoi/datasets/create/{functions/sources → sources}/accumulations.py +296 -30
  65. anemoi/datasets/create/{functions/sources → sources}/constants.py +27 -2
  66. anemoi/datasets/create/{functions/sources → sources}/eccc_fstd.py +7 -3
  67. anemoi/datasets/create/sources/empty.py +37 -0
  68. anemoi/datasets/create/{functions/sources → sources}/forcings.py +25 -1
  69. anemoi/datasets/create/sources/grib.py +297 -0
  70. anemoi/datasets/create/{functions/sources → sources}/hindcasts.py +38 -4
  71. anemoi/datasets/create/sources/legacy.py +93 -0
  72. anemoi/datasets/create/{functions/sources → sources}/mars.py +168 -20
  73. anemoi/datasets/create/sources/netcdf.py +42 -0
  74. anemoi/datasets/create/sources/opendap.py +43 -0
  75. anemoi/datasets/create/{functions/sources/__init__.py → sources/patterns.py} +35 -4
  76. anemoi/datasets/create/sources/recentre.py +150 -0
  77. anemoi/datasets/create/{functions/sources → sources}/source.py +27 -5
  78. anemoi/datasets/create/{functions/sources → sources}/tendencies.py +64 -7
  79. anemoi/datasets/create/sources/xarray.py +92 -0
  80. anemoi/datasets/create/sources/xarray_kerchunk.py +36 -0
  81. anemoi/datasets/create/sources/xarray_support/README.md +1 -0
  82. anemoi/datasets/create/{functions/sources/xarray → sources/xarray_support}/__init__.py +109 -8
  83. anemoi/datasets/create/sources/xarray_support/coordinates.py +442 -0
  84. anemoi/datasets/create/{functions/sources/xarray → sources/xarray_support}/field.py +94 -16
  85. anemoi/datasets/create/{functions/sources/xarray → sources/xarray_support}/fieldlist.py +90 -25
  86. anemoi/datasets/create/sources/xarray_support/flavour.py +1036 -0
  87. anemoi/datasets/create/{functions/sources/xarray → sources/xarray_support}/grid.py +92 -31
  88. anemoi/datasets/create/sources/xarray_support/metadata.py +395 -0
  89. anemoi/datasets/create/sources/xarray_support/patch.py +91 -0
  90. anemoi/datasets/create/sources/xarray_support/time.py +391 -0
  91. anemoi/datasets/create/sources/xarray_support/variable.py +331 -0
  92. anemoi/datasets/create/sources/xarray_zarr.py +41 -0
  93. anemoi/datasets/create/{functions/sources → sources}/zenodo.py +34 -5
  94. anemoi/datasets/create/statistics/__init__.py +233 -44
  95. anemoi/datasets/create/statistics/summary.py +52 -6
  96. anemoi/datasets/create/testing.py +76 -0
  97. anemoi/datasets/create/{functions/filters/noop.py → typing.py} +6 -3
  98. anemoi/datasets/create/utils.py +97 -6
  99. anemoi/datasets/create/writer.py +26 -4
  100. anemoi/datasets/create/zarr.py +170 -23
  101. anemoi/datasets/data/__init__.py +51 -4
  102. anemoi/datasets/data/complement.py +191 -40
  103. anemoi/datasets/data/concat.py +141 -16
  104. anemoi/datasets/data/dataset.py +552 -61
  105. anemoi/datasets/data/debug.py +197 -26
  106. anemoi/datasets/data/ensemble.py +93 -8
  107. anemoi/datasets/data/fill_missing.py +165 -18
  108. anemoi/datasets/data/forwards.py +428 -56
  109. anemoi/datasets/data/grids.py +323 -97
  110. anemoi/datasets/data/indexing.py +112 -19
  111. anemoi/datasets/data/interpolate.py +92 -12
  112. anemoi/datasets/data/join.py +158 -19
  113. anemoi/datasets/data/masked.py +129 -15
  114. anemoi/datasets/data/merge.py +137 -23
  115. anemoi/datasets/data/misc.py +172 -16
  116. anemoi/datasets/data/missing.py +233 -29
  117. anemoi/datasets/data/rescale.py +111 -10
  118. anemoi/datasets/data/select.py +168 -26
  119. anemoi/datasets/data/statistics.py +67 -6
  120. anemoi/datasets/data/stores.py +149 -64
  121. anemoi/datasets/data/subset.py +159 -25
  122. anemoi/datasets/data/unchecked.py +168 -57
  123. anemoi/datasets/data/xy.py +168 -25
  124. anemoi/datasets/dates/__init__.py +191 -16
  125. anemoi/datasets/dates/groups.py +189 -47
  126. anemoi/datasets/grids.py +270 -31
  127. anemoi/datasets/testing.py +28 -1
  128. {anemoi_datasets-0.5.15.dist-info → anemoi_datasets-0.5.17.dist-info}/METADATA +10 -7
  129. anemoi_datasets-0.5.17.dist-info/RECORD +137 -0
  130. {anemoi_datasets-0.5.15.dist-info → anemoi_datasets-0.5.17.dist-info}/WHEEL +1 -1
  131. {anemoi_datasets-0.5.15.dist-info → anemoi_datasets-0.5.17.dist-info/licenses}/LICENSE +1 -1
  132. anemoi/datasets/create/functions/__init__.py +0 -66
  133. anemoi/datasets/create/functions/filters/__init__.py +0 -9
  134. anemoi/datasets/create/functions/filters/empty.py +0 -17
  135. anemoi/datasets/create/functions/filters/orog_to_z.py +0 -58
  136. anemoi/datasets/create/functions/filters/rename.py +0 -79
  137. anemoi/datasets/create/functions/filters/speeddir_to_uv.py +0 -78
  138. anemoi/datasets/create/functions/filters/uv_to_speeddir.py +0 -56
  139. anemoi/datasets/create/functions/sources/empty.py +0 -15
  140. anemoi/datasets/create/functions/sources/grib.py +0 -150
  141. anemoi/datasets/create/functions/sources/netcdf.py +0 -15
  142. anemoi/datasets/create/functions/sources/opendap.py +0 -15
  143. anemoi/datasets/create/functions/sources/recentre.py +0 -60
  144. anemoi/datasets/create/functions/sources/xarray/coordinates.py +0 -255
  145. anemoi/datasets/create/functions/sources/xarray/flavour.py +0 -472
  146. anemoi/datasets/create/functions/sources/xarray/metadata.py +0 -148
  147. anemoi/datasets/create/functions/sources/xarray/patch.py +0 -44
  148. anemoi/datasets/create/functions/sources/xarray/time.py +0 -177
  149. anemoi/datasets/create/functions/sources/xarray/variable.py +0 -188
  150. anemoi/datasets/create/functions/sources/xarray_kerchunk.py +0 -42
  151. anemoi/datasets/create/functions/sources/xarray_zarr.py +0 -15
  152. anemoi/datasets/utils/fields.py +0 -47
  153. anemoi_datasets-0.5.15.dist-info/RECORD +0 -129
  154. {anemoi_datasets-0.5.15.dist-info → anemoi_datasets-0.5.17.dist-info}/entry_points.txt +0 -0
  155. {anemoi_datasets-0.5.15.dist-info → anemoi_datasets-0.5.17.dist-info}/top_level.txt +0 -0
anemoi/datasets/grids.py CHANGED
@@ -10,13 +10,43 @@
10
10
 
11
11
  import base64
12
12
  import logging
13
+ from typing import Any
14
+ from typing import List
15
+ from typing import Optional
16
+ from typing import Tuple
17
+ from typing import Union
13
18
 
14
19
  import numpy as np
20
+ from numpy.typing import NDArray
15
21
 
16
22
  LOG = logging.getLogger(__name__)
17
23
 
18
24
 
19
- def plot_mask(path, mask, lats, lons, global_lats, global_lons):
25
+ def plot_mask(
26
+ path: str,
27
+ mask: NDArray[Any],
28
+ lats: NDArray[Any],
29
+ lons: NDArray[Any],
30
+ global_lats: NDArray[Any],
31
+ global_lons: NDArray[Any],
32
+ ) -> None:
33
+ """Plot and save various visualizations of the mask and coordinates.
34
+
35
+ Parameters
36
+ ----------
37
+ path : str
38
+ The base path for saving the plots.
39
+ mask : NDArray[Any]
40
+ The mask array.
41
+ lats : NDArray[Any]
42
+ Latitude coordinates.
43
+ lons : NDArray[Any]
44
+ Longitude coordinates.
45
+ global_lats : NDArray[Any]
46
+ Global latitude coordinates.
47
+ global_lons : NDArray[Any]
48
+ Global longitude coordinates.
49
+ """
20
50
  import matplotlib.pyplot as plt
21
51
 
22
52
  s = 1
@@ -64,7 +94,23 @@ def plot_mask(path, mask, lats, lons, global_lats, global_lons):
64
94
 
65
95
  # TODO: Use the one from anemoi.utils.grids instead
66
96
  # from anemoi.utils.grids import ...
67
- def xyz_to_latlon(x, y, z):
97
+ def xyz_to_latlon(x: NDArray[Any], y: NDArray[Any], z: NDArray[Any]) -> Tuple[NDArray[Any], NDArray[Any]]:
98
+ """Convert Cartesian coordinates to latitude and longitude.
99
+
100
+ Parameters
101
+ ----------
102
+ x : NDArray[Any]
103
+ X coordinates.
104
+ y : NDArray[Any]
105
+ Y coordinates.
106
+ z : NDArray[Any]
107
+ Z coordinates.
108
+
109
+ Returns
110
+ -------
111
+ Tuple[NDArray[Any], NDArray[Any]]
112
+ Latitude and longitude coordinates.
113
+ """
68
114
  return (
69
115
  np.rad2deg(np.arcsin(np.minimum(1.0, np.maximum(-1.0, z)))),
70
116
  np.rad2deg(np.arctan2(y, x)),
@@ -73,7 +119,25 @@ def xyz_to_latlon(x, y, z):
73
119
 
74
120
  # TODO: Use the one from anemoi.utils.grids instead
75
121
  # from anemoi.utils.grids import ...
76
- def latlon_to_xyz(lat, lon, radius=1.0):
122
+ def latlon_to_xyz(
123
+ lat: NDArray[Any], lon: NDArray[Any], radius: float = 1.0
124
+ ) -> Tuple[NDArray[Any], NDArray[Any], NDArray[Any]]:
125
+ """Convert latitude and longitude to Cartesian coordinates.
126
+
127
+ Parameters
128
+ ----------
129
+ lat : NDArray[Any]
130
+ Latitude coordinates.
131
+ lon : NDArray[Any]
132
+ Longitude coordinates.
133
+ radius : float, optional
134
+ Radius of the sphere. Defaults to 1.0.
135
+
136
+ Returns
137
+ -------
138
+ Tuple[NDArray[Any], NDArray[Any], NDArray[Any]]
139
+ X, Y, and Z coordinates.
140
+ """
77
141
  # https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinates
78
142
  # We assume that the Earth is a sphere of radius 1 so N(phi) = 1
79
143
  # We assume h = 0
@@ -94,12 +158,39 @@ def latlon_to_xyz(lat, lon, radius=1.0):
94
158
 
95
159
 
96
160
  class Triangle3D:
97
- def __init__(self, v0, v1, v2):
161
+ """A class to represent a 3D triangle and perform intersection tests with rays."""
162
+
163
+ def __init__(self, v0: NDArray[Any], v1: NDArray[Any], v2: NDArray[Any]) -> None:
164
+ """Initialize the Triangle3D object.
165
+
166
+ Parameters
167
+ ----------
168
+ v0 : NDArray[Any]
169
+ First vertex of the triangle.
170
+ v1 : NDArray[Any]
171
+ Second vertex of the triangle.
172
+ v2 : NDArray[Any]
173
+ Third vertex of the triangle.
174
+ """
98
175
  self.v0 = v0
99
176
  self.v1 = v1
100
177
  self.v2 = v2
101
178
 
102
- def intersect(self, ray_origin, ray_direction):
179
+ def intersect(self, ray_origin: NDArray[Any], ray_direction: NDArray[Any]) -> bool:
180
+ """Check if a ray intersects with the triangle.
181
+
182
+ Parameters
183
+ ----------
184
+ ray_origin : NDArray[Any]
185
+ Origin of the ray.
186
+ ray_direction : NDArray[Any]
187
+ Direction of the ray.
188
+
189
+ Returns
190
+ -------
191
+ bool
192
+ True if the ray intersects with the triangle, False otherwise.
193
+ """
103
194
  # Möller–Trumbore intersection algorithm
104
195
  # https://en.wikipedia.org/wiki/M%C3%B6ller%E2%80%93Trumbore_intersection_algorithm
105
196
 
@@ -132,7 +223,36 @@ class Triangle3D:
132
223
  return False
133
224
 
134
225
 
135
- def cropping_mask(lats, lons, north, west, south, east):
226
+ def cropping_mask(
227
+ lats: NDArray[Any],
228
+ lons: NDArray[Any],
229
+ north: float,
230
+ west: float,
231
+ south: float,
232
+ east: float,
233
+ ) -> NDArray[Any]:
234
+ """Create a mask for the points within the specified latitude and longitude bounds.
235
+
236
+ Parameters
237
+ ----------
238
+ lats : NDArray[Any]
239
+ Latitude coordinates.
240
+ lons : NDArray[Any]
241
+ Longitude coordinates.
242
+ north : float
243
+ Northern boundary.
244
+ west : float
245
+ Western boundary.
246
+ south : float
247
+ Southern boundary.
248
+ east : float
249
+ Eastern boundary.
250
+
251
+ Returns
252
+ -------
253
+ NDArray[Any]
254
+ Mask array.
255
+ """
136
256
  mask = (
137
257
  (lats >= south)
138
258
  & (lats <= north)
@@ -146,16 +266,41 @@ def cropping_mask(lats, lons, north, west, south, east):
146
266
 
147
267
 
148
268
  def cutout_mask(
149
- lats,
150
- lons,
151
- global_lats,
152
- global_lons,
153
- cropping_distance=2.0,
154
- neighbours=5,
155
- min_distance_km=None,
156
- plot=None,
157
- ):
158
- """Return a mask for the points in [global_lats, global_lons] that are inside of [lats, lons]"""
269
+ lats: NDArray[Any],
270
+ lons: NDArray[Any],
271
+ global_lats: NDArray[Any],
272
+ global_lons: NDArray[Any],
273
+ cropping_distance: float = 2.0,
274
+ neighbours: int = 5,
275
+ min_distance_km: Optional[Union[int, float]] = None,
276
+ plot: Optional[str] = None,
277
+ ) -> NDArray[Any]:
278
+ """Return a mask for the points in [global_lats, global_lons] that are inside of [lats, lons].
279
+
280
+ Parameters
281
+ ----------
282
+ lats : NDArray[Any]
283
+ Latitude coordinates.
284
+ lons : NDArray[Any]
285
+ Longitude coordinates.
286
+ global_lats : NDArray[Any]
287
+ Global latitude coordinates.
288
+ global_lons : NDArray[Any]
289
+ Global longitude coordinates.
290
+ cropping_distance : float, optional
291
+ Cropping distance. Defaults to 2.0.
292
+ neighbours : int, optional
293
+ Number of neighbours. Defaults to 5.
294
+ min_distance_km : Optional[Union[int, float]], optional
295
+ Minimum distance in kilometers. Defaults to None.
296
+ plot : Optional[str], optional
297
+ Path for saving the plot. Defaults to None.
298
+
299
+ Returns
300
+ -------
301
+ NDArray[Any]
302
+ Mask array.
303
+ """
159
304
  from scipy.spatial import cKDTree
160
305
 
161
306
  # TODO: transform min_distance from lat/lon to xyz
@@ -232,15 +377,15 @@ def cutout_mask(
232
377
  inside_lam.append(inside or close)
233
378
 
234
379
  j = 0
235
- inside_lam = np.array(inside_lam)
380
+ inside_lam_array = np.array(inside_lam)
236
381
  for i, m in enumerate(mask):
237
382
  if not m:
238
383
  continue
239
384
 
240
- mask[i] = inside_lam[j]
385
+ mask[i] = inside_lam_array[j]
241
386
  j += 1
242
387
 
243
- assert j == len(inside_lam)
388
+ assert j == len(inside_lam_array)
244
389
 
245
390
  # Invert the mask, so we have only the points outside the cutout
246
391
  mask = ~mask
@@ -252,13 +397,32 @@ def cutout_mask(
252
397
 
253
398
 
254
399
  def thinning_mask(
255
- lats,
256
- lons,
257
- global_lats,
258
- global_lons,
259
- cropping_distance=2.0,
260
- ):
261
- """Return the list of points in [lats, lons] closest to [global_lats, global_lons]"""
400
+ lats: NDArray[Any],
401
+ lons: NDArray[Any],
402
+ global_lats: NDArray[Any],
403
+ global_lons: NDArray[Any],
404
+ cropping_distance: float = 2.0,
405
+ ) -> NDArray[Any]:
406
+ """Return the list of points in [lats, lons] closest to [global_lats, global_lons].
407
+
408
+ Parameters
409
+ ----------
410
+ lats : NDArray[Any]
411
+ Latitude coordinates.
412
+ lons : NDArray[Any]
413
+ Longitude coordinates.
414
+ global_lats : NDArray[Any]
415
+ Global latitude coordinates.
416
+ global_lons : NDArray[Any]
417
+ Global longitude coordinates.
418
+ cropping_distance : float, optional
419
+ Cropping distance. Defaults to 2.0.
420
+
421
+ Returns
422
+ -------
423
+ NDArray[Any]
424
+ Array of indices of the closest points.
425
+ """
262
426
  from scipy.spatial import cKDTree
263
427
 
264
428
  assert global_lats.ndim == 1
@@ -301,7 +465,23 @@ def thinning_mask(
301
465
  return np.array([i for i in indices])
302
466
 
303
467
 
304
- def outline(lats, lons, neighbours=5):
468
+ def outline(lats: NDArray[Any], lons: NDArray[Any], neighbours: int = 5) -> List[int]:
469
+ """Find the outline of the grid points.
470
+
471
+ Parameters
472
+ ----------
473
+ lats : NDArray[Any]
474
+ Latitude coordinates.
475
+ lons : NDArray[Any]
476
+ Longitude coordinates.
477
+ neighbours : int, optional
478
+ Number of neighbours. Defaults to 5.
479
+
480
+ Returns
481
+ -------
482
+ List[int]
483
+ Indices of the outline points.
484
+ """
305
485
  from scipy.spatial import cKDTree
306
486
 
307
487
  xyx = latlon_to_xyz(lats, lons)
@@ -333,7 +513,19 @@ def outline(lats, lons, neighbours=5):
333
513
  return outside
334
514
 
335
515
 
336
- def deserialise_mask(encoded):
516
+ def deserialise_mask(encoded: str) -> NDArray[Any]:
517
+ """Deserialise a mask from a base64 encoded string.
518
+
519
+ Parameters
520
+ ----------
521
+ encoded : str
522
+ Base64 encoded string.
523
+
524
+ Returns
525
+ -------
526
+ NDArray[Any]
527
+ Deserialised mask array.
528
+ """
337
529
  import pickle
338
530
  import zlib
339
531
 
@@ -347,7 +539,19 @@ def deserialise_mask(encoded):
347
539
  return np.array(mask, dtype=bool)
348
540
 
349
541
 
350
- def _serialise_mask(mask):
542
+ def _serialise_mask(mask: NDArray[Any]) -> str:
543
+ """Serialise a mask to a base64 encoded string.
544
+
545
+ Parameters
546
+ ----------
547
+ mask : NDArray[Any]
548
+ Mask array.
549
+
550
+ Returns
551
+ -------
552
+ str
553
+ Base64 encoded string.
554
+ """
351
555
  import pickle
352
556
  import zlib
353
557
 
@@ -376,14 +580,49 @@ def _serialise_mask(mask):
376
580
  return base64.b64encode(zlib.compress(pickle.dumps(packed))).decode("utf-8")
377
581
 
378
582
 
379
- def serialise_mask(mask):
583
+ def serialise_mask(mask: NDArray[Any]) -> str:
584
+ """Serialise a mask and ensure it can be deserialised.
585
+
586
+ Parameters
587
+ ----------
588
+ mask : NDArray[Any]
589
+ Mask array.
590
+
591
+ Returns
592
+ -------
593
+ str
594
+ Base64 encoded string.
595
+ """
380
596
  result = _serialise_mask(mask)
381
597
  # Make sure we can deserialise it
382
598
  assert np.all(mask == deserialise_mask(result))
383
599
  return result
384
600
 
385
601
 
386
- def nearest_grid_points(source_latitudes, source_longitudes, target_latitudes, target_longitudes):
602
+ def nearest_grid_points(
603
+ source_latitudes: NDArray[Any],
604
+ source_longitudes: NDArray[Any],
605
+ target_latitudes: NDArray[Any],
606
+ target_longitudes: NDArray[Any],
607
+ ) -> NDArray[Any]:
608
+ """Find the nearest grid points from source to target coordinates.
609
+
610
+ Parameters
611
+ ----------
612
+ source_latitudes : NDArray[Any]
613
+ Source latitude coordinates.
614
+ source_longitudes : NDArray[Any]
615
+ Source longitude coordinates.
616
+ target_latitudes : NDArray[Any]
617
+ Target latitude coordinates.
618
+ target_longitudes : NDArray[Any]
619
+ Target longitude coordinates.
620
+
621
+ Returns
622
+ -------
623
+ NDArray[Any]
624
+ Indices of the nearest grid points.
625
+ """
387
626
  # TODO: Use the one from anemoi.utils.grids instead
388
627
  # from anemoi.utils.grids import ...
389
628
  from scipy.spatial import cKDTree
@@ -11,11 +11,38 @@
11
11
  # A collection of functions to support pytest testing
12
12
 
13
13
  import logging
14
+ from typing import Any
15
+ from typing import List
16
+ from typing import Optional
14
17
 
15
18
  LOG = logging.getLogger(__name__)
16
19
 
17
20
 
18
- def assert_field_list(fs, size=None, start=None, end=None, constant=False, skip=None):
21
+ def assert_field_list(
22
+ fs: List[Any],
23
+ size: Optional[int] = None,
24
+ start: Optional[Any] = None,
25
+ end: Optional[Any] = None,
26
+ constant: bool = False,
27
+ skip: Optional[Any] = None,
28
+ ) -> None:
29
+ """Asserts various properties of a list of fields.
30
+
31
+ Parameters
32
+ ----------
33
+ fs : List[Any]
34
+ List of fields to be checked.
35
+ size : Optional[int], optional
36
+ Expected size of the list. If None, the list must be non-empty.
37
+ start : Optional[Any], optional
38
+ Expected start metadata value. If None, no check is performed.
39
+ end : Optional[Any], optional
40
+ Expected end metadata value. If None, no check is performed.
41
+ constant : bool, optional
42
+ If True, checks that all fields are constant.
43
+ skip : Optional[Any], optional
44
+ Placeholder for future use.
45
+ """
19
46
  import numpy as np
20
47
 
21
48
  if size is None:
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: anemoi-datasets
3
- Version: 0.5.15
3
+ Version: 0.5.17
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
@@ -191,7 +191,7 @@ License: Apache License
191
191
  same "printed page" as the copyright notice for easier
192
192
  identification within third-party archives.
193
193
 
194
- Copyright [yyyy] [name of copyright owner]
194
+ Copyright 2024-2025 Anemoi Contributors
195
195
 
196
196
  Licensed under the Apache License, Version 2.0 (the "License");
197
197
  you may not use this file except in compliance with the License.
@@ -224,18 +224,18 @@ Classifier: Programming Language :: Python :: Implementation :: CPython
224
224
  Classifier: Programming Language :: Python :: Implementation :: PyPy
225
225
  Requires-Python: >=3.9
226
226
  License-File: LICENSE
227
- Requires-Dist: anemoi-transform>=0.1.1
228
- Requires-Dist: anemoi-utils[provenance]>=0.4.11
227
+ Requires-Dist: anemoi-transform>=0.1.4
228
+ Requires-Dist: anemoi-utils[provenance]>=0.4.16
229
229
  Requires-Dist: cfunits
230
230
  Requires-Dist: numpy
231
231
  Requires-Dist: pyyaml
232
232
  Requires-Dist: semantic-version
233
233
  Requires-Dist: tqdm
234
- Requires-Dist: zarr<=2.17
234
+ Requires-Dist: zarr<=2.18.4
235
235
  Provides-Extra: all
236
236
  Requires-Dist: anemoi-datasets[create,remote,xarray]; extra == "all"
237
237
  Provides-Extra: create
238
- Requires-Dist: earthkit-data[mars]>=0.12; extra == "create"
238
+ Requires-Dist: earthkit-data[mars]>=0.12.4; extra == "create"
239
239
  Requires-Dist: earthkit-geo>=0.3; extra == "create"
240
240
  Requires-Dist: earthkit-meteo>=0.3; extra == "create"
241
241
  Requires-Dist: eccodes>=2.39.1; extra == "create"
@@ -253,10 +253,13 @@ Provides-Extra: remote
253
253
  Requires-Dist: boto3; extra == "remote"
254
254
  Requires-Dist: requests; extra == "remote"
255
255
  Provides-Extra: tests
256
+ Requires-Dist: anemoi-datasets[xarray]; extra == "tests"
256
257
  Requires-Dist: pytest; extra == "tests"
257
258
  Provides-Extra: xarray
259
+ Requires-Dist: adlfs; extra == "xarray"
258
260
  Requires-Dist: gcsfs; extra == "xarray"
259
261
  Requires-Dist: kerchunk; extra == "xarray"
260
262
  Requires-Dist: pandas; extra == "xarray"
261
263
  Requires-Dist: planetary-computer; extra == "xarray"
262
264
  Requires-Dist: pystac-client; extra == "xarray"
265
+ Dynamic: license-file
@@ -0,0 +1,137 @@
1
+ anemoi/datasets/__init__.py,sha256=i_wsAT3ezEYF7o5dpqGrpoG4wmLS-QIBug18uJbSYMs,1065
2
+ anemoi/datasets/__main__.py,sha256=ErwAqE3rBc7OaNO2JRsEOhWpB8ldjAt7BFSuRhbnlqQ,936
3
+ anemoi/datasets/_version.py,sha256=G3jgIvqAOb3RgYTFryPuF7LF2dSXviBKmqCnS1RQzaU,513
4
+ anemoi/datasets/grids.py,sha256=ALvRRMvu0GaDCnNlOO-cRCfbpywA-1w_wzSylqpqgNY,17795
5
+ anemoi/datasets/testing.py,sha256=fy_JzavUwLlK_2rtXAT-UGUyo5gjyQW2y826zf334Wg,2645
6
+ anemoi/datasets/commands/__init__.py,sha256=O5W3yHZywRoAqmRUioAr3zMCh0hGVV18wZYGvc00ioM,698
7
+ anemoi/datasets/commands/cleanup.py,sha256=FX082xkHKCSd8d-FUN5zDBSiKA-QYQEeUZ6dCUD-Ob8,1816
8
+ anemoi/datasets/commands/compare.py,sha256=jzhjbbt1U-YANTVRBhrwSh2CcYgk4qX2IiTMJtcn82s,3678
9
+ anemoi/datasets/commands/copy.py,sha256=UlvW9YIlP7jwKAY7TikVAfhkrjaQ9Kkxqfx8jEut-Jg,16010
10
+ anemoi/datasets/commands/create.py,sha256=5BXdPZMO-ZULBnEVgyeSS-IMy4p84HSyFVG855gqj3k,6598
11
+ anemoi/datasets/commands/finalise-additions.py,sha256=2LqU7ke3i-yRQbjkgldX6e2QlyE-tKqp0b6QOhJF19g,1985
12
+ anemoi/datasets/commands/finalise.py,sha256=-YtN9wFFDrM_i_V9YHoXZsajF3eAax-73Zsi4uHAFCI,1709
13
+ anemoi/datasets/commands/init-additions.py,sha256=2vMom5L38UvLLopzP2z-R_Fq31fU2uMvKXoDq5d8oI4,1931
14
+ anemoi/datasets/commands/init.py,sha256=5IKyJ_hJA4lLIbpT88XtcGzXccHLSGwSoqVSvVJGxPg,2852
15
+ anemoi/datasets/commands/inspect.py,sha256=dGx_3IQTNaV3iGfwhHp_G1fIecBWeRbOLU9ckrZ7epg,26578
16
+ anemoi/datasets/commands/load-additions.py,sha256=zqmRherIHXb5WIB4cnAuCBEsxFJmUpGjafvm6RtQ7Co,2004
17
+ anemoi/datasets/commands/load.py,sha256=U1Y8qByjreu7H9WeX4G8-tyKsz48va10fkW1L4U4wWg,2034
18
+ anemoi/datasets/commands/patch.py,sha256=Q9FDabWxlvK1QaeH4D9zhNpoSGB4h7EliWgcV76iFBs,1599
19
+ anemoi/datasets/commands/publish.py,sha256=7YusLCWYdVLuexZzvyh8ztYoBOBzVmve3uJs-XKeMAE,1469
20
+ anemoi/datasets/commands/scan.py,sha256=e5t_oxSi-II38TVQiMlWMJ8AZhDEBk5PcPD22DDbHfU,4008
21
+ anemoi/datasets/compute/__init__.py,sha256=hCW0QcLHJmE-C1r38P27_ZOvCLNewex5iQEtZqx2ckI,393
22
+ anemoi/datasets/compute/recentre.py,sha256=kwxDB8qpgOCFZSQJvjAmVcpH5zWsfk5FSoIureqNHd4,5915
23
+ anemoi/datasets/create/__init__.py,sha256=1Y7IcMPXjCZkNbezhSDiurG-qvGFGgPqvgOMpQH_e0k,50501
24
+ anemoi/datasets/create/check.py,sha256=FrgyZP3Xyx4qXHl8_ZfM31fgNhcxMqxlE5oLweMDGU0,10003
25
+ anemoi/datasets/create/chunks.py,sha256=kZV3dWoCuv3Bttc0wysJB7OPbXsD99exKyrrj4HGFwQ,4025
26
+ anemoi/datasets/create/config.py,sha256=ZF7tEPT6U4ILYVekryFd612tQeMDQK6riaTYtSJrUcM,13295
27
+ anemoi/datasets/create/filter.py,sha256=Hu4o3Z2omIdcu5ycJqmBkY_ZSKTG5JkjbIuxXM8ADfs,1254
28
+ anemoi/datasets/create/patch.py,sha256=u4CeIuo3Ncrbhu9CTyaUbcmaJfBfMrrFVpgEikM9pE4,5398
29
+ anemoi/datasets/create/persistent.py,sha256=XkEBjymXrR-y9KPVLtz9xdd0IB14wSEhcANUhUUzGVw,7832
30
+ anemoi/datasets/create/size.py,sha256=nHjX1manYhQIrcQWDCgBBBiAVDbfoMAG6ybVjytSaKI,1454
31
+ anemoi/datasets/create/source.py,sha256=xoV8uH_y6aBSE4_PWuy5w7Q7cX-tGm8e-2xC9flSAT4,1336
32
+ anemoi/datasets/create/testing.py,sha256=FzTSsbv_JBGViGrD1jT6z_T2yaA0KCrbJ3SCgp-rFPQ,2406
33
+ anemoi/datasets/create/typing.py,sha256=Hs2uDG8ZVtQ-Q-5I9-W0Pik2p1hZH5-JPVjpJXRXP7M,484
34
+ anemoi/datasets/create/utils.py,sha256=94JKPYcNSurA62yFAytW5dUFVz-r-fdwiPOkmu121pM,5572
35
+ anemoi/datasets/create/writer.py,sha256=yjgic7FfVWuVKysi3HbaW6i2j4e831oCUdyD48Ua-MA,2203
36
+ anemoi/datasets/create/zarr.py,sha256=N9PGGD-dYvcc97BZjLVWm5XQeYTiK9gwvhtreRiQzBI,9437
37
+ anemoi/datasets/create/filters/__init__.py,sha256=rhetUFPZKe-vwDIfMY33SbYrJMq909dUJRgBzuX6Q6E,901
38
+ anemoi/datasets/create/filters/empty.py,sha256=Dw1kUnAlFt6b5ds0kmrw9Gak09XjSqF8m1_MpHZNV9I,1013
39
+ anemoi/datasets/create/filters/legacy.py,sha256=6JY6uX7m-8NZjoZ1sqs0EAqT-uorvnZ-eFOwMU3LmRU,2536
40
+ anemoi/datasets/create/filters/noop.py,sha256=WHl-k3NojGJMX4iNYxQ6Ln21pM8ERP4z8pQ5zLRDvXs,1019
41
+ anemoi/datasets/create/filters/orog_to_z.py,sha256=vnZ1hD9LXoOfHCIbzkurMuBl_NSfXSiiHS2yZt8ndeQ,1784
42
+ anemoi/datasets/create/filters/pressure_level_relative_humidity_to_specific_humidity.py,sha256=2xWyqIZm8AFqS9IDPylOB3UfFu9aqe47aZ8qAbmpNUo,2558
43
+ anemoi/datasets/create/filters/pressure_level_specific_humidity_to_relative_humidity.py,sha256=L7cZvPZ1zNHbfbHQw-jn1TZEfO0i0JX5O7AoytuLy1Q,2575
44
+ anemoi/datasets/create/filters/rename.py,sha256=pKi3CU6fvox2sPH7szXdA79NjdIcSz59IB7HsiS_9Co,5779
45
+ anemoi/datasets/create/filters/rotate_winds.py,sha256=fVyAbypO_EsENHjQCujbEXp2gUEb97sMoG0s4YiPXfc,3102
46
+ anemoi/datasets/create/filters/single_level_dewpoint_to_relative_humidity.py,sha256=hCS3yiN9nZf-P6shQmBm5Or9rMOwU1fTwHw_qFIjT9s,2378
47
+ anemoi/datasets/create/filters/single_level_relative_humidity_to_dewpoint.py,sha256=pGwu6YprJ6PwJ8ZRD5k4Mz_wqSXz52jvXP13WDIGOTw,2642
48
+ anemoi/datasets/create/filters/single_level_relative_humidity_to_specific_humidity.py,sha256=a9QVOG8hTVqkDtX4MJ5NB0y-huOKsOm_K4ujakQ36fg,5160
49
+ anemoi/datasets/create/filters/single_level_specific_humidity_to_relative_humidity.py,sha256=bXgm5nKgBZaP1E4tcjSLqJsEl6BlJaNLr3MsR8V9sJ4,14682
50
+ anemoi/datasets/create/filters/speeddir_to_uv.py,sha256=8NXsus1LaYOzAAr7XCHKCh8HAz8BI0A1ZZz_RNDB0-w,2762
51
+ anemoi/datasets/create/filters/sum.py,sha256=aGT6JkdHJ3i2SKzklqiyJ4ZFV3bVMYhHOSoxkdYuzp8,2151
52
+ anemoi/datasets/create/filters/transform.py,sha256=C8tizuYtO1Bp28dTB9mEHeADAO8zHlDFXh8XR1IO1Os,1506
53
+ anemoi/datasets/create/filters/unrotate_winds.py,sha256=3AJf0crnVVySLlXLIdfEUxRRlQeKgheUuD-UCrSrgo8,2798
54
+ anemoi/datasets/create/filters/uv_to_speeddir.py,sha256=Zdc34AG5Bsz-Z7JGuznyRJr6F-BnWKXPiI3mjmOpbek,2883
55
+ anemoi/datasets/create/filters/wz_to_w.py,sha256=42AQvTHk-ISyHlwvXfU3yiTGiDkfrs5kiKNkyqqtQpg,2725
56
+ anemoi/datasets/create/input/__init__.py,sha256=XeURpmbReQvpELltGFKzg3oZFXWRdUxW9SK3K662SBQ,3364
57
+ anemoi/datasets/create/input/action.py,sha256=0P1aSutrzdDDtUU78YMLfdsUEOeJcLvLiH2KDR5kOxM,7565
58
+ anemoi/datasets/create/input/concat.py,sha256=bU8SWfBVfK8bRAmmN4UO9zpIGxwQvRUk9_vwrKPOTE4,5355
59
+ anemoi/datasets/create/input/context.py,sha256=qrLccxMe9UkyQxsNuR6JSK7oLzZq21dt38AxZ9kYzsY,2714
60
+ anemoi/datasets/create/input/data_sources.py,sha256=4xUUShM0pCXIZVPJW_cSNMUwCO_wLx996MLFpTLChm0,4385
61
+ anemoi/datasets/create/input/empty.py,sha256=tOxe3LykoGkEAFuf4yggMpAcvFzMw3E6hCz5pyeQ8Q0,1534
62
+ anemoi/datasets/create/input/filter.py,sha256=R19IUwTdWBueeTKAMxyYKiP-JXOFJQu2vUoEiPYK0rA,3313
63
+ anemoi/datasets/create/input/function.py,sha256=FJ2W5DJBLmpkQ6QFo0-yfUE9iIZyimBn_cZ1b2nRu-Q,6874
64
+ anemoi/datasets/create/input/join.py,sha256=RAdgE4lVcC71_J47dNa1weJuWdTXSQIvo06G2J6dfdg,4016
65
+ anemoi/datasets/create/input/misc.py,sha256=FVaH_ym52RZI_fnLSMM_dKTQmWTrInucP780E3gGqvw,3357
66
+ anemoi/datasets/create/input/pipe.py,sha256=-tCz161IwXoI8pl1hilA9T_j5eHSr-sgbijFLp9HHNc,2083
67
+ anemoi/datasets/create/input/repeated_dates.py,sha256=HaPzDCNHQBY1VVp6gvd3drwjWjYpSBh-GLgHqBRJTz0,12012
68
+ anemoi/datasets/create/input/result.py,sha256=wZHquaytAatwqGZifHzJDsysed_cEwSr9X2ND6Yq9o0,24218
69
+ anemoi/datasets/create/input/step.py,sha256=WcR9NgRvUKF60Fo5veLvRCAQMrOd55x1gOEAmd2t2r4,5948
70
+ anemoi/datasets/create/input/template.py,sha256=Iycw9VmfA0WEIDP_Of8bp-8HsV0EUfwbnm0WjxiO4GA,4092
71
+ anemoi/datasets/create/input/trace.py,sha256=dakPYMmwKq6s17Scww1CN-xYBD3btJTGeDknOhAcnEM,3320
72
+ anemoi/datasets/create/sources/__init__.py,sha256=XNiiGaC6NbxnGfl6glPw-gTJASi3vsGKwVlfkMqYGk4,950
73
+ anemoi/datasets/create/sources/accumulations.py,sha256=Fh4LJi7XptsOZ9CBv4Nxw8CPJpp_-ugRAWg3mtNcmKU,19855
74
+ anemoi/datasets/create/sources/constants.py,sha256=5O6d9tEuAmVjl5vNkNfmkaAjKXFlw1UjeueTsF1GZCI,1528
75
+ anemoi/datasets/create/sources/eccc_fstd.py,sha256=8HK38f444HcWMvBhooP0XqTfMXYoCbN_8G9RI_Ne5rc,659
76
+ anemoi/datasets/create/sources/empty.py,sha256=5mVIVRUwnBfE3zp-bvNA_imXCSpyds-4mewcI8HXAiY,1020
77
+ anemoi/datasets/create/sources/forcings.py,sha256=877OZoXUoJncQ2_AAGSijwWqM-4kJJdxdIa6SFvZBUw,1216
78
+ anemoi/datasets/create/sources/grib.py,sha256=zFBFWNFDVPCMSDRheNuaLZ7EaInjDt9OTJwVOPj9j-U,8371
79
+ anemoi/datasets/create/sources/hindcasts.py,sha256=_4880rgd4AsRxlDXVi6dkh8mlKXrz2i27btVlmlMFjY,2611
80
+ anemoi/datasets/create/sources/legacy.py,sha256=O6sTbI4QBlUiuGwaUwO2kpmfJYCAs_gTid0YOnkm37I,2536
81
+ anemoi/datasets/create/sources/mars.py,sha256=tesQz7Ne6SLBChE_cNJU6Sxr6e0LXFlUKQ8gCdRiCMw,13155
82
+ anemoi/datasets/create/sources/netcdf.py,sha256=UnehMwEMJquqaOeU33zNyFUYfzqQx4Rg-GRmUcgMcbE,1222
83
+ anemoi/datasets/create/sources/opendap.py,sha256=sTm0wXE_BHk9q8vaNNE_Y6BhTOmhxPweS8RTjP4HYjU,1254
84
+ anemoi/datasets/create/sources/patterns.py,sha256=xNl3yI_cClgJsHaoYwE-bmDSzV4pcBgHRanHdz9MsQU,2291
85
+ anemoi/datasets/create/sources/recentre.py,sha256=OtobkmaWzGD3UacjXfK_Oerjf7EnQi85LIs9xBYJK7A,4044
86
+ anemoi/datasets/create/sources/source.py,sha256=x8k---A2_3AglYqNsXLlv1ti4f9n_gVKmmqtyQGLPTs,2117
87
+ anemoi/datasets/create/sources/tendencies.py,sha256=saHGYl-MnvBEeZX-n1zgT8lehA7LC2G5dMNnxklI9-U,5590
88
+ anemoi/datasets/create/sources/xarray.py,sha256=zBuWCmBidEY3Wz6DDRZStBcrkw646AXpIM8B1nHV55c,2555
89
+ anemoi/datasets/create/sources/xarray_kerchunk.py,sha256=vdFaFzze8VLjYUgIX8Lc39ELvwmgfT3ioyxBHAt4nrs,1136
90
+ anemoi/datasets/create/sources/xarray_zarr.py,sha256=McY-vgXmUbGAkBViAfYwBUeVmGUU-Qr8UW-jUGu5-9s,1209
91
+ anemoi/datasets/create/sources/zenodo.py,sha256=KEetFEk5GzGFpoos8rbBQBTa2XElWG7oTYjfZXgbu0Q,2065
92
+ anemoi/datasets/create/sources/xarray_support/README.md,sha256=56olM9Jh0vI0_bU9GI-IqbBcz4DZXWONqvdzN_VeAFE,78
93
+ anemoi/datasets/create/sources/xarray_support/__init__.py,sha256=CLq5gcHhP5XGzr_LD6D4VPYqPUECmlYztzVC842KMU0,5563
94
+ anemoi/datasets/create/sources/xarray_support/coordinates.py,sha256=rPEuijS77mQ9V9tpN7wjg-w9rBxj7bZf_c30lLgSscE,11029
95
+ anemoi/datasets/create/sources/xarray_support/field.py,sha256=YRxx6kh1qO2qQ6I_VyR51h3dwNiiFM7CNwQNfpp-p-E,6375
96
+ anemoi/datasets/create/sources/xarray_support/fieldlist.py,sha256=CG8ecTXCr37pNiykoxR6Sb21Xxsz6AS5K5-KE4qMEmo,8243
97
+ anemoi/datasets/create/sources/xarray_support/flavour.py,sha256=GYodfpKfTBBWiyXytRrin6NK07ltlyz0UF7x4gQ3Fok,31836
98
+ anemoi/datasets/create/sources/xarray_support/grid.py,sha256=P-NPDYU0eZg_mWcEbeNL9ZhtoJHGNw0eWaC1jxYfK5o,5690
99
+ anemoi/datasets/create/sources/xarray_support/metadata.py,sha256=WRO86l-ZB7iJ7pG5Vz9kVv5h1MokfF0fuy0bNSNBRIc,10687
100
+ anemoi/datasets/create/sources/xarray_support/patch.py,sha256=Snk8bz7gp0HrG0MrY5hrXu7VC0tKgtoiWXByi2sBYJc,2037
101
+ anemoi/datasets/create/sources/xarray_support/time.py,sha256=Y_lZTUOXWJH4jcSgyL4WTDwrtPXi7MUiumaXfRoqqAY,12486
102
+ anemoi/datasets/create/sources/xarray_support/variable.py,sha256=fcazws9vuizmx55JCXwbkwffg4WxJllPrEg2US1VysE,9163
103
+ anemoi/datasets/create/statistics/__init__.py,sha256=_BuPcuUrwQAEcMQVds93EV9M5ys2ao8jCWKV4OVoSSA,18291
104
+ anemoi/datasets/create/statistics/summary.py,sha256=JdtChTmsr1Y958_nka36HltTbeZkawuGbprbfZD7Ux8,4790
105
+ anemoi/datasets/data/__init__.py,sha256=dLzKYFX0eCi7urHA9t530SqZ_GYxTUyQeEcXYV8lZho,2521
106
+ anemoi/datasets/data/complement.py,sha256=C55ZyWO8uM-bGbZkpuh80z95XtQjIr_NBnsxiKDWWtE,9643
107
+ anemoi/datasets/data/concat.py,sha256=eY5rujcdal00BJCv00mKSlxp0FKVvPQd7uqrBnL9fj4,8996
108
+ anemoi/datasets/data/dataset.py,sha256=Z1P1bkscPChGNcjjkxonbw9XylixJoM0UIUjqDDvxl8,30494
109
+ anemoi/datasets/data/debug.css,sha256=z2X_ZDSnZ9C3pyZPWnQiEyAxuMxUaxJxET4oaCImTAQ,211
110
+ anemoi/datasets/data/debug.py,sha256=hVa1jAQ-TK7CoKJNyyUC0eZPobFG-FpkVXEaO_3B-MA,10796
111
+ anemoi/datasets/data/ensemble.py,sha256=-36kMjuT2y5jUeSnjCRTCyE4um6DLAADBVSKSTkHZZg,5352
112
+ anemoi/datasets/data/fill_missing.py,sha256=ceONpzD-PWLMTtG4WOw6USw-Cd1O55VYzfpAiEsROK8,8797
113
+ anemoi/datasets/data/forwards.py,sha256=d0LL0AORQApGmuPIfMWevOOZuePlgZ6GldHUKmqnTtg,19732
114
+ anemoi/datasets/data/grids.py,sha256=vTAfGq3SaTU4tQzzfeRpFAKlmfL-JVvpjP4e3nGWO3s,22045
115
+ anemoi/datasets/data/indexing.py,sha256=DasVd1j0FB0iTw6eqvhiLka4ztf2zJcI5NgWxmtxzCw,7526
116
+ anemoi/datasets/data/interpolate.py,sha256=D6yBMlY-PTngbMC0Mx9cQn-wL_Oe5M8JNBQ0RaIj1Hc,6482
117
+ anemoi/datasets/data/join.py,sha256=ZEHOsCecKBkKKH-vki404Sm7r7cV368ECO7PXPpay3s,9212
118
+ anemoi/datasets/data/masked.py,sha256=xYhvdv4z11QVdZE1d4yGxSJ7VKixQcJy6iviZ_s54bo,7802
119
+ anemoi/datasets/data/merge.py,sha256=SvQhJHf-C-Kn7hEjFqomienk-epPPjMtoccRNCJpMtw,8733
120
+ anemoi/datasets/data/misc.py,sha256=WUXqN7IdIdqxM8fIaOcr9FE7UbgvoKHtwsfqPm1cMpU,15253
121
+ anemoi/datasets/data/missing.py,sha256=ogfVDponbs0bGHMxps32Fj_fq4gT26R70yEMco5gdK8,12593
122
+ anemoi/datasets/data/rescale.py,sha256=nGfJ5tWCncMJ7NMXkLbmt6z0ELrD6FxpbjJreQ3W91g,7004
123
+ anemoi/datasets/data/select.py,sha256=Xs6uOzJL0CoOGeWA_E5_ukr8Jav2kXbZ41vhk7Vr8PE,8277
124
+ anemoi/datasets/data/statistics.py,sha256=Hi9tPtNPBFaD0jcBa5vxoZp1radEMS-1RXwA3RbWrK8,3173
125
+ anemoi/datasets/data/stores.py,sha256=-1WSQDYCMJVZlcvBim7Ay_h-VLJffbJ3v7N0uB2VfXc,18918
126
+ anemoi/datasets/data/subset.py,sha256=3h3Y7Mcw-fxs9-S0z8WNk6TcV5Hk5u9ZWfpJCTAZt4g,8804
127
+ anemoi/datasets/data/unchecked.py,sha256=c7YIa9gFxOOjqyyOqrhGaFWQ1pN7_0W1Q8ABUTkI8e8,7311
128
+ anemoi/datasets/data/xy.py,sha256=-jWzYismrK3eI3YCKIBpU1BCmraRncmVn0_2IUY--lk,7579
129
+ anemoi/datasets/dates/__init__.py,sha256=pEArHDQ7w5E0WC8Vvf9ypyKSdm6gnhoN9TmooITB7C4,13617
130
+ anemoi/datasets/dates/groups.py,sha256=IOveL6IyTXZwEdXZEnRAnpu9pINY95VN7LzcpLfJ09E,10105
131
+ anemoi/datasets/utils/__init__.py,sha256=hCW0QcLHJmE-C1r38P27_ZOvCLNewex5iQEtZqx2ckI,393
132
+ anemoi_datasets-0.5.17.dist-info/licenses/LICENSE,sha256=8HznKF1Vi2IvfLsKNE5A2iVyiri3pRjRPvPC9kxs6qk,11354
133
+ anemoi_datasets-0.5.17.dist-info/METADATA,sha256=jIFWwwr0VWMKPo-lTpC82vLpvagt5n2HD99Otf7CKW4,15727
134
+ anemoi_datasets-0.5.17.dist-info/WHEEL,sha256=L0N565qmK-3nM2eBoMNFszYJ_MTx03_tQ0CQu1bHLYo,91
135
+ anemoi_datasets-0.5.17.dist-info/entry_points.txt,sha256=yR-o-4uiPEA_GLBL81SkMYnUoxq3CAV3hHulQiRtGG0,66
136
+ anemoi_datasets-0.5.17.dist-info/top_level.txt,sha256=DYn8VPs-fNwr7fNH9XIBqeXIwiYYd2E2k5-dUFFqUz0,7
137
+ anemoi_datasets-0.5.17.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (78.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -186,7 +186,7 @@
186
186
  same "printed page" as the copyright notice for easier
187
187
  identification within third-party archives.
188
188
 
189
- Copyright [yyyy] [name of copyright owner]
189
+ Copyright 2024-2025 Anemoi Contributors
190
190
 
191
191
  Licensed under the Apache License, Version 2.0 (the "License");
192
192
  you may not use this file except in compliance with the License.