From 8be094260db81cc62c0d04e5be19070dd7242b00 Mon Sep 17 00:00:00 2001 From: Le Roux Erwan <erwan.le-roux@irstea.fr> Date: Tue, 3 Mar 2020 17:10:53 +0100 Subject: [PATCH] [paper 1] add file to see the impact of mixed distribution --- .../mixed_distribution_impact.py | 105 ++++++++++++++++++ .../qqplot/plot_qqplot.py | 1 + ...dy_visualizer_for_non_stationary_trends.py | 15 ++- 3 files changed, 115 insertions(+), 6 deletions(-) create mode 100644 papers/exceeding_snow_loads/check_mle_convergence_for_trends/mixed_distribution/mixed_distribution_impact.py diff --git a/papers/exceeding_snow_loads/check_mle_convergence_for_trends/mixed_distribution/mixed_distribution_impact.py b/papers/exceeding_snow_loads/check_mle_convergence_for_trends/mixed_distribution/mixed_distribution_impact.py new file mode 100644 index 00000000..0bea2224 --- /dev/null +++ b/papers/exceeding_snow_loads/check_mle_convergence_for_trends/mixed_distribution/mixed_distribution_impact.py @@ -0,0 +1,105 @@ +import pandas as pd + +from experiment.meteo_france_data.scm_models_data.crocus.crocus import CrocusSnowLoadTotal +from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.main_study_visualizer import \ + ALL_ALTITUDES_WITHOUT_NAN +from extreme_fit.model.result_from_model_fit.result_from_extremes.confidence_interval_method import \ + ConfidenceIntervalMethodFromExtremes +from papers.exceeding_snow_loads.study_visualizer_for_non_stationary_trends import StudyVisualizerForNonStationaryTrends + + +def mix_dsitrbution_impact(): + altitudes = [300, 600, 900] + altitude_to_couple = {altitude: [None, None] for altitude in altitudes} + for j, fit_gev_only_on_non_null_maxima in enumerate([True, False]): + for altitude in altitudes: + altitude_to_couple[altitude][j] = StudyVisualizerForNonStationaryTrends( + CrocusSnowLoadTotal(altitude=altitude), + select_only_acceptable_shape_parameter=True, + multiprocessing=True, + save_to_file=True, + fit_gev_only_on_non_null_maxima=fit_gev_only_on_non_null_maxima, + fit_only_time_series_with_ninety_percent_of_non_null_values=True, + show=False) + pd.options.display.width = 0 + # Compare return level + for altitude, (viz1, viz2) in altitude_to_couple.items(): + # for m in viz1.all_massif_name_to_eurocode_uncertainty_for_minimized_aic_model_class: + m_to_eurocode_return_level_1 = viz1.all_massif_name_to_eurocode_uncertainty_for_minimized_aic_model_class() + m_to_eurocode_return_level_2 = viz2.all_massif_name_to_eurocode_uncertainty_for_minimized_aic_model_class() + + s_diff = [] + massifs_names = set(viz1.massifs_names_with_year_without_snow).intersection(m_to_eurocode_return_level_1.keys()) + for m in massifs_names: + return_level1 = m_to_eurocode_return_level_1[m].mean_estimate + return_level2 = m_to_eurocode_return_level_2[m].mean_estimate + difference = return_level1 - return_level2 + abs_difference = abs(difference) + s_diff.append({'massif': m, 'abs(r1 - r2)': abs_difference, 'abs(r1 - r2)/r1': 100 * abs_difference/return_level1, + 'abs(r1 - r2)/r2': 100 * abs_difference / return_level2, + 'r1 (with mixed)': return_level1, 'r2 (without)': return_level2 + }) + df = pd.DataFrame(s_diff) + print(df) + print(altitude, '\n', df.describe()) + +""" + + abs(r1 - r2) abs(r1 - r2)/r1 abs(r1 - r2)/r2 massif r1 (with mixed) r2 (without) +0 0.000000 0.000000 0.000000 Belledonne 0.370008 0.370008 +1 0.000564 0.186687 0.186340 Bauges 0.302025 0.302589 +2 0.000000 0.000000 0.000000 Mont-Blanc 0.407016 0.407016 +3 0.017822 2.427636 2.370098 Aravis 0.734127 0.751949 +4 0.025847 7.197779 6.714485 Chablais 0.359097 0.384944 +5 0.060221 9.472780 8.653092 Vanoise 0.635731 0.695952 +6 0.099971 21.315869 17.570553 Oisans 0.468997 0.568967 +7 0.004269 1.617252 1.643837 Beaufortain 0.263942 0.259673 +8 0.000731 0.206005 0.205581 Maurienne 0.354998 0.355729 +300 + abs(r1 - r2) abs(r1 - r2)/r1 abs(r1 - r2)/r2 r1 (with mixed) r2 (without) +count 9.000000 9.000000 9.000000 9.000000 9.000000 +mean 0.023269 4.713779 4.149332 0.432882 0.455203 +std 0.034915 7.110878 5.938525 0.156124 0.174963 +min 0.000000 0.000000 0.000000 0.263942 0.259673 +25% 0.000564 0.186687 0.186340 0.354998 0.355729 +50% 0.004269 1.617252 1.643837 0.370008 0.384944 +75% 0.025847 7.197779 6.714485 0.468997 0.568967 +max 0.099971 21.315869 17.570553 0.734127 0.751949 + abs(r1 - r2) abs(r1 - r2)/r1 abs(r1 - r2)/r2 massif r1 (with mixed) r2 (without) +0 0.0 0.0 0.0 Haut_Var-Haut_Verdon 1.977354 1.977354 +1 0.0 0.0 0.0 Ubaye 1.607606 1.607606 +2 0.0 0.0 0.0 Parpaillon 0.435603 0.435603 +600 + abs(r1 - r2) abs(r1 - r2)/r1 abs(r1 - r2)/r2 r1 (with mixed) r2 (without) +count 3.0 3.0 3.0 3.000000 3.000000 +mean 0.0 0.0 0.0 1.340187 1.340187 +std 0.0 0.0 0.0 0.804912 0.804912 +min 0.0 0.0 0.0 0.435603 0.435603 +25% 0.0 0.0 0.0 1.021604 1.021604 +50% 0.0 0.0 0.0 1.607606 1.607606 +75% 0.0 0.0 0.0 1.792480 1.792480 +max 0.0 0.0 0.0 1.977354 1.977354 + abs(r1 - r2) abs(r1 - r2)/r1 abs(r1 - r2)/r2 massif r1 (with mixed) r2 (without) +0 0.0 0.0 0.0 Mercantour 2.818572 2.818572 +900 + abs(r1 - r2) abs(r1 - r2)/r1 abs(r1 - r2)/r2 r1 (with mixed) r2 (without) +count 1.0 1.0 1.0 1.000000 1.000000 +mean 0.0 0.0 0.0 2.818572 2.818572 +std NaN NaN NaN NaN NaN +min 0.0 0.0 0.0 2.818572 2.818572 +25% 0.0 0.0 0.0 2.818572 2.818572 +50% 0.0 0.0 0.0 2.818572 2.818572 +75% 0.0 0.0 0.0 2.818572 2.818572 +max 0.0 0.0 0.0 2.818572 2.818572 + +Process finished with exit code 0 + +""" + + +""" +Au grand maximum: l ecart est inférieur à 0.1 kN.... entre si on utilise la mixed distribution ou non +""" + +if __name__ == '__main__': + mix_dsitrbution_impact() diff --git a/papers/exceeding_snow_loads/check_mle_convergence_for_trends/qqplot/plot_qqplot.py b/papers/exceeding_snow_loads/check_mle_convergence_for_trends/qqplot/plot_qqplot.py index 848a048f..1aaa9a01 100644 --- a/papers/exceeding_snow_loads/check_mle_convergence_for_trends/qqplot/plot_qqplot.py +++ b/papers/exceeding_snow_loads/check_mle_convergence_for_trends/qqplot/plot_qqplot.py @@ -193,6 +193,7 @@ if __name__ == '__main__': fit_method=TemporalMarginFitMethod.extremes_fevd_mle, multiprocessing=True, fit_gev_only_on_non_null_maxima=True, + fit_only_time_series_with_ninety_percent_of_non_null_values=True, save_to_file=True, show=False) for altitude in altitudes} 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 56582008..f33fe1ef 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 @@ -53,7 +53,7 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer): non_stationary_trend_test_to_marker=None, fit_method=TemporalMarginFitMethod.extremes_fevd_mle, select_only_acceptable_shape_parameter=True, - fit_gev_only_on_non_null_maxima=True, + fit_gev_only_on_non_null_maxima=False, fit_only_time_series_with_ninety_percent_of_non_null_values=True, ): super().__init__(study, show, save_to_file, only_one_graph, only_first_row, vertical_kde_plot, @@ -126,8 +126,9 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer): d[m] = (years[mask], maxima[mask]) else: d = self.massif_name_to_years_and_maxima - if self.fit_only_time_series_with_ninety_percent_of_non_null_values: - d = {m: v for m, v in d.items() if self.massif_name_to_psnow[m] >= 0.90} + # In both cases, we remove any massif with psnow < 0.9 + if self.fit_only_time_series_with_ninety_percent_of_non_null_values: + d = {m: v for m, v in d.items() if self.massif_name_to_psnow[m] >= 0.9} return d @property @@ -324,16 +325,18 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer): else: raise ValueError(model_subset_for_uncertainty) - def all_massif_name_to_eurocode_uncertainty_for_minimized_aic_model_class(self, ci_method, - model_subset_for_uncertainty) \ + def all_massif_name_to_eurocode_uncertainty_for_minimized_aic_model_class(self, ci_method=ConfidenceIntervalMethodFromExtremes.ci_mle, + model_subset_for_uncertainty=ModelSubsetForUncertainty.non_stationary_gumbel_and_gev) \ -> Dict[str, EurocodeConfidenceIntervalFromExtremes]: # Compute for the uncertainty massif names + massifs_names = set(self.massif_name_to_years_and_maxima_for_model_fitting.keys()).\ + intersection(self.uncertainty_massif_names) arguments = [ [self.massif_name_to_years_and_maxima_for_model_fitting[m], self.massif_name_and_model_subset_to_model_class(m, model_subset_for_uncertainty), ci_method, self.effective_temporal_covariate, self.massif_name_to_eurocode_quantile_level_in_practice[m] - ] for m in self.uncertainty_massif_names] + ] for m in massifs_names] if self.multiprocessing: with Pool(NB_CORES) as p: res = p.starmap(compute_eurocode_confidence_interval, arguments) -- GitLab