From f10e815593cc9538db5607d0d141310f6908f963 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Mon, 25 Nov 2019 13:34:55 +0100
Subject: [PATCH] [PAPER 1] taking into account psnow when computing TDRL and
 also when computing return level uncertainties

---
 .../altitude_hypercube_visualizer.py          |  2 +-
 .../eurocode_visualizer.py                    | 45 +++++++++++--------
 .../main_result_trends_and_return_levels.py   | 14 +++---
 ...dy_visualizer_for_non_stationary_trends.py | 10 +++--
 ...bstract_comparison_non_stationary_model.py | 11 +++--
 .../abstract_gev_trend_test.py                | 12 ++---
 .../gev_trend_test_one_parameter.py           | 33 +++++++++-----
 .../gev_trend_test_two_parameters.py          | 13 +++---
 extreme_fit/distribution/gev/gev_params.py    |  3 +-
 .../abstract_extract_eurocode_return_level.py | 12 ++---
 .../abstract_result_from_extremes.py          |  4 +-
 .../eurocode_return_level_uncertainties.py    | 17 ++++---
 .../result_from_bayesian_extremes.py          |  4 +-
 .../result_from_mle_extremes.py               |  4 +-
 14 files changed, 107 insertions(+), 77 deletions(-)

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 d918abe9..ae0e5389 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
@@ -396,7 +396,7 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer):
             title += ' until starting_year={}'.format(self.last_starting_year)
         title += ' with {} test'.format(get_display_name_from_object_type(self.trend_test_class))
         if first_title:
