diff --git a/skais/ais/ais_trajectory.py b/skais/ais/ais_trajectory.py index 71fb3776053bd70d08e16cf446d89d11ce81d4a5..ea9dad11744393879f5d551fa4c3a3480165923b 100644 --- a/skais/ais/ais_trajectory.py +++ b/skais/ais/ais_trajectory.py @@ -193,6 +193,17 @@ def angle_dispersion(dat, radius): return disp +@jit(nopython=True) +def apply_func_on_window(dat, func, radius, on_edge='copy'): + result = np.zeros(dat.shape) + if on_edge == 'copy': + dat = np.concatenate([np.full(radius, dat[0]), dat, np.full(radius, dat[-1])]) + for i in range(radius, dat.shape[0] - radius): + data = dat[i - radius:i + radius + 1] + result[i - radius] = func(data) + return result + else: + raise ValueError(f"{on_edge} not recognised, options are: ['copy']") class AISTrajectory: def __init__(self, df, interpolation_time=None): @@ -388,3 +399,12 @@ class AISTrajectory: index += i return result + + def apply_func_on_time_window(self, func, radius, column, new_column=None): + dat = self.df[column] + result = apply_func_on_window(dat, func, radius, on_edge='copy') + + if new_column is None: + self.df[column] = result + else: + self.df[new_column] = result \ No newline at end of file diff --git a/skais/process/basic_features_operations.py b/skais/process/basic_features_operations.py index 127102e61f5ac2183277e4714188d1b5b3547650..1a805fae767d88b76a2793ff1c4d61962a786fbf 100644 --- a/skais/process/basic_features_operations.py +++ b/skais/process/basic_features_operations.py @@ -1,3 +1,5 @@ +import cmath + import numpy as np @@ -31,3 +33,10 @@ def angular_mean(angles): def angular_std(angles): return 1 - angular_dispersion(angles) + +def angular_time_derivative(angle1, angle2, ts1, ts2): + z1 = np.cos(angle1) + np.sin(angle1) * 1j + z2 = np.cos(angle2) + np.sin(angle2) * 1j + + z = z2 / z1 + return cmath.polar(z)[1] / (ts2 - ts1) diff --git a/skais/tests/process/test_basic_features_operations.py b/skais/tests/process/test_basic_features_operations.py index c8f5a5cece00242e781037d11e8d85d0ca0fe01c..da2f62eb6388adf5c8f8036c2b67610aeb0a3626 100644 --- a/skais/tests/process/test_basic_features_operations.py +++ b/skais/tests/process/test_basic_features_operations.py @@ -2,7 +2,7 @@ import unittest import numpy as np -from skais.process.basic_features_operations import angular_mean, angular_std +from skais.process.basic_features_operations import angular_mean, angular_std, angular_time_derivative class TestAngular(unittest.TestCase): @@ -46,7 +46,17 @@ class TestAngular(unittest.TestCase): self.assertEqual(0, angular_std(x)) - def test_angular_std(self): + def test_angular_std_2(self): x = np.radians(np.array([0, 90, 180, 270])) - self.assertAlmostEqual(1, angular_std(x)) \ No newline at end of file + self.assertAlmostEqual(1, angular_std(x)) + + def test_angular_time_derivative(self): + result = angular_time_derivative(0, np.pi, 0, 1) + + self.assertAlmostEqual(np.pi, result) + + def test_angular_time_derivative_2(self): + result = angular_time_derivative(7*np.pi/4, np.pi/4, 0, 1) + + self.assertAlmostEqual(np.pi/2, result) \ No newline at end of file