@@ -100,8 +100,48 @@ def rotary_spectrum(self):
100
100
plt .xlim ([0 , 30 ])
101
101
plt .show ()
102
102
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
104
142
143
+ def skill (self , expected , method = 'liu-weissberg' , ** kwargs ):
144
+
105
145
expected = expected .traj # Normalise
106
146
expected_trajdim = expected .trajectory_dim
107
147
self_trajdim = self .trajectory_dim
0 commit comments