import pandas as pd
from mikeio.eum import EUMType, ItemInfo
from fmskill.model import ModelResult
from fmskill.observation import TrackObservation
import matplotlib.pyplot as plt
from IPython.display import set_matplotlib_formats
set_matplotlib_formats('png')
fn = '../tests/testdata/NorthSeaHD_and_windspeed.dfsu'
mr = ModelResult(fn, name='HD')
mr.dfs
Dfsu2D Number of elements: 958 Number of nodes: 570 Projection: LONG/LAT Items: 0: Surface elevation <Surface Elevation> (meter) 1: Wind speed <Wind speed> (meter per sec) Time: 67 steps with dt=3600.0s 2017-10-27 00:00:00 -- 2017-10-29 18:00:00
fn = '../tests/testdata/altimetry_NorthSea_20171027.csv'
df = pd.read_csv(fn, index_col=0, parse_dates=True)
o1 = TrackObservation(df, item=2, name='alti')
o1.itemInfo = ItemInfo(EUMType.Surface_Elevation) # if TrackObservation is created with a df, itemInfo needs to be added manually
mr.add_observation(o1, item=0)
cc = mr.extract()
cc['alti'].scatter()
ModelResult is now a dfs0
fn = '../tests/testdata/NorthSeaHD_extracted_track.dfs0'
mr = ModelResult(fn, name='HD')
mr.dfs
<mikeio.Dfs0> Timeaxis: TimeAxisType.NonEquidistantCalendar Items: 0: Longitude <Undefined> (undefined) 1: Latitude <Undefined> (undefined) 2: Model_surface_elevation <Undefined> (undefined) 3: Model_wind_speed <Undefined> (undefined)
fn = '../tests/testdata/altimetry_NorthSea_20171027.csv'
df = pd.read_csv(fn, index_col=0, parse_dates=True)
o1 = TrackObservation(df, item=2, name='alti')
mr.add_observation(o1, item=2)
cc = mr.extract()
cc['alti'].scatter()
Run the download.ipynb first
fn = '../data/SW_gwm_3a_extracted_2018.dfs0'
mr = ModelResult(fn, name='GWM')
fn = '../data/altimetry_3a_2018_filter1.dfs0'
o1 = TrackObservation(fn, item=2, name='3a')
mr.add_observation(o1, item=2)
cc = mr.extract()
cc['3a'].skill(end='2018-1-15')
n | bias | rmse | urmse | mae | cc | si | r2 | |
---|---|---|---|---|---|---|---|---|
observation | ||||||||
3a | 372356 | -0.475229 | 0.633093 | 0.418287 | 0.510757 | 0.940399 | 0.116879 | 0.968706 |
cc['3a'].scatter(end='2018-7-1', area=[0,50,10,60], binsize=0.1, cmap='YlOrRd')
import xarray as xr
import numpy as np
df = cc.all_df
df['lonBin'] = pd.cut(df.x,bins=360)
df['latBin'] = pd.cut(df.y,bins=180)
QIs = []
min_observations = 30
for (lonBin,latBin),dfi in df.groupby(['lonBin','latBin']):
n = len(dfi)
if n < min_observations:
continue
QIi = pd.DataFrame(index=[1],data=dict(N_obs=dfi['obs_val'].count(),mean_obs=dfi['obs_val'].mean(),
N_mdl=dfi['mod_val'].count(),mean_mdl=dfi['mod_val'].mean()))
resi = dfi['obs_val'] - dfi['mod_val']
QIi['n'] = n
QIi['bias'] = QIi['mean_mdl']-QIi['mean_obs']
QIi['rmse'] = np.sqrt(np.mean(resi**2))
QIi['lon'] = lonBin.mid
QIi['lat'] = latBin.mid
QIs.append(QIi.set_index(['lon','lat']))
QI = pd.concat(QIs)
ds = QI.to_xarray()
ds['bias'].plot(x='lon',y='lat');
ds['rmse'].plot(x='lon',y='lat');