anemoi-datasets 0.4.4__py3-none-any.whl → 0.5.0__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 (64) hide show
  1. anemoi/datasets/_version.py +2 -2
  2. anemoi/datasets/commands/cleanup.py +44 -0
  3. anemoi/datasets/commands/create.py +52 -21
  4. anemoi/datasets/commands/finalise-additions.py +45 -0
  5. anemoi/datasets/commands/finalise.py +39 -0
  6. anemoi/datasets/commands/init-additions.py +45 -0
  7. anemoi/datasets/commands/init.py +67 -0
  8. anemoi/datasets/commands/inspect.py +1 -1
  9. anemoi/datasets/commands/load-additions.py +47 -0
  10. anemoi/datasets/commands/load.py +47 -0
  11. anemoi/datasets/commands/patch.py +39 -0
  12. anemoi/datasets/create/__init__.py +959 -146
  13. anemoi/datasets/create/check.py +5 -3
  14. anemoi/datasets/create/config.py +54 -2
  15. anemoi/datasets/create/functions/filters/pressure_level_relative_humidity_to_specific_humidity.py +57 -0
  16. anemoi/datasets/create/functions/filters/pressure_level_specific_humidity_to_relative_humidity.py +57 -0
  17. anemoi/datasets/create/functions/filters/single_level_dewpoint_to_relative_humidity.py +54 -0
  18. anemoi/datasets/create/functions/filters/single_level_relative_humidity_to_dewpoint.py +59 -0
  19. anemoi/datasets/create/functions/filters/single_level_relative_humidity_to_specific_humidity.py +115 -0
  20. anemoi/datasets/create/functions/filters/single_level_specific_humidity_to_relative_humidity.py +390 -0
  21. anemoi/datasets/create/functions/filters/speeddir_to_uv.py +77 -0
  22. anemoi/datasets/create/functions/filters/uv_to_speeddir.py +55 -0
  23. anemoi/datasets/create/functions/sources/grib.py +86 -1
  24. anemoi/datasets/create/functions/sources/hindcasts.py +14 -73
  25. anemoi/datasets/create/functions/sources/mars.py +9 -3
  26. anemoi/datasets/create/functions/sources/xarray/__init__.py +12 -2
  27. anemoi/datasets/create/functions/sources/xarray/coordinates.py +7 -0
  28. anemoi/datasets/create/functions/sources/xarray/field.py +8 -2
  29. anemoi/datasets/create/functions/sources/xarray/fieldlist.py +0 -2
  30. anemoi/datasets/create/functions/sources/xarray/flavour.py +21 -1
  31. anemoi/datasets/create/functions/sources/xarray/metadata.py +40 -40
  32. anemoi/datasets/create/functions/sources/xarray/time.py +63 -30
  33. anemoi/datasets/create/functions/sources/xarray/variable.py +15 -38
  34. anemoi/datasets/create/input.py +62 -39
  35. anemoi/datasets/create/persistent.py +1 -1
  36. anemoi/datasets/create/statistics/__init__.py +39 -23
  37. anemoi/datasets/create/utils.py +6 -2
  38. anemoi/datasets/data/__init__.py +1 -0
  39. anemoi/datasets/data/concat.py +46 -2
  40. anemoi/datasets/data/dataset.py +119 -34
  41. anemoi/datasets/data/debug.py +5 -1
  42. anemoi/datasets/data/forwards.py +17 -8
  43. anemoi/datasets/data/grids.py +17 -3
  44. anemoi/datasets/data/interpolate.py +133 -0
  45. anemoi/datasets/data/masked.py +2 -2
  46. anemoi/datasets/data/misc.py +56 -66
  47. anemoi/datasets/data/missing.py +240 -0
  48. anemoi/datasets/data/rescale.py +147 -0
  49. anemoi/datasets/data/select.py +7 -1
  50. anemoi/datasets/data/stores.py +23 -10
  51. anemoi/datasets/data/subset.py +47 -5
  52. anemoi/datasets/data/unchecked.py +20 -22
  53. anemoi/datasets/data/xy.py +125 -0
  54. anemoi/datasets/dates/__init__.py +124 -95
  55. anemoi/datasets/dates/groups.py +85 -20
  56. anemoi/datasets/grids.py +66 -48
  57. {anemoi_datasets-0.4.4.dist-info → anemoi_datasets-0.5.0.dist-info}/METADATA +8 -17
  58. anemoi_datasets-0.5.0.dist-info/RECORD +105 -0
  59. {anemoi_datasets-0.4.4.dist-info → anemoi_datasets-0.5.0.dist-info}/WHEEL +1 -1
  60. anemoi/datasets/create/loaders.py +0 -936
  61. anemoi_datasets-0.4.4.dist-info/RECORD +0 -86
  62. {anemoi_datasets-0.4.4.dist-info → anemoi_datasets-0.5.0.dist-info}/LICENSE +0 -0
  63. {anemoi_datasets-0.4.4.dist-info → anemoi_datasets-0.5.0.dist-info}/entry_points.txt +0 -0
  64. {anemoi_datasets-0.4.4.dist-info → anemoi_datasets-0.5.0.dist-info}/top_level.txt +0 -0
@@ -7,9 +7,32 @@
7
7
 
8
8
 
9
9
  import itertools
