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