-            title += '\nEvolution of the quantile {} every {} years'.format(AbstractGevTrendTest.quantile_for_strength,
+            title += '\nEvolution of the Eurocode quantile every {} years'.format(
                                                                             AbstractGevTrendTest.nb_years_for_quantile_evolution)
         else:
             title += '\nStarting years'
diff --git a/experiment/paper_past_snow_loads/result_trends_and_return_levels/eurocode_visualizer.py b/experiment/paper_past_snow_loads/result_trends_and_return_levels/eurocode_visualizer.py
index 78bd644d..fcf66c6f 100644
--- a/experiment/paper_past_snow_loads/result_trends_and_return_levels/eurocode_visualizer.py
+++ b/experiment/paper_past_snow_loads/result_trends_and_return_levels/eurocode_visualizer.py
@@ -108,25 +108,10 @@ def plot_single_uncertainty_massif_and_non_stationary_context(ax, massif_name, n
         if j == 0:
             eurocode_region.plot_eurocode_snow_load_on_ground_characteristic_value_variable_action(ax,
                                                                                                    altitudes=altitudes)
-        # Compute ordered_return_level_uncertaines for a given massif_name, uncertainty methods, and non stationary context
-        ordered_return_level_uncertaines = []
-        for visualizer in altitude_to_visualizer.values():
-            u = visualizer.triplet_to_eurocode_uncertainty[(uncertainty_method, non_stationary_context, massif_name)]
-            ordered_return_level_uncertaines.append(u)
-        # Display
-        mean = [r.mean_estimate for r in ordered_return_level_uncertaines]
-        # Filter and keep only non nan values
-        not_nan_index = [not np.isnan(m) for m in mean]
-        mean = list(np.array(mean)[not_nan_index])
-        altitudes = list(np.array(altitudes)[not_nan_index])
-        ordered_return_level_uncertaines = list(np.array(ordered_return_level_uncertaines)[not_nan_index])
-
-        ci_method_name = str(uncertainty_method).split('.')[1].replace('_', ' ')
-        ax.plot(altitudes, mean, linestyle='--', marker='o', color=color,
-                label=get_label_name(non_stationary_context, ci_method_name))
-        lower_bound = [r.confidence_interval[0] for r in ordered_return_level_uncertaines]
-        upper_bound = [r.confidence_interval[1] for r in ordered_return_level_uncertaines]
-        ax.fill_between(altitudes, lower_bound, upper_bound, color=color, alpha=alpha)
+        # Plot uncertainties
+        plot_valid_return_level_uncertainties(alpha, altitude_to_visualizer, altitudes, ax, color, massif_name,
+                                              non_stationary_context, uncertainty_method)
+
     ax.legend(loc=2)
     ax.set_ylim([0.0, 16])
     massif_name_str = massif_name.replace('_', ' ')
@@ -144,3 +129,25 @@ def plot_single_uncertainty_massif_and_non_stationary_context(ax, massif_name, n
     ax.set_ylabel('50-year return level of SL (kN $m^-2$)')
     ax.set_xlabel('Altitude (m)')
     ax.grid()
+
+
+def plot_valid_return_level_uncertainties(alpha, altitude_to_visualizer, altitudes, ax, color, massif_name,
+                                          non_stationary_context, uncertainty_method):
+    # Compute ordered_return_level_uncertaines for a given massif_name, uncertainty methods, and non stationary context
+    ordered_return_level_uncertainties = []
+    for visualizer in altitude_to_visualizer.values():
+        u = visualizer.triplet_to_eurocode_uncertainty[(uncertainty_method, non_stationary_context, massif_name)]
+        ordered_return_level_uncertainties.append(u)
+    # Display
+    mean = [r.mean_estimate for r in ordered_return_level_uncertainties]
+    # Filter and keep only non nan values
+    not_nan_index = [not np.isnan(m) for m in mean]
+    mean = list(np.array(mean)[not_nan_index])
+    valid_altitudes = list(np.array(altitudes)[not_nan_index])
+    ordered_return_level_uncertainties = list(np.array(ordered_return_level_uncertainties)[not_nan_index])
+    ci_method_name = str(uncertainty_method).split('.')[1].replace('_', ' ')
+    ax.plot(valid_altitudes, mean, linestyle='--', marker='o', color=color,
+            label=get_label_name(non_stationary_context, ci_method_name))
+    lower_bound = [r.confidence_interval[0] for r in ordered_return_level_uncertainties]
+    upper_bound = [r.confidence_interval[1] for r in ordered_return_level_uncertainties]
+    ax.fill_between(valid_altitudes, lower_bound, upper_bound, color=color, alpha=alpha)
diff --git a/experiment/paper_past_snow_loads/result_trends_and_return_levels/main_result_trends_and_return_levels.py b/experiment/paper_past_snow_loads/result_trends_and_return_levels/main_result_trends_and_return_levels.py
index 8554af5c..6c867dfb 100644
--- a/experiment/paper_past_snow_loads/result_trends_and_return_levels/main_result_trends_and_return_levels.py
+++ b/experiment/paper_past_snow_loads/result_trends_and_return_levels/main_result_trends_and_return_levels.py
@@ -67,16 +67,16 @@ def major_result():
 
 if __name__ == '__main__':
     # minor_result(altitude=1800)
-    # intermediate_result(altitudes=[1500, 1800], massif_names=['Chartreuse'],
-    #                     uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.ci_mle],
-    #                     non_stationary_uncertainty=[False])
+    intermediate_result(altitudes=[1500, 1800], massif_names=['Chartreuse'],
+                        uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.ci_mle],
+                        non_stationary_uncertainty=[False])
     # intermediate_result(altitudes=[1500, 1800], massif_names=None,
     #                     uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.ci_mle],
     #                     non_stationary_uncertainty=[False])
     # intermediate_result(altitudes=[300, 600, 900, 1200, 1500, 1800], massif_names=None,
     #                     uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.ci_mle],
     #                     non_stationary_uncertainty=[False])
-    intermediate_result(altitudes=[300, 600, 900, 1200, 1500, 1800], massif_names=None,
-                        uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.ci_mle,
-                                             ConfidenceIntervalMethodFromExtremes.ci_bayes],
-                        non_stationary_uncertainty=[False, True])
+    # intermediate_result(altitudes=[300, 600, 900, 1200, 1500, 1800], massif_names=['Vercors', 'Oisans', 'Devoluy'],
+    #                     uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.ci_mle,
+    #                                          ConfidenceIntervalMethodFromExtremes.ci_bayes],
+    #                     non_stationary_uncertainty=[False, True])
diff --git a/experiment/paper_past_snow_loads/result_trends_and_return_levels/study_visualizer_for_non_stationary_trends.py b/experiment/paper_past_snow_loads/result_trends_and_return_levels/study_visualizer_for_non_stationary_trends.py
index b80f46ac..85272623 100644
--- a/experiment/paper_past_snow_loads/result_trends_and_return_levels/study_visualizer_for_non_stationary_trends.py
+++ b/experiment/paper_past_snow_loads/result_trends_and_return_levels/study_visualizer_for_non_stationary_trends.py
@@ -72,7 +72,7 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer):
                 self.massif_name_to_years_and_maxima.items()}
 
     @cached_property
-    def massif_name_to_eurocode_quantile_in_practice(self):
+    def massif_name_to_eurocode_quantile_level_in_practice(self):
         """Due to missing data, the the eurocode quantile which 0.98 if we have all the data
         correspond in practice to the quantile psnow x 0.98 of the data where there is snow"""
         return {m: p * EUROCODE_QUANTILE for m, p in self.massif_name_to_psnow.items()}
@@ -90,7 +90,9 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer):
         starting_year = None
         massif_name_to_trend_test_that_minimized_aic = {}
         for massif_name, (x, y) in self.massif_name_to_non_null_years_and_maxima.items():
-            non_stationary_trend_test = [t(x, y, starting_year) for t in self.non_stationary_trend_test]
+            quantile_level = self.massif_name_to_eurocode_quantile_level_in_practice[massif_name]
+            non_stationary_trend_test = [t(years=x, maxima=y, starting_year=starting_year, quantile_level=quantile_level)
+                                         for t in self.non_stationary_trend_test]
             trend_test_that_minimized_aic = sorted(non_stationary_trend_test, key=lambda t: t.aic)[0]
             massif_name_to_trend_test_that_minimized_aic[massif_name] = trend_test_that_minimized_aic
         return massif_name_to_trend_test_that_minimized_aic
@@ -151,7 +153,9 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer):
         arguments = [
             [self.massif_name_to_non_null_years_and_maxima[m],
              self.massif_name_to_model_class(m, non_stationary_model),
-             ci_method, self.effective_temporal_covariate] for m in self.uncertainty_massif_names]
+             ci_method, self.effective_temporal_covariate,
+             self.massif_name_to_eurocode_quantile_level_in_practice[m]
+             ] for m in self.uncertainty_massif_names]
         if self.multiprocessing:
             with Pool(NB_CORES) as p:
                 res = p.starmap(compute_eurocode_confidence_interval, arguments)
diff --git a/experiment/trend_analysis/univariate_test/abstract_comparison_non_stationary_model.py b/experiment/trend_analysis/univariate_test/abstract_comparison_non_stationary_model.py
index 51f0cc77..cfd2dc5e 100644
--- a/experiment/trend_analysis/univariate_test/abstract_comparison_non_stationary_model.py
+++ b/experiment/trend_analysis/univariate_test/abstract_comparison_non_stationary_model.py
@@ -1,3 +1,4 @@
+from experiment.eurocode_data.utils import EUROCODE_QUANTILE
 from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import AbstractGevTrendTest
 from experiment.trend_analysis.univariate_test.gev_trend_test_two_parameters import GevLocationAndScaleTrendTest
 from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import \
