diff --git a/.gitignore b/.gitignore index 1c2d52b6c9c31d02d96bdbd5f5c273d8f68efcb9..397680eecc360e1cda8d18d964d0f90b47430f9a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ .idea/* +build/ +skais.egg-info/ +*.coverage \ No newline at end of file diff --git a/skais/stats/__init__.py b/skais/stats/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/skais/stats/angluar.py b/skais/stats/angluar.py new file mode 100644 index 0000000000000000000000000000000000000000..3fbac4263dda68700b39f813f412da10b52ebfaa --- /dev/null +++ b/skais/stats/angluar.py @@ -0,0 +1,30 @@ +import numpy as np + + +def angular_dispersion(x): + n = len(x) + X = np.sum(np.cos(x)) / n + Y = np.sum(np.sin(x)) / n + + r = np.sqrt(X ** 2 + Y ** 2) + + return r + + +def angular_mean(x): + n = len(x) + X = np.sum(np.cos(x)) / n + Y = np.sum(np.sin(x)) / n + + theta = abs(np.arctan2(X, Y)) + + if Y > 0 and X > 0: + return theta + + if Y > 0 >= X: + return np.pi/2 - theta + + if Y <= 0 < X: + return np.pi + theta + else: + return 2 * np.pi + theta diff --git a/skais/tests/stats/test_angular.py b/skais/tests/stats/test_angular.py new file mode 100644 index 0000000000000000000000000000000000000000..ae524adc08fda2f4e0f6883e9efd50f68a3c11a4 --- /dev/null +++ b/skais/tests/stats/test_angular.py @@ -0,0 +1,42 @@ +import unittest + +import numpy as np + +from skais.stats.angluar import angular_mean + + +class TestAngular(unittest.TestCase): + def test_angular_mean_simple(self): + x = np.radians(np.array([1, 359])) + + self.assertEqual(0.0, angular_mean(x)) + + def test_angular_mean_simple_2(self): + x = np.radians(np.array([180, 180, 180, 180, 179, 181])) + + self.assertEqual(np.pi, angular_mean(x)) + + def test_angular_mean_simple_3(self): + x = np.radians(np.array([0, 0, 0, 0, 359, 1])) + + self.assertEqual(0.0, angular_mean(x)) + + def test_angular_mean_first_quadrant(self): + x = np.radians(np.array([43, 44, 45, 46, 47])) + + self.assertEqual(np.pi / 4, angular_mean(x)) + + def test_angular_mean_second_quadrant(self): + x = np.radians(np.array([133, 134, 135, 136, 137])) + + self.assertEqual(3*np.pi / 4, angular_mean(x)) + + def test_angular_mean_third_quadrant(self): + x = np.radians(np.array([223, 224, 225, 226, 227])) + + self.assertEqual(5*np.pi / 4, angular_mean(x)) + + def test_angular_mean_fourth_quadrant(self): + x = np.radians(np.array([313, 314, 315, 316, 317])) + + self.assertEqual(7*np.pi / 4, angular_mean(x))