From 133356084d9d641579a3f902dbfd0ddae411c763 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Fri, 10 May 2019 15:36:55 +0200
Subject: [PATCH] [SCM][STUDY VISUALIZER] modify setting for non stationary
 trend test. fix test dataset

---
 .../meteo_france_SCM_study/abstract_study.py    |  2 +-
 .../main_study_visualizer.py                    |  8 ++++----
 .../non_stationary_trends.py                    |  8 ++++----
 .../study_visualization/study_visualizer.py     |  6 ++++--
 .../coordinates/abstract_coordinates.py         |  6 +++++-
 .../alps_station_3D_coordinates.py              |  2 --
 .../dataset/abstract_dataset.py                 | 17 ++++++++++++-----
 .../test_dataset.py                             | 12 ++++--------
 8 files changed, 34 insertions(+), 27 deletions(-)

diff --git a/experiment/meteo_france_SCM_study/abstract_study.py b/experiment/meteo_france_SCM_study/abstract_study.py
index f29b6a5a..ab121cea 100644
--- a/experiment/meteo_france_SCM_study/abstract_study.py
+++ b/experiment/meteo_france_SCM_study/abstract_study.py
@@ -313,7 +313,7 @@ class AbstractStudy(object):
 
     @property
     def title(self):
-        return "{} at altitude {}m ({} mountain chains)".format(self.variable_name, self.altitude,
+        return "{}/at altitude {}m ({} mountain chains)".format(self.variable_name, self.altitude,
                                                                 len(self.study_massif_names))
 
     @property
diff --git a/experiment/meteo_france_SCM_study/visualization/study_visualization/main_study_visualizer.py b/experiment/meteo_france_SCM_study/visualization/study_visualization/main_study_visualizer.py
index 818c4be0..0abcf0e6 100644
--- a/experiment/meteo_france_SCM_study/visualization/study_visualization/main_study_visualizer.py
+++ b/experiment/meteo_france_SCM_study/visualization/study_visualization/main_study_visualizer.py
@@ -114,15 +114,15 @@ def complete_analysis(only_first_one=False):
 
 
 def trend_analysis():
-    save_to_file = False
-    only_first_one = True
+    save_to_file = True
+    only_first_one = False
     # [0, 300, 600, 900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600, 3900, 4200, 4500, 4800] to test for others
     altitudes = [300, 1200, 2100, 3000][-1:]
-    study_classes = [CrocusSwe, CrocusDepth, SafranSnowfall, SafranRainfall, SafranTemperature]
+    study_classes = [CrocusSwe, CrocusDepth, SafranSnowfall, SafranRainfall, SafranTemperature][:1]
     for study in study_iterator_global(study_classes, only_first_one=only_first_one, altitudes=altitudes):
         study_visualizer = StudyVisualizer(study, save_to_file=save_to_file,
                                            transformation_2D=BetweenZeroAndOne2DNormalization())
-        study_visualizer.visualize_temporal_trend_relevance(complete_analysis=False)
+        study_visualizer.visualize_temporal_trend_relevance(complete_analysis=True)
 
 
 if __name__ == '__main__':
diff --git a/experiment/meteo_france_SCM_study/visualization/study_visualization/non_stationary_trends.py b/experiment/meteo_france_SCM_study/visualization/study_visualization/non_stationary_trends.py
index 889fd80a..77050e97 100644
--- a/experiment/meteo_france_SCM_study/visualization/study_visualization/non_stationary_trends.py
+++ b/experiment/meteo_france_SCM_study/visualization/study_visualization/non_stationary_trends.py
@@ -70,12 +70,12 @@ class AbstractNonStationaryTrendTest(object):
         ax.set_ylabel(self.RESULT_ATTRIBUTE_METRIC + ' difference', color=color_difference)
 
         # Plot zero line
-        years_line = [years[0] -10, years[-1]  + 10]
-        ax.plot(years_line, [0 for _ in years_line], 'k-', label='zero line')
+        # years_line = [years[0] -10, years[-1]  + 10]
+        ax.plot(years, [0 for _ in years], 'k-', label='zero line')
         # Plot significative line corresponding to 0.05 relevance
         alpha = 0.05
         significative_deviance = chi2.ppf(q=1 - alpha, df=1)
-        ax.plot(years_line, [significative_deviance for _ in years_line], 'g-', label='significative line')
+        ax.plot(years, [significative_deviance for _ in years], 'g-', label='significative line')
 
         # Plot the mu1 parameter
         mu1_trends = [self.get_mu1(starting_point=year) for year in years]
@@ -111,7 +111,7 @@ class ConditionalIndedendenceLocationTrendTest(AbstractNonStationaryTrendTest):
 
     @property
     def display_name(self):
-        return get_display_name_from_object_type('conditional independence')
+        return 'conditional independence'
 
 
 class MaxStableLocationTrendTest(AbstractNonStationaryTrendTest):
diff --git a/experiment/meteo_france_SCM_study/visualization/study_visualization/study_visualizer.py b/experiment/meteo_france_SCM_study/visualization/study_visualization/study_visualizer.py
index 457bf951..f479d985 100644
--- a/experiment/meteo_france_SCM_study/visualization/study_visualization/study_visualizer.py
+++ b/experiment/meteo_france_SCM_study/visualization/study_visualization/study_visualizer.py
@@ -385,9 +385,11 @@ class StudyVisualizer(object):
         if self.show:
             plt.show()
         if self.save_to_file:
-            filename = "{}/{}".format(VERSION_TIME, '_'.join(self.study.title.split()))
+            main_title, specific_title = '_'.join(self.study.title.split()).split('/')
+            filename = "{}/{}/".format(VERSION_TIME, main_title)
             if not self.only_one_graph:
-                filename += "/{}".format('_'.join(self.plot_name.split()))
+                filename += "{}".format('_'.join(self.plot_name.split())) + '_'
+            filename += specific_title
             filepath = op.join(self.study.result_full_path, filename + '.png')
             dirname = op.dirname(filepath)
             if not op.exists(dirname):
diff --git a/spatio_temporal_dataset/coordinates/abstract_coordinates.py b/spatio_temporal_dataset/coordinates/abstract_coordinates.py
index b3bf4039..e81aea16 100644
--- a/spatio_temporal_dataset/coordinates/abstract_coordinates.py
+++ b/spatio_temporal_dataset/coordinates/abstract_coordinates.py
@@ -176,6 +176,10 @@ class AbstractCoordinates(object):
         else:
             return self.df_coordinates(split).loc[:, self.coordinates_spatial_names].drop_duplicates()
 
+    @property
+    def nb_stations(self, split: Split = Split.all) -> int:
+        return len(self.df_spatial_coordinates(split))
+
     def spatial_index(self, split: Split = Split.all) -> pd.Index:
         df_spatial = self.df_spatial_coordinates(split)
         if self.has_spatio_temporal_coordinates:
@@ -205,7 +209,7 @@ class AbstractCoordinates(object):
             return self.df_coordinates(split).loc[:, self.coordinates_temporal_names].drop_duplicates()
 
     @property
-    def nb_steps(self, split: Split = Split.all):
+    def nb_steps(self, split: Split = Split.all) -> int:
         return len(self.df_temporal_coordinates(split))
 
     def df_temporal_range(self, split: Split = Split.all) -> Tuple[int, int]:
diff --git a/spatio_temporal_dataset/coordinates/spatial_coordinates/alps_station_3D_coordinates.py b/spatio_temporal_dataset/coordinates/spatial_coordinates/alps_station_3D_coordinates.py
index 30e241a1..92e6ed42 100644
--- a/spatio_temporal_dataset/coordinates/spatial_coordinates/alps_station_3D_coordinates.py
+++ b/spatio_temporal_dataset/coordinates/spatial_coordinates/alps_station_3D_coordinates.py
@@ -34,7 +34,6 @@ class AlpsStation3DCoordinates(AbstractSpatialCoordinates):
                 station_to_coordinates[station_name] = coordinates
         df = pd.DataFrame.from_dict(data=station_to_coordinates, orient='index',
                                     columns=[cls.COORDINATE_X, cls.COORDINATE_Y, cls.COORDINATE_Z])
-        print(df.head())
         filepath = op.join(cls.FULL_PATH, 'coord-lambert2.csv')
         assert not op.exists(filepath)
         df.to_csv(filepath)
@@ -45,6 +44,5 @@ class AlpsStation3DCoordinatesWithAnisotropy(AlpsStation3DCoordinates):
     @classmethod
     def from_csv(cls, csv_file='coord-lambert2'):
         coord = super().from_csv(csv_file)
-        print(coord)
         return TransformedCoordinates.from_coordinates(coordinates=coord,
                                                        transformation_function=AnisotropyTransformation())
diff --git a/spatio_temporal_dataset/dataset/abstract_dataset.py b/spatio_temporal_dataset/dataset/abstract_dataset.py
index 2dbb6476..91add0b4 100644
--- a/spatio_temporal_dataset/dataset/abstract_dataset.py
+++ b/spatio_temporal_dataset/dataset/abstract_dataset.py
@@ -56,11 +56,18 @@ class AbstractDataset(object):
     def transform_maxima_for_spatial_extreme_package(self, maxima_function, split) -> np.ndarray:
         array = maxima_function(split)
         if self.coordinates.has_spatio_temporal_coordinates:
-            inverted_shape = list(self.coordinates.spatio_temporal_shape(split)[::-1])
-            inverted_shape[0] *= self.observations.nb_obs
-            return array.reshape(inverted_shape)
-        else:
-            return np.transpose(array)
+            nb_obs = self.observations.nb_obs
+            nb_stations = self.coordinates.nb_stations
+            nb_steps = self.coordinates.nb_steps
+            # Permute array lines
+            time_steps = np.array(range(nb_steps))
+            c = [time_steps * nb_stations + i for i in range(nb_stations)]
+            permutation = np.concatenate(c)
+            array = array[permutation]
+            # Reshape array
+            shape = (nb_stations, nb_steps * nb_obs)
+            array = array.reshape(shape)
+        return np.transpose(array)
 
     def maxima_gev_for_spatial_extremes_package(self, split: Split = Split.all) -> np.ndarray:
         return self.transform_maxima_for_spatial_extreme_package(self.maxima_gev, split)
diff --git a/test/test_spatio_temporal_dataset/test_dataset.py b/test/test_spatio_temporal_dataset/test_dataset.py
index 481314b9..357028fa 100644
--- a/test/test_spatio_temporal_dataset/test_dataset.py
+++ b/test/test_spatio_temporal_dataset/test_dataset.py
@@ -99,21 +99,17 @@ class TestSpatioTemporalDataset(unittest.TestCase):
             coordinate_name=AbstractCoordinates.COORDINATE_X,
             value=-1)
         observation_at_station_0_v1 = self.dataset.observations.df_maxima_gev.loc[ind_station_0].values.flatten()