@@ -27,11 +28,13 @@ class AbstractComparisonNonStationaryModelOneParameter(AbstractComparisonNonStat
 
 class ComparisonAgainstMu(AbstractComparisonNonStationaryModelOneParameter, GevLocationAndScaleTrendTest):
 
-    def __init__(self, years, maxima, starting_year):
-        super().__init__(years, maxima, starting_year, constrained_model_class=NonStationaryLocationTemporalModel)
+    def __init__(self, years, maxima, starting_year, quantile_level=EUROCODE_QUANTILE):
+        super().__init__(years, maxima, starting_year, constrained_model_class=NonStationaryLocationTemporalModel,
+                         quantile_level=quantile_level)
 
 
 class ComparisonAgainstSigma(AbstractComparisonNonStationaryModelOneParameter, GevLocationAndScaleTrendTest):
 
-    def __init__(self, years, maxima, starting_year):
-        super().__init__(years, maxima, starting_year, constrained_model_class=NonStationaryScaleTemporalModel)
+    def __init__(self, years, maxima, starting_year, quantile_level=EUROCODE_QUANTILE):
+        super().__init__(years, maxima, starting_year, constrained_model_class=NonStationaryScaleTemporalModel,
+                         quantile_level=quantile_level)
diff --git a/experiment/trend_analysis/univariate_test/abstract_gev_trend_test.py b/experiment/trend_analysis/univariate_test/abstract_gev_trend_test.py
index bfe20929..59184411 100644
--- a/experiment/trend_analysis/univariate_test/abstract_gev_trend_test.py
+++ b/experiment/trend_analysis/univariate_test/abstract_gev_trend_test.py
@@ -19,14 +19,14 @@ from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoo
 
 class AbstractGevTrendTest(AbstractUnivariateTest):
     RRunTimeError_TREND = 'R RunTimeError trend'
-    # I should use the quantile from the Eurocode for the buildings
-    quantile_for_strength = EUROCODE_QUANTILE
     nb_years_for_quantile_evolution = 10
 
     def __init__(self, years, maxima, starting_year, unconstrained_model_class,
                  constrained_model_class=StationaryTemporalModel,
+                 quantile_level=EUROCODE_QUANTILE,
                  ):
         super().__init__(years, maxima, starting_year)
+        self.quantile_level = quantile_level
         self.unconstrained_model_class = unconstrained_model_class
         self.constrained_model_class = constrained_model_class
         self.fit_method = TemporalMarginFitMethod.extremes_fevd_mle
@@ -42,14 +42,16 @@ class AbstractGevTrendTest(AbstractUnivariateTest):
     @cached_property
     def constrained_estimator(self):
         try:
-            return fitted_linear_margin_estimator(self.constrained_model_class, self.coordinates, self.dataset, self.starting_year, self.fit_method)
+            return fitted_linear_margin_estimator(self.constrained_model_class, self.coordinates, self.dataset,
+                                                  self.starting_year, self.fit_method)
         except SafeRunException:
             self.crashed = True
 
     @cached_property
     def unconstrained_estimator(self):
         try:
-            return fitted_linear_margin_estimator(self.unconstrained_model_class, self.coordinates, self.dataset, self.starting_year, self.fit_method)
+            return fitted_linear_margin_estimator(self.unconstrained_model_class, self.coordinates, self.dataset,
+                                                  self.starting_year, self.fit_method)
         except SafeRunException:
             self.crashed = True
 
@@ -176,4 +178,4 @@ class AbstractGevTrendTest(AbstractUnivariateTest):
         if self.crashed:
             return 0.0
         else:
-            return self.non_stationary_constant_gev_params.quantile(p=self.quantile_for_strength)
+            return self.non_stationary_constant_gev_params.quantile(p=self.quantile_level)
diff --git a/experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py b/experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py
index 9883777a..8af03890 100644
--- a/experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py
+++ b/experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py
@@ -1,3 +1,4 @@
+from experiment.eurocode_data.utils import EUROCODE_QUANTILE
 from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import AbstractGevTrendTest
 from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import \
     NonStationaryLocationTemporalModel, NonStationaryScaleTemporalModel, NonStationaryShapeTemporalModel
@@ -6,8 +7,10 @@ from extreme_fit.distribution.gev.gev_params import GevParams
 
 class GevTrendTestOneParameter(AbstractGevTrendTest):
 
-    def __init__(self, years, maxima, starting_year, unconstrained_model_class, gev_param_name):
-        super().__init__(years, maxima, starting_year, unconstrained_model_class)
+    def __init__(self, years, maxima, starting_year, unconstrained_model_class, gev_param_name, quantile_level=EUROCODE_QUANTILE):
+        super().__init__(years, maxima, starting_year,
+                         unconstrained_model_class=unconstrained_model_class,
+                         quantile_level=quantile_level)
         self.gev_param_name = gev_param_name
 
     @property
@@ -21,13 +24,15 @@ class GevTrendTestOneParameter(AbstractGevTrendTest):
 
 class GevLocationTrendTest(GevTrendTestOneParameter):
 
-    def __init__(self, years, maxima, starting_year):
+    def __init__(self, years, maxima, starting_year, quantile_level=EUROCODE_QUANTILE):
         super().__init__(years, maxima, starting_year,
-                         NonStationaryLocationTemporalModel, GevParams.LOC)
+                         unconstrained_model_class=NonStationaryLocationTemporalModel,
+                         gev_param_name=GevParams.LOC,
+                         quantile_level=quantile_level)
 
     def _slope_strength(self):
