From 661bfe2903dcb24ad6485213bdf09c66cf67ab15 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Wed, 22 May 2019 16:45:13 +0200
Subject: [PATCH] [SCM][HYPERCUBE] normalize gev trend_strength with distance
 between years. update test to check this distance.

---
 .../main_hypercube_visualization.py                   |  4 ++--
 .../univariate_trend_test/abstract_gev_trend_test.py  | 11 +++++++++--
 .../coordinates/abstract_coordinates.py               |  4 ++--
 .../abstract_temporal_coordinates.py                  |  6 +++++-
 .../test_transformation.py                            |  9 +++++----
 5 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/experiment/meteo_france_SCM_study/visualization/hypercube_visualization/main_hypercube_visualization.py b/experiment/meteo_france_SCM_study/visualization/hypercube_visualization/main_hypercube_visualization.py
index 534541c8..dce9a699 100644
--- a/experiment/meteo_france_SCM_study/visualization/hypercube_visualization/main_hypercube_visualization.py
+++ b/experiment/meteo_france_SCM_study/visualization/hypercube_visualization/main_hypercube_visualization.py
@@ -93,9 +93,9 @@ def fast_trends_with_quantity_altitude_hypercube():
 
 
 def main_run():
-    # fast_trends_with_altitude_hypercube()
+    fast_trends_with_altitude_hypercube()
     # fast_trends_with_quantity_altitude_hypercube()
-    full_trends_with_quantity_altitude_hypercube()
+    # full_trends_with_quantity_altitude_hypercube()
 
 
 if __name__ == '__main__':
diff --git a/experiment/trend_analysis/univariate_trend_test/abstract_gev_trend_test.py b/experiment/trend_analysis/univariate_trend_test/abstract_gev_trend_test.py
index c9811d9e..1b734763 100644
--- a/experiment/trend_analysis/univariate_trend_test/abstract_gev_trend_test.py
+++ b/experiment/trend_analysis/univariate_trend_test/abstract_gev_trend_test.py
@@ -28,7 +28,7 @@ class AbstractGevTrendTest(AbstractTrendTest):
         df = pd.DataFrame({AbstractCoordinates.COORDINATE_T: years_after_change_point})
         df_maxima_gev = pd.DataFrame(maxima_after_change_point, index=df.index)
         observations = AbstractSpatioTemporalObservations(df_maxima_gev=df_maxima_gev)
-        self.coordinates = AbstractTemporalCoordinates.from_df(df, transformation_class=CenteredScaledNormalization)
+        self.coordinates = AbstractTemporalCoordinates.from_df(df, transformation_class=CenteredScaledNormalization) # type: AbstractTemporalCoordinates
         self.dataset = AbstractDataset(observations=observations, coordinates=self.coordinates)
 
         try:
@@ -81,7 +81,14 @@ class AbstractGevTrendTest(AbstractTrendTest):
 
     @property
     def test_trend_strength(self):
-        return 100 * np.abs(self.non_stationary_linear_coef) / np.abs(self.non_stationary_intercept_coef)
+        return self.percentage_of_change_per_year
+
+    @property
+    def percentage_of_change_per_year(self):
+        ratio = np.abs(self.non_stationary_linear_coef) / np.abs(self.non_stationary_intercept_coef)
+        scaled_ratio = ratio * self.coordinates.transformed_distance_between_two_successive_years
+        percentage_of_change_per_year = 100 * scaled_ratio
+        return percentage_of_change_per_year
 
     @property
     def test_sign(self) -> int:
diff --git a/spatio_temporal_dataset/coordinates/abstract_coordinates.py b/spatio_temporal_dataset/coordinates/abstract_coordinates.py
index 523d5131..9a8f63de 100644
--- a/spatio_temporal_dataset/coordinates/abstract_coordinates.py
+++ b/spatio_temporal_dataset/coordinates/abstract_coordinates.py
@@ -133,8 +133,8 @@ class AbstractCoordinates(object):
     # Normalize
 
     def transform(self, coordinate: np.ndarray) -> np.ndarray:
-        coordinate_float = coordinate.astype(self.COORDINATE_TYPE)
-        return self.transformation.transform_array(coordinate=coordinate_float)
+        coordinate_array_as_float = coordinate.astype(self.COORDINATE_TYPE)
+        return self.transformation.transform_array(coordinate=coordinate_array_as_float)
 
     # Split
 
diff --git a/spatio_temporal_dataset/coordinates/temporal_coordinates/abstract_temporal_coordinates.py b/spatio_temporal_dataset/coordinates/temporal_coordinates/abstract_temporal_coordinates.py
index 8084820e..8edda847 100644
--- a/spatio_temporal_dataset/coordinates/temporal_coordinates/abstract_temporal_coordinates.py
+++ b/spatio_temporal_dataset/coordinates/temporal_coordinates/abstract_temporal_coordinates.py
@@ -1,5 +1,5 @@
 import pandas as pd
-
+import numpy as np
 from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates
 from spatio_temporal_dataset.slicer.temporal_slicer import TemporalSlicer
 
@@ -10,6 +10,10 @@ class AbstractTemporalCoordinates(AbstractCoordinates):
     def temporal_coordinates(self):
         return self
 
+    @property
+    def transformed_distance_between_two_successive_years(self):
+        return self.transform(np.ones([1])) - self.transform(np.zeros([1]))
+
     @classmethod
     def from_df(cls, df: pd.DataFrame, train_split_ratio: float = None, transformation_class: type = None):
         assert cls.COORDINATE_T in df.columns
diff --git a/test/test_spatio_temporal_dataset/test_transformation.py b/test/test_spatio_temporal_dataset/test_transformation.py
index bbce7051..e03b0eb5 100644
--- a/test/test_spatio_temporal_dataset/test_transformation.py
+++ b/test/test_spatio_temporal_dataset/test_transformation.py
@@ -18,14 +18,15 @@ class TestTransformation(unittest.TestCase):
         nb_steps = 3
         start = 1950
         transformation_class_to_expected = {
-            BetweenZeroAndOneNormalization: [0.0, 0.5, 1.0],
-            BetweenMinusOneAndOneNormalization: [-1.0, 0.0, 1.0],
-            CenteredScaledNormalization: [-1.22474487, 0., 1.22474487],
+            BetweenZeroAndOneNormalization: (0.5, [0.0, 0.5, 1.0]),
+            BetweenMinusOneAndOneNormalization: (1.0, [-1.0, 0.0, 1.0]),
+            CenteredScaledNormalization: (1.22474487, [-1.22474487, 0., 1.22474487]),
         }
-        for transformation_class, expected in transformation_class_to_expected.items():
+        for transformation_class, (expected_distance, expected) in transformation_class_to_expected.items():
             temporal_coordinates = ConsecutiveTemporalCoordinates.from_nb_temporal_steps(nb_temporal_steps=nb_steps,
                                                                                          start=start,
                                                                                          transformation_class=transformation_class)
+            self.assertTrue(np.allclose(temporal_coordinates.transformed_distance_between_two_successive_years, expected_distance))
             normalized_coordinates = temporal_coordinates.df_coordinates().iloc[:, 0].values
             expected_coordinates = np.array(expected)
             equal = np.allclose(normalized_coordinates , expected_coordinates)
-- 
GitLab