From a0f688f4eb096124062e2fd05bc91ab183fa0d80 Mon Sep 17 00:00:00 2001
From: Raphael <raphael.sturgis@lis-lab.fr>
Date: Fri, 5 Nov 2021 08:43:32 +0100
Subject: [PATCH] minor

---
 .gitignore                        |  3 ++-
 requirements.txt                  |  3 ++-
 skais/ais/ais_trajectory.py       | 26 +++++++++++++++++++++++---
 skais/learn/hmm_gmm_classifier.py |  1 -
 4 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/.gitignore b/.gitignore
index 397680e..b139f3e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
 .idea/*
 build/
 skais.egg-info/
-*.coverage
\ No newline at end of file
+*.coverage
+*__pycache__*
diff --git a/requirements.txt b/requirements.txt
index 7d1581b..0634b7c 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -3,4 +3,5 @@ setuptools~=57.0.0
 numpy~=1.19.5
 numba~=0.53.1
 scipy~=1.5.4
-POT~=0.7.0
\ No newline at end of file
+hmmlearn~=0.2.6
+scikit-learn~=1.0.1
\ No newline at end of file
diff --git a/skais/ais/ais_trajectory.py b/skais/ais/ais_trajectory.py
index c3a339c..4185386 100644
--- a/skais/ais/ais_trajectory.py
+++ b/skais/ais/ais_trajectory.py
@@ -5,6 +5,7 @@ import numpy as np
 from numba import jit
 from scipy.interpolate import interp1d
 
+from skais.stats.angluar import angular_dispersion
 from skais.utils.geography import great_circle
 from skais.utils.stats import calc_std_dev
 
@@ -155,7 +156,7 @@ def l1_angle(dat, radius):
 
     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]
+        data = dat[i - radius:i + radius + 1]
         l1[i - radius] = np.linalg.norm(data, ord=1)
 
     return l1
@@ -166,11 +167,20 @@ def l2_angle(dat, radius):
 
     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]
+        data = dat[i - radius:i + radius + 1]
         l2[i - radius] = np.linalg.norm(data, ord=2)
     return l2
 
 
+def angle_dispersion(dat, radius):
+    l2 = np.zeros(dat.shape)
+
+    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]
+        l2[i - radius] = angular_dispersion(np.radians(data))
+
+
 class AISTrajectory:
     def __init__(self, df, interpolation_time=None):
         df = df.drop_duplicates(subset=['ts_sec'])
@@ -181,7 +191,7 @@ class AISTrajectory:
             discrete_columns = ['navstatus', 'label']
             new_df = pd.DataFrame()
             t_raw = df['ts_sec'].to_numpy()
-            t_interp1d = np.arange(start=t_raw[0], stop=t_raw[-1]+1,
+            t_interp1d = np.arange(start=t_raw[0], stop=t_raw[-1] + 1,
                                    step=interpolation_time * 60)
 
             new_df['ts_sec'] = t_interp1d
@@ -267,6 +277,16 @@ class AISTrajectory:
             stds[:radius] = np.nan
             self.df[f"{field}_std"] = stds
 
+    def compute_all_dispersions(self, radius):
+        fields = ['cog', 'heading', 'angles_diff']
+        for field in fields:
+            if field in self.df.columns:
+                dat = self.df[field].to_numpy()
+                disp = angle_dispersion(dat, radius)
+                disp[-radius:] = np.nan
+                disp[:radius] = np.nan
+                self.df[f"{field}_disp"] = disp
+
     def compute_position_features(self, radius):
         dat = np.stack([self.df.longitude.to_numpy(), self.df.latitude.to_numpy()], axis=1)
         std = compute_position_angle_std(dat, radius)
diff --git a/skais/learn/hmm_gmm_classifier.py b/skais/learn/hmm_gmm_classifier.py
index 34507dd..953041d 100644
--- a/skais/learn/hmm_gmm_classifier.py
+++ b/skais/learn/hmm_gmm_classifier.py
@@ -1,7 +1,6 @@
 import random
 
 from hmmlearn.hmm import GMMHMM, GaussianHMM
-from matplotlib import pyplot as plt
 from numba import jit
 from scipy import linalg
 from sklearn.datasets import make_spd_matrix
-- 
GitLab