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.
- anemoi/datasets/_version.py +2 -2
- anemoi/datasets/commands/create.py +3 -2
- anemoi/datasets/create/__init__.py +30 -32
- anemoi/datasets/create/config.py +4 -3
- anemoi/datasets/create/functions/filters/pressure_level_relative_humidity_to_specific_humidity.py +57 -0
- anemoi/datasets/create/functions/filters/pressure_level_specific_humidity_to_relative_humidity.py +57 -0
- anemoi/datasets/create/functions/filters/single_level_dewpoint_to_relative_humidity.py +54 -0
- anemoi/datasets/create/functions/filters/single_level_relative_humidity_to_dewpoint.py +59 -0
- anemoi/datasets/create/functions/filters/single_level_relative_humidity_to_specific_humidity.py +115 -0
- anemoi/datasets/create/functions/filters/single_level_specific_humidity_to_relative_humidity.py +390 -0
- anemoi/datasets/create/functions/filters/speeddir_to_uv.py +77 -0
- anemoi/datasets/create/functions/filters/uv_to_speeddir.py +55 -0
- anemoi/datasets/create/functions/sources/grib.py +86 -1
- anemoi/datasets/create/functions/sources/hindcasts.py +14 -73
- anemoi/datasets/create/functions/sources/mars.py +9 -3
- anemoi/datasets/create/functions/sources/xarray/field.py +7 -1
- anemoi/datasets/create/functions/sources/xarray/metadata.py +13 -11
- anemoi/datasets/create/input.py +39 -17
- anemoi/datasets/create/persistent.py +1 -1
- anemoi/datasets/create/utils.py +3 -0
- anemoi/datasets/data/dataset.py +11 -1
- anemoi/datasets/data/debug.py +5 -1
- anemoi/datasets/data/masked.py +2 -2
- anemoi/datasets/data/rescale.py +147 -0
- anemoi/datasets/data/stores.py +20 -7
- anemoi/datasets/dates/__init__.py +112 -30
- anemoi/datasets/dates/groups.py +84 -19
- {anemoi_datasets-0.4.5.dist-info → anemoi_datasets-0.5.0.dist-info}/METADATA +10 -19
- {anemoi_datasets-0.4.5.dist-info → anemoi_datasets-0.5.0.dist-info}/RECORD +33 -24
- {anemoi_datasets-0.4.5.dist-info → anemoi_datasets-0.5.0.dist-info}/WHEEL +1 -1
- {anemoi_datasets-0.4.5.dist-info → anemoi_datasets-0.5.0.dist-info}/LICENSE +0 -0
- {anemoi_datasets-0.4.5.dist-info → anemoi_datasets-0.5.0.dist-info}/entry_points.txt +0 -0
- {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 +=
|
|
35
|
+
start += step
|
|
34
36
|
return
|
|
35
37
|
|
|
36
38
|
yield as_datetime(x)
|
|
37
39
|
|
|
38
40
|
|
|
39
|
-
class
|
|
41
|
+
class DatesProvider:
|
|
40
42
|
"""Base class for date generation.
|
|
41
43
|
|
|
42
|
-
>>>
|
|
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
|
-
>>>
|
|
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
|
-
>>>
|
|
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(
|
|
53
|
+
>>> len(DatesProvider.from_config(start="2023-01-01 00:00", end="2023-01-02 00:00", frequency=12))
|
|
52
54
|
3
|
|
53
|
-
>>> len(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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(
|
|
105
|
-
def __init__(self, start, end, frequency=1,
|
|
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
|
-
|
|
136
|
-
self.values = []
|
|
137
|
-
while date <= end:
|
|
139
|
+
missing = kwargs.pop("missing", [])
|
|
138
140
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
date += increment
|
|
142
|
-
continue
|
|
141
|
+
self.values = list(DateTimes(start, end, increment=frequency, **kwargs))
|
|
142
|
+
self.kwargs = kwargs
|
|
143
143
|
|
|
144
|
-
|
|
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":
|
|
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__":
|
anemoi/datasets/dates/groups.py
CHANGED
|
@@ -7,11 +7,34 @@
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
import itertools
|
|
10
|
+
from functools import cached_property
|
|
10
11
|
|
|
11
|
-
from anemoi.datasets.
|
|
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.
|
|
45
|
-
self.
|
|
46
|
-
self.
|
|
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
|
|
50
|
-
dates = self.
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
62
|
-
return
|
|
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 =
|
|
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
|
-
|
|
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.
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
25
|
-
anemoi/datasets/create/input.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
47
|
-
anemoi/datasets/create/functions/sources/hindcasts.py,sha256=
|
|
48
|
-
anemoi/datasets/create/functions/sources/mars.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
89
|
-
anemoi/datasets/dates/groups.py,sha256=
|
|
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.
|
|
92
|
-
anemoi_datasets-0.
|
|
93
|
-
anemoi_datasets-0.
|
|
94
|
-
anemoi_datasets-0.
|
|
95
|
-
anemoi_datasets-0.
|
|
96
|
-
anemoi_datasets-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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|