-
         # Load observation correspond to time 0
         maxima_gev = self.dataset.maxima_gev_for_spatial_extremes_package()
-        self.assertEqual(maxima_gev.shape[1], self.nb_points)
         maxima_gev = np.transpose(maxima_gev)
         self.assertEqual(maxima_gev.shape, (3, 2 * 2))
-        observation_at_time_0_v2 = maxima_gev[1, :]
-        self.assertEqual(len(observation_at_time_0_v2), 4, msg='{}'.format(observation_at_time_0_v2))
+        observation_at_station_0_v2 = maxima_gev[0, :]
+        self.assertEqual(len(observation_at_station_0_v2), 4, msg='{}'.format(observation_at_station_0_v2))
 
         # The order does not really matter here but we check it anyway
-        self.assertTrue(np.equal(observation_at_station_0_v1, observation_at_time_0_v2).all(),
+        self.assertTrue(np.equal(observation_at_station_0_v1, observation_at_station_0_v2).all(),
                         msg='v1={} is different from v2={}'.format(observation_at_station_0_v1,
-                                                                   observation_at_time_0_v2))
-
-        print(self.dataset.maxima_gev_for_spatial_extremes_package())
+                                                                   observation_at_station_0_v2))
 
 
 if __name__ == '__main__':
-- 
GitLab