-        return self.non_stationary_constant_gev_params.quantile_strength_evolution(p=self.quantile_for_strength,
-                                                                                   mu1=self.non_stationary_linear_coef)
+        return self.non_stationary_constant_gev_params.time_derivative_of_return_level(p=self.quantile_level,
+                                                                                       mu1=self.non_stationary_linear_coef)
 
     @property
     def mean_difference_same_sign_as_slope_strenght(self) -> bool:
@@ -42,13 +47,15 @@ class GevLocationTrendTest(GevTrendTestOneParameter):
 
 class GevScaleTrendTest(GevTrendTestOneParameter):
 
-    def __init__(self, years, maxima, starting_year):
+    def __init__(self, years, maxima, starting_year, quantile_level=EUROCODE_QUANTILE):
         super().__init__(years, maxima, starting_year,
-                         NonStationaryScaleTemporalModel, GevParams.SCALE)
+                         unconstrained_model_class=NonStationaryScaleTemporalModel,
+                         gev_param_name=GevParams.SCALE,
+                         quantile_level=quantile_level)
 
     def _slope_strength(self):
-        return self.non_stationary_constant_gev_params.quantile_strength_evolution(
-            p=self.quantile_for_strength,
+        return self.non_stationary_constant_gev_params.time_derivative_of_return_level(
+            p=self.quantile_level,
             sigma1=self.non_stationary_linear_coef)
 
     @property
@@ -65,6 +72,8 @@ class GevScaleTrendTest(GevTrendTestOneParameter):
 
 class GevShapeTrendTest(GevTrendTestOneParameter):
 
-    def __init__(self, years, maxima, starting_year):
+    def __init__(self, years, maxima, starting_year, quantile_level=EUROCODE_QUANTILE):
         super().__init__(years, maxima, starting_year,
-                         NonStationaryShapeTemporalModel, GevParams.SHAPE)
+                         unconstrained_model_class=NonStationaryShapeTemporalModel,
+                         gev_param_name=GevParams.SHAPE,
+                         quantile_level=quantile_level)
diff --git a/experiment/trend_analysis/univariate_test/gev_trend_test_two_parameters.py b/experiment/trend_analysis/univariate_test/gev_trend_test_two_parameters.py
index 85456427..95525524 100644
--- a/experiment/trend_analysis/univariate_test/gev_trend_test_two_parameters.py
+++ b/experiment/trend_analysis/univariate_test/gev_trend_test_two_parameters.py
@@ -1,3 +1,4 @@
+from experiment.eurocode_data.utils import EUROCODE_QUANTILE
 from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import AbstractGevTrendTest
 from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import \
     NonStationaryLocationAndScaleTemporalModel, StationaryTemporalModel
@@ -13,9 +14,11 @@ class GevTrendTestTwoParameters(AbstractGevTrendTest):
 
 class GevLocationAndScaleTrendTest(GevTrendTestTwoParameters):
 
-    def __init__(self, years, maxima, starting_year, constrained_model_class=StationaryTemporalModel):
+    def __init__(self, years, maxima, starting_year, constrained_model_class=StationaryTemporalModel, quantile_level=EUROCODE_QUANTILE):
         super().__init__(years, maxima, starting_year,
-                         NonStationaryLocationAndScaleTemporalModel, constrained_model_class=constrained_model_class)
+                         unconstrained_model_class=NonStationaryLocationAndScaleTemporalModel,
+                         constrained_model_class=constrained_model_class,
+                         quantile_level=quantile_level)
 
     @property
     def mu1(self):
@@ -26,9 +29,9 @@ class GevLocationAndScaleTrendTest(GevTrendTestTwoParameters):
         return self.get_non_stationary_linear_coef(gev_param_name=GevParams.SCALE)
 
     def _slope_strength(self):
