Skip to content

Commit e585362

Browse files
committed
Top level data object
1 parent 24651a7 commit e585362

File tree

14 files changed

+622
-17
lines changed

14 files changed

+622
-17
lines changed

docs/experimental/top_level_object/bufr_single.ipynb

Lines changed: 500 additions & 0 deletions
Large diffs are not rendered by default.

src/earthkit/data/core/data.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ def to_geopandas(self, **kwargs):
5353
pass
5454

5555
@abstractmethod
56-
def to_bufr_list(self, *args, **kwargs):
57-
"""Convert into a list of bufr messages"""
56+
def to_featurelist(self, *args, **kwargs):
57+
"""Convert into a list of feature messages"""
5858
pass
5959

6060
@abstractmethod
@@ -115,7 +115,7 @@ def to_pandas(self, *args, **kwargs):
115115
def to_geopandas(self, *args, **kwargs):
116116
raise NotImplementedError("Conversion of MultiData to geopandas is not implemented")
117117

118-
def to_bufr_list(self, *args, **kwargs):
118+
def to_featurelist(self, *args, **kwargs):
119119
pass
120120

121121
def to_numpy(self, *args, **kwargs):
@@ -153,7 +153,7 @@ def to_geojson(self, **kwargs):
153153
def to_geopandas(self, **kwargs):
154154
return self._conversion_not_implemented()
155155

156-
def to_bufr_list(self, *args, **kwargs):
156+
def to_featurelist(self, *args, **kwargs):
157157
self._conversion_not_implemented()
158158

159159
def to_numpy(self, *args, **kwargs):

src/earthkit/data/readers/bufr/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def _match_magic(magic, deeper_check):
2323

2424
def reader(source, path, *, magic=None, deeper_check=False, **kwargs):
2525
if _match_magic(magic, deeper_check):
26-
from .message_list import BUFRReader
26+
from .message_list import BUFRReader1
2727

2828
parts = source.parts if hasattr(source, "parts") else None
29-
return BUFRReader(source, path, parts=parts)
29+
return BUFRReader1(source, path, parts=parts)
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# (C) Copyright 2020 ECMWF.
2+
#
3+
# This software is licensed under the terms of the Apache Licence Version 2.0
4+
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
5+
# In applying this licence, ECMWF does not waive the privileges and immunities
6+
# granted to it by virtue of its status as an intergovernmental organisation
7+
# nor does it submit to any jurisdiction.
8+
#
9+
10+
from earthkit.data.core.data import Data
11+
12+
13+
class BUFRData(Data):
14+
_TYPE_NAME = "BUFR"
15+
16+
def __init__(self, reader):
17+
self._reader = reader
18+
19+
@property
20+
def available_types(self):
21+
return ["pandas", "featurelist"]
22+
23+
def describe(self):
24+
return f"BUFR data from {self._reader.path}"
25+
26+
def to_fieldlist(self, *args, **kwargs):
27+
return self._conversion_not_implemented()
28+
29+
def to_pandas(self, **kwargs):
30+
return self._reader.to_pandas(**kwargs)
31+
32+
def to_xarray(self, **kwargs):
33+
return self._conversion_not_implemented()
34+
35+
def to_geojson(self, **kwargs):
36+
return self._conversion_not_implemented()
37+
38+
def to_geopandas(self, **kwargs):
39+
return self._conversion_not_implemented()
40+
41+
def to_featurelist(self, *args, **kwargs):
42+
return self._reader.to_featurelist(*args, **kwargs)
43+
44+
def to_numpy(self, *args, **kwargs):
45+
self._conversion_not_implemented()
46+
47+
def to_array(self, *args, **kwargs):
48+
self._conversion_not_implemented()

src/earthkit/data/readers/bufr/handle.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
# nor does it submit to any jurisdiction.
88
#
99

10-
1110
import eccodes
1211

1312
from earthkit.data.utils.message import CodesHandle

src/earthkit/data/readers/bufr/message_list.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from earthkit.data.core.index import Index
1414
from earthkit.data.core.index import MaskIndex
1515
from earthkit.data.core.index import MultiIndex
16+
from earthkit.data.sources import Source
1617
from earthkit.data.utils.parts import Part
1718

1819
from .. import Reader
@@ -505,3 +506,60 @@ def mutate_source(self):
505506

506507
def _default_encoder(self):
507508
return Reader._default_encoder(self)
509+
510+
511+
class BUFRReader1(Source, Reader):
512+
def __init__(self, source, path, parts=None, positions=None):
513+
self._ori_source = source
514+
self._kwargs = {"parts": parts}
515+
Reader.__init__(self, source, path)
516+
517+
def to_featurelist(self, *args, **kwargs):
518+
return BUFRInOneFile(self.path, **self._kwargs, **kwargs)
519+
520+
def to_pandas(self, *args, **kwargs):
521+
return self.to_featurelist().to_pandas(*args, **kwargs)
522+
523+
def mutate_source(self):
524+
# A BUFRReader is a source itself
525+
return self
526+
527+
def mutate(self):
528+
return self
529+
530+
def _to_data_object(self):
531+
from .data import BUFRData
532+
533+
return BUFRData(self)
534+
535+
@classmethod
536+
def merge(cls, sources):
537+
538+
assert all(isinstance(s, BUFRReader1) for s in sources)
539+
return MultiBUFRReader1(sources)
540+
541+
542+
class MultiBUFRReader1(BUFRReader1):
543+
def __init__(self, sources):
544+
self.sources = sources
545+
546+
def to_featurelist(self):
547+
fs = [s.to_featurelist() for s in self.sources]
548+
from earthkit.data.mergers import merge_by_class
549+
550+
merged = merge_by_class(fs)
551+
if merged is not None:
552+
return merged.mutate()
553+
554+
raise NotImplementedError("Conversion of MultiBUFRReader1 to featurelist is not implemented")
555+
556+
def to_pandas(self, *args, **kwargs):
557+
return self.to_featurelist().to_pandas(*args, **kwargs)
558+
559+
def __repr__(self):
560+
return "MultiBUFRReader1(%s)" % (self.sources,)
561+
562+
def _to_data_object(self):
563+
from earthkit.data.core.data import MultiData
564+
565+
return MultiData(self)

src/earthkit/data/readers/covjson.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ def to_geojson(self, **kwargs):
158158
def to_geopandas(self, **kwargs):
159159
return self._conversion_not_implemented()
160160

161-
def to_bufr_list(self, *args, **kwargs):
161+
def to_featurelist(self, *args, **kwargs):
162162
self._conversion_not_implemented()
163163

164164
def to_numpy(self, *args, **kwargs):

src/earthkit/data/readers/csv.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ def to_xarray(self, **kwargs):
223223
def to_geopandas(self, **kwargs):
224224
self._conversion_not_implemented()
225225

226-
def to_bufr_list(self, *args, **kwargs):
226+
def to_featurelist(self, *args, **kwargs):
227227
self._conversion_not_implemented()
228228

229229
def to_numpy(self, *args, **kwargs):

src/earthkit/data/readers/geotiff.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ def to_xarray(self, **kwargs):
206206
def to_geopandas(self, **kwargs):
207207
self._conversion_not_implemented()
208208

209-
def to_bufr_list(self, *args, **kwargs):
209+
def to_featurelist(self, *args, **kwargs):
210210
self._conversion_not_implemented()
211211

212212
def to_numpy(self, *args, **kwargs):

src/earthkit/data/readers/grib/data.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def to_geojson(self, **kwargs):
2929
def to_geopandas(self, **kwargs):
3030
return self._conversion_not_implemented()
3131

32-
def to_bufr_list(self, *args, **kwargs):
32+
def to_featurelist(self, *args, **kwargs):
3333
self._conversion_not_implemented()
3434

3535
def to_numpy(self, *args, **kwargs):

0 commit comments

Comments
 (0)