Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 9 additions & 17 deletions src/mikeio/dataset/_dataarray.py
Original file line number Diff line number Diff line change
Expand Up @@ -227,40 +227,32 @@ def _parse_zn(
raise ValueError("zn can only be provided for layered dfsu data")
return zn

def _is_compatible(self, other: DataArray) -> bool:
"""check if other DataArray has equivalent dimensions, time and geometry."""
def _is_compatible(self, other: DataArray) -> None:
"""Check that other DataArray has equivalent dimensions, time and geometry."""
problems = []
assert isinstance(other, DataArray)
if self.shape != other.shape:
problems.append("shape of data must be the same")
if self.n_timesteps != other.n_timesteps:
problems.append("Number of timesteps must be the same")
if self.start_time != other.start_time:
if self.time[0] != other.time[0]:
problems.append("start_time must be the same")
if not isinstance(self.geometry, other.geometry.__class__):
if not isinstance(other.geometry, self.geometry.__class__):
problems.append("The type of geometry must be the same")
if hasattr(self.geometry, "__eq__"):
if not (self.geometry == self.geometry):
elif type(self.geometry).__eq__ is not object.__eq__:
if self.geometry != other.geometry:
problems.append("The geometries must be the same")
if self._zn is not None:
# it can be expensive to check equality of zn
# so we test only size, first and last element
if (
other._zn is None
or self._zn.shape != other._zn.shape
or self._zn.ravel()[0] != other._zn.ravel()[0]
or self._zn.ravel()[-1] != other._zn.ravel()[-1]
):
problems.append("zn must be the same")

if self.dims != other.dims:
problems.append("Dimension names (dims) must be the same")
problems.append("dims must be the same")

if len(problems) > 0:
if problems:
raise ValueError(", ".join(problems))

return len(problems) == 0

def _get_plotter_by_geometry(self) -> Any:
# TODO: this is explicit, but with consistent naming, we could create this mapping automatically
PLOTTER_MAP: Any = {
Expand Down Expand Up @@ -1712,7 +1704,7 @@ def _quantile(self, q, *, axis: int | str = 0, func=np.quantile, **kwargs: Any):
qd.name = newname
res.append(qd)

return Dataset(data=res, validate=False)
return Dataset(data=res)

# ============= MATH operations ===========

Expand Down
58 changes: 37 additions & 21 deletions src/mikeio/dataset/_dataset.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,12 +95,19 @@ def __init__(
data: Mapping[str, DataArray] | Sequence[DataArray],
validate: bool = True,
):
if not validate:
warnings.warn(
"validate=False is deprecated and will be removed in a future version. "
"Dataset always validates consistency of its DataArrays.",
FutureWarning,
stacklevel=2,
)

data_vars = self._dataarrays_as_mapping(data)

if validate:
first, *rest = data_vars.values()
for da in rest:
first._is_compatible(da)
first, *rest = data_vars.values()
for da in rest:
first._is_compatible(da)

self._data_vars = data_vars

Expand Down Expand Up @@ -133,12 +140,21 @@ def from_numpy(
Geometry of the DataArrays, by default None
zn: NDArray[np.floating], optional
Z-coordinates of the DataArrays, by default None
validate: bool, optional
Validate the DataArrays, by default True
validate: bool
Deprecated. Dataset always validates consistency.
Will be removed in a future version.
dt: float, optional
Dummy time step in seconds, by default 1.0

"""
if not validate:
warnings.warn(
"validate=False is deprecated and will be removed in a future version. "
"Dataset always validates consistency of its DataArrays.",
FutureWarning,
stacklevel=2,
)

item_infos = Dataset._parse_items(items, len(data))

data_vars = {
Expand All @@ -148,7 +164,7 @@ def from_numpy(
for dd, it in zip(data, item_infos)
}

return Dataset(data_vars, validate=validate)
return Dataset(data_vars)

@property
def values(self) -> None:
Expand Down Expand Up @@ -350,7 +366,7 @@ def fillna(self, value: float = 0.0) -> Dataset:
"""
res = {name: da.fillna(value=value) for name, da in self._data_vars.items()}

return Dataset(data=res, validate=False)
return Dataset(data=res)

def dropna(self) -> Dataset:
"""Remove time steps where all items are NaN."""
Expand Down Expand Up @@ -397,7 +413,7 @@ def squeeze(self) -> Dataset:
)
res = {name: da.squeeze() for name, da in self._data_vars.items()}

return Dataset(data=res, validate=False)
return Dataset(data=res)

def create_data_array(
self,
Expand Down Expand Up @@ -562,14 +578,14 @@ def __getitem__(self, key: Any) -> DataArray | Dataset:
for k, da in self._data_vars.items()
if fnmatch.fnmatch(k, key)
}
return Dataset(data=data_vars, validate=False)
return Dataset(data=data_vars)
else:
item_names = ",".join(self._data_vars.keys())
raise KeyError(f"No item named: {key}. Valid items: {item_names}")

if isinstance(key, Iterable):
data_vars = {v: self._data_vars[v] for v in key}
return Dataset(data=data_vars, validate=False)
return Dataset(data=data_vars)

raise TypeError(f"indexing with a {type(key)} is not (yet) supported")

Expand Down Expand Up @@ -677,7 +693,7 @@ def isel(
)
for da in self
]
return Dataset(data=res, validate=False)
return Dataset(data=res)

def sel(
self,
Expand Down Expand Up @@ -758,7 +774,7 @@ def sel(
da.sel(time=time, x=x, y=y, z=z, coords=coords, area=area, layers=layers)
for da in self
]
return Dataset(data=res, validate=False)
return Dataset(data=res)

def interp(
self,
Expand Down Expand Up @@ -838,9 +854,9 @@ def interp(
das = [da.interp(x=x, y=y, interpolant=interpolant) for da in self]
else:
das = [da.interp(x=x, y=y) for da in self]
ds = Dataset(das, validate=False)
ds = Dataset(das)
else:
ds = Dataset([da for da in self], validate=False)
ds = Dataset([da for da in self])

# interp in time
if isinstance(time, (pd.DatetimeIndex, DataArray)):
Expand Down Expand Up @@ -1039,7 +1055,7 @@ def interp_like(

interpolant = self.geometry.get_2d_interpolant(xy, **kwargs)
das = [da.interp_like(geom, interpolant=interpolant) for da in self]
ds = Dataset(das, validate=False)
ds = Dataset(das)

if time is not None:
ds = ds.interp_time(time)
Expand Down Expand Up @@ -1222,13 +1238,13 @@ def aggregate(
zn=self._zn,
)

return Dataset([da], validate=False)
return Dataset([da])
else:
res = {
name: da.aggregate(axis=axis, func=func, **kwargs)
for name, da in self._data_vars.items()
}
return Dataset(data=res, validate=False)
return Dataset(data=res)

@staticmethod
def _agg_item_from_items(items: Sequence[ItemInfo], name: str) -> ItemInfo:
Expand Down Expand Up @@ -1324,14 +1340,14 @@ def _quantile(self, q, *, axis=0, func=np.quantile, **kwargs) -> Dataset: # typ
geometry=self.geometry,
zn=self._zn,
)
return Dataset([da], validate=False)
return Dataset([da])
else:
res: list[DataArray] = []
for quantile in q:
qd = self._quantile(q=quantile, axis=axis, func=func, **kwargs)[0]
assert isinstance(qd, DataArray)
res.append(qd)
return Dataset(data=res, validate=False)
return Dataset(data=res)
else:
if np.isscalar(q):
res = [da._quantile(q=q, axis=axis, func=func) for da in self]
Expand All @@ -1346,7 +1362,7 @@ def _quantile(self, q, *, axis=0, func=np.quantile, **kwargs) -> Dataset: # typ
qd.name = newname
res.append(qd)

return Dataset(data=res, validate=False)
return Dataset(data=res)

def max(self, axis: int | str = 0, **kwargs: Any) -> Dataset:
"""Max value along an axis.
Expand Down
2 changes: 1 addition & 1 deletion src/mikeio/dfs/_dfs0.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ def read(
item_infos = [self.items[it] for it in item_numbers]
else:
item_infos = self.items
ds = Dataset.from_numpy(data, time=ftime, items=item_infos, validate=False)
ds = Dataset.from_numpy(data, time=ftime, items=item_infos)

# select time steps
if self._timeaxistype == TimeAxisType.CalendarNonEquidistant and isinstance(
Expand Down
1 change: 0 additions & 1 deletion src/mikeio/dfs/_dfs1.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,6 @@ def read(
time=time,
items=items,
geometry=self.geometry,
validate=False,
dt=self._timestep,
)

Expand Down
1 change: 0 additions & 1 deletion src/mikeio/dfs/_dfs2.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,6 @@ def read(
time=time,
items=items,
geometry=geometry,
validate=False,
)

def append(self, ds: Dataset, validate: bool = True) -> None:
Expand Down
1 change: 0 additions & 1 deletion src/mikeio/dfs/_dfs3.py
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,6 @@ def read(
time=time,
items=items,
geometry=geometry,
validate=False,
)

def append(self, ds: Dataset, validate: bool = True) -> None:
Expand Down
2 changes: 0 additions & 2 deletions src/mikeio/dfsu/_dfsu.py
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,6 @@ def _read_geometry(filename: str) -> GeometryFM2D:
dfsu_type=dfsu_type,
element_ids=el_table.ids,
node_ids=node_table.ids,
validate=False,
)
dfs.Close()
return geometry
Expand Down Expand Up @@ -486,7 +485,6 @@ def read(
time=time,
items=item_infos,
geometry=geometry,
validate=False,
dt=self.timestep,
)

Expand Down
3 changes: 0 additions & 3 deletions src/mikeio/dfsu/_layered.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,6 @@ def _read_geometry(filename: str) -> GeometryFM3D | GeometryFMVerticalProfile:
node_ids=node_table.ids,
n_layers=dfs.NumberOfLayers,
n_sigma=min(dfs.NumberOfSigmaLayers, dfs.NumberOfLayers),
validate=False,
)
dfs.Close()
return geometry
Expand Down Expand Up @@ -442,7 +441,6 @@ def read(
items=items,
geometry=geometry,
zn=data_list[0],
validate=False,
dt=self.timestep,
)
else:
Expand All @@ -451,7 +449,6 @@ def read(
time=time,
items=items,
geometry=geometry,
validate=False,
dt=self.timestep,
)

Expand Down
1 change: 0 additions & 1 deletion src/mikeio/dfsu/_mesh.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@ def _read_header(self, filename: str | Path) -> GeometryFM2D:
projection=msh.ProjectionString,
element_ids=el_table.ids,
node_ids=node_table.ids,
validate=False,
)

return geom
Expand Down
3 changes: 0 additions & 3 deletions src/mikeio/dfsu/_spectral.py
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,6 @@ def _read_geometry(
dfsu_type=dfsu_type,
element_ids=el_table.ids,
node_ids=node_table.ids,
validate=False,
frequencies=frequencies,
directions=directions,
)
Expand All @@ -184,7 +183,6 @@ def _read_geometry(
dfsu_type=dfsu_type,
element_ids=el_table.ids,
node_ids=node_table.ids,
validate=False,
frequencies=frequencies,
directions=directions,
)
Expand Down Expand Up @@ -392,7 +390,6 @@ def read(
time=time,
items=items,
geometry=geometry,
validate=False,
)

def _parse_geometry_sel(
Expand Down
1 change: 0 additions & 1 deletion src/mikeio/spatial/_FM_geometry_layered.py
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,6 @@ def to_2d_geometry(self) -> GeometryFM2D:
projection=self.projection_string,
element_table=elem_tbl,
element_ids=elem_ids,
validate=False,
dfsu_type=DfsuFileType.Dfsu2D,
reindex=True,
)
Expand Down
Loading