10
+ from functools import cached_property
10
11
 
11
- from anemoi.datasets.dates import Dates
12
- from anemoi.datasets.dates import normalize_date
12
+ from anemoi.datasets.create.input import shorten
13
+ from anemoi.datasets.dates import DatesProvider
14
+ from anemoi.datasets.dates import as_datetime
15
+
16
+
17
+ class GroupOfDates:
18
+ def __init__(self, dates, provider):
19
+ assert isinstance(provider, DatesProvider), type(provider)
20
+ assert isinstance(dates, list)
21
+
22
+ self.dates = dates
23
+ self.provider = provider
24
+
25
+ def __len__(self):
26
+ return len(self.dates)
27
+
28
+ def __iter__(self):
29
+ return iter(self.dates)
30
+
31
+ def __repr__(self) -> str:
32
+ return f"GroupOfDates(dates={shorten(self.dates)})"
33
+
34
+ def __eq__(self, other: object) -> bool:
35
+ return isinstance(other, GroupOfDates) and self.dates == other.dates
13
36
 
14
37
 
15
38
  class Groups:
@@ -41,33 +64,48 @@ class Groups:
41
64
 
42
65
  def __init__(self, **kwargs):
43
66
  group_by = kwargs.pop("group_by")
44
- self.dates = Dates.from_config(**kwargs)
45
- self.grouper = Grouper.from_config(group_by)
46
- self.filter = Filter(self.dates.missing)
67
+ self._dates = DatesProvider.from_config(**kwargs)
68
+ self._grouper = Grouper.from_config(group_by)
69
+ self._filter = Filter(self._dates.missing)
70
+
71
+ @property
72
+ def provider(self):
73
+ return self._dates
47
74
 
48
75
  def __iter__(self):
49
- for dates in self.grouper(self.dates):
50
- dates = self.filter(dates)
76
+ for go in self._grouper(self._dates):
77
+ dates = self._filter(go.dates)
51
78
  if not dates:
52
79
  continue
53
- yield dates
80
+ yield GroupOfDates(dates, go.provider)
54
81
 
55
82
  def __len__(self):
56
- count = 0
57
- for dates in self.grouper(self.dates):
58
- dates = self.filter(dates)
83
+ return self._len
84
+
85
+ @cached_property
86
+ def _len(self):
87
+ n = 0
88
+ for go in self._grouper(self._dates):
89
+ dates = self._filter(go.dates)
59
90
  if not dates:
60
91
  continue
61
- count += 1
62
- return count
92
+ n += 1
93
+ return n
63
94
 
64
95
  def __repr__(self):
65
- return f"{self.__class__.__name__}(dates={len(self)})"
96
+ return f"{self.__class__.__name__}(dates={len(self)},{shorten(self._dates)})"
97
+
98
+ def describe(self):
99
+ return self.dates.summary
100
+
101
+ def one_date(self):
102
+ go = next(iter(self))
103
+ return GroupOfDates([go.dates[0]], go.provider)
66
104
 
67
105
 
68
106
  class Filter:
69
107
  def __init__(self, missing):
70
- self.missing = [normalize_date(m) for m in missing]
108
+ self.missing = set(as_datetime(m) for m in missing)
71
109
 
72
110
  def __call__(self, dates):
73
111
  return [d for d in dates if d not in self.missing]
@@ -76,10 +114,16 @@ class Filter:
76
114
  class Grouper:
77
115
  @classmethod
78
116
  def from_config(cls, group_by):
117
+
79
118
  if isinstance(group_by, int) and group_by > 0:
80
119
  return GrouperByFixedSize(group_by)
120
+
81
121
  if group_by is None:
82
122
  return GrouperOneGroup()