-        return self.non_stationary_constant_gev_params.quantile_strength_evolution(p=self.quantile_for_strength,
-                                                                                   mu1=self.mu1,
-                                                                                   sigma1=self.sigma1)
+        return self.non_stationary_constant_gev_params.time_derivative_of_return_level(p=self.quantile_level,
+                                                                                       mu1=self.mu1,
+                                                                                       sigma1=self.sigma1)
 
     @property
     def mean_difference_same_sign_as_slope_strenght(self) -> bool:
diff --git a/extreme_fit/distribution/gev/gev_params.py b/extreme_fit/distribution/gev/gev_params.py
index 9811f7dd..55f56115 100644
--- a/extreme_fit/distribution/gev/gev_params.py
+++ b/extreme_fit/distribution/gev/gev_params.py
@@ -49,8 +49,7 @@ class GevParams(AbstractParams):
     def __str__(self):
         return self.to_dict().__str__()
 
-    def quantile_strength_evolution(self, p=0.99, mu1=0.0, sigma1=0.0):
-        # todo: chagne the name to time derivative
+    def time_derivative_of_return_level(self, p=0.99, mu1=0.0, sigma1=0.0):
         """
         Compute the variation of some quantile with respect to time.
         (when mu1 and sigma1 can be modified with time)
diff --git a/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_extract_eurocode_return_level.py b/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_extract_eurocode_return_level.py
index c0cd76d2..d02ef69d 100644
--- a/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_extract_eurocode_return_level.py
+++ b/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_extract_eurocode_return_level.py
@@ -16,13 +16,13 @@ from extreme_fit.model.result_from_model_fit.result_from_extremes.result_from_ml
 class AbstractExtractEurocodeReturnLevel(object):
     ALPHA_CONFIDENCE_INTERVAL_UNCERTAINTY = 0.05
 
-    def __init__(self, estimator: LinearMarginEstimator, ci_method, temporal_covariate):
+    def __init__(self, estimator: LinearMarginEstimator, ci_method, temporal_covariate, quantile_level=EUROCODE_QUANTILE):
         self.ci_method = ci_method
         self.estimator = estimator
         self.result_from_fit = self.estimator.result_from_model_fit
         self.temporal_covariate = temporal_covariate
         # Fixed Parameters
-        self.eurocode_quantile = EUROCODE_QUANTILE
+        self.eurocode_quantile_level = quantile_level
         self.alpha_for_confidence_interval = self.ALPHA_CONFIDENCE_INTERVAL_UNCERTAINTY
 
     @property
@@ -43,7 +43,7 @@ class ExtractEurocodeReturnLevelFromCiMethod(AbstractExtractEurocodeReturnLevel)
 
     @cached_property
     def confidence_interval_method(self):
-        return self.result_from_fit.confidence_interval_method(self.eurocode_quantile,
+        return self.result_from_fit.confidence_interval_method(self.eurocode_quantile_level,
                                                                self.alpha_for_confidence_interval,
                                                                self.transformed_temporal_covariate,
                                                                self.ci_method)
@@ -60,8 +60,8 @@ class ExtractEurocodeReturnLevelFromCiMethod(AbstractExtractEurocodeReturnLevel)
 class ExtractEurocodeReturnLevelFromMyBayesianExtremes(AbstractExtractEurocodeReturnLevel):
     result_from_fit: ResultFromBayesianExtremes
 
-    def __init__(self, estimator: LinearMarginEstimator, ci_method, temporal_covariate):
-        super().__init__(estimator, ci_method, temporal_covariate)
+    def __init__(self, estimator: LinearMarginEstimator, ci_method, temporal_covariate, quantile_level=EUROCODE_QUANTILE):
+        super().__init__(estimator, ci_method, temporal_covariate, quantile_level)
         assert isinstance(self.result_from_fit, ResultFromBayesianExtremes)
 
     @property
@@ -81,7 +81,7 @@ class ExtractEurocodeReturnLevelFromMyBayesianExtremes(AbstractExtractEurocodeRe
     @cached_property
     def posterior_eurocode_return_level_samples_for_temporal_covariate(self) -> np.ndarray:
         return np.array(
-            [p.quantile(self.eurocode_quantile) for p in self.gev_params_from_fit_for_temporal_covariate])
+            [p.quantile(self.eurocode_quantile_level) for p in self.gev_params_from_fit_for_temporal_covariate])
 
     @property
     def mean_estimate(self) -> np.ndarray:
diff --git a/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_result_from_extremes.py b/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_result_from_extremes.py
index acf56fa5..240d6535 100644
--- a/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_result_from_extremes.py
+++ b/extreme_fit/model/result_from_model_fit/result_from_extremes/abstract_result_from_extremes.py
@@ -48,8 +48,8 @@ class AbstractResultFromExtremes(AbstractResultFromModelFit):
             qcov = r("make.qcov")(self.result_from_fit,
                                   **kwargs)
             common_kwargs['qcov'] = qcov
-        mean_estimate, confidence_interval = self._confidence_interval_method(common_kwargs, ci_method)
+        mean_estimate, confidence_interval = self._confidence_interval_method(common_kwargs, ci_method, return_period)
         return mean_estimate, confidence_interval
 
-    def _confidence_interval_method(self, common_kwargs, ci_method):
+    def _confidence_interval_method(self, common_kwargs, ci_method, return_period):
         raise NotImplementedError
diff --git a/extreme_fit/model/result_from_model_fit/result_from_extremes/eurocode_return_level_uncertainties.py b/extreme_fit/model/result_from_model_fit/result_from_extremes/eurocode_return_level_uncertainties.py
index 71d7e183..7b25ef08 100644
--- a/extreme_fit/model/result_from_model_fit/result_from_extremes/eurocode_return_level_uncertainties.py
+++ b/extreme_fit/model/result_from_model_fit/result_from_extremes/eurocode_return_level_uncertainties.py
@@ -1,5 +1,6 @@
 from enum import Enum
 
+from experiment.eurocode_data.utils import EUROCODE_QUANTILE
 from extreme_fit.model.result_from_model_fit.result_from_extremes.abstract_extract_eurocode_return_level import \
     ExtractEurocodeReturnLevelFromMyBayesianExtremes, ExtractEurocodeReturnLevelFromCiMethod
 from experiment.trend_analysis.univariate_test.utils import load_temporal_coordinates_and_dataset, \
@@ -11,9 +12,9 @@ from extreme_fit.model.result_from_model_fit.result_from_extremes.confidence_int
     ConfidenceIntervalMethodFromExtremes
 
 
-def compute_eurocode_confidence_interval(smooth_maxima_x_y, model_class, ci_method, temporal_covariate):
+def compute_eurocode_confidence_interval(smooth_maxima_x_y, model_class, ci_method, temporal_covariate, quantile_level):
     years, smooth_maxima = smooth_maxima_x_y
-    return EurocodeConfidenceIntervalFromExtremes.from_maxima_years_model_class(smooth_maxima, years, model_class, temporal_covariate, ci_method)
+    return EurocodeConfidenceIntervalFromExtremes.from_maxima_years_model_class(smooth_maxima, years, model_class, temporal_covariate, ci_method, quantile_level)
 
 
 class EurocodeConfidenceIntervalFromExtremes(object):
@@ -29,17 +30,19 @@ class EurocodeConfidenceIntervalFromExtremes(object):
     @classmethod
     def from_estimator_extremes(cls, estimator_extremes: LinearMarginEstimator,
                                 ci_method: ConfidenceIntervalMethodFromExtremes,
-                                temporal_covariate: int):
+                                temporal_covariate: int,
+                                quantile_level=EUROCODE_QUANTILE):
         if ci_method == ConfidenceIntervalMethodFromExtremes.my_bayes:
-            extractor = ExtractEurocodeReturnLevelFromMyBayesianExtremes(estimator_extremes, ci_method, temporal_covariate)
+            extractor = ExtractEurocodeReturnLevelFromMyBayesianExtremes(estimator_extremes, ci_method, temporal_covariate, quantile_level)
         else:
-            extractor = ExtractEurocodeReturnLevelFromCiMethod(estimator_extremes, ci_method, temporal_covariate)
+            extractor = ExtractEurocodeReturnLevelFromCiMethod(estimator_extremes, ci_method, temporal_covariate, quantile_level)
         return cls(extractor.mean_estimate,  extractor.confidence_interval)
 
     @classmethod
     def from_maxima_years_model_class(cls, maxima, years, model_class,
                                       temporal_covariate,
-                                      ci_method=ConfidenceIntervalMethodFromExtremes.ci_bayes):
+                                      ci_method=ConfidenceIntervalMethodFromExtremes.ci_bayes,
+                                      quantile_level=EUROCODE_QUANTILE):
         # Load coordinates and dataset
         coordinates, dataset = load_temporal_coordinates_and_dataset(maxima, years)
         # Select fit method depending on the ci_method
@@ -52,7 +55,7 @@ class EurocodeConfidenceIntervalFromExtremes(object):
         fitted_estimator = fitted_linear_margin_estimator(model_class, coordinates, dataset, starting_year=None,
                                                           fit_method=fit_method)
         # Load object from result from extremes
-        return cls.from_estimator_extremes(fitted_estimator, ci_method, temporal_covariate)
+        return cls.from_estimator_extremes(fitted_estimator, ci_method, temporal_covariate, quantile_level)
 
 
 
diff --git a/extreme_fit/model/result_from_model_fit/result_from_extremes/result_from_bayesian_extremes.py b/extreme_fit/model/result_from_model_fit/result_from_extremes/result_from_bayesian_extremes.py
index b83915d8..acb087e6 100644
--- a/extreme_fit/model/result_from_model_fit/result_from_extremes/result_from_bayesian_extremes.py
+++ b/extreme_fit/model/result_from_model_fit/result_from_extremes/result_from_bayesian_extremes.py
@@ -47,7 +47,7 @@ class ResultFromBayesianExtremes(AbstractResultFromExtremes):
         mean_posterior_parameters = self.df_posterior_samples.iloc[:, :-2].mean(axis=0)
         return self.get_coef_dict_from_posterior_sample(mean_posterior_parameters)
 
-    def _confidence_interval_method(self, common_kwargs, ci_method):
+    def _confidence_interval_method(self, common_kwargs, ci_method, return_period):
         bayesian_ci_parameters = {
                 'burn.in': self.burn_in_nb,
                 'FUN': "mean",
@@ -58,7 +58,7 @@ class ResultFromBayesianExtremes(AbstractResultFromExtremes):
             lower, mean_estimate, upper = a
         else:
             d = self.get_python_dictionary(res)
-            keys = ['Posterior Mean 50-year level', '95% lower CI', '95% upper CI']
+            keys = ['Posterior Mean {}-year level'.format(return_period), '95% lower CI', '95% upper CI']
             mean_estimate, lower, upper = [np.array(d[k])[0] for k in keys]
         return mean_estimate, (lower, upper)
 
diff --git a/extreme_fit/model/result_from_model_fit/result_from_extremes/result_from_mle_extremes.py b/extreme_fit/model/result_from_model_fit/result_from_extremes/result_from_mle_extremes.py
index 68708932..243eb2e9 100644
--- a/extreme_fit/model/result_from_model_fit/result_from_extremes/result_from_mle_extremes.py
+++ b/extreme_fit/model/result_from_model_fit/result_from_extremes/result_from_mle_extremes.py
@@ -18,7 +18,7 @@ class ResultFromMleExtremes(AbstractResultFromExtremes):
         values = {i: param for i, param in enumerate(np.array(d['par']))}
         return get_margin_coef_ordered_dict(self.gev_param_name_to_dim, values)
 
-    def _confidence_interval_method(self, common_kwargs, ci_method):
+    def _confidence_interval_method(self, common_kwargs, ci_method, return_period):
         method_name = ci_method_to_method_name[ci_method]
         mle_ci_parameters = {
                 'method': method_name,
@@ -33,7 +33,7 @@ class ResultFromMleExtremes(AbstractResultFromExtremes):
             lower, mean_estimate, upper, _ = a
         else:
             d = self.get_python_dictionary(res)
-            keys = ['50-year return level', '95% lower CI', '95% upper CI']
+            keys = ['{}-year return level'.format(return_period), '95% lower CI', '95% upper CI']
             mean_estimate, lower, upper = [np.array(d[k])[0] for k in keys]
         return mean_estimate, (lower, upper)
 
-- 
GitLab