NodeObservation
NodeObservation(
data,
node,
*,
item=None,
name=None,
weight=1.0,
quantity=None,
aux_items=None,
attrs=None,
)Class for observations at network nodes.
Create a NodeObservation from a DataFrame or other data source. The node ID is specified as an integer.
To create multiple NodeObservation objects from a single data source, use :method:from_multiple.
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| data | (str, Path, mikeio.Dataset, mikeio.DataArray, pd.DataFrame, pd.Series, xr.Dataset or xr.DataArray) | data source with time series for the node | required |
| item | (int, str) | index or name of the wanted item/column, by default None if data contains more than one item, item must be given | None |
| node | int | node ID (integer), by default None | required |
| name | str | user-defined name for easy identification in plots etc, by default derived from data | None |
| weight | float | weighting factor for skill scores, by default 1.0 | 1.0 |
| quantity | Quantity | The quantity of the observation, for validation with model results | None |
| aux_items | list | list of names or indices of auxiliary items, by default None | None |
| attrs | dict | additional attributes to be added to the data, by default None | None |
Examples
>>> import modelskill as ms
>>> o1 = ms.NodeObservation(data, node=123, name="123")
>>> o2 = ms.NodeObservation(df, item="Water Level", node=456)
>>>
>>> # Multiple node observations from separate data sources
>>> obs = ms.NodeObservation.from_multiple(nodes={123: df1, 456: df2})Attributes
| Name | Description |
|---|---|
| attrs | Attributes of the observation |
| gtype | Geometry type |
| n_points | Number of data points |
| name | Name of time series (value item name) |
| node | Node ID of observation |
| plot | Plot using the ComparerPlotter |
| quantity | Quantity of time series |
| time | Time index |
| values | Values as numpy array |
| weight | Weighting factor for skill scores |
| x | x-coordinate |
| y | y-coordinate |
Methods
| Name | Description |
|---|---|
| copy | Create a deep copy of the TimeSeries. |
| equals | Check if two TimeSeries are equal |
| from_multiple | Create multiple NodeObservation objects. |
| sel | Select data by label |
| to_dataframe | Convert matched data to pandas DataFrame |
| trim | Trim observation data to a given time interval |
copy
NodeObservation.copy()Create a deep copy of the TimeSeries.
Returns
| Name | Type | Description |
|---|---|---|
| TimeSeries | Deep copy of the TimeSeries object |
equals
NodeObservation.equals(other)Check if two TimeSeries are equal
from_multiple
NodeObservation.from_multiple(
data=None,
nodes=None,
quantity=None,
aux_items=None,
attrs=None,
)Create multiple NodeObservation objects.
Two calling conventions are supported:
Separate data sources — pass only
nodesas a dict mapping each node ID to its own data source (file path, DataFrame, etc.)::obs = NodeObservation.from_multiple(nodes={123: df1, 456: "sensor.csv"})Shared data source — pass a single
dataobject together withnodesas a dict mapping each node ID to the column name or index to select fromdata::obs = NodeObservation.from_multiple(data=df, nodes={123: "col_a", 456: "col_b"})
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| data | PointType | Shared data source (required when nodes values are column selectors). |
None |
| nodes | dict[int, PointType | str | int] | Mapping of node_id -> data source or column selector. | None |
| quantity | Quantity | None | Physical quantity metadata, by default None. | None |
| aux_items | list[int | str] | None | Auxiliary items, by default None. | None |
| attrs | dict | None | Additional attributes, by default None. | None |
Returns
| Name | Type | Description |
|---|---|---|
| list[NodeObservation] | List of NodeObservation objects. |
sel
NodeObservation.sel(**kwargs)Select data by label
to_dataframe
NodeObservation.to_dataframe()Convert matched data to pandas DataFrame
Include x, y coordinates only if gtype=track
Returns
| Name | Type | Description |
|---|---|---|
| pd.DataFrame | data as a pandas DataFrame |
trim
NodeObservation.trim(
start_time=None,
end_time=None,
buffer='1s',
no_overlap='error',
)Trim observation data to a given time interval
Parameters
| Name | Type | Description | Default |
|---|---|---|---|
| start_time | pd.Timestamp | start time | None |
| end_time | pd.Timestamp | end time | None |
| buffer | str | buffer time around start and end time, by default “1s” | '1s' |
| no_overlap | Literal['ignore', 'error', 'warn'] | Empty data handling. | 'error' |