123
+
124
+ if group_by == "reference_date":
125
+ return ReferenceDateGroup()
126
+
83
127
  key = {
84
128
  "monthly": lambda dt: (dt.year, dt.month),
85
129
  "daily": lambda dt: (dt.year, dt.month, dt.day),
@@ -89,30 +133,51 @@ class Grouper:
89
133
  return GrouperByKey(key)
90
134
 
91
135
 
136
+ class ReferenceDateGroup(Grouper):
137
+ def __call__(self, dates):
138
+ assert isinstance(dates, DatesProvider), type(dates)
139
+
140
+ mapping = dates.mapping
141
+
142
+ def same_refdate(dt):
143
+ return mapping[dt].refdate
144
+
145
+ for _, g in itertools.groupby(sorted(dates, key=same_refdate), key=same_refdate):
146
+ yield GroupOfDates(list(g), dates)
147
+
148
+
92
149
  class GrouperOneGroup(Grouper):
93
150
  def __call__(self, dates):
94
- yield dates.values
151
+ assert isinstance(dates, DatesProvider), type(dates)
152
+
153
+ yield GroupOfDates(dates.values, dates)
95
154
 
96
155
 
97
156
  class GrouperByKey(Grouper):
157
+ """Group dates by a key."""
158
+
98
159
  def __init__(self, key):
99
160
  self.key = key
100
161
 
101
162
  def __call__(self, dates):
102
- for _, g in itertools.groupby(dates, key=self.key):
103
- yield list(g)
163
+ for _, g in itertools.groupby(sorted(dates, key=self.key), key=self.key):
164
+ yield GroupOfDates(list(g), dates)
104
165
 
105
166
 
106
167
  class GrouperByFixedSize(Grouper):
168
+ """Group dates by a fixed size."""
169
+
107
170
  def __init__(self, size):
108
171
  self.size = size
109
172
 
110
173
  def __call__(self, dates):
111
174
  batch = []
175
+
112
176
  for d in dates:
113
177
  batch.append(d)
114
178
  if len(batch) == self.size:
115
- yield batch
179
+ yield GroupOfDates(batch, dates)
116
180
  batch = []
181
+
117
182
  if batch:
118
- yield batch
183
+ yield GroupOfDates(batch, dates)
anemoi/datasets/grids.py CHANGED
@@ -7,41 +7,65 @@
7
7
  # nor does it submit to any jurisdiction.
8
8
  #
9
9
 
10
+ import logging
11
+
10
12
  import numpy as np
11
13
 
14
+ LOG = logging.getLogger(__name__)
15
+
12
16
 
13
17
  def plot_mask(path, mask, lats, lons, global_lats, global_lons):
14
18
  import matplotlib.pyplot as plt
15
19
 
16
- middle = (np.amin(lons) + np.amax(lons)) / 2
17
- print("middle", middle)
18
20
  s = 1
19
21
 
20
- # gmiddle = (np.amin(global_lons)+ np.amax(global_lons))/2
21
-
22
- # print('gmiddle', gmiddle)
23
- # global_lons = global_lons-gmiddle+middle
24
22
  global_lons[global_lons >= 180] -= 360
25
23
 
26
24
  plt.figure(figsize=(10, 5))
27
25
  plt.scatter(global_lons, global_lats, s=s, marker="o", c="r")
28
- plt.savefig(path + "-global.png")
26
+ if isinstance(path, str):
27
+ plt.savefig(path + "-global.png")
29
28
 
30
29
  plt.figure(figsize=(10, 5))
31
30
  plt.scatter(global_lons[mask], global_lats[mask], s=s, c="k")
32
- plt.savefig(path + "-cutout.png")
31
+ if isinstance(path, str):
32
+ plt.savefig(path + "-cutout.png")
33
33
 
34
34
  plt.figure(figsize=(10, 5))
35
35
  plt.scatter(lons, lats, s=s)
36
- plt.savefig(path + "-lam.png")
36
+ if isinstance(path, str):
37
+ plt.savefig(path + "-lam.png")
37
38
  # plt.scatter(lons, lats, s=0.01)
38
39
 
39
40
  plt.figure(figsize=(10, 5))
40
41
  plt.scatter(global_lons[mask], global_lats[mask], s=s, c="r")
41
42
  plt.scatter(lons, lats, s=s)
42
- plt.savefig(path + "-both.png")
43
+ if isinstance(path, str):
44
+ plt.savefig(path + "-both.png")
43
45
  # plt.scatter(lons, lats, s=0.01)
44
46
 
47
+ plt.figure(figsize=(10, 5))
48
+ plt.scatter(global_lons[mask], global_lats[mask], s=s, c="r")
49
+ plt.scatter(lons, lats, s=s)
50
+ plt.xlim(np.amin(lons) - 1, np.amax(lons) + 1)
51
+ plt.ylim(np.amin(lats) - 1, np.amax(lats) + 1)
52
+ if isinstance(path, str):
53
+ plt.savefig(path + "-both-zoomed.png")
54
+
55
+ plt.figure(figsize=(10, 5))
56
+ plt.scatter(global_lons[mask], global_lats[mask], s=s, c="r")
57
+ plt.xlim(np.amin(lons) - 1, np.amax(lons) + 1)
58
+ plt.ylim(np.amin(lats) - 1, np.amax(lats) + 1)
59
+ if isinstance(path, str):
60
+ plt.savefig(path + "-global-zoomed.png")
61
+
62
+
63
+ def xyz_to_latlon(x, y, z):
64
+ return (
65
+ np.rad2deg(np.arcsin(np.minimum(1.0, np.maximum(-1.0, z)))),
66
+ np.rad2deg(np.arctan2(y, x)),
67
+ )
68
+
45
69
 
46
70
  def latlon_to_xyz(lat, lon, radius=1.0):
47
71
  # https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinates
@@ -121,6 +145,7 @@ def cutout_mask(
121
145
  global_lats,
122
146
  global_lons,
123
147
  cropping_distance=2.0,
148
+ neighbours=5,
124
149
  min_distance_km=None,
125
150
  plot=None,
126
151
  ):
@@ -164,58 +189,52 @@ def cutout_mask(
164
189
  xyx = latlon_to_xyz(lats, lons)
165
190
  lam_points = np.array(xyx).transpose()
166
191
 
167
- # Use a KDTree to find the nearest points
168
- kdtree = KDTree(lam_points)
169
- distances, indices = kdtree.query(global_points, k=3)
170
-
171
- if min_distance_km is not None:
192
+ if isinstance(min_distance_km, (int, float)):
172
193
  min_distance = min_distance_km / 6371.0
173
194
  else:
174
- # Estimnation of the minimum distance between two grib points
175
-
176
- glats = sorted(set(global_lats_masked))
177
- glons = sorted(set(global_lons_masked))
178
- min_dlats = np.min(np.diff(glats))
179
- min_dlons = np.min(np.diff(glons))
180
-
181
- # Use the centre of the LAM grid as the reference point
182
- centre = np.mean(lats), np.mean(lons)
183
- centre_xyz = np.array(latlon_to_xyz(*centre))
184
-
185
- pt1 = np.array(latlon_to_xyz(centre[0] + min_dlats, centre[1]))
186
- pt2 = np.array(latlon_to_xyz(centre[0], centre[1] + min_dlons))
187
- min_distance = (
188
- min(
189
- np.linalg.norm(pt1 - centre_xyz),
190
- np.linalg.norm(pt2 - centre_xyz),
191
- )
192
- / 2.0
193
- )
195
+ points = {"lam": lam_points, "global": global_points, None: global_points}[min_distance_km]
196
+ distances, _ = KDTree(points).query(points, k=2)
197
+ min_distance = np.min(distances[:, 1])
198
+
199
+ LOG.info(f"cutout_mask using min_distance = {min_distance * 6371.0} km")
200
+
201
+ # Use a KDTree to find the nearest points
202
+ distances, indices = KDTree(lam_points).query(global_points, k=neighbours)
194
203
 
204
+ # Centre of the Earth
195
205
  zero = np.array([0.0, 0.0, 0.0])
196
- ok = []
206
+
207
+ # After the loop, 'inside_lam' will contain a list point to EXCLUDE
208
+ inside_lam = []
209
+
197
210
  for i, (global_point, distance, index) in enumerate(zip(global_points, distances, indices)):
198
- t = Triangle3D(lam_points[index[0]], lam_points[index[1]], lam_points[index[2]])
199
- # distance = np.min(distance)
200
- # The point is inside the triangle if the intersection with the ray
201
- # from the point to the centre of the Earth is not None
202
- # (the direction of the ray is not important)
203
211
 
204
- intersect = t.intersect(zero, global_point)
212
+ # We check more than one triangle in case te global point
213
+ # is near the edge of triangle, (the lam point and global points are colinear)
214
+
215
+ inside = False
216
+ for j in range(neighbours):
217
+ t = Triangle3D(
218
+ lam_points[index[j]], lam_points[index[(j + 1) % neighbours]], lam_points[index[(j + 2) % neighbours]]
219
+ )
220
+ inside = t.intersect(zero, global_point)
221
+ if inside:
222
+ break
223
+
205
224
  close = np.min(distance) <= min_distance
206
225
 
207
- ok.append(intersect or close)
226
+ inside_lam.append(inside or close)
208
227
 
209
228
  j = 0
210
- ok = np.array(ok)
229
+ inside_lam = np.array(inside_lam)
211
230
  for i, m in enumerate(mask):
212
231
  if not m:
213
232
  continue
214
233
 
215
- mask[i] = ok[j]
234
+ mask[i] = inside_lam[j]
216
235
  j += 1
217
236
 
218
- assert j == len(ok)
237
+ assert j == len(inside_lam)
219
238
 
220
239
  # Invert the mask, so we have only the points outside the cutout
221
240
  mask = ~mask
@@ -271,8 +290,7 @@ def thinning_mask(
271
290
  points = np.array(xyx).transpose()
272
291
 
273
292
  # Use a KDTree to find the nearest points
274
- kdtree = KDTree(points)
275
- _, indices = kdtree.query(global_points, k=1)
293
+ _, indices = KDTree(points).query(global_points, k=1)
276
294
 
277
295
  return np.array([i for i in indices])
278
296
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: anemoi-datasets
3
- Version: 0.4.4
3
+ Version: 0.5.0
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,14 +223,14 @@ 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.13
226
+ Requires-Dist: anemoi-utils[provenance] >=0.3.15
227
+ Requires-Dist: cfunits
227
228
  Requires-Dist: numpy
228
229
  Requires-Dist: pyyaml
229
230
  Requires-Dist: semantic-version
230
231
  Requires-Dist: tqdm
231
- Requires-Dist: zarr
232
+ Requires-Dist: zarr <=2.17
232
233
  Provides-Extra: all
233
- Requires-Dist: aiohttp ; extra == 'all'
234
234
  Requires-Dist: boto3 ; extra == 'all'
235
235
  Requires-Dist: earthkit-data[mars] >=0.9 ; extra == 'all'
236
236
  Requires-Dist: earthkit-geo >=0.2 ; extra == 'all'
@@ -241,7 +241,6 @@ Requires-Dist: gcsfs ; extra == 'all'
241
241
  Requires-Dist: kerchunk ; extra == 'all'
242
242
  Requires-Dist: pyproj ; extra == 'all'
243
243
  Requires-Dist: requests ; extra == 'all'
244
- Requires-Dist: s3fs ; extra == 'all'
245
244
  Provides-Extra: create
246
245
  Requires-Dist: earthkit-data[mars] >=0.9 ; extra == 'create'
247
246
  Requires-Dist: earthkit-geo >=0.2 ; extra == 'create'
@@ -250,7 +249,6 @@ Requires-Dist: ecmwflibs >=0.6.3 ; extra == 'create'
250
249
  Requires-Dist: entrypoints ; extra == 'create'
251
250
  Requires-Dist: pyproj ; extra == 'create'
252
251
  Provides-Extra: dev
253
- Requires-Dist: aiohttp ; extra == 'dev'
254
252
  Requires-Dist: boto3 ; extra == 'dev'
255
253
  Requires-Dist: earthkit-data[mars] >=0.9 ; extra == 'dev'
256
254
  Requires-Dist: earthkit-geo >=0.2 ; extra == 'dev'
@@ -264,27 +262,20 @@ Requires-Dist: pandoc ; extra == 'dev'
264
262
  Requires-Dist: pyproj ; extra == 'dev'
265
263
  Requires-Dist: pytest ; extra == 'dev'
266
264
  Requires-Dist: requests ; extra == 'dev'
267
- Requires-Dist: rstfmt ; extra == 'dev'
268
- Requires-Dist: s3fs ; extra == 'dev'
269
265
  Requires-Dist: sphinx ; extra == 'dev'
270
- Requires-Dist: sphinx-argparse <0.5 ; extra == 'dev'
271
266
  Requires-Dist: sphinx-rtd-theme ; extra == 'dev'
272
267
  Provides-Extra: docs
273
268
  Requires-Dist: nbsphinx ; extra == 'docs'
274
269
  Requires-Dist: pandoc ; extra == 'docs'
275
- Requires-Dist: rstfmt ; extra == 'docs'
276
270
  Requires-Dist: sphinx ; extra == 'docs'
277
- Requires-Dist: sphinx-argparse <0.5 ; extra == 'docs'
271
+ Requires-Dist: sphinx-argparse ; extra == 'docs'
278
272
  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'
283
273
  Provides-Extra: remote
284
- Requires-Dist: aiohttp ; extra == 'remote'
285
274
  Requires-Dist: boto3 ; extra == 'remote'
286
275
  Requires-Dist: requests ; extra == 'remote'
287
- Requires-Dist: s3fs ; extra == 'remote'
288
276
  Provides-Extra: tests
289
277
  Requires-Dist: pytest ; extra == 'tests'
278
+ Provides-Extra: xarray
279
+ Requires-Dist: gcsfs ; extra == 'xarray'
280
+ Requires-Dist: kerchunk ; extra == 'xarray'
290
281
 
@@ -0,0 +1,105 @@
1
+ anemoi/datasets/__init__.py,sha256=Z1gqZWhecLcT0RZQqYBLlz01MUlUZd0kWEj_RavbITM,782
2
+ anemoi/datasets/__main__.py,sha256=cLA2PidDTOUHaDGzd0_E5iioKYNe-PSTv567Y2fuwQk,723
3
+ anemoi/datasets/_version.py,sha256=aeBju2l8GTMwAhIRG_c2Q_oVPFacRkZZwGtxmvFCGPQ,411
4
+ anemoi/datasets/grids.py,sha256=xgvIbpMGuN2GKi2wIBhOLEMzj940nY9PH-toD0rCmPo,8980
5
+ anemoi/datasets/commands/__init__.py,sha256=qAybFZPBBQs0dyx7dZ3X5JsLpE90pwrqt1vSV7cqEIw,706
6
+ anemoi/datasets/commands/cleanup.py,sha256=_BkzGPUgvSqnuleymBfBx-sIyIM55hjK61m-v7yK0T8,1062
7
+ anemoi/datasets/commands/compare.py,sha256=svEhyR7pOS1847_RJr1I6vF7ZDPB9AVlcrhy_gxQVms,3263
8
+ anemoi/datasets/commands/copy.py,sha256=SxAeN51owyN5gwtwpt30xhJSIJRlJb9YOUt_4K4m-D8,11780
9
+ anemoi/datasets/commands/create.py,sha256=X6cmuSd1Ni0QciZFVWaJw9a4-HhOkb0tLW8NUmytrus,5022
10
+ anemoi/datasets/commands/finalise-additions.py,sha256=876K37hVjslHJiu9VXZfre4YJhS2_t9rLhmNWqlKGGk,1158
11
+ anemoi/datasets/commands/finalise.py,sha256=oPul5za7E__eJqkf5fRwvdL_0n2nG5Xk3JraRZQe64k,913
12
+ anemoi/datasets/commands/init-additions.py,sha256=K3eKH5V_6ERiBKKyqIUuI1cfvAsjWV9ZAFzbtjIDyjs,1146
13
+ anemoi/datasets/commands/init.py,sha256=7BpWaZ4gzMMiRqD9djHRciQNa0W2R4cOzoy5R-UJ0ck,2033
14
+ anemoi/datasets/commands/inspect.py,sha256=g2H_Ey47szeRp6sfaXkbAuk2JWW-LL4GXpssJIsWKVo,18675
15
+ anemoi/datasets/commands/load-additions.py,sha256=Tg4FX0xealmwyB--zv03ZBrqTAGddkT0rKrHlcu4VW0,1234
16
+ anemoi/datasets/commands/load.py,sha256=3jhL3DKUg07C8D6L8RsRWciq8korYsJ40_9atp-p68U,1304
17
+ anemoi/datasets/commands/patch.py,sha256=gHY16r46GHxARItaAUHVjKSOm0Q7ZyZvSZmXqg1Wnig,841
18
+ anemoi/datasets/commands/scan.py,sha256=MaTdne4JrtlqO3LhOUr43DZhZ6O-RZwC7uQ7C6PG7Os,2910
19
+ anemoi/datasets/compute/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ anemoi/datasets/compute/recentre.py,sha256=CMvRxTMv2H1hF1KqaZHT3Maa9P01GtsgAxr1YHbvH_o,4939
21
+ anemoi/datasets/create/__init__.py,sha256=cQKNci_vtVKBDE2-lH-_RZdMTtjNvJOnvtyk_3ZnrLg,34990
22
+ anemoi/datasets/create/check.py,sha256=9If6iAXILExjzX1YAWCDekV821BquHdjDaUSb_S_gp0,6008
23
+ anemoi/datasets/create/chunks.py,sha256=1Inh3sIBn-2sNguErb-BsLns6W_HtDiOJAjIb29lp-U,2442
24
+ anemoi/datasets/create/config.py,sha256=IqWsW_AVcp0uA2M1IPB-TT0IWjquvZL2R7PeiviOb4Y,8882
25
+ anemoi/datasets/create/input.py,sha256=I7voGdYCcUsGXMyQbfhK367jqSUYJOshwx0S4trFCwE,34668
26
+ anemoi/datasets/create/patch.py,sha256=c8cWoqxFzcY9mKREosLjuQCUeJMJL6sbNNkoVvhCZDA,3800
27
+ anemoi/datasets/create/persistent.py,sha256=isENKsd6OievmNfe1rF6_3mY7X4HjaXGIrVIfH82JKY,4294
28
+ anemoi/datasets/create/size.py,sha256=k4COEjs3wud0oKHH5P3n8Fap35xddXs002ucPjpBC88,1040
29
+ anemoi/datasets/create/template.py,sha256=1t8EKGQcZGFUpgQw9a9oEy6ZWlfnow5e0vs1SOelUNc,3148
30
+ anemoi/datasets/create/trace.py,sha256=J-8jDy28wNZa4aSV1KIQMwc1KolcoH3R2xjLl-_eLzM,2183
31
+ anemoi/datasets/create/utils.py,sha256=v0dyQUk3hWOVQeZ82pnH3GmRwENXIHSwlwB7qqnomuU,2708
32
+ anemoi/datasets/create/writer.py,sha256=G1qAPvdn8anGnpWYhvSSP4u3Km_tHKPdMXm0G4skKSk,1379
33
+ anemoi/datasets/create/zarr.py,sha256=Pb57mZn5s4JTA1o6_satrvG7C8XQhgPFhpTGvlaC_kg,5340
34
+ anemoi/datasets/create/functions/__init__.py,sha256=5HmelLkXDjFOhNhX0Z78aV3ZlW2txiJliJwT4jfLEN4,945
35
+ anemoi/datasets/create/functions/filters/__init__.py,sha256=Xe9G54CKvCI3ji-7k0R5l0WZZdhlydRgawsXuBcX_hg,379
36
+ anemoi/datasets/create/functions/filters/empty.py,sha256=QGj7YEfbo3gwlmwHi1lPATjST0332TH2-uc6_wKENjI,621
37
+ anemoi/datasets/create/functions/filters/noop.py,sha256=ZP434Z1rFlqdgXse_1ZzqC2XAqRQlYlXlVfGLx7rK8g,444
38
+ anemoi/datasets/create/functions/filters/pressure_level_relative_humidity_to_specific_humidity.py,sha256=ml-hbCxiYcjZ9EMz6uCX4E39NlUD1F8W0GK7oAPyWdg,1842
39
+ anemoi/datasets/create/functions/filters/pressure_level_specific_humidity_to_relative_humidity.py,sha256=htO023TUI5dEIqhUklueYzuGud5ddIcENeIAz54OlTU,1840
40
+ anemoi/datasets/create/functions/filters/rename.py,sha256=02p6zj2g0Qp866RrXeZG9DD2zRbv0LPqCNIDtbJ9tw4,2369
41
+ anemoi/datasets/create/functions/filters/rotate_winds.py,sha256=E0P5scdX0lwTMdcFDYfBzQ_X_4A6EvnrtFvF55-56Hk,2414
42
+ anemoi/datasets/create/functions/filters/single_level_dewpoint_to_relative_humidity.py,sha256=GBtGTuP5YWfAB0QKz2p63PHGZ_vwLV3Is-jsMZuCMFo,1704
43
+ anemoi/datasets/create/functions/filters/single_level_relative_humidity_to_dewpoint.py,sha256=H9WC4-5zaxZPLFc0CNngdLwSd0nBhBx47QAxf4si6Eo,1893
44
+ anemoi/datasets/create/functions/filters/single_level_relative_humidity_to_specific_humidity.py,sha256=QEWjoKiyDQ0XZKyjl6ZmVnjK1njQ_NOpQ-Z2BwaYqlM,4076
45
+ anemoi/datasets/create/functions/filters/single_level_specific_humidity_to_relative_humidity.py,sha256=HqMxnGGq_95ltoIyWom4DxeT37Juk1U069Am9Mq6lQU,12672
46
+ anemoi/datasets/create/functions/filters/speeddir_to_uv.py,sha256=qZei5TaxTpw3CGck-Mnf_VoiOJhdaeNuzggxLE7Hn1o,2234
47
+ anemoi/datasets/create/functions/filters/unrotate_winds.py,sha256=hiIwgWi_2lk_ntxsPFMyZ6Ku8_5p91ht36VN_2kHYDA,2414
48
+ anemoi/datasets/create/functions/filters/uv_to_speeddir.py,sha256=8JpzPTZr3r18kl-AdpPkWN90hVqa3x3NB-Q2J8128kw,1747
49
+ anemoi/datasets/create/functions/sources/__init__.py,sha256=83G1-DD2IV4VJP3MVN9512_CN4D3IVDZHUKa2ghVgKo,1246
50
+ anemoi/datasets/create/functions/sources/accumulations.py,sha256=nz09rezfNvXdTBtSQAKnsOeoiWwB8v1ecAayrJZq9rE,11947
51
+ anemoi/datasets/create/functions/sources/constants.py,sha256=9MNxjkXAjtIq7X-T7GgKGVzH-V-FBcTxj0gLLJYoXTI,903
52
+ anemoi/datasets/create/functions/sources/empty.py,sha256=ZrXGs8Y3VrLSV8C8YlJTJcHV7Bmi7xPiUlrq8R0JZQY,485
53
+ anemoi/datasets/create/functions/sources/forcings.py,sha256=tF3EyIs5AGF1Ppvp6dIExONM-kGF-wcnMO1sZc_wDuo,646
54
+ anemoi/datasets/create/functions/sources/grib.py,sha256=uypaAqcQANwn3sSutOwVTR2lJBbfuKIxbsg1zsHTaGc,4343
55
+ anemoi/datasets/create/functions/sources/hindcasts.py,sha256=yW30hfbgHGV4DOhKEv6OGrJXGHBZDXtZBYqh9wzAieU,1662
56
+ anemoi/datasets/create/functions/sources/mars.py,sha256=R5KzvxgCVXrEs5-Y7BCKpVYYp3Gw9QL3iD8UMKQpudI,6797
57
+ anemoi/datasets/create/functions/sources/netcdf.py,sha256=8uug0oAdGBJIKKws-EflA4ZgjQye_sWCBymUVv1TEW4,532
58
+ anemoi/datasets/create/functions/sources/opendap.py,sha256=0Bs0PytUvI1WZGn2OdmnJuFDGAQypxN8v44nl106QjY,531
59
+ anemoi/datasets/create/functions/sources/recentre.py,sha256=t07LIXG3Hp9gmPkPriILVt86TxubsHyS1EL1lzwgtXY,1810
60
+ anemoi/datasets/create/functions/sources/source.py,sha256=J3O4M0nB1a-67IJuY_aWqDDqyNGXB_uzxVbicFldO4U,1422
61
+ anemoi/datasets/create/functions/sources/tendencies.py,sha256=4hFPGU51KnxXp-KteSp5WLb8v586sDq2ePPd8CfUFjA,4108
62
+ anemoi/datasets/create/functions/sources/xarray_kerchunk.py,sha256=JsuGjTs5BQdJIPRI8TuUNde680UQkT4GbUhOt6wYy38,1432
63
+ anemoi/datasets/create/functions/sources/xarray_zarr.py,sha256=qI_fEKo28hu_B_qMPx67gigysw8qw5ePMU9P0wbDcIc,531
64
+ anemoi/datasets/create/functions/sources/zenodo.py,sha256=n7_sfZHJVDjVnSwc07muO9kS7TwOM4S8DIlJf5pnDiU,1237
65
+ anemoi/datasets/create/functions/sources/xarray/__init__.py,sha256=XcP072AgDX_aiK3t_rWM-C3MnAuX-mhYO5-wSLyaxPo,2805
66
+ anemoi/datasets/create/functions/sources/xarray/coordinates.py,sha256=iwnGIinuLoP0jk2s4ro9_ihJ6CoJcZ9HaRGyWh2gm8M,5893
67
+ anemoi/datasets/create/functions/sources/xarray/field.py,sha256=yTdt5YOpu7TSb4THGc0w_qpD2O7xmSzDARWZxk7Nd3w,3433
68
+ anemoi/datasets/create/functions/sources/xarray/fieldlist.py,sha256=B0toXCiYFBFF0fvxpy5bxnan2dfptWMl51_JO8TrH3A,5557
69
+ anemoi/datasets/create/functions/sources/xarray/flavour.py,sha256=_tVSrvDPJ5pXAJhmha3UA1a0Gr2FrPhcjRFoAMtX-EU,10538
70
+ anemoi/datasets/create/functions/sources/xarray/grid.py,sha256=KSlhXj5dHeRQVeZd26CChMyC1iqYsH5XqxPC2VA_YJc,1169
71
+ anemoi/datasets/create/functions/sources/xarray/metadata.py,sha256=N5-4k75vGaKvWHH6wT-AAcHKV121uViB3SY5a8FS7kA,4891
72
+ anemoi/datasets/create/functions/sources/xarray/time.py,sha256=WGO8m9J7fF-GjgBEJ0Dmqp-M2-vMsrkH-aSG0QBOVYU,4726
73
+ anemoi/datasets/create/functions/sources/xarray/variable.py,sha256=THd7uterDPJlpypRCCgTwKaaGjkV74s6WmuveH6qyBE,4474
74
+ anemoi/datasets/create/statistics/__init__.py,sha256=wMCncdfpLXxfDA9-RMtI2raVGP6dGqXfSolCXEzzITE,12704
75
+ anemoi/datasets/create/statistics/summary.py,sha256=sgmhA24y3VRyjmDUgTnPIqcHSlWBbFA0qynx6gJ9Xw8,3370
76
+ anemoi/datasets/data/__init__.py,sha256=usTH1SLkeveBbYkbBTc7rP4G3mCGNa8A74vPjXjlOSw,1067
77
+ anemoi/datasets/data/concat.py,sha256=SYASNNngnAyz3rC4ENzrGAu91rnhd6uwP0kGX9aMZAQ,5269
78
+ anemoi/datasets/data/dataset.py,sha256=GS-V1rHze1qynIBz56PQOpQMVzWcSpbIppZ7-SLtYr8,10383
79
+ anemoi/datasets/data/debug.css,sha256=z2X_ZDSnZ9C3pyZPWnQiEyAxuMxUaxJxET4oaCImTAQ,211
80
+ anemoi/datasets/data/debug.py,sha256=xNpFeJqdlN9Qhlhbp4pxXJP0dQTf0V4bm2cK4hsrSJM,6326
81
+ anemoi/datasets/data/ensemble.py,sha256=AsP7Xx0ZHLoZs6a4EC0jtyGYIcOvZvvKXhgNsIvqIN8,1137
82
+ anemoi/datasets/data/forwards.py,sha256=SfB3o8Y-nQEOkS5gI_6wtipvzB5peF_YkwW9cOMhLMg,8167
83
+ anemoi/datasets/data/grids.py,sha256=KiHpN1Ne0DnQM42buBy0sIAZHNaC2kuEFwkk6ohIooU,8046
84
+ anemoi/datasets/data/indexing.py,sha256=625m__JG5m_tDMrkz1hB6Vydenwt0oHuyAlc-o3Zwos,4799
85
+ anemoi/datasets/data/interpolate.py,sha256=usnYgjoDPfnUNg_lZl3KsFTsJ7kOsf7YaHwarsBU7Ag,4163
86
+ anemoi/datasets/data/join.py,sha256=dtCBbMTicqrRPxfBULi3RwEcQBLhQpIcvCjdN5A3XUU,4892
87
+ anemoi/datasets/data/masked.py,sha256=GKAKHwiiVrDX13V_mDiQ3G1Y7zXSksc0IkABPEvVw-M,3825
88
+ anemoi/datasets/data/misc.py,sha256=8ZaLhgHmUmP77X0_6scp36BJJzz544nHVQRAamW6x-Y,9821
89
+ anemoi/datasets/data/missing.py,sha256=OyW8cRow1v641Vgv-IY5BnUxH2Ob5P2QjgrVR1Szjl0,7157
90
+ anemoi/datasets/data/rescale.py,sha256=c_onY5f-2XDGmLP5mawNFueQWNS-BnTpo6xaBJF4aWA,4138
91
+ anemoi/datasets/data/select.py,sha256=tProUPIiRwSe_H9cwwn_4iMX1uZEIQ7q5KsegBgSmdc,3971
92
+ anemoi/datasets/data/statistics.py,sha256=lZCcKw9s7ttMBEp6ANyxtbXoZZvchhE7SClq-D4AUR8,1645
93
+ anemoi/datasets/data/stores.py,sha256=7CRqiAzOq71pzRezC2f_elTRDmJQzfu8bi0vrnylatI,12194
94
+ anemoi/datasets/data/subset.py,sha256=peyHlIvno0uUzqW0HS9zjqThmyXn6rpvVWh-925XHnE,4692
95
+ anemoi/datasets/data/unchecked.py,sha256=xLOCU-O3OpfAi3bd-XZEpfDTnZfFGqdhh55d8D_u3wQ,4184
96
+ anemoi/datasets/data/xy.py,sha256=_k1z_2INvA0v7zsm5lxfVvf7ymBFu6Tr9PxvtdB9kFg,3002
97
+ anemoi/datasets/dates/__init__.py,sha256=1k85MFXUTB58F8NgAvlDSiPLYLAmV2EUhJjo6RW8IYE,7919
98
+ anemoi/datasets/dates/groups.py,sha256=_HyuVg36fiBh6dtV18KhNyxiGdbMb7RN42F81QLPKO0,5181
99
+ anemoi/datasets/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
+ anemoi_datasets-0.5.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
101
+ anemoi_datasets-0.5.0.dist-info/METADATA,sha256=mdKKSc6UrPXrULNPGvQ9S5wBwdsTRlirOC3PSHfwMhU,16324
102
+ anemoi_datasets-0.5.0.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
103
+ anemoi_datasets-0.5.0.dist-info/entry_points.txt,sha256=yR-o-4uiPEA_GLBL81SkMYnUoxq3CAV3hHulQiRtGG0,66
104
+ anemoi_datasets-0.5.0.dist-info/top_level.txt,sha256=DYn8VPs-fNwr7fNH9XIBqeXIwiYYd2E2k5-dUFFqUz0,7
105
+ anemoi_datasets-0.5.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (72.1.0)
2
+ Generator: setuptools (75.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5