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.
- anemoi/datasets/_version.py +2 -2
- anemoi/datasets/commands/cleanup.py +44 -0
- anemoi/datasets/commands/create.py +52 -21
- anemoi/datasets/commands/finalise-additions.py +45 -0
- anemoi/datasets/commands/finalise.py +39 -0
- anemoi/datasets/commands/init-additions.py +45 -0
- anemoi/datasets/commands/init.py +67 -0
- anemoi/datasets/commands/inspect.py +1 -1
- anemoi/datasets/commands/load-additions.py +47 -0
- anemoi/datasets/commands/load.py +47 -0
- anemoi/datasets/commands/patch.py +39 -0
- anemoi/datasets/create/__init__.py +959 -146
- anemoi/datasets/create/check.py +5 -3
- anemoi/datasets/create/config.py +54 -2
- 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/__init__.py +12 -2
- anemoi/datasets/create/functions/sources/xarray/coordinates.py +7 -0
- anemoi/datasets/create/functions/sources/xarray/field.py +8 -2
- anemoi/datasets/create/functions/sources/xarray/fieldlist.py +0 -2
- anemoi/datasets/create/functions/sources/xarray/flavour.py +21 -1
- anemoi/datasets/create/functions/sources/xarray/metadata.py +40 -40
- anemoi/datasets/create/functions/sources/xarray/time.py +63 -30
- anemoi/datasets/create/functions/sources/xarray/variable.py +15 -38
- anemoi/datasets/create/input.py +62 -39
- anemoi/datasets/create/persistent.py +1 -1
- anemoi/datasets/create/statistics/__init__.py +39 -23
- anemoi/datasets/create/utils.py +6 -2
- anemoi/datasets/data/__init__.py +1 -0
- anemoi/datasets/data/concat.py +46 -2
- anemoi/datasets/data/dataset.py +119 -34
- anemoi/datasets/data/debug.py +5 -1
- anemoi/datasets/data/forwards.py +17 -8
- anemoi/datasets/data/grids.py +17 -3
- anemoi/datasets/data/interpolate.py +133 -0
- anemoi/datasets/data/masked.py +2 -2
- anemoi/datasets/data/misc.py +56 -66
- anemoi/datasets/data/missing.py +240 -0
- anemoi/datasets/data/rescale.py +147 -0
- anemoi/datasets/data/select.py +7 -1
- anemoi/datasets/data/stores.py +23 -10
- anemoi/datasets/data/subset.py +47 -5
- anemoi/datasets/data/unchecked.py +20 -22
- anemoi/datasets/data/xy.py +125 -0
- anemoi/datasets/dates/__init__.py +124 -95
- anemoi/datasets/dates/groups.py +85 -20
- anemoi/datasets/grids.py +66 -48
- {anemoi_datasets-0.4.4.dist-info → anemoi_datasets-0.5.0.dist-info}/METADATA +8 -17
- anemoi_datasets-0.5.0.dist-info/RECORD +105 -0
- {anemoi_datasets-0.4.4.dist-info → anemoi_datasets-0.5.0.dist-info}/WHEEL +1 -1
- anemoi/datasets/create/loaders.py +0 -936
- anemoi_datasets-0.4.4.dist-info/RECORD +0 -86
- {anemoi_datasets-0.4.4.dist-info → anemoi_datasets-0.5.0.dist-info}/LICENSE +0 -0
- {anemoi_datasets-0.4.4.dist-info → anemoi_datasets-0.5.0.dist-info}/entry_points.txt +0 -0
- {anemoi_datasets-0.4.4.dist-info → anemoi_datasets-0.5.0.dist-info}/top_level.txt +0 -0
anemoi/datasets/dates/groups.py
CHANGED
|
@@ -7,9 +7,32 @@
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
import itertools
|
|
10
|
+
from functools import cached_property
|
|
10
11
|
|
|
11
|
-
from anemoi.datasets.
|
|
12
|
-
from anemoi.datasets.dates import
|
|
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.
|
|
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)
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
226
|
+
inside_lam.append(inside or close)
|
|
208
227
|
|
|
209
228
|
j = 0
|
|
210
|
-
|
|
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] =
|
|
234
|
+
mask[i] = inside_lam[j]
|
|
216
235
|
j += 1
|
|
217
236
|
|
|
218
|
-
assert j == len(
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
|
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,,
|