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 730df279670e4d0585cb33716b5bc9b0a52cf4c7..80b4737ee43ab360c4e9ddb522e8e6c0005342a3 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 @@ -19,8 +19,10 @@ class AbstractHypercubeVisualizer(object): def __init__(self, tuple_to_study_visualizer: Dict[Tuple, StudyVisualizer], trend_test_class, nb_data_reduced_for_speed=False, - save_to_file=False): + save_to_file=False, + nb_top_likelihood_values=1): 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] @@ -33,7 +35,7 @@ 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.nb_data_for_fast_mode is not None: starting_years = starting_years[:self.nb_data_for_fast_mode] return starting_years @@ -44,7 +46,8 @@ class AbstractHypercubeVisualizer(object): @cached_property def df_trends_spatio_temporal(self): return [study_visualizer.df_trend_spatio_temporal(self.trend_test_class, self.starting_years, - self.nb_data_for_fast_mode) + self.nb_data_for_fast_mode, + self.nb_top_likelihood_values) for study_visualizer in self.tuple_to_study_visualizer.values()] @cached_property 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 57500696093b72f373a5aa589677212a54a06ef4..fcca15b5827cd205364b8c3b65cd45492f231d97 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 @@ -85,7 +85,8 @@ def fast_altitude_year_hypercube(): 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) + 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() diff --git a/experiment/meteo_france_data/visualization/study_visualization/study_visualizer.py b/experiment/meteo_france_data/visualization/study_visualization/study_visualizer.py index a91ea95408ed81ed6b89e656b9fd6bbd4132c847..a50338a70dd3872307260aa12f9be7521d94803c 100644 --- a/experiment/meteo_france_data/visualization/study_visualization/study_visualizer.py +++ b/experiment/meteo_france_data/visualization/study_visualization/study_visualizer.py @@ -385,7 +385,8 @@ class StudyVisualizer(object): massif_name_to_df_trend_type[massif_name] = df return massif_name_to_df_trend_type - def df_trend_spatio_temporal(self, trend_test_class, starting_years, nb_massif_for_fast_mode=None): + def df_trend_spatio_temporal(self, trend_test_class, starting_years, nb_massif_for_fast_mode=None, + nb_top_likelihood_values=1): """ Index are the massif Columns are the starting year @@ -411,9 +412,13 @@ class StudyVisualizer(object): for starting_year in starting_years] # Keep only the most likely starting year # (set all the other data to np.nan so that they will not be taken into account in mean function) - best_idx = np.argmax(trend_test_res, axis=0)[-1] - trend_test_res = [(a, b) if i == best_idx else (np.nan, np.nan) - for i, (a, b, _) in enumerate(trend_test_res)] + best_idx = list(np.argmax(trend_test_res, axis=0))[2] + # print(best_idx, trend_test_res) + best_idxs = [best_idx] + # todo: by doing a sorting on the deviance, I could get the nb_top_likelihood_values values + # best_idxs = list(np.argmax(trend_test_res, axis=0))[-nb_top_likelihood_values:] + trend_test_res = [(a, b) if i in best_idxs else (np.nan, np.nan) + for i, (a, b, *_) in enumerate(trend_test_res)] massif_name_to_trend_res[massif_name] = list(zip(*trend_test_res)) nb_res = len(list(massif_name_to_trend_res.values())[0]) assert nb_res == 2 @@ -426,7 +431,7 @@ class StudyVisualizer(object): def compute_gev_change_point_test_result(smooth_maxima, starting_year, trend_test_class, years): trend_test = trend_test_class(years, smooth_maxima, starting_year) # type: AbstractGevChangePointTest assert isinstance(trend_test, AbstractGevChangePointTest) - return trend_test.test_trend_type, trend_test.test_trend_strength, trend_test.non_stationary_nllh + return trend_test.test_trend_type, trend_test.test_trend_strength, trend_test.non_stationary_nllh, trend_test.non_stationary_deviance, trend_test.stationary_deviance @staticmethod def compute_trend_test_result(smooth_maxima, starting_year, trend_test_class, years): diff --git a/experiment/trend_analysis/univariate_test/abstract_gev_change_point_test.py b/experiment/trend_analysis/univariate_test/abstract_gev_change_point_test.py index c326ac2d146e6ec6e94e810ea011c5126f7485ac..9348e9baefc1736d7bca4b00778debb032d078ae 100644 --- a/experiment/trend_analysis/univariate_test/abstract_gev_change_point_test.py +++ b/experiment/trend_analysis/univariate_test/abstract_gev_change_point_test.py @@ -57,8 +57,7 @@ class AbstractGevChangePointTest(AbstractUnivariateTest): @property def likelihood_ratio(self): - return 2 * (self.non_stationary_estimator.result_from_fit.deviance - - self.stationary_estimator.result_from_fit.deviance) + return 2 * (self.non_stationary_deviance - self.stationary_deviance) @property def non_stationary_nllh(self): @@ -67,6 +66,14 @@ class AbstractGevChangePointTest(AbstractUnivariateTest): else: return self.non_stationary_estimator.result_from_fit.nllh + @property + def stationary_deviance(self): + return self.stationary_estimator.result_from_fit.deviance + + @property + def non_stationary_deviance(self): + return self.non_stationary_estimator.result_from_fit.deviance + @property def is_significant(self) -> bool: return self.likelihood_ratio > chi2.ppf(q=1 - self.SIGNIFICANCE_LEVEL, df=1)