Skip to content

Commit f4b52db

Browse files
authored
Merge pull request #799 from DHI/dataset_from_numpy
Dataset_from_numpy
2 parents 091dacf + 9bc27cc commit f4b52db

File tree

16 files changed

+106
-87
lines changed

16 files changed

+106
-87
lines changed

docs/examples/dfsu/merge_subdomains.qmd

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,11 @@ combined_geometry.plot()
132132
## Merge everything into dataset
133133

134134
```{python}
135-
ds_out = mikeio.Dataset(
135+
ds_out = mikeio.Dataset.from_numpy(
136136
data=merged_data, # n_items, timesteps, n_elements
137-
items=items,
137+
items=items,
138138
time=time_steps,
139-
geometry=combined_geometry
139+
geometry=combined_geometry,
140140
)
141141
```
142142

docs/user-guide/dataset.qmd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ Selecting a specific item "itemA" (at position 0) from a Dataset ds can be done
3434
* `ds[0]` - returns "itemA" DataArray
3535
* `ds.itemA` - returns "itemA" DataArray
3636

37-
We recommend the use *named* items for readability.
37+
We recommend to use *named* items for readability.
3838

3939
```{python}
4040
ds.Surface_elevation

mikeio/_track.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ def is_EOF(step: int) -> bool:
156156
for item_info in items:
157157
items_out.append(item_info)
158158

159-
return Dataset(data_list, times, items_out)
159+
return Dataset.from_numpy(data=data_list, time=times, items=items_out)
160160

161161

162162
def _get_track_data_from_dataset(track: Dataset) -> tuple[pd.DatetimeIndex, np.ndarray]:

mikeio/dataset/_dataarray.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,6 @@ def _parse_geometry(
269269
if dims == ("time", "x"):
270270
return Grid1D(nx=shape[1], dx=1.0 / (shape[1] - 1))
271271

272-
warnings.warn("Geometry is required for ndim >=1")
273-
274272
axis = 1 if "time" in dims else 0
275273
# dims_no_time = tuple([d for d in dims if d != "time"])
276274
# shape_no_time = shape[1:] if ("time" in dims) else shape

mikeio/dataset/_dataset.py

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ class Dataset:
6464
By providing a mapping of data arrays, the remaining parameters are not needed
6565
time:
6666
a pandas.DatetimeIndex with the time instances of the data
67-
item:
68-
an ItemInfo with name, type and unit
67+
items:
68+
a list of ItemInfo with name, type and unit
6969
geometry:
7070
a geometry object e.g. Grid2D or GeometryFM2D
7171
zn:
@@ -113,6 +113,10 @@ def __init__(
113113
dt: float = 1.0,
114114
):
115115
if not self._is_DataArrays(data):
116+
warnings.warn(
117+
"Supplying data as a list of numpy arrays is deprecated. Use Dataset.from_numpy",
118+
FutureWarning,
119+
)
116120
data = self._create_dataarrays(
117121
data=data,
118122
time=time,
@@ -122,12 +126,36 @@ def __init__(
122126
dims=dims,
123127
dt=dt,
124128
)
125-
self._data_vars: MutableMapping[str, DataArray] = self._init_from_DataArrays(
129+
self._data_vars = self._init_from_DataArrays(
126130
data, # type: ignore
127131
validate=validate,
128-
) # type: ignore
132+
)
129133
self.plot = _DatasetPlotter(self)
130134

135+
@staticmethod
136+
def from_numpy(
137+
data: Sequence[NDArray[np.floating]],
138+
time: pd.DatetimeIndex | None = None,
139+
items: Sequence[ItemInfo] | None = None,
140+
*,
141+
geometry: Any | None = None,
142+
zn: NDArray[np.floating] | None = None,
143+
dims: tuple[str, ...] | None = None,
144+
validate: bool = True,
145+
dt: float = 1.0,
146+
) -> Dataset:
147+
das = Dataset._create_dataarrays(
148+
data=data,
149+
time=time,
150+
items=items,
151+
geometry=geometry,
152+
zn=zn,
153+
dims=dims,
154+
dt=dt,
155+
)
156+
157+
return Dataset(das)
158+
131159
@staticmethod
132160
def _is_DataArrays(data: Any) -> bool:
133161
"""Check if input is Sequence/Mapping of DataArrays."""
@@ -179,8 +207,6 @@ def _init_from_DataArrays(
179207
for da in data_vars.values():
180208
first._is_compatible(da, raise_error=True)
181209

182-
# TODO is it necessary to keep track of item names?
183-
self.__itemattr: set[str] = set()
184210
for key, value in data_vars.items():
185211
self._set_name_attr(key, value)
186212

@@ -644,15 +670,11 @@ def rename(self, mapper: Mapping[str, str], inplace: bool = False) -> "Dataset":
644670

645671
def _set_name_attr(self, name: str, value: DataArray) -> None:
646672
name = _to_safe_name(name)
647-
if name not in self.__itemattr:
648-
self.__itemattr.add(name) # keep track of what we insert
649673
setattr(self, name, value)
650674

651675
def _del_name_attr(self, name: str) -> None:
652676
name = _to_safe_name(name)
653-
if name in self.__itemattr:
654-
self.__itemattr.remove(name)
655-
delattr(self, name)
677+
delattr(self, name)
656678

657679
@overload
658680
def __getitem__(self, key: Hashable | int) -> DataArray: ...
@@ -1359,7 +1381,7 @@ def _concat_time(
13591381
zn[idx2, :] = other._zn
13601382
zn[idx1, :] = self._zn
13611383

1362-
return Dataset(
1384+
return Dataset.from_numpy(
13631385
newdata, time=newtime, items=ds.items, geometry=ds.geometry, zn=zn
13641386
)
13651387

mikeio/dfs/_dfs0.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ def read(
175175
fitems = [self.items[it] for it in item_numbers]
176176
else:
177177
fitems = self.items
178-
ds = Dataset(fdata, ftime, fitems, validate=False)
178+
ds = Dataset.from_numpy(fdata, time=ftime, items=fitems, validate=False)
179179

180180
# select time steps
181181
self._n_timesteps = dfs.FileInfo.TimeAxis.NumberOfTimeSteps

mikeio/dfs/_dfs1.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ def read(
175175

176176
self._dfs.Close()
177177

178-
return Dataset(
178+
return Dataset.from_numpy(
179179
data=data_list,
180180
time=time,
181181
items=items,

mikeio/dfs/_dfs2.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ def read(
243243
else:
244244
dims = ("time", "y", "x")
245245

246-
return Dataset(
246+
return Dataset.from_numpy(
247247
data_list,
248248
time=time,
249249
items=items,

mikeio/dfs/_dfs3.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ def read(
267267

268268
time = pd.to_datetime(t_seconds, unit="s", origin=self.start_time)
269269
items = _get_item_info(dfs.ItemInfo, item_numbers)
270-
return Dataset(
270+
return Dataset.from_numpy(
271271
data_list,
272272
time=time,
273273
items=items,

mikeio/dfsu/_dfsu.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -414,10 +414,10 @@ def read(
414414
time = pd.to_datetime(t_rel, unit="s", origin=self.start_time)
415415
item_infos = _get_item_info(dfs.ItemInfo, item_numbers)
416416

417-
return Dataset(
417+
return Dataset.from_numpy(
418418
data_list,
419-
time,
420-
item_infos,
419+
time=time,
420+
items=item_infos,
421421
geometry=geometry,
422422
dims=dims,
423423
validate=False,

0 commit comments

Comments
 (0)