anemoi-datasets 0.4.5__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 (33) hide show
  1. anemoi/datasets/_version.py +2 -2
  2. anemoi/datasets/commands/create.py +3 -2
  3. anemoi/datasets/create/__init__.py +30 -32
  4. anemoi/datasets/create/config.py +4 -3
  5. anemoi/datasets/create/functions/filters/pressure_level_relative_humidity_to_specific_humidity.py +57 -0
  6. anemoi/datasets/create/functions/filters/pressure_level_specific_humidity_to_relative_humidity.py +57 -0
  7. anemoi/datasets/create/functions/filters/single_level_dewpoint_to_relative_humidity.py +54 -0
  8. anemoi/datasets/create/functions/filters/single_level_relative_humidity_to_dewpoint.py +59 -0
  9. anemoi/datasets/create/functions/filters/single_level_relative_humidity_to_specific_humidity.py +115 -0
  10. anemoi/datasets/create/functions/filters/single_level_specific_humidity_to_relative_humidity.py +390 -0
  11. anemoi/datasets/create/functions/filters/speeddir_to_uv.py +77 -0
  12. anemoi/datasets/create/functions/filters/uv_to_speeddir.py +55 -0
  13. anemoi/datasets/create/functions/sources/grib.py +86 -1
  14. anemoi/datasets/create/functions/sources/hindcasts.py +14 -73
  15. anemoi/datasets/create/functions/sources/mars.py +9 -3
  16. anemoi/datasets/create/functions/sources/xarray/field.py +7 -1
  17. anemoi/datasets/create/functions/sources/xarray/metadata.py +13 -11
  18. anemoi/datasets/create/input.py +39 -17
  19. anemoi/datasets/create/persistent.py +1 -1
  20. anemoi/datasets/create/utils.py +3 -0
  21. anemoi/datasets/data/dataset.py +11 -1
  22. anemoi/datasets/data/debug.py +5 -1
  23. anemoi/datasets/data/masked.py +2 -2
  24. anemoi/datasets/data/rescale.py +147 -0
  25. anemoi/datasets/data/stores.py +20 -7
  26. anemoi/datasets/dates/__init__.py +112 -30
  27. anemoi/datasets/dates/groups.py +84 -19
  28. {anemoi_datasets-0.4.5.dist-info → anemoi_datasets-0.5.0.dist-info}/METADATA +10 -19
  29. {anemoi_datasets-0.4.5.dist-info → anemoi_datasets-0.5.0.dist-info}/RECORD +33 -24
  30. {anemoi_datasets-0.4.5.dist-info → anemoi_datasets-0.5.0.dist-info}/WHEEL +1 -1
  31. {anemoi_datasets-0.4.5.dist-info → anemoi_datasets-0.5.0.dist-info}/LICENSE +0 -0
  32. {anemoi_datasets-0.4.5.dist-info → anemoi_datasets-0.5.0.dist-info}/entry_points.txt +0 -0
  33. {anemoi_datasets-0.4.5.dist-info → anemoi_datasets-0.5.0.dist-info}/top_level.txt +0 -0
@@ -10,8 +10,10 @@ import datetime
10
10
  import warnings
11
11
 
12
12
  # from anemoi.utils.dates import as_datetime
13
+ from anemoi.utils.dates import DateTimes
13
14
  from anemoi.utils.dates import as_datetime
14
15
  from anemoi.utils.dates import frequency_to_timedelta
16
+ from anemoi.utils.hindcasts import HindcastDatesTimes
15
17
  from anemoi.utils.humanize import print_dates
16
18
 
17
19
 
@@ -30,32 +32,32 @@ def extend(x):
30
32
  step = frequency_to_timedelta(step)
31
33
  while start <= end:
32
34
  yield start
33
- start += datetime.timedelta(hours=step)
35
+ start += step
34
36
  return
35
37
 
36
38
  yield as_datetime(x)
37
39
 
38
40
 
