Commit f869c2a4 authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[paper 1] add some options on study visualizer to handle years without snow

parent bdbb1197
No related merge requests found
Showing with 33 additions and 16 deletions
+33 -16
...@@ -17,6 +17,8 @@ def get_tuple_ordered_by_shape(fast=False): ...@@ -17,6 +17,8 @@ def get_tuple_ordered_by_shape(fast=False):
select_only_acceptable_shape_parameter=False, select_only_acceptable_shape_parameter=False,
multiprocessing=True, multiprocessing=True,
save_to_file=True, save_to_file=True,
fit_gev_only_on_non_null_maxima=False,
fit_only_time_series_with_ninety_percent_of_non_null_values=False,
show=False) show=False)
for altitude in altitudes} for altitude in altitudes}
# Extract all the values # Extract all the values
......
...@@ -7,6 +7,8 @@ import pandas as pd ...@@ -7,6 +7,8 @@ import pandas as pd
from matplotlib.ticker import PercentFormatter from matplotlib.ticker import PercentFormatter
from experiment.meteo_france_data.scm_models_data.crocus.crocus import CrocusSnowLoadTotal 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.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \ from extreme_fit.model.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \
TemporalMarginFitMethod TemporalMarginFitMethod
from extreme_fit.model.result_from_model_fit.result_from_extremes.abstract_extract_eurocode_return_level import \ from extreme_fit.model.result_from_model_fit.result_from_extremes.abstract_extract_eurocode_return_level import \
...@@ -183,20 +185,21 @@ if __name__ == '__main__': ...@@ -183,20 +185,21 @@ if __name__ == '__main__':
300 Haut_Var-Haut_Verdon 0.8446498197950775 300 Haut_Var-Haut_Verdon 0.8446498197950775
""" """
altitudes = [300, 600, 900, 1200, 1500, 1800][:] altitudes = [300, 600, 900, 1200, 1500, 1800][:3]
# altitudes = ALL_ALTITUDES_WITHOUT_NAN # altitudes = ALL_ALTITUDES_WITHOUT_NAN
# altitudes = [900, 1800, 2700] # altitudes = [900, 1800, 2700]
altitude_to_visualizer = {altitude: StudyVisualizerForNonStationaryTrends(CrocusSnowLoadTotal(altitude=altitude), altitude_to_visualizer = {altitude: StudyVisualizerForNonStationaryTrends(CrocusSnowLoadTotal(altitude=altitude),
select_only_acceptable_shape_parameter=True, select_only_acceptable_shape_parameter=True,
fit_method=TemporalMarginFitMethod.extremes_fevd_mle, fit_method=TemporalMarginFitMethod.extremes_fevd_mle,
multiprocessing=True, multiprocessing=True,
fit_gev_only_on_non_null_maxima=True,
save_to_file=True, save_to_file=True,
show=False) show=False)
for altitude in altitudes} for altitude in altitudes}
# plot_qqplot_wrt_standard_gumbel(altitude_to_visualizer) # plot_qqplot_wrt_standard_gumbel(altitude_to_visualizer)
# plot_hist_psnow(altitude_to_visualizer) plot_hist_psnow(altitude_to_visualizer)
plot_intensity_against_gumbel_quantile_for_time_series_with_missing_zeros(altitude_to_visualizer, nb_worst_examples=None) # plot_intensity_against_gumbel_quantile_for_time_series_with_missing_zeros(altitude_to_visualizer, nb_worst_examples=None)
# plot_exceedance_psnow(altitude_to_visualizer) # plot_exceedance_psnow(altitude_to_visualizer)
# non_stationarity_psnow(altitude_to_visualizer) # non_stationarity_psnow(altitude_to_visualizer)
......
...@@ -18,7 +18,7 @@ class StudyVisualizerForFitWithoutMaximum(StudyVisualizerForNonStationaryTrends) ...@@ -18,7 +18,7 @@ class StudyVisualizerForFitWithoutMaximum(StudyVisualizerForNonStationaryTrends)
@cached_property @cached_property
def massif_name_to_maximum_index_for_non_null_values(self) -> Tuple[Dict, Dict]: def massif_name_to_maximum_index_for_non_null_values(self) -> Tuple[Dict, Dict]:
d = super().massif_name_to_non_null_years_and_maxima d = super().massif_name_to_years_and_maxima_for_model_fitting
d_without_maximum = {} d_without_maximum = {}
d_maximum = {} d_maximum = {}
for m, (years, maxima) in d.items(): for m, (years, maxima) in d.items():
...@@ -35,7 +35,7 @@ class StudyVisualizerForFitWithoutMaximum(StudyVisualizerForNonStationaryTrends) ...@@ -35,7 +35,7 @@ class StudyVisualizerForFitWithoutMaximum(StudyVisualizerForNonStationaryTrends)
return self.massif_name_to_maximum_index_for_non_null_values[1] return self.massif_name_to_maximum_index_for_non_null_values[1]
@cached_property @cached_property
def massif_name_to_non_null_years_and_maxima(self): def massif_name_to_years_and_maxima_for_model_fitting(self):
return self.massif_name_to_maximum_index_for_non_null_values[0] return self.massif_name_to_maximum_index_for_non_null_values[0]
def maximum_value_test(self): def maximum_value_test(self):
......
...@@ -52,12 +52,17 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer): ...@@ -52,12 +52,17 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer):
relative_change_trend_plot=True, relative_change_trend_plot=True,
non_stationary_trend_test_to_marker=None, non_stationary_trend_test_to_marker=None,
fit_method=TemporalMarginFitMethod.extremes_fevd_mle, fit_method=TemporalMarginFitMethod.extremes_fevd_mle,
select_only_acceptable_shape_parameter=True): select_only_acceptable_shape_parameter=True,
fit_gev_only_on_non_null_maxima=True,
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, super().__init__(study, show, save_to_file, only_one_graph, only_first_row, vertical_kde_plot,
year_for_kde_plot, plot_block_maxima_quantiles, temporal_non_stationarity, year_for_kde_plot, plot_block_maxima_quantiles, temporal_non_stationarity,
transformation_class, verbose, multiprocessing, complete_non_stationary_trend_analysis, transformation_class, verbose, multiprocessing, complete_non_stationary_trend_analysis,
normalization_under_one_observations, score_class) normalization_under_one_observations, score_class)
# Add some attributes # Add some attributes
self.fit_only_time_series_with_ninety_percent_of_non_null_values = fit_only_time_series_with_ninety_percent_of_non_null_values
self.fit_gev_only_on_non_null_maxima = fit_gev_only_on_non_null_maxima
self.select_only_acceptable_shape_parameter = select_only_acceptable_shape_parameter self.select_only_acceptable_shape_parameter = select_only_acceptable_shape_parameter
self.fit_method = fit_method self.fit_method = fit_method
self.non_stationary_trend_test_to_marker = non_stationary_trend_test_to_marker self.non_stationary_trend_test_to_marker = non_stationary_trend_test_to_marker
...@@ -107,15 +112,22 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer): ...@@ -107,15 +112,22 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer):
def massif_name_to_eurocode_quantile_level_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 """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""" correspond in practice to the quantile psnow x 0.98 of the data where there is snow"""
return {m: 1 - ((1 - EUROCODE_QUANTILE) / p_snow) for m, p_snow in self.massif_name_to_psnow.items()} if self.fit_gev_only_on_non_null_maxima:
return {m: 1 - ((1 - EUROCODE_QUANTILE) / p_snow) for m, p_snow in self.massif_name_to_psnow.items()}
else:
return {m: EUROCODE_QUANTILE for m in self.massif_name_to_psnow.keys()}
@cached_property @cached_property
def massif_name_to_non_null_years_and_maxima(self): def massif_name_to_years_and_maxima_for_model_fitting(self):
# return self.massif_name_to_years_and_maxima if self.fit_gev_only_on_non_null_maxima:
d = {} d = {}
for m, (years, maxima) in self.massif_name_to_years_and_maxima.items(): for m, (years, maxima) in self.massif_name_to_years_and_maxima.items():
mask = np.nonzero(maxima) mask = np.nonzero(maxima)
d[m] = (years[mask], maxima[mask]) 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}
return d return d
@property @property
...@@ -137,7 +149,7 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer): ...@@ -137,7 +149,7 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer):
massif_name_to_trend_test_that_minimized_aic = {} massif_name_to_trend_test_that_minimized_aic = {}
massif_name_to_stationary_trend_test_that_minimized_aic = {} massif_name_to_stationary_trend_test_that_minimized_aic = {}
massif_name_to_gumbel_trend_test_that_minimized_aic = {} massif_name_to_gumbel_trend_test_that_minimized_aic = {}
for massif_name, (x, y) in self.massif_name_to_non_null_years_and_maxima.items(): for massif_name, (x, y) in self.massif_name_to_years_and_maxima_for_model_fitting.items():
quantile_level = self.massif_name_to_eurocode_quantile_level_in_practice[massif_name] quantile_level = self.massif_name_to_eurocode_quantile_level_in_practice[massif_name]
all_trend_test = [ all_trend_test = [
t(years=x, maxima=y, starting_year=starting_year, quantile_level=quantile_level, t(years=x, maxima=y, starting_year=starting_year, quantile_level=quantile_level,
...@@ -317,7 +329,7 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer): ...@@ -317,7 +329,7 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer):
-> Dict[str, EurocodeConfidenceIntervalFromExtremes]: -> Dict[str, EurocodeConfidenceIntervalFromExtremes]:
# Compute for the uncertainty massif names # Compute for the uncertainty massif names
arguments = [ arguments = [
[self.massif_name_to_non_null_years_and_maxima[m], [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), self.massif_name_and_model_subset_to_model_class(m, model_subset_for_uncertainty),
ci_method, self.effective_temporal_covariate, ci_method, self.effective_temporal_covariate,
self.massif_name_to_eurocode_quantile_level_in_practice[m] self.massif_name_to_eurocode_quantile_level_in_practice[m]
...@@ -353,7 +365,7 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer): ...@@ -353,7 +365,7 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer):
# Some checks with Gelman convergence diagnosis # Some checks with Gelman convergence diagnosis
def massif_name_to_gelman_convergence_value(self, mcmc_iterations, model_class, nb_chains): def massif_name_to_gelman_convergence_value(self, mcmc_iterations, model_class, nb_chains):
arguments = [(self.massif_name_to_non_null_years_and_maxima[m], mcmc_iterations, model_class, nb_chains) arguments = [(self.massif_name_to_years_and_maxima_for_model_fitting[m], mcmc_iterations, model_class, nb_chains)
for m in self.uncertainty_massif_names] for m in self.uncertainty_massif_names]
if self.multiprocessing: if self.multiprocessing:
with Pool(NB_CORES) as p: with Pool(NB_CORES) as p:
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment