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