39
- class Dates:
41
+ class DatesProvider:
40
42
  """Base class for date generation.
41
43
 
42
- >>> Dates.from_config(**{"start": "2023-01-01 00:00", "end": "2023-01-02 00:00", "frequency": "1d"}).values
44
+ >>> DatesProvider.from_config(**{"start": "2023-01-01 00:00", "end": "2023-01-02 00:00", "frequency": "1d"}).values
43
45
  [datetime.datetime(2023, 1, 1, 0, 0), datetime.datetime(2023, 1, 2, 0, 0)]
44
46
 
45
- >>> Dates.from_config(**{"start": "2023-01-01 00:00", "end": "2023-01-03 00:00", "frequency": "18h"}).values
47
+ >>> DatesProvider.from_config(**{"start": "2023-01-01 00:00", "end": "2023-01-03 00:00", "frequency": "18h"}).values
46
48
  [datetime.datetime(2023, 1, 1, 0, 0), datetime.datetime(2023, 1, 1, 18, 0), datetime.datetime(2023, 1, 2, 12, 0)]
47
49
 
48
- >>> Dates.from_config(start="2023-01-01 00:00", end="2023-01-02 00:00", frequency=6).as_dict()
50
+ >>> DatesProvider.from_config(start="2023-01-01 00:00", end="2023-01-02 00:00", frequency=6).as_dict()
49
51
  {'start': '2023-01-01T00:00:00', 'end': '2023-01-02T00:00:00', 'frequency': '6h'}
50
52
 
51
- >>> len(Dates.from_config(start="2023-01-01 00:00", end="2023-01-02 00:00", frequency=12))
53
+ >>> len(DatesProvider.from_config(start="2023-01-01 00:00", end="2023-01-02 00:00", frequency=12))
52
54
  3
53
- >>> len(Dates.from_config(start="2023-01-01 00:00",
55
+ >>> len(DatesProvider.from_config(start="2023-01-01 00:00",
54
56
  ... end="2023-01-02 00:00",
55
57
  ... frequency=12,
56
58
  ... missing=["2023-01-01 12:00"]))
57
59
  3
58
- >>> len(Dates.from_config(start="2023-01-01 00:00",
60
+ >>> len(DatesProvider.from_config(start="2023-01-01 00:00",
59
61
  ... end="2023-01-02 00:00",
60
62
  ... frequency=12,
61
63
  ... missing=["2099-01-01 12:00"]))
@@ -67,12 +69,18 @@ class Dates:
67
69
  missing = []
68
70
  self.missing = list(extend(missing))
69
71
  if set(self.missing) - set(self.values):
70
- warnings.warn(f"Missing dates {self.missing} not in list.")
72
+ diff = set(self.missing) - set(self.values)
73
+ warnings.warn(f"Missing dates {len(diff)=} not in list.")
71
74
 
72
75
  @classmethod
73
76
  def from_config(cls, **kwargs):
77
+
78
+ if kwargs.pop("hindcasts", False):
79
+ return HindcastsDates(**kwargs)
80
+
74
81
  if "values" in kwargs:
75
82
  return ValuesDates(**kwargs)
83
+
76
84
  return StartEndDates(**kwargs)
77
85
 
78
86
  def __iter__(self):
@@ -89,7 +97,7 @@ class Dates:
89
97
  return f"📅 {self.values[0]} ... {self.values[-1]}"
90
98
 
91
99
 
92
- class ValuesDates(Dates):
100
+ class ValuesDates(DatesProvider):
93
101
  def __init__(self, values, **kwargs):
94
102
  self.values = sorted([as_datetime(_) for _ in values])
95
103
  super().__init__(**kwargs)
@@ -101,8 +109,9 @@ class ValuesDates(Dates):
101
109
  return {"values": self.values[0]}
102
110
 
103
111
 
104
- class StartEndDates(Dates):
105
- def __init__(self, start, end, frequency=1, months=None, **kwargs):
112
+ class StartEndDates(DatesProvider):
113
+ def __init__(self, start, end, frequency=1, **kwargs):
114
+
106
115
  frequency = frequency_to_timedelta(frequency)
107
116
  assert isinstance(frequency, datetime.timedelta), frequency
108
117
 
@@ -123,35 +132,108 @@ class StartEndDates(Dates):
123
132
  start = as_datetime(start)
124
133
  end = as_datetime(end)
125
134
 
126
- # if end <= start:
127
- # raise ValueError(f"End date {end} must be after start date {start}")
128
-
129
- increment = frequency
130
-
131
135
  self.start = start
132
136
  self.end = end
133
137
  self.frequency = frequency
134
138
 
135
- date = start
136
- self.values = []
137
- while date <= end:
139
+ missing = kwargs.pop("missing", [])
138
140
 
139
- if months is not None:
140
- if date.month not in months:
141
- date += increment
142
- continue
141
+ self.values = list(DateTimes(start, end, increment=frequency, **kwargs))
142
+ self.kwargs = kwargs
143
143
 
144
- self.values.append(date)
145
- date += increment
146
-
147
- super().__init__(**kwargs)
144
+ super().__init__(missing=missing)
148
145
 
149
146
  def as_dict(self):
150
147
  return {
151
148
  "start": self.start.isoformat(),
152
149
  "end": self.end.isoformat(),
153
- "frequency": f"{self.frequency}h",
154
- }
150
+ "frequency": frequency_to_string(self.frequency),
151
+ }.update(self.kwargs)
152
+
153
+
154
+ class Hindcast:
155
+
156
+ def __init__(self, date, refdate, hdate, step):
157
+ self.date = date
158
+ self.refdate = refdate
159
+ self.hdate = hdate
160
+ self.step = step
161
+
162
+
163
+ class HindcastsDates(DatesProvider):
164
+ def __init__(self, start, end, steps=[0], years=20, **kwargs):
165
+
166
+ if not isinstance(start, list):
167
+ start = [start]
168
+ end = [end]
169
+
170
+ reference_dates = []
171
+ for s, e in zip(start, end):
172
+ reference_dates.extend(list(DateTimes(s, e, increment=24, **kwargs)))
173
+ # reference_dates = list(DateTimes(start, end, increment=24, **kwargs))
174
+ dates = []
175
+
176
+ seen = {}
177
+
178
+ for hdate, refdate in HindcastDatesTimes(reference_dates=reference_dates, years=years):
179
+ assert refdate - hdate >= datetime.timedelta(days=365), (refdate - hdate, refdate, hdate)
180
+ for step in steps:
181
+
182
+ date = hdate + datetime.timedelta(hours=step)
183
+
184
+ if date in seen:
185
+ raise ValueError(f"Duplicate date {date}={hdate}+{step} for {refdate} and {seen[date]}")
186
+
187
+ seen[date] = Hindcast(date, refdate, hdate, step)
188
+
189
+ assert refdate - date > datetime.timedelta(days=360), (refdate - date, refdate, date, hdate, step)
190
+
191
+ dates.append(date)
192
+
193
+ dates = sorted(dates)
194
+
195
+ mindelta = None
196
+ for a, b in zip(dates, dates[1:]):
197
+ delta = b - a
198
+ assert isinstance(delta, datetime.timedelta), delta
199
+ if mindelta is None:
200
+ mindelta = delta
201
+ else:
202
+ mindelta = min(mindelta, delta)
203
+
204
+ self.frequency = mindelta
205
+ assert mindelta.total_seconds() > 0, mindelta
206
+
207
+ print("🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥", dates[0], dates[-1], mindelta)
208
+
209
+ # Use all values between start and end by frequency, and set the ones that are missing
210
+ self.values = []
211
+ missing = []
212
+ date = dates[0]
213
+ last = date
214
+ print("------", date, dates[-1])
215
+ dateset = set(dates)
216
+ while date <= dates[-1]:
217
+ self.values.append(date)
218
+ if date not in dateset:
219
+ missing.append(date)
220
+ seen[date] = seen[last]
221
+ else:
222
+ last = date
223
+ date = date + mindelta
224
+
225
+ self.mapping = seen
226
+
227
+ print("🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥", self.values[0], self.values[-1], mindelta)
228
+ print("🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥", f"{len(self.values)=} - {len(missing)=}")
229
+
230
+ super().__init__(missing=missing)
231
+
232
+ def __repr__(self):
233
+ return f"{self.__class__.__name__}({self.values[0]}..{self.values[-1]})"
234
+
235
+ def as_dict(self):
236
+ return {"hindcasts": self.hindcasts}
155
237
 
156
238
 
157
239
  if __name__ == "__main__":
@@ -7,11 +7,34 @@
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.create.input import shorten
13
+ from anemoi.datasets.dates import DatesProvider
12
14
  from anemoi.datasets.dates import as_datetime
13
15
 
14
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
36
+
37
+
15
38
  class Groups:
16
39
  """>>> list(Groups(group_by="daily", start="2023-01-01 00:00", end="2023-01-05 00:00", frequency=12))[0]
17
40
  [datetime.datetime(2023, 1, 1, 0, 0), datetime.datetime(2023, 1, 1, 12, 0)]
@@ -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 = [as_datetime(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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: anemoi-datasets
3
- Version: 0.4.5
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
@@ -224,38 +224,36 @@ Classifier: Programming Language :: Python :: Implementation :: PyPy
224
224
  Requires-Python: >=3.9
225
225
  License-File: LICENSE
226
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'
237
237
  Requires-Dist: earthkit-meteo ; extra == 'all'
238
- Requires-Dist: eccodes >=2.37 ; extra == 'all'
238
+ Requires-Dist: ecmwflibs >=0.6.3 ; extra == 'all'
239
239
  Requires-Dist: entrypoints ; extra == 'all'
240
240
  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'
248
247
  Requires-Dist: earthkit-meteo ; extra == 'create'
249
- Requires-Dist: eccodes >=2.37 ; extra == 'create'
248
+ 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'
257
255
  Requires-Dist: earthkit-meteo ; extra == 'dev'
258
- Requires-Dist: eccodes >=2.37 ; extra == 'dev'
256
+ Requires-Dist: ecmwflibs >=0.6.3 ; extra == 'dev'
259
257
  Requires-Dist: entrypoints ; extra == 'dev'
260
258
  Requires-Dist: gcsfs ; extra == 'dev'
261
259
  Requires-Dist: kerchunk ; 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
 
@@ -1,12 +1,12 @@
1
1
  anemoi/datasets/__init__.py,sha256=Z1gqZWhecLcT0RZQqYBLlz01MUlUZd0kWEj_RavbITM,782
2
2
  anemoi/datasets/__main__.py,sha256=cLA2PidDTOUHaDGzd0_E5iioKYNe-PSTv567Y2fuwQk,723
3
- anemoi/datasets/_version.py,sha256=XyejXnBNtqNdR37CiSnJ022K8vUHKAlzN9lbcpmmftA,411
3
+ anemoi/datasets/_version.py,sha256=aeBju2l8GTMwAhIRG_c2Q_oVPFacRkZZwGtxmvFCGPQ,411
4
4
  anemoi/datasets/grids.py,sha256=xgvIbpMGuN2GKi2wIBhOLEMzj940nY9PH-toD0rCmPo,8980
5
5
  anemoi/datasets/commands/__init__.py,sha256=qAybFZPBBQs0dyx7dZ3X5JsLpE90pwrqt1vSV7cqEIw,706
6
6
  anemoi/datasets/commands/cleanup.py,sha256=_BkzGPUgvSqnuleymBfBx-sIyIM55hjK61m-v7yK0T8,1062
7
7
  anemoi/datasets/commands/compare.py,sha256=svEhyR7pOS1847_RJr1I6vF7ZDPB9AVlcrhy_gxQVms,3263
8
8
  anemoi/datasets/commands/copy.py,sha256=SxAeN51owyN5gwtwpt30xhJSIJRlJb9YOUt_4K4m-D8,11780
9
- anemoi/datasets/commands/create.py,sha256=jdwgzUvZBkXROkJ-LSbi28mVWnnZ5F1xr0IOciktfrU,5012
9
+ anemoi/datasets/commands/create.py,sha256=X6cmuSd1Ni0QciZFVWaJw9a4-HhOkb0tLW8NUmytrus,5022
10
10
  anemoi/datasets/commands/finalise-additions.py,sha256=876K37hVjslHJiu9VXZfre4YJhS2_t9rLhmNWqlKGGk,1158
11
11
  anemoi/datasets/commands/finalise.py,sha256=oPul5za7E__eJqkf5fRwvdL_0n2nG5Xk3JraRZQe64k,913
12
12
  anemoi/datasets/commands/init-additions.py,sha256=K3eKH5V_6ERiBKKyqIUuI1cfvAsjWV9ZAFzbtjIDyjs,1146
@@ -18,34 +18,42 @@ anemoi/datasets/commands/patch.py,sha256=gHY16r46GHxARItaAUHVjKSOm0Q7ZyZvSZmXqg1
18
18
  anemoi/datasets/commands/scan.py,sha256=MaTdne4JrtlqO3LhOUr43DZhZ6O-RZwC7uQ7C6PG7Os,2910
19
19
  anemoi/datasets/compute/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
20
  anemoi/datasets/compute/recentre.py,sha256=CMvRxTMv2H1hF1KqaZHT3Maa9P01GtsgAxr1YHbvH_o,4939
21
- anemoi/datasets/create/__init__.py,sha256=8eYVI0QAkdAIdxVDrqQAY34yDlLAAsr92DL-e_nhHCM,35163
21
+ anemoi/datasets/create/__init__.py,sha256=cQKNci_vtVKBDE2-lH-_RZdMTtjNvJOnvtyk_3ZnrLg,34990
22
22
  anemoi/datasets/create/check.py,sha256=9If6iAXILExjzX1YAWCDekV821BquHdjDaUSb_S_gp0,6008
23
23
  anemoi/datasets/create/chunks.py,sha256=1Inh3sIBn-2sNguErb-BsLns6W_HtDiOJAjIb29lp-U,2442
24
- anemoi/datasets/create/config.py,sha256=ojynLQTX7BmJRZ18rhjUTmuMOh0rYAx9M5d6gY8wRH0,8872
25
- anemoi/datasets/create/input.py,sha256=LArEOIxa6Y42rneF0VUva25zOvks_BwVDfBNOSERpYA,33924
24
+ anemoi/datasets/create/config.py,sha256=IqWsW_AVcp0uA2M1IPB-TT0IWjquvZL2R7PeiviOb4Y,8882
25
+ anemoi/datasets/create/input.py,sha256=I7voGdYCcUsGXMyQbfhK367jqSUYJOshwx0S4trFCwE,34668
26
26
  anemoi/datasets/create/patch.py,sha256=c8cWoqxFzcY9mKREosLjuQCUeJMJL6sbNNkoVvhCZDA,3800
27
- anemoi/datasets/create/persistent.py,sha256=wfNnNSY8VLO2EyEOQL9umI3sbQqETjJP7bPCiVF6Cko,4291
27
+ anemoi/datasets/create/persistent.py,sha256=isENKsd6OievmNfe1rF6_3mY7X4HjaXGIrVIfH82JKY,4294
28
28
  anemoi/datasets/create/size.py,sha256=k4COEjs3wud0oKHH5P3n8Fap35xddXs002ucPjpBC88,1040
29
29
  anemoi/datasets/create/template.py,sha256=1t8EKGQcZGFUpgQw9a9oEy6ZWlfnow5e0vs1SOelUNc,3148
30
30
  anemoi/datasets/create/trace.py,sha256=J-8jDy28wNZa4aSV1KIQMwc1KolcoH3R2xjLl-_eLzM,2183
31
- anemoi/datasets/create/utils.py,sha256=mgin7LF-JkfXMr22IIIEQjfUHFkwPwMJHca4Fek3F6Q,2639
31
+ anemoi/datasets/create/utils.py,sha256=v0dyQUk3hWOVQeZ82pnH3GmRwENXIHSwlwB7qqnomuU,2708
32
32
  anemoi/datasets/create/writer.py,sha256=G1qAPvdn8anGnpWYhvSSP4u3Km_tHKPdMXm0G4skKSk,1379
33
33
  anemoi/datasets/create/zarr.py,sha256=Pb57mZn5s4JTA1o6_satrvG7C8XQhgPFhpTGvlaC_kg,5340
34
34
  anemoi/datasets/create/functions/__init__.py,sha256=5HmelLkXDjFOhNhX0Z78aV3ZlW2txiJliJwT4jfLEN4,945
35
35
  anemoi/datasets/create/functions/filters/__init__.py,sha256=Xe9G54CKvCI3ji-7k0R5l0WZZdhlydRgawsXuBcX_hg,379
36
36
  anemoi/datasets/create/functions/filters/empty.py,sha256=QGj7YEfbo3gwlmwHi1lPATjST0332TH2-uc6_wKENjI,621
37
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
38
40
  anemoi/datasets/create/functions/filters/rename.py,sha256=02p6zj2g0Qp866RrXeZG9DD2zRbv0LPqCNIDtbJ9tw4,2369
39
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
40
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
41
49
  anemoi/datasets/create/functions/sources/__init__.py,sha256=83G1-DD2IV4VJP3MVN9512_CN4D3IVDZHUKa2ghVgKo,1246
42
50
  anemoi/datasets/create/functions/sources/accumulations.py,sha256=nz09rezfNvXdTBtSQAKnsOeoiWwB8v1ecAayrJZq9rE,11947
43
51
  anemoi/datasets/create/functions/sources/constants.py,sha256=9MNxjkXAjtIq7X-T7GgKGVzH-V-FBcTxj0gLLJYoXTI,903
44
52
  anemoi/datasets/create/functions/sources/empty.py,sha256=ZrXGs8Y3VrLSV8C8YlJTJcHV7Bmi7xPiUlrq8R0JZQY,485
45
53
  anemoi/datasets/create/functions/sources/forcings.py,sha256=tF3EyIs5AGF1Ppvp6dIExONM-kGF-wcnMO1sZc_wDuo,646
46
- anemoi/datasets/create/functions/sources/grib.py,sha256=MbHSAJAkvUsQT5uo_-mEqzN-0-aOygMwFIds42kXcqg,1750
47
- anemoi/datasets/create/functions/sources/hindcasts.py,sha256=xgE4a-diiy8rP8cmgAT12cBsQZiGk0cRzUswtZM7i_0,3607
48
- anemoi/datasets/create/functions/sources/mars.py,sha256=Wrxm15-7QUQ_xCe7eqmxHLLkYo5RDM0GKUoeEP8BZS4,6603
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
49
57
  anemoi/datasets/create/functions/sources/netcdf.py,sha256=8uug0oAdGBJIKKws-EflA4ZgjQye_sWCBymUVv1TEW4,532
50
58
  anemoi/datasets/create/functions/sources/opendap.py,sha256=0Bs0PytUvI1WZGn2OdmnJuFDGAQypxN8v44nl106QjY,531
51
59
  anemoi/datasets/create/functions/sources/recentre.py,sha256=t07LIXG3Hp9gmPkPriILVt86TxubsHyS1EL1lzwgtXY,1810
@@ -56,41 +64,42 @@ anemoi/datasets/create/functions/sources/xarray_zarr.py,sha256=qI_fEKo28hu_B_qMP
56
64
  anemoi/datasets/create/functions/sources/zenodo.py,sha256=n7_sfZHJVDjVnSwc07muO9kS7TwOM4S8DIlJf5pnDiU,1237
57
65
  anemoi/datasets/create/functions/sources/xarray/__init__.py,sha256=XcP072AgDX_aiK3t_rWM-C3MnAuX-mhYO5-wSLyaxPo,2805
58
66
  anemoi/datasets/create/functions/sources/xarray/coordinates.py,sha256=iwnGIinuLoP0jk2s4ro9_ihJ6CoJcZ9HaRGyWh2gm8M,5893
59
- anemoi/datasets/create/functions/sources/xarray/field.py,sha256=bUTgod2XuV3OGDaK7kcGiUqC5oQ6tuCWbHb67fo9lsY,3186
67
+ anemoi/datasets/create/functions/sources/xarray/field.py,sha256=yTdt5YOpu7TSb4THGc0w_qpD2O7xmSzDARWZxk7Nd3w,3433
60
68
  anemoi/datasets/create/functions/sources/xarray/fieldlist.py,sha256=B0toXCiYFBFF0fvxpy5bxnan2dfptWMl51_JO8TrH3A,5557
61
69
  anemoi/datasets/create/functions/sources/xarray/flavour.py,sha256=_tVSrvDPJ5pXAJhmha3UA1a0Gr2FrPhcjRFoAMtX-EU,10538
62
70
  anemoi/datasets/create/functions/sources/xarray/grid.py,sha256=KSlhXj5dHeRQVeZd26CChMyC1iqYsH5XqxPC2VA_YJc,1169
63
- anemoi/datasets/create/functions/sources/xarray/metadata.py,sha256=_HQgAY5qI39M-5JhEx2q3APgqqmXE0Ed3GqoUvttNuE,4721
71
+ anemoi/datasets/create/functions/sources/xarray/metadata.py,sha256=N5-4k75vGaKvWHH6wT-AAcHKV121uViB3SY5a8FS7kA,4891
64
72
  anemoi/datasets/create/functions/sources/xarray/time.py,sha256=WGO8m9J7fF-GjgBEJ0Dmqp-M2-vMsrkH-aSG0QBOVYU,4726
65
73
  anemoi/datasets/create/functions/sources/xarray/variable.py,sha256=THd7uterDPJlpypRCCgTwKaaGjkV74s6WmuveH6qyBE,4474
66
74
  anemoi/datasets/create/statistics/__init__.py,sha256=wMCncdfpLXxfDA9-RMtI2raVGP6dGqXfSolCXEzzITE,12704
67
75
  anemoi/datasets/create/statistics/summary.py,sha256=sgmhA24y3VRyjmDUgTnPIqcHSlWBbFA0qynx6gJ9Xw8,3370
68
76
  anemoi/datasets/data/__init__.py,sha256=usTH1SLkeveBbYkbBTc7rP4G3mCGNa8A74vPjXjlOSw,1067
69
77
  anemoi/datasets/data/concat.py,sha256=SYASNNngnAyz3rC4ENzrGAu91rnhd6uwP0kGX9aMZAQ,5269
70
- anemoi/datasets/data/dataset.py,sha256=u1RKLEJer6gY6n4odBHKK4CEozWCUQjFJMFqCCF_FPo,10044
78
+ anemoi/datasets/data/dataset.py,sha256=GS-V1rHze1qynIBz56PQOpQMVzWcSpbIppZ7-SLtYr8,10383
71
79
  anemoi/datasets/data/debug.css,sha256=z2X_ZDSnZ9C3pyZPWnQiEyAxuMxUaxJxET4oaCImTAQ,211
72
- anemoi/datasets/data/debug.py,sha256=PcyrjgxaLzeb_vf12pvUtPPVvBRHNm1SimythZvqsP4,6303
80
+ anemoi/datasets/data/debug.py,sha256=xNpFeJqdlN9Qhlhbp4pxXJP0dQTf0V4bm2cK4hsrSJM,6326
73
81
  anemoi/datasets/data/ensemble.py,sha256=AsP7Xx0ZHLoZs6a4EC0jtyGYIcOvZvvKXhgNsIvqIN8,1137
74
82
  anemoi/datasets/data/forwards.py,sha256=SfB3o8Y-nQEOkS5gI_6wtipvzB5peF_YkwW9cOMhLMg,8167
75
83
  anemoi/datasets/data/grids.py,sha256=KiHpN1Ne0DnQM42buBy0sIAZHNaC2kuEFwkk6ohIooU,8046
76
84
  anemoi/datasets/data/indexing.py,sha256=625m__JG5m_tDMrkz1hB6Vydenwt0oHuyAlc-o3Zwos,4799
77
85
  anemoi/datasets/data/interpolate.py,sha256=usnYgjoDPfnUNg_lZl3KsFTsJ7kOsf7YaHwarsBU7Ag,4163
78
86
  anemoi/datasets/data/join.py,sha256=dtCBbMTicqrRPxfBULi3RwEcQBLhQpIcvCjdN5A3XUU,4892
79
- anemoi/datasets/data/masked.py,sha256=czAv1ZfZ9q6Wr4RqI2Xj8SEm7yoCgJrwMl-CPDs_wSI,3857
87
+ anemoi/datasets/data/masked.py,sha256=GKAKHwiiVrDX13V_mDiQ3G1Y7zXSksc0IkABPEvVw-M,3825
80
88
  anemoi/datasets/data/misc.py,sha256=8ZaLhgHmUmP77X0_6scp36BJJzz544nHVQRAamW6x-Y,9821
81
89
  anemoi/datasets/data/missing.py,sha256=OyW8cRow1v641Vgv-IY5BnUxH2Ob5P2QjgrVR1Szjl0,7157
90
+ anemoi/datasets/data/rescale.py,sha256=c_onY5f-2XDGmLP5mawNFueQWNS-BnTpo6xaBJF4aWA,4138
82
91
  anemoi/datasets/data/select.py,sha256=tProUPIiRwSe_H9cwwn_4iMX1uZEIQ7q5KsegBgSmdc,3971
83
92
  anemoi/datasets/data/statistics.py,sha256=lZCcKw9s7ttMBEp6ANyxtbXoZZvchhE7SClq-D4AUR8,1645
84
- anemoi/datasets/data/stores.py,sha256=4F2tCsG3p_ZI0Ut2FdtfPCGClP8U9U6V_12l8-aIGbg,11962
93
+ anemoi/datasets/data/stores.py,sha256=7CRqiAzOq71pzRezC2f_elTRDmJQzfu8bi0vrnylatI,12194
85
94
  anemoi/datasets/data/subset.py,sha256=peyHlIvno0uUzqW0HS9zjqThmyXn6rpvVWh-925XHnE,4692
86
95
  anemoi/datasets/data/unchecked.py,sha256=xLOCU-O3OpfAi3bd-XZEpfDTnZfFGqdhh55d8D_u3wQ,4184
87
96
  anemoi/datasets/data/xy.py,sha256=_k1z_2INvA0v7zsm5lxfVvf7ymBFu6Tr9PxvtdB9kFg,3002
88
- anemoi/datasets/dates/__init__.py,sha256=odF5RnQtTRozEys4_17bR20jWzUGspFCDM0i7UC6uVs,5087
89
- anemoi/datasets/dates/groups.py,sha256=lBnrutmQ7WNv-Asyl7eI95Uhi0zfT_3Kb0R_Xm1UNnM,3469
97
+ anemoi/datasets/dates/__init__.py,sha256=1k85MFXUTB58F8NgAvlDSiPLYLAmV2EUhJjo6RW8IYE,7919
98
+ anemoi/datasets/dates/groups.py,sha256=_HyuVg36fiBh6dtV18KhNyxiGdbMb7RN42F81QLPKO0,5181
90
99
  anemoi/datasets/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
- anemoi_datasets-0.4.5.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
92
- anemoi_datasets-0.4.5.dist-info/METADATA,sha256=4jEPNynR2lfXdnhXNlzCBb8jtEgSQ69n8WSTtaxrm9Q,16707
93
- anemoi_datasets-0.4.5.dist-info/WHEEL,sha256=cVxcB9AmuTcXqmwrtPhNK88dr7IR_b6qagTj0UvIEbY,91
94
- anemoi_datasets-0.4.5.dist-info/entry_points.txt,sha256=yR-o-4uiPEA_GLBL81SkMYnUoxq3CAV3hHulQiRtGG0,66
95
- anemoi_datasets-0.4.5.dist-info/top_level.txt,sha256=DYn8VPs-fNwr7fNH9XIBqeXIwiYYd2E2k5-dUFFqUz0,7
96
- anemoi_datasets-0.4.5.dist-info/RECORD,,
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 (74.1.2)
2
+ Generator: setuptools (75.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5