Skip to content

Commit 83a7d44

Browse files
authored
Merge pull request #168 from knutfrode/dev
New method skill_along_trajectory
2 parents 97a9a79 + 86ad5b6 commit 83a7d44

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

trajan/traj1d.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,48 @@ def rotary_spectrum(self):
100100
plt.xlim([0, 30])
101101
plt.show()
102102

103-
def skill(self, expected, method='liu-weissberg', **kwargs):
103+
def skill_along_trajectory(self, expected, **kwargs):
104+
"""_Skill score is calculated for each trajectory versus the matcing part of the expected (single) trajectory.
105+
"""
106+
107+
expected = expected.traj # Normalise
108+
109+
numtraj_expected = expected.ds.sizes[expected.trajectory_dim]
110+
if numtraj_expected > 1:
111+
raise ValueError(
112+
f'Expected must contain a single trajectory, this contains {numtraj_expected}.'
113+
)
114+
115+
start_lon = self.ds.lon.bfill(dim='time').isel(time=0)
116+
start_lat = self.ds.lat.bfill(dim='time').isel(time=0)
117+
end_lon = self.ds.lon.ffill(dim='time').isel(time=-1)
118+
end_lat = self.ds.lat.ffill(dim='time').isel(time=-1)
119+
120+
def skill_matching(traj, expected):
121+
traj = traj.where(np.isfinite(traj.lon), drop=True)
122+
expected_overlap = expected.sel(time=slice(traj.time[0], traj.time[-1]))
123+
mask = False
124+
if traj.sizes[self.obs_dim] != expected_overlap.sizes[expected_overlap.traj.obs_dim]:
125+
traj = traj.sel(time=slice(expected_overlap.time[0], expected_overlap.time[-1]))
126+
mask = True
127+
s = traj.traj.skill(expected_overlap, **kwargs)
128+
if mask is True:
129+
s = s*np.nan # Mask out the skill score if the trajectories are not of equal length
130+
s['start_time'] = traj.time[0]
131+
s['end_time'] = traj.time[-1]
132+
return s
133+
134+
s = self.ds.groupby(self.trajectory_dim).apply(skill_matching, expected=expected)
135+
s['start_lon'] = start_lon
136+
s['start_lat'] = start_lat
137+
s['end_lon'] = end_lon
138+
s['end_lat'] = end_lat
139+
s = s.drop_vars('time')
140+
141+
return s
104142

143+
def skill(self, expected, method='liu-weissberg', **kwargs):
144+
105145
expected = expected.traj # Normalise
106146
expected_trajdim = expected.trajectory_dim
107147
self_trajdim = self.trajectory_dim

trajan/traj2d.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,3 +289,6 @@ def gridtime(self, times, time_varname=None, round=True):
289289
{self.trajectory_dim: self.ds[self.trajectory_dim]})
290290

291291
return d
292+
293+
def skill(self):
294+
raise ValueError('Not implemented for 1D datasets')

0 commit comments

Comments
 (0)