@@ -240,6 +240,59 @@ def from_split_network(cls, group_dataset, indexs, **kwargs):
240
240
def infos (self , label = "" ):
241
241
return f"{ len (self )} obs { unique (self .segment ).shape [0 ]} segments"
242
242
243
+ def correct_close_events (self , nb_days_max = 20 ):
244
+
245
+ _time = self .time
246
+ segment = self .segment .copy ()
247
+ segments_connexion = dict ()
248
+
249
+ previous_obs , next_obs = self .previous_obs , self .next_obs
250
+
251
+ # record for every segments, the slice, indice of next obs & indice of previous obs
252
+ for i , seg , _ in self .iter_on (self .segment ):
253
+ if i .start == i .stop :
254
+ continue
255
+
256
+ i_p , i_n = previous_obs [i .start ], next_obs [i .stop - 1 ]
257
+ segments_connexion [seg ] = [i , i_p , i_n ]
258
+
259
+ for seg in sorted (segments_connexion .keys ()):
260
+ seg_slice , i_seg_p , i_seg_n = segments_connexion [seg ]
261
+ n_seg = segment [i_seg_n ]
262
+
263
+ # if segment has splitting
264
+ if i_seg_n != - 1 :
265
+ seg2_slice , i2_seg_p , i2_seg_n = segments_connexion [n_seg ]
266
+ p2_seg = segment [i2_seg_p ]
267
+
268
+ # if it merge on the first in a certain time
269
+ if (p2_seg == seg ) and (_time [i_seg_n ] - _time [i2_seg_p ] < nb_days_max ):
270
+
271
+ segment [i_seg_n : seg2_slice .stop ] = seg
272
+ previous_obs [i_seg_n ] = seg_slice .stop - 1
273
+
274
+ self .segment [:] = segment
275
+ self .next_obs [:] = next_obs
276
+ self .previous_obs [:] = previous_obs
277
+
278
+ self .sort ()
279
+
280
+ def sort (self , order = ("track" , "segment" , "time" )):
281
+ """
282
+ sort observations
283
+
284
+ :param tuple order: order or sorting. Passed to `np.argsort`
285
+ """
286
+
287
+ index_order = self .obs .argsort (order = order )
288
+ for field in self .elements :
289
+ self [field ][:] = self [field ][index_order ]
290
+
291
+ translate = - ones (index_order .max () + 2 , dtype = "i4" )
292
+ translate [index_order ] = arange (index_order .shape [0 ])
293
+ self .next_obs [:] = translate [self .next_obs ]
294
+ self .previous_obs [:] = translate [self .previous_obs ]
295
+
243
296
def obs_relative_order (self , i_obs ):
244
297
self .only_one_network ()
245
298
return self .segment_relative_order (self .segment [i_obs ])
0 commit comments