import modelskill as ms
import mikeio
Comparing Directional Data (e.g. wind direction)
Comparing directional data is easy from version 1.0 if the quantity is defined as directional. This happens automatically if data is loaded from a dfs file with EUM unit in “degrees” or if loaded from a xarray dataset with attribute “units” set to “degrees”. The quantity can also be created as directional manually by ms.Quantity(..., is_directional=True)
.
In the below example, the EUM unit is “degrees”.
= "../data/wave_dir.dfs0"
fn = mikeio.read(fn)
ds ds
<mikeio.Dataset>
dims: (time:9026)
time: 2006-12-20 22:00:00 - 2007-12-31 23:00:00 (9026 records)
geometry: GeometryUndefined()
items:
0: China_Model: Sign. Wave Height <Significant wave height> (meter)
1: China_Measured: Sign. Wave Height <Significant wave height> (meter)
2: China_Model: Mean Wave Direction <Mean Wave Direction> (degree)
3: China_Measured: Mean Wave Direction <Mean Wave Direction> (degree)
cmp = ms.from_matched(ds, obs_item=3, mod_items=[2])
cmp
<Comparer>
Quantity: Mean Wave Direction [degree]
Observation: China_Measured: Mean Wave Direction, n_points=9026
Model(s):
0: China_Model: Mean Wave Direction
cmp.quantity
Quantity(name='Mean Wave Direction', unit='degree', is_directional=True)
Circular metrics are used to compare directional data if the quantity is defined as directional.
cmp.skill(metrics=["c_rmse","c_max_error"]).round(1)
n | c_rmse | c_max_error | |
---|---|---|---|
observation | |||
China_Measured: Mean Wave Direction | 9026 | 60.7 | 179.9 |
cmp.plot.timeseries(figsize=(8,5));
cmp.plot.kde(); # note: the KDE estimate is not directional! (yet)
cmp.plot.scatter(); # note: regression line and Q-Q are not shown