diff --git a/experiment/meteo_france_SCM_study/abstract_study.py b/experiment/meteo_france_SCM_study/abstract_study.py index f29b6a5a86361430521e1fd21b9018f0c036bd13..ab121ceae9e346cd05fa2a96c4f0ab0a8746d49d 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 818c4be0fca4861c81466c94f7dd1bd2e55e51d9..0abcf0e6a57a32c0db5e673329a17e469373c2c4 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 889fd80a79dda28c06ae5d76e16612969aff8fe6..77050e97f29b6436d3476a0b50f3f5ac7aba81d0 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 457bf951c39b239365c94d928d588b2ff0f4e1a8..f479d985a732b276d434425012f47a34fb6eac90 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 b3bf403983c30f8fbaf54e6d3e9bb30b117d4a25..e81aea16c5297a129ab98aef69fd17ec158be94d 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 30e241a14872e726bdc2a8330d1e28e0c1f6e5e6..92e6ed424a7133b0557f2578dcf9154260b2e38b 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 2dbb64761a2e303a5c0dc1dcb6792b856399c68c..91add0b4b0801a531c2fdee42189435ea8d9f2e5 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 481314b90cbeed5c4831506d2c6ef9d6ebfe38cb..357028fa8200282d6d21806190e11e090179c810 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__':