Skip to content

Commit 04b8826

Browse files
committed
add a baseline obs_concat function that just wraps the xarray version
1 parent b31fa09 commit 04b8826

File tree

2 files changed

+29
-117
lines changed

2 files changed

+29
-117
lines changed

obsarray/concat.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
"""obsarray.concat - module with extension to xarray.concat for obs_vars and unc_vars"""
22

3-
import numpy as np
43
import xarray as xr
54
from typing import Union, Any
65
from xarray.core.types import T_Dataset, T_DataArray, T_Variable
@@ -21,6 +20,8 @@ def obs_concat(
2120
**kwargs
2221
):
2322
"""
23+
**NB: THIS FUNCTION IS NOT CURRENTLY IMPLEMENTED AND JUST ACTS AS A WRAPPER FOR XR.CONCAT**
24+
2425
Concatenate xarray *obs_vars* along a new or existing dimension, safely handling also
2526
concatenating associated *unc_vars*. Extension to :py:func:`xarray.concat`.
2627
@@ -47,7 +48,5 @@ def obs_concat(
4748
return concat_obs_vars, concat_unc_vars
4849

4950

50-
51-
5251
if __name__ == "__main__":
53-
pass
52+
pass

obsarray/test/test_concat.py

Lines changed: 26 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -71,132 +71,45 @@ def create_test_ds():
7171

7272
return ds
7373

74-
def create_concat_ds():
75-
c1a = np.ones((4, 3))
76-
c2a = np.ones((4, 3))
77-
78-
c1b = np.ones((7, 5, 3))
79-
c2b = np.ones((7, 5, 3))
80-
81-
da = np.ones((4, 3, 2)) * 1
82-
da[:, : 1] = 2
83-
84-
s1a = np.ones((4, 3)) * 3
85-
s2a = np.ones((4, 3)) * 4
86-
s3a = np.ones((4, 3)) * 5
87-
88-
d1b = np.ones((7, 5, 3)) * 1
89-
90-
da_attrs = {"units": "test_units", "geometry": "a", "measurand": "d", 'm': 10}
91-
s1a_attrs = {"units": "test_units", "geometry": "a", "measurand": "s", 'm': 12}
92-
s2a_attrs = {"units": "test_units", "geometry": "a", "measurand": "s", 'm': 4}
93-
s3a_attrs = {"units": "test_units", "geometry": "a", "measurand": "s", 'm': 5}
94-
d1b_attrs = {"units": "test_units", "geometry": "b", "measurand": "d"}
95-
96-
ds = xr.Dataset(
97-
{
98-
"da": (["xa", "ya"], da, da_attrs),
99-
"s1a": (["xa", "ya"], s1a, s1a_attrs),
100-
"s2a": (["xa", "ya"], s2a, s2a_attrs),
101-
"s3a": (["xa", "ya"], s3a, s3a_attrs),
102-
"d1b": (["xb", "yb", "zb"], d1b, d1b_attrs),
103-
},
104-
coords={
105-
"c1a": (["xa", "ya"], c1a),
106-
"c2a": (["xa", "ya"], c2a),
107-
"c1b": (["xb", "yb", "zb"], c1b),
108-
"c2b": (["xb", "yb", "zb"], c2b),
109-
},
110-
attrs={
111-
"history": "test_history",
112-
"meas_vars": ["d1a", "d2a", "s1a", "s2a", "s3a", "d1b"],
113-
},
114-
)
115-
116-
for var in ["d1a", "d2a"]:
117-
ds.unc[var]["u_r_" + var] = (["xa", "ya"], ds[var].values, {})
118-
119-
err_corr_def = [
120-
{
121-
"dim": ["xa", "ya"],
122-
"form": "systematic",
123-
"params": [],
124-
"units": []
125-
}
126-
]
127-
128-
ds.unc[var]["u_s_" + var] = (["xa", "ya"], ds[var].values, {"err_corr": err_corr_def})
129-
130-
return ds
131-
132-
133-
134-
13574
class TestConcat(unittest.TestCase):
13675

13776
def test_concat_combine_unc_concat(self):
13877
ds = create_test_ds()
13978

140-
obs_vars, unc_vars = obs_concat([ds["d1a"], ds["d2a"]], "new_dim", ds, "concat")
141-
142-
c1a = np.ones((4, 3))
143-
c2a = np.ones((4, 3))
79+
concat_vars, concat_unc_vars = obs_concat([ds["d1a"], ds["d2a"]], "new_dim", ds, "concat")
14480

145-
c1b = np.ones((7, 5, 3))
146-
c2b = np.ones((7, 5, 3))
81+
# Create expected concatenated data array
82+
data = np.array([[[1., 1., 1.],
83+
[1., 1., 1.],
84+
[1., 1., 1.],
85+
[1., 1., 1.]],
86+
[[2., 2., 2.],
87+
[2., 2., 2.],
88+
[2., 2., 2.],
89+
[2., 2., 2.]]])
14790

148-
da = np.ones((4, 3, 2)) * 1
149-
da[:, : 1] = 2
91+
coord_data = np.ones((4, 3)) # coords
15092

151-
s1a = np.ones((4, 3)) * 3
152-
s2a = np.ones((4, 3)) * 4
153-
s3a = np.ones((4, 3)) * 5
154-
155-
d1b = np.ones((7, 5, 3)) * 1
156-
157-
da_attrs = {"units": "test_units", "geometry": "a", "measurand": "d", 'm': 10}
158-
s1a_attrs = {"units": "test_units", "geometry": "a", "measurand": "s", 'm': 12}
159-
s2a_attrs = {"units": "test_units", "geometry": "a", "measurand": "s", 'm': 4}
160-
s3a_attrs = {"units": "test_units", "geometry": "a", "measurand": "s", 'm': 5}
161-
d1b_attrs = {"units": "test_units", "geometry": "b", "measurand": "d"}
162-
163-
ds = xr.Dataset(
164-
{
165-
"da": (["xa", "ya"], da, da_attrs),
166-
"s1a": (["xa", "ya"], s1a, s1a_attrs),
167-
"s2a": (["xa", "ya"], s2a, s2a_attrs),
168-
"s3a": (["xa", "ya"], s3a, s3a_attrs),
169-
"d1b": (["xb", "yb", "zb"], d1b, d1b_attrs),
170-
},
93+
exp_concat_vars = xr.DataArray(
94+
data,
95+
dims=("new_dim", "xa", "ya"),
17196
coords={
172-
"c1a": (["xa", "ya"], c1a),
173-
"c2a": (["xa", "ya"], c2a),
174-
"c1b": (["xb", "yb", "zb"], c1b),
175-
"c2b": (["xb", "yb", "zb"], c2b),
97+
"c1a": (("xa", "ya"), coord_data),
98+
"c2a": (("xa", "ya"), coord_data),
17699
},
100+
name="d1a",
177101
attrs={
178-
"history": "test_history",
179-
"meas_vars": ["d1a", "d2a", "s1a", "s2a", "s3a", "d1b"],
180-
},
102+
"units": "test_units",
103+
"geometry": "a",
104+
"measurand": "d",
105+
"m": 10,
106+
"unc_comps": ["u_r_d1a", "u_s_d1a"]
107+
}
181108
)
182109

183-
for var in ["d1a", "d2a"]:
184-
ds.unc[var]["u_r_" + var] = (["xa", "ya"], ds[var].values, {})
185-
186-
err_corr_def = [
187-
{
188-
"dim": ["xa", "ya"],
189-
"form": "systematic",
190-
"params": [],
191-
"units": []
192-
}
193-
]
194-
195-
ds.unc[var]["u_s_" + var] = (["xa", "ya"], ds[var].values, {"err_corr": err_corr_def})
196-
197-
return ds
198-
199-
110+
# Tests
111+
xr.testing.assert_equal(concat_vars, exp_concat_vars)
112+
self.assertIsNone(concat_unc_vars)
200113

201114
if __name__ == "__main__":
202115
pass

0 commit comments

Comments
 (0)