diff --git a/experiment/meteo_france_data/scm_models_data/abstract_study.py b/experiment/meteo_france_data/scm_models_data/abstract_study.py index 7eebbec1a0958f6fcbf4c9d9633f01a88ce826dc..e856eaf51a16e4af88ac96c4773d637a42222e65 100644 --- a/experiment/meteo_france_data/scm_models_data/abstract_study.py +++ b/experiment/meteo_france_data/scm_models_data/abstract_study.py @@ -275,7 +275,6 @@ class AbstractStudy(object): # ax.scatter(x, y) # ax.text(x, y, massif_name) # Display the center of the massif - print(massif_names) masssif_coordinate_for_display = cls.massifs_coordinates_for_display(massif_names) ax.scatter(masssif_coordinate_for_display.x_coordinates, diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer.py index 37c9706836ad3f78162e7160bf5a3a7ed826f036..c4fbbaaf44da1cd573fc61a26a1568663dc95830 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer.py @@ -115,7 +115,8 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): ax.set_xlabel(xlabel) ax.grid() ax.legend() - ax.set_title(plot_title) + if plot_title is not None: + ax.set_title(plot_title) specific_title = 'Evolution of {} trends (significative or not) wrt to the {} with {}'.format(subtitle, xlabel, self.trend_test_name) @@ -146,7 +147,8 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): axes = [axes] return axes - def visualize_trend_test_repartition(self, reduction_function, axes=None, subtitle='', isin_parameters=None): + def visualize_trend_test_repartition(self, reduction_function, axes=None, subtitle='', isin_parameters=None, + show_or_save_to_file=True, plot_title=None): if axes is None: axes = self.load_axes_for_trend_test_repartition(self.nb_rows) else: @@ -162,12 +164,17 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): epislon = 0.001 * vmax vmin -= epislon vmax += epislon + + if i == 0: + vmin, vmax = 0, 100 for ax, display_trend_type in zip(axes_row, self.display_trend_types): serie = trend_type_to_serie[display_trend_type] massif_to_value = dict(serie) cmap = self.trend_test_class.get_cmap_from_trend_type(display_trend_type) - self.study.visualize_study(ax, massif_to_value, show=False, cmap=cmap, label=None, vmax=vmax, vmin=vmin) - ax.set_title(display_trend_type) + self.study.visualize_study(ax, massif_to_value, show=False, cmap=cmap, label=display_trend_type, + vmax=vmax, vmin=vmin) + if plot_title is not None: + ax.set_title(plot_title) row_title = self.get_title_plot(xlabel='massifs', ax_idx=i) StudyVisualizer.clean_axes_write_title_on_the_left(axes_row, row_title, left_border=None) @@ -175,7 +182,10 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): title = 'Repartition of {} trends (significative or not) with {}'.format(subtitle, self.trend_test_name) title += '\n ' + self.get_title_plot('massifs') plt.suptitle(title) - self.show_or_save_to_file(specific_title=title) + + if show_or_save_to_file: + self.show_or_save_to_file(specific_title=title) + return title def load_axes_for_trend_test_repartition(self, nb_rows): nb_trend_type = len(self.display_trend_type_to_style) @@ -216,16 +226,22 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): level=self.altitude_index_level, add_detailed_plot=add_detailed_plots).items(): last_result = self.visualize_trend_test_evolution(reduction_function=reduction_function, - xlabel=ALTITUDES_XLABEL, - xlabel_values=self.altitudes, axes=axes, marker=marker, - subtitle=subtitle, isin_parameters=isin_parameters, - show_or_save_to_file=show_or_save_to_file, - plot_title=plot_title) + xlabel=ALTITUDES_XLABEL, + xlabel_values=self.altitudes, axes=axes, marker=marker, + subtitle=subtitle, isin_parameters=isin_parameters, + show_or_save_to_file=show_or_save_to_file, + plot_title=plot_title) return last_result - def visualize_massif_trend_test(self, axes=None, add_detailed_plots=False, isin_parameters=None): + def visualize_massif_trend_test(self, axes=None, add_detailed_plots=False, plot_title=None, + isin_parameters=None, + show_or_save_to_file=True): for subtitle, reduction_function in self.subtitle_to_reduction_function(self.index_reduction, level=self.massif_index_level, add_detailed_plot=add_detailed_plots).items(): - self.visualize_trend_test_repartition(reduction_function, axes, subtitle=subtitle, - isin_parameters=isin_parameters) + last_result = self.visualize_trend_test_repartition(reduction_function, axes, subtitle=subtitle, + isin_parameters=isin_parameters, + plot_title=plot_title, + show_or_save_to_file=show_or_save_to_file) + + return last_result diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer_extended.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer_extended.py index 024d060bc8e56b4c5b0fa8c71d612b20398806b7..5e8d220207c30c20b2379d5571125c2b5a4cf572 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer_extended.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/altitude_hypercube_visualizer_extended.py @@ -23,31 +23,61 @@ class AltitudeHypercubeVisualizerExtended(AltitudeHypercubeVisualizer): df_bool = res.transpose() if transpose else res return df_bool + def _visualize_meta(self, visualization_function, loading_function, name_to_isin_parameters=None): + assert name_to_isin_parameters is not None, 'this method should not be called directly' + multiplication_factor = len(name_to_isin_parameters) + all_axes = loading_function(self.nb_rows * multiplication_factor) + specific_title = '' + for j, (name, isin_parameters) in enumerate(name_to_isin_parameters.items()): + axes = all_axes[j::multiplication_factor] + specific_title = visualization_function(axes, plot_title=name, + isin_parameters=isin_parameters, + show_or_save_to_file=False) + self.show_or_save_to_file(specific_title=specific_title) + + # Altitude trends + + def _visualize_altitude_trend_test(self, name_to_isin_parameters=None): + return self._visualize_meta(visualization_function=self.visualize_altitude_trend_test, + loading_function=self.load_trend_test_evolution_axes, + name_to_isin_parameters=name_to_isin_parameters) + + def visualize_altitute_trend_test_by_regions(self): + return self._visualize_altitude_trend_test(name_to_isin_parameters=self.region_name_to_isin_parameters) + @property def region_name_to_isin_parameters(self): return {region_name: [(False, values, self.massif_index_level)] for region_name, values in AbstractExtendedStudy.region_name_to_massif_names.items()} + # Massif trends + + def _visualize_massif_trend_test(self, name_to_isin_parameters=None): + return self._visualize_meta(visualization_function=self.visualize_massif_trend_test, + loading_function=self.load_axes_for_trend_test_repartition, + name_to_isin_parameters=name_to_isin_parameters) + + def visualize_massif_trend_test_by_altitudes(self): + return self._visualize_massif_trend_test(name_to_isin_parameters=self.altitude_band_name_to_isin_parameters) + @property - def nb_regions(self): - return len(self.region_name_to_isin_parameters) + def altitude_band_name_to_values(self): + altitude_band = 1000 + group_idxs = [a // altitude_band for a in self.altitudes] + altitude_band_name_to_values = {'All altitudes': self.altitudes} + for group_idx in set(group_idxs): + values = [a for a, i in zip(self.altitudes, group_idxs) if i == group_idx] + altitude_band_name = '{}m <= altitude <={}m'.format(group_idx * altitude_band, + (group_idx + 1) * altitude_band) + altitude_band_name_to_values[altitude_band_name] = values + return altitude_band_name_to_values + @property def altitude_band_name_to_isin_parameters(self): - return self.altitudes + return {altitude_band_name: [(False, values, self.altitude_index_level)] + for altitude_band_name, values in self.altitude_band_name_to_values.items()} - def visualize_altitute_trend_test_by_regions(self): - return self._visualize_altitude_trend_test(name_to_isin_parameters=self.region_name_to_isin_parameters) - def _visualize_altitude_trend_test(self, name_to_isin_parameters=None): - assert name_to_isin_parameters is not None, 'this method should not be called directly' - multiplication_factor = len(name_to_isin_parameters) - all_axes = self.load_trend_test_evolution_axes(self.nb_rows * multiplication_factor) - specific_title = '' - for j, (name, isin_parameters) in enumerate(name_to_isin_parameters.items()): - axes = all_axes[j::multiplication_factor] - specific_title = self.visualize_altitude_trend_test(axes, plot_title=name, isin_parameters=isin_parameters, show_or_save_to_file=False) - print(specific_title) - self.show_or_save_to_file(specific_title=specific_title) class AltitudeHypercubeVisualizerBisExtended(AltitudeHypercubeVisualizerExtended, AltitudeHypercubeVisualizerBis): diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_hypercube_visualization.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_hypercube_visualization.py index d3df13adf9644592ec75dd7bda86515e2e358965..bc3ba3da48d5750fa1c709ded605e0dfb78bb9f4 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_hypercube_visualization.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_hypercube_visualization.py @@ -116,8 +116,10 @@ def fast_altitude_year_hypercube_extended(): nb_data_reduced_for_speed=nb_data_reduced_for_speed, last_starting_year=last_starting_year) # visualizer.visualize_year_trend_test() - visualizer.visualize_altitude_trend_test() - visualizer.visualize_altitute_trend_test_by_regions() + # visualizer.visualize_altitude_trend_test() + visualizer.visualize_massif_trend_test_by_altitudes() + # visualizer.visualize_massif_trend_test_by_altitudes() + # visualizer.visualize_altitute_trend_test_by_regions() # visualizer.visualize_massif_trend_test() @@ -154,22 +156,24 @@ def full_altitude_year_hypercube_extended(): for study_class in SCM_STUDIES[:1]: for trend_test_class in [GevLocationChangePointTest, GevScaleChangePointTest, GevShapeChangePointTest][:1]: - years = [1967, 1977, 1987, 1997, 2007, None][-2:-1][::-1] + years = [1967, 1977, 1987, 1997, 2007, None][-2:][::-1] for last_starting_year in years: - visualizers = [ - StudyVisualizer(study, temporal_non_stationarity=True, verbose=False, multiprocessing=True) - for study in study_iterator(study_class=study_class, only_first_one=only_first_one, - altitudes=altitudes)] - altitude_to_visualizer = OrderedDict(zip(altitudes, visualizers)) - visualizer = AltitudeHypercubeVisualizerBisExtended(altitude_to_visualizer, - save_to_file=save_to_file, - trend_test_class=trend_test_class, - nb_data_reduced_for_speed=nb_data_reduced_for_speed, - last_starting_year=last_starting_year) - visualizer.visualize_altitute_trend_test_by_regions() - # visualizer.visualize_year_trend_test() - # visualizer.visualize_massif_trend_test() - visualizer.visualize_altitude_trend_test() + for days in [1, 3]: + visualizers = [ + StudyVisualizer(study, temporal_non_stationarity=True, verbose=False, multiprocessing=True) + for study in study_iterator(study_class=study_class, only_first_one=only_first_one, + altitudes=altitudes, nb_consecutive_days=days)] + altitude_to_visualizer = OrderedDict(zip(altitudes, visualizers)) + visualizer = AltitudeHypercubeVisualizerBisExtended(altitude_to_visualizer, + save_to_file=save_to_file, + trend_test_class=trend_test_class, + nb_data_reduced_for_speed=nb_data_reduced_for_speed, + last_starting_year=last_starting_year, + ) + visualizer.visualize_altitute_trend_test_by_regions() + # visualizer.visualize_year_trend_test() + # visualizer.visualize_massif_trend_test() + # visualizer.visualize_altitude_trend_test() def fast_quantity_altitude_hypercube(): @@ -196,9 +200,9 @@ def main_run(): # fast_altitude_hypercube() # fast_altitude_year_hypercube() - # fast_altitude_year_hypercube_extended() + fast_altitude_year_hypercube_extended() # full_altitude_year_hypercube_extended() - full_altitude_year_hypercube() + # full_altitude_year_hypercube() # fast_quantity_altitude_hypercube() # full_quantity_altitude_hypercube() diff --git a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py index cc03044e4f0eafa82e61ab235e512d0ce116d8c2..390a389c70f93ebebe2656764f8e2413e9078171 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py @@ -405,7 +405,7 @@ class StudyVisualizer(VisualizationParameters): self.starting_years_for_change_point_test = starting_years_for_change_point_test self.nb_massif_for_change_point_test = nb_massif_for_change_point_test else: - # Check that the argument are the same + # Check that the argument are the same assert self.trend_test_class_for_change_point_test == trend_test_class_for_change_point_test assert self.starting_years == starting_years_for_change_point_test assert self.nb_massif_for_change_point_test == nb_massif_for_change_point_test @@ -421,11 +421,13 @@ class StudyVisualizer(VisualizationParameters): years, smooth_maxima = self.smooth_maxima_x_y(massif_id) gev_change_point_test_results = compute_gev_change_point_test_results(self.multiprocessing, smooth_maxima, self.starting_years_for_change_point_test, - self.trend_test_class_for_change_point_test, years) + self.trend_test_class_for_change_point_test, + years) massif_name_to_gev_change_point_test_results[massif_name] = gev_change_point_test_results return massif_name_to_gev_change_point_test_results - def df_trend_spatio_temporal(self, trend_test_class_for_change_point_test, starting_years_for_change_point_test, + def df_trend_spatio_temporal(self, trend_test_class_for_change_point_test, + starting_years_for_change_point_test, nb_massif_for_change_point_test=None): """ Index are the massif @@ -435,12 +437,11 @@ class StudyVisualizer(VisualizationParameters): :param starting_year_to_weight: :return: """ - # Set the attributes - massif_name_to_trend_res = {} - massif_name_to_gev_change_point_test_results = self.massif_name_to_gev_change_point_test_results(trend_test_class_for_change_point_test, - starting_years_for_change_point_test, - nb_massif_for_change_point_test) + massif_name_to_gev_change_point_test_results = self.massif_name_to_gev_change_point_test_results( + trend_test_class_for_change_point_test, + starting_years_for_change_point_test, + nb_massif_for_change_point_test) for massif_name, gev_change_point_test_results in massif_name_to_gev_change_point_test_results.items(): trend_test_res, best_idxs = gev_change_point_test_results trend_test_res = [(a, b) if i in best_idxs else (np.nan, np.nan) diff --git a/test/test_experiment/test_hypercube.py b/test/test_experiment/test_hypercube.py index 845102aeef2a9fb58a855ea02baf0f171339ec6e..117fe8a3db2cacfa7d859c62295cd66e04c9e229 100644 --- a/test/test_experiment/test_hypercube.py +++ b/test/test_experiment/test_hypercube.py @@ -17,7 +17,7 @@ from extreme_estimator.extreme_models.utils import set_seed_for_test class TestHypercube(unittest.TestCase): - DISPLAY = True + DISPLAY = False def setUp(self) -> None: set_seed_for_test(42)