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