diff --git a/experiment/meteo_france_data/visualization/hypercube_visualization/abstract_hypercube_visualizer.py b/experiment/meteo_france_data/visualization/hypercube_visualization/abstract_hypercube_visualizer.py index 80b4737ee43ab360c4e9ddb522e8e6c0005342a3..d8eadaaed3570b701396d3ae29b3d3ebbf179ef5 100644 --- a/experiment/meteo_france_data/visualization/hypercube_visualization/abstract_hypercube_visualizer.py +++ b/experiment/meteo_france_data/visualization/hypercube_visualization/abstract_hypercube_visualizer.py @@ -20,12 +20,18 @@ class AbstractHypercubeVisualizer(object): trend_test_class, nb_data_reduced_for_speed=False, save_to_file=False, - nb_top_likelihood_values=1): + nb_top_likelihood_values=1, + last_starting_year=None): + self.last_starting_year = last_starting_year self.nb_data_for_fast_mode = 7 if nb_data_reduced_for_speed else None self.nb_top_likelihood_values = nb_top_likelihood_values self.save_to_file = save_to_file self.trend_test_class = trend_test_class self.tuple_to_study_visualizer = tuple_to_study_visualizer # type: Dict[Tuple, StudyVisualizer] + print('Hypercube with parameters:') + print(self.last_starting_year) + print(self.trend_test_class) + # print(self.nb_data_for_fast_mode) # Main attributes defining the hypercube @@ -35,7 +41,9 @@ class AbstractHypercubeVisualizer(object): @cached_property def starting_years(self): - starting_years = self.study_visualizer.starting_years[:] + starting_years = self.study_visualizer.starting_years + if self.last_starting_year is not None: + starting_years = [year for year in starting_years if year <= self.last_starting_year] if self.nb_data_for_fast_mode is not None: starting_years = starting_years[:self.nb_data_for_fast_mode] return starting_years @@ -86,9 +94,3 @@ class AbstractHypercubeVisualizer(object): @property def study(self): return self.study_visualizer.study - - @property - def starting_year_to_weights(self): - # Load uniform weights by default - uniform_weight = 1 / len(self.starting_years) - return {year: uniform_weight for year in self.starting_years} diff --git a/experiment/meteo_france_data/visualization/hypercube_visualization/altitude_hypercube_visualizer.py b/experiment/meteo_france_data/visualization/hypercube_visualization/altitude_hypercube_visualizer.py index 650553fe2530dac101e8a9c2f00b3a969f9c99ea..c546a14eda2ab6cbafa9c9da531fe2999d86f1ee 100644 --- a/experiment/meteo_france_data/visualization/hypercube_visualization/altitude_hypercube_visualizer.py +++ b/experiment/meteo_france_data/visualization/hypercube_visualization/altitude_hypercube_visualizer.py @@ -1,3 +1,5 @@ +from typing import List + import matplotlib.pyplot as plt import numpy as np import pandas as pd @@ -33,8 +35,10 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): def trend_type_to_series(self, reduction_function): # Map each trend type to its serie with percentages - return {display_trend_type: self.trend_type_reduction(reduction_function, display_trend_type)[0] - for display_trend_type in self.display_trend_types} + # Define here all the trend type we might need in the results/displays + trend_types_to_process = list(self.display_trend_types) + [AbstractUnivariateTest.SIGNIFICATIVE_ALL_TREND] + return {trend_type: self.trend_type_reduction(reduction_function, trend_type)[0] + for trend_type in trend_types_to_process} def trend_type_reduction(self, reduction_function, display_trend_type): # Reduce df_bool df to a serie s_trend_type_percentage @@ -53,10 +57,12 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): def subtitle_to_reduction_function(self, reduction_function, level=None, add_detailed_plot=False, subtitle=None): def reduction_function_with_level(df_bool, **kwargs): - return reduction_function(df_bool, **kwargs) if level is None else reduction_function(df_bool, level, **kwargs) + return reduction_function(df_bool, **kwargs) if level is None else reduction_function(df_bool, level, + **kwargs) if subtitle is None: - subtitle = self.study.variable_name + subtitle = self.study.variable_name[:5] + return {subtitle: reduction_function_with_level} def get_title_plot(self, xlabel, ax_idx=None): @@ -71,6 +77,7 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): if xlabel != 'starting years': labels.remove('starting years') common_txt = 'averaged on {}'.format(' & '.join(labels)) + common_txt += 'with any starting year <= {}'.format(str(self.last_starting_year)) return common_txt def visualize_trend_test_evolution(self, reduction_function, xlabel, xlabel_values, axes=None, marker='o', @@ -82,10 +89,10 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): trend_type_to_series = self.trend_type_to_series(reduction_function) for ax_idx, ax in enumerate(axes): - for trend_type in self.display_trend_types: - style = self.display_trend_type_to_style[trend_type] - percentages_values = trend_type_to_series[trend_type][ax_idx] - ax.plot(xlabel_values, percentages_values, style + marker, label=trend_type) + for display_trend_type in self.display_trend_types: + style = self.display_trend_type_to_style[display_trend_type] + percentages_values = trend_type_to_series[display_trend_type][ax_idx] + ax.plot(xlabel_values, percentages_values, style + marker, label=display_trend_type) if ax_idx == 0: # Global information @@ -104,11 +111,25 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): ax.grid() ax.legend() - title = 'Evolution of {} trends (significative or not) wrt to the {} with {}'.format(subtitle, xlabel, - self.trend_test_name) - title += '\n ' + self.get_title_plot(xlabel) - plt.suptitle(title) - self.show_or_save_to_file(specific_title=title) + specific_title = 'Evolution of {} trends (significative or not) wrt to the {} with {}'.format(subtitle, xlabel, + self.trend_test_name) + specific_title += '\n ' + self.get_title_plot(xlabel) + + # Figure title + specific_title += '\n' + + trend_types = [AbstractUnivariateTest.SIGNIFICATIVE_ALL_TREND, + AbstractUnivariateTest.SIGNIFICATIVE_POSITIVE_TREND, + AbstractUnivariateTest.SIGNIFICATIVE_NEGATIVE_TREND] + series = [trend_type_to_series[trend_type][0] for trend_type in trend_types] + percents = [serie.sum() if xlabel == STARTING_YEARS_XLABEL else serie.mean() for serie in series] + percents = [round(p) for p in percents] + + specific_title += 'Total ' if xlabel == STARTING_YEARS_XLABEL else 'Mean ' + specific_title += 'of significative trends: {} (+:{} -{})'.format(*percents) + plt.suptitle(specific_title) + + self.show_or_save_to_file(specific_title=specific_title) def visualize_trend_test_repartition(self, reduction_function, axes=None, subtitle=''): if axes is None: @@ -116,16 +137,21 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): fig, axes = plt.subplots(self.nb_axes, nb_trend_type, figsize=self.study_visualizer.figsize) for i, axes_row in enumerate(axes): - trend_type_to_serie = {k: v[i] for k, v in self.trend_type_to_series(reduction_function).items()} + trend_type_to_serie = {k: v[i].replace(0.0, np.nan) for k, v in + self.trend_type_to_series(reduction_function).items()} vmax = max([s.max() for s in trend_type_to_serie.values()]) vmin = min([s.min() for s in trend_type_to_serie.values()]) vmax = max(vmax, 0.01) - for ax, trend_type in zip(axes_row, self.display_trend_types): - serie = trend_type_to_serie[trend_type] + if vmin == vmax: + epislon = 0.001 * vmax + vmin -= epislon + vmax += epislon + 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(trend_type) + 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(trend_type) + ax.set_title(display_trend_type) 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) diff --git a/experiment/meteo_france_data/visualization/hypercube_visualization/main_hypercube_visualization.py b/experiment/meteo_france_data/visualization/hypercube_visualization/main_hypercube_visualization.py index fcca15b5827cd205364b8c3b65cd45492f231d97..9f0c8daf07c4f4753f52098ce2b3b795b6a86c46 100644 --- a/experiment/meteo_france_data/visualization/hypercube_visualization/main_hypercube_visualization.py +++ b/experiment/meteo_france_data/visualization/hypercube_visualization/main_hypercube_visualization.py @@ -16,22 +16,22 @@ from experiment.trend_analysis.univariate_test.abstract_gev_change_point_test im from utils import get_display_name_from_object_type -# def full_trends_with_altitude_hypercube(): -# save_to_file = True -# only_first_one = False -# fast = False -# altitudes = ALL_ALTITUDES[3:-6] -# for study_class in SCM_STUDIES[:]: -# for trend_test_class in [MannKendallTrendTest, GevLocationTrendTest, GevScaleTrendTest, GevShapeTrendTest][:]: -# 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 = AltitudeHypercubeVisualizer(altitude_to_visualizer, save_to_file=save_to_file, -# trend_test_class=trend_test_class, fast=fast) -# visualizer.visualize_massif_trend_test() -# visualizer.visualize_year_trend_test() -# visualizer.visualize_altitude_trend_test() +def full_trends_with_altitude_hypercube(): + save_to_file = True + only_first_one = False + fast = False + altitudes = ALL_ALTITUDES[3:-6] + for study_class in SCM_STUDIES[:1]: + for trend_test_class in [GevLocationChangePointTest, GevScaleChangePointTest, GevShapeChangePointTest][:1]: + 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 = AltitudeHypercubeVisualizer(altitude_to_visualizer, save_to_file=save_to_file, + trend_test_class=trend_test_class, nb_data_reduced_for_speed=False) + visualizer.visualize_massif_trend_test() + visualizer.visualize_year_trend_test() + visualizer.visualize_altitude_trend_test() def full_quantity_altitude_hypercube(): @@ -59,37 +59,39 @@ def fast_altitude_hypercube(): save_to_file = False only_first_one = False fast = True - altitudes = ALL_ALTITUDES[2:4] + altitudes = [ALL_ALTITUDES[3], ALL_ALTITUDES[-7]] for study_class in SCM_STUDIES[:1]: - for trend_test_class in [GevLocationChangePointTest, GevScaleChangePointTest, GevShapeChangePointTest][1:2]: + for trend_test_class in [GevLocationChangePointTest, GevScaleChangePointTest, GevShapeChangePointTest][:1]: 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 = AltitudeHypercubeVisualizer(altitude_to_visualizer, save_to_file=save_to_file, - trend_test_class=trend_test_class, fast=fast) + trend_test_class=trend_test_class, nb_data_reduced_for_speed=fast) # visualizer.visualize_year_trend_test() # visualizer.visualize_massif_trend_test() visualizer.visualize_altitude_trend_test() def fast_altitude_year_hypercube(): - save_to_file = False + save_to_file = True only_first_one = False nb_data_reduced_for_speed = True altitudes = [ALL_ALTITUDES[3], ALL_ALTITUDES[-7]] for study_class in SCM_STUDIES[:1]: - for trend_test_class in [GevLocationChangePointTest, GevScaleChangePointTest, GevShapeChangePointTest][:1]: - 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 = Altitude_Hypercube_Year_Visualizer(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) - visualizer.visualize_year_trend_test() - # visualizer.visualize_altitude_trend_test() - # visualizer.visualize_massif_trend_test() + for last_starting_year in [1989, 1999]: + for trend_test_class in [GevLocationChangePointTest, GevScaleChangePointTest, GevShapeChangePointTest][:1]: + 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 = Altitude_Hypercube_Year_Visualizer(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_year_trend_test() + visualizer.visualize_altitude_trend_test() + visualizer.visualize_massif_trend_test() def full_altitude_year_hypercube(): @@ -100,17 +102,19 @@ def full_altitude_year_hypercube(): for study_class in SCM_STUDIES[:1]: for trend_test_class in [GevLocationChangePointTest, GevScaleChangePointTest, GevShapeChangePointTest][:1]: - 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 = Altitude_Hypercube_Year_Visualizer(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) - visualizer.visualize_year_trend_test() - visualizer.visualize_massif_trend_test() - visualizer.visualize_altitude_trend_test() + for last_starting_year in [1967, 1977, 1987, 1997, 2007, None]: + 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 = Altitude_Hypercube_Year_Visualizer(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_year_trend_test() + visualizer.visualize_massif_trend_test() + visualizer.visualize_altitude_trend_test() def fast_quantity_altitude_hypercube():