From 4b3349caf4f2bf7d40f03620fd942525d9afa36d Mon Sep 17 00:00:00 2001 From: Le Roux Erwan <erwan.le-roux@irstea.fr> Date: Wed, 12 Feb 2020 14:06:07 +0100 Subject: [PATCH] [paper 1] add trend_test_analysis. modify a property into a classproperty --- .../abstract_gev_trend_test.py | 4 ++-- .../gumbel_trend_test_one_parameter.py | 16 ++++++++-------- .../gev_trend_test_three_parameters.py | 4 ++-- .../gev_trend_test_two_parameters.py | 8 ++++---- .../gumbel_test_two_parameters.py | 4 ++-- .../shape/main_shape_repartition.py | 3 ++- .../study_visualizer_for_shape_repartition.py | 2 +- papers/exceeding_snow_loads/paper_utils.py | 19 ++++++++++++++++--- ...dy_visualizer_for_non_stationary_trends.py | 12 ++++-------- test/test_experiment/test_trend_analysis.py | 16 ++++++++++++++++ 10 files changed, 57 insertions(+), 31 deletions(-) create mode 100644 test/test_experiment/test_trend_analysis.py diff --git a/experiment/trend_analysis/univariate_test/extreme_trend_test/abstract_gev_trend_test.py b/experiment/trend_analysis/univariate_test/extreme_trend_test/abstract_gev_trend_test.py index ff001c28..c6040667 100644 --- a/experiment/trend_analysis/univariate_test/extreme_trend_test/abstract_gev_trend_test.py +++ b/experiment/trend_analysis/univariate_test/extreme_trend_test/abstract_gev_trend_test.py @@ -88,8 +88,8 @@ class AbstractGevTrendTest(AbstractUnivariateTest): def degree_freedom_chi2(self) -> int: raise NotImplementedError - @property - def total_number_of_parameters_for_unconstrained_model(self) -> int: + @classproperty + def total_number_of_parameters_for_unconstrained_model(cls) -> int: raise NotImplementedError @property diff --git a/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_one_parameter/gumbel_trend_test_one_parameter.py b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_one_parameter/gumbel_trend_test_one_parameter.py index d6e1ba53..cf2fcdb3 100644 --- a/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_one_parameter/gumbel_trend_test_one_parameter.py +++ b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_one_parameter/gumbel_trend_test_one_parameter.py @@ -23,8 +23,8 @@ class GumbelVersusGumbel(GevTrendTestOneParameter): def is_significant(self) -> bool: return False - @property - def total_number_of_parameters_for_unconstrained_model(self) -> int: + @classproperty + def total_number_of_parameters_for_unconstrained_model(cls) -> int: return 2 @classproperty @@ -49,8 +49,8 @@ class GevStationaryVersusGumbel(GevTrendTestOneParameter): quantile_level=quantile_level, fit_method=fit_method) - @property - def total_number_of_parameters_for_unconstrained_model(self) -> int: + @classproperty + def total_number_of_parameters_for_unconstrained_model(cls) -> int: return 3 def _slope_strength(self): @@ -74,8 +74,8 @@ class GumbelLocationTrendTest(GevTrendTestOneParameterAgainstStationary): quantile_level=quantile_level, constrained_model_class=GumbelTemporalModel, fit_method=fit_method) - @property - def total_number_of_parameters_for_unconstrained_model(self) -> int: + @classproperty + def total_number_of_parameters_for_unconstrained_model(cls) -> int: return 3 def _slope_strength(self): @@ -107,8 +107,8 @@ class GumbelScaleTrendTest(GevTrendTestOneParameterAgainstStationary): p=self.quantile_level, sigma1=self.non_stationary_linear_coef) - @property - def total_number_of_parameters_for_unconstrained_model(self) -> int: + @classproperty + def total_number_of_parameters_for_unconstrained_model(cls) -> int: return 3 @classproperty diff --git a/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_three_parameters/gev_trend_test_three_parameters.py b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_three_parameters/gev_trend_test_three_parameters.py index 9f9a7bbb..d552869b 100644 --- a/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_three_parameters/gev_trend_test_three_parameters.py +++ b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_three_parameters/gev_trend_test_three_parameters.py @@ -50,6 +50,6 @@ class GevLocationAndScaleTrendTestAgainstGumbel(GevTrendTestThreeParameters): def marker(self): return 'D' - @property - def total_number_of_parameters_for_unconstrained_model(self) -> int: + @classproperty + def total_number_of_parameters_for_unconstrained_model(cls) -> int: return 5 \ No newline at end of file diff --git a/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_two_parameters/gev_trend_test_two_parameters.py b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_two_parameters/gev_trend_test_two_parameters.py index 56c93e8c..265babf9 100644 --- a/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_two_parameters/gev_trend_test_two_parameters.py +++ b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_two_parameters/gev_trend_test_two_parameters.py @@ -65,8 +65,8 @@ class GevLocationAgainstGumbel(GevTrendTestTwoParameters, GevLocationTrendTest): def marker(self): return 'o' - @property - def total_number_of_parameters_for_unconstrained_model(self) -> int: + @classproperty + def total_number_of_parameters_for_unconstrained_model(cls) -> int: return 4 @@ -83,6 +83,6 @@ class GevScaleAgainstGumbel(GevTrendTestTwoParameters, GevScaleTrendTest): def marker(self): return '^' - @property - def total_number_of_parameters_for_unconstrained_model(self) -> int: + @classproperty + def total_number_of_parameters_for_unconstrained_model(cls) -> int: return 4 diff --git a/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_two_parameters/gumbel_test_two_parameters.py b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_two_parameters/gumbel_test_two_parameters.py index d21fdb7f..975f90ce 100644 --- a/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_two_parameters/gumbel_test_two_parameters.py +++ b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_two_parameters/gumbel_test_two_parameters.py @@ -18,8 +18,8 @@ class GumbelLocationAndScaleTrendTest(GevTrendTestTwoParameters): quantile_level=quantile_level, fit_method=fit_method) - @property - def total_number_of_parameters_for_unconstrained_model(self) -> int: + @classproperty + def total_number_of_parameters_for_unconstrained_model(cls) -> int: return 4 @property diff --git a/papers/exceeding_snow_loads/check_mle_convergence_for_trends/shape/main_shape_repartition.py b/papers/exceeding_snow_loads/check_mle_convergence_for_trends/shape/main_shape_repartition.py index d9344122..846d1aae 100644 --- a/papers/exceeding_snow_loads/check_mle_convergence_for_trends/shape/main_shape_repartition.py +++ b/papers/exceeding_snow_loads/check_mle_convergence_for_trends/shape/main_shape_repartition.py @@ -2,6 +2,7 @@ from experiment.meteo_france_data.scm_models_data.crocus.crocus import CrocusSno from papers.exceeding_snow_loads.check_mle_convergence_for_trends.shape.study_visualizer_for_shape_repartition import \ StudyVisualizerForShape from papers.exceeding_snow_loads.paper_main_utils import load_altitude_to_visualizer +from papers.exceeding_snow_loads.paper_utils import paper_altitudes def main_shape_repartition(altitudes, massif_names=None, @@ -28,6 +29,6 @@ if __name__ == '__main__': # main_shape_repartition([900], save_to_file=False) # main_shape_repartition([900, 1800, 2700]) # main_shape_repartition([300, 600, 900, 1200, 1500, 1800, 2700]) - main_shape_repartition([900, 1800, 2700], study_visualizer_class=StudyVisualizerForShape, save_to_file=True) + main_shape_repartition(paper_altitudes, study_visualizer_class=StudyVisualizerForShape, save_to_file=True) # main_shape_repartition([300, 600, 900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600, 3900, 4200], # study_visualizer_class=StudyVisualizerForShape, save_to_file=True) diff --git a/papers/exceeding_snow_loads/check_mle_convergence_for_trends/shape/study_visualizer_for_shape_repartition.py b/papers/exceeding_snow_loads/check_mle_convergence_for_trends/shape/study_visualizer_for_shape_repartition.py index 56de999a..59d377f7 100644 --- a/papers/exceeding_snow_loads/check_mle_convergence_for_trends/shape/study_visualizer_for_shape_repartition.py +++ b/papers/exceeding_snow_loads/check_mle_convergence_for_trends/shape/study_visualizer_for_shape_repartition.py @@ -3,7 +3,7 @@ from cached_property import cached_property from experiment.meteo_france_data.plot.create_shifted_cmap import get_shifted_map from experiment.meteo_france_data.scm_models_data.abstract_study import AbstractStudy -from experiment.exceeding_snow_loads.study_visualizer_for_non_stationary_trends import \ +from papers.exceeding_snow_loads.study_visualizer_for_non_stationary_trends import \ StudyVisualizerForNonStationaryTrends from experiment.trend_analysis.abstract_score import MeanScore diff --git a/papers/exceeding_snow_loads/paper_utils.py b/papers/exceeding_snow_loads/paper_utils.py index 5a45a996..801febc0 100644 --- a/papers/exceeding_snow_loads/paper_utils.py +++ b/papers/exceeding_snow_loads/paper_utils.py @@ -4,18 +4,31 @@ from experiment.meteo_france_data.scm_models_data.crocus.crocus import CrocusSno CrocusSnowLoad3Days from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.main_study_visualizer import \ ALL_ALTITUDES_WITHOUT_NAN +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter.gumbel_trend_test_one_parameter import \ + GumbelVersusGumbel, GumbelLocationTrendTest, GumbelScaleTrendTest, GevStationaryVersusGumbel +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_three_parameters.gev_trend_test_three_parameters import \ + GevLocationAndScaleTrendTestAgainstGumbel +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_two_parameters.gev_trend_test_two_parameters import \ + GevLocationAgainstGumbel, GevScaleAgainstGumbel +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_two_parameters.gumbel_test_two_parameters import \ + GumbelLocationAndScaleTrendTest from root_utils import get_display_name_from_object_type paper_altitudes = ALL_ALTITUDES_WITHOUT_NAN paper_study_classes = [CrocusSnowLoadTotal, CrocusSnowLoadEurocode, CrocusSnowLoad3Days][:2] # dpi_paper1_figure = 700 dpi_paper1_figure = None +NON_STATIONARY_TREND_TEST_PAPER = [GumbelVersusGumbel, + GumbelLocationTrendTest, GumbelScaleTrendTest, + GumbelLocationAndScaleTrendTest, + GevStationaryVersusGumbel, + GevLocationAgainstGumbel, GevScaleAgainstGumbel, + GevLocationAndScaleTrendTestAgainstGumbel] + + class ModelSubsetForUncertainty(Enum): stationary_gumbel = 0 stationary_gumbel_and_gev = 1 non_stationary_gumbel = 2 non_stationary_gumbel_and_gev = 3 - - - diff --git a/papers/exceeding_snow_loads/study_visualizer_for_non_stationary_trends.py b/papers/exceeding_snow_loads/study_visualizer_for_non_stationary_trends.py index 7a81fbe2..34be0609 100644 --- a/papers/exceeding_snow_loads/study_visualizer_for_non_stationary_trends.py +++ b/papers/exceeding_snow_loads/study_visualizer_for_non_stationary_trends.py @@ -16,7 +16,7 @@ from experiment.meteo_france_data.scm_models_data.visualization.study_visualizat StudyVisualizer from papers.exceeding_snow_loads.check_mcmc_convergence_for_return_levels.gelman_convergence_test import \ compute_gelman_convergence_value -from papers.exceeding_snow_loads.paper_utils import ModelSubsetForUncertainty +from papers.exceeding_snow_loads.paper_utils import ModelSubsetForUncertainty, NON_STATIONARY_TREND_TEST_PAPER from experiment.trend_analysis.abstract_score import MeanScore from experiment.trend_analysis.univariate_test.extreme_trend_test.abstract_gev_trend_test import AbstractGevTrendTest from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter.gumbel_trend_test_one_parameter import \ @@ -76,12 +76,7 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer): self.uncertainty_massif_names = self.study.study_massif_names if self.non_stationary_trend_test_to_marker is None: # Assign default argument for the non stationary trends - self.non_stationary_trend_test = [GumbelVersusGumbel, - GumbelLocationTrendTest, GumbelScaleTrendTest, - GumbelLocationAndScaleTrendTest, - GevStationaryVersusGumbel, - GevLocationAgainstGumbel, GevScaleAgainstGumbel, - GevLocationAndScaleTrendTestAgainstGumbel] + self.non_stationary_trend_test = NON_STATIONARY_TREND_TEST_PAPER self.non_stationary_trend_test_to_marker = {t: t.marker for t in self.non_stationary_trend_test} else: self.non_stationary_trend_test = list(self.non_stationary_trend_test_to_marker.keys()) @@ -284,7 +279,8 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer): @cached_property def selected_and_significative_trend_test_class_counter(self): - return Counter([type(t) for t in self.massif_name_to_trend_test_that_minimized_aic.values() if t.is_significant]) + return Counter( + [type(t) for t in self.massif_name_to_trend_test_that_minimized_aic.values() if t.is_significant]) @cached_property def massif_name_to_marker_style(self): diff --git a/test/test_experiment/test_trend_analysis.py b/test/test_experiment/test_trend_analysis.py new file mode 100644 index 00000000..81fba150 --- /dev/null +++ b/test/test_experiment/test_trend_analysis.py @@ -0,0 +1,16 @@ +import unittest + +from papers.exceeding_snow_loads.paper_utils import NON_STATIONARY_TREND_TEST_PAPER + + +class TestTrendAnalysis(unittest.TestCase): + + def test_nb_parameters(self): + trend_test_classes = NON_STATIONARY_TREND_TEST_PAPER + nb_expected = [2, 3, 3, 4, 3, 4, 4, 5] + for trend_test_class, nb in zip(trend_test_classes, nb_expected): + self.assertEqual(trend_test_class.total_number_of_parameters_for_unconstrained_model, nb) + + +if __name__ == '__main__': + unittest.main() -- GitLab