diff --git a/projects/elevation_temporal_model_for_projections/__init__.py b/projects/projected_snowfall/elevation_temporal_model_for_projections/__init__.py similarity index 100% rename from projects/elevation_temporal_model_for_projections/__init__.py rename to projects/projected_snowfall/elevation_temporal_model_for_projections/__init__.py diff --git a/projects/elevation_temporal_model_for_projections/ensemble_fit/abstract_ensemble_fit.py b/projects/projected_snowfall/elevation_temporal_model_for_projections/ensemble_fit/__init__.py similarity index 100% rename from projects/elevation_temporal_model_for_projections/ensemble_fit/abstract_ensemble_fit.py rename to projects/projected_snowfall/elevation_temporal_model_for_projections/ensemble_fit/__init__.py diff --git a/projects/projected_snowfall/elevation_temporal_model_for_projections/ensemble_fit/abstract_ensemble_fit.py b/projects/projected_snowfall/elevation_temporal_model_for_projections/ensemble_fit/abstract_ensemble_fit.py new file mode 100644 index 0000000000000000000000000000000000000000..d2c9cf659961692b111cd34a62f710983cd6644a --- /dev/null +++ b/projects/projected_snowfall/elevation_temporal_model_for_projections/ensemble_fit/abstract_ensemble_fit.py @@ -0,0 +1,4 @@ + + +class AbstractEnsembleFit(object): + pass \ No newline at end of file diff --git a/projects/elevation_temporal_model_for_projections/ensemble_fit/independent_ensemble_fit.py b/projects/projected_snowfall/elevation_temporal_model_for_projections/ensemble_fit/independent_ensemble_fit.py similarity index 100% rename from projects/elevation_temporal_model_for_projections/ensemble_fit/independent_ensemble_fit.py rename to projects/projected_snowfall/elevation_temporal_model_for_projections/ensemble_fit/independent_ensemble_fit.py diff --git a/projects/elevation_temporal_model_for_projections/ensemble_fit/together_ensemble_fit.py b/projects/projected_snowfall/elevation_temporal_model_for_projections/ensemble_fit/together_ensemble_fit.py similarity index 100% rename from projects/elevation_temporal_model_for_projections/ensemble_fit/together_ensemble_fit.py rename to projects/projected_snowfall/elevation_temporal_model_for_projections/ensemble_fit/together_ensemble_fit.py diff --git a/projects/elevation_temporal_model_for_projections/main_elevation_temporal_for_projections_ensemble.py b/projects/projected_snowfall/elevation_temporal_model_for_projections/main_elevation_temporal_for_projections_ensemble.py similarity index 74% rename from projects/elevation_temporal_model_for_projections/main_elevation_temporal_for_projections_ensemble.py rename to projects/projected_snowfall/elevation_temporal_model_for_projections/main_elevation_temporal_for_projections_ensemble.py index 01fa3a47eca1bffc8bf23502ac18112a5f488d54..f3f05a462abbd40b01d52f3088aef06e52721f55 100644 --- a/projects/elevation_temporal_model_for_projections/main_elevation_temporal_for_projections_ensemble.py +++ b/projects/projected_snowfall/elevation_temporal_model_for_projections/main_elevation_temporal_for_projections_ensemble.py @@ -4,13 +4,15 @@ from typing import List import matplotlib +from projects.projected_snowfall.elevation_temporal_model_for_projections.utils_projected_visualizer import \ + load_projected_visualizer_list +from projects.projected_snowfall.elevation_temporal_model_for_projections.visualizer_for_projection_ensemble import \ + VisualizerForProjectionEnsemble + matplotlib.use('Agg') -from extreme_data.meteo_france_data.scm_models_data.safran.safran_max_snowf import SafranSnowfall2019, \ - SafranSnowfall2020 from projects.altitude_spatial_model.altitudes_fit.plots.plot_histogram_altitude_studies import \ - plot_shoe_plot_changes_against_altitude, plot_histogram_all_trends_against_altitudes, \ - plot_shoe_plot_ratio_interval_size_against_altitude, plot_histogram_all_models_against_altitudes + plot_shoe_plot_changes_against_altitude, plot_histogram_all_trends_against_altitudes from extreme_fit.model.result_from_model_fit.result_from_extremes.abstract_extract_eurocode_return_level import \ AbstractExtractEurocodeReturnLevel @@ -18,25 +20,20 @@ from extreme_fit.model.result_from_model_fit.result_from_extremes.abstract_extra import matplotlib as mpl from extreme_fit.model.utils import set_seed_for_test -from projects.altitude_spatial_model.altitudes_fit.plots.plot_coherence_curves import plot_coherence_curves mpl.rcParams['text.usetex'] = True mpl.rcParams['text.latex.preamble'] = [r'\usepackage{amsmath}'] -from projects.altitude_spatial_model.altitudes_fit.utils_altitude_studies_visualizer import load_visualizer_list - from projects.altitude_spatial_model.altitudes_fit.one_fold_analysis.altitude_group import altitudes_for_groups -from projects.altitude_spatial_model.altitudes_fit.one_fold_analysis.plot_total_aic import plot_individual_aic from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day, SafranSnowfall3Days, \ - SafranSnowfall5Days, SafranSnowfall7Days, SafranDateFirstSnowfall, SafranPrecipitation1Day, \ - SafranPrecipitation3Days, SafranSnowfallCenterOnDay1dayMeanRate, SafranSnowfallNotCenterOnDay1day + SafranSnowfall5Days, SafranSnowfall7Days from extreme_data.meteo_france_data.scm_models_data.utils import Season def main(): study_classes = [SafranSnowfall1Day - , SafranSnowfall3Days, + , SafranSnowfall3Days, SafranSnowfall5Days, SafranSnowfall7Days][:1] seasons = [Season.annual, Season.winter, Season.spring, Season.automn][:1] @@ -70,9 +67,9 @@ def main_loop(altitudes_list, massif_names, seasons, study_classes, model_must_p for season in seasons: for study_class in study_classes: print('Inner loop', season, study_class) - visualizer_list = load_visualizer_list(season, study_class, altitudes_list, massif_names, - model_must_pass_the_test - ) + visualizer_list = load_projected_visualizer_list(season, study_class, altitudes_list, massif_names, + model_must_pass_the_test + ) plot_visualizers(massif_names, visualizer_list) for visualizer in visualizer_list: plot_visualizer(massif_names, visualizer) @@ -97,13 +94,14 @@ def plot_visualizer(massif_names, visualizer): # visualizer.studies.plot_maxima_time_series(['Vanoise']) # Plot the results for the model that minimizes the individual aic - plot_individual_aic(visualizer) + plots(visualizer) # Plot the results for the model that minimizes the total aic # plot_total_aic(model_classes, visualizer) pass -def plots(visualizer: AltitudesStudiesVisualizerForNonStationaryModels): + +def plots(visualizer: VisualizerForProjectionEnsemble): # visualizer.plot_shape_map() visualizer.plot_moments() # visualizer.plot_qqplots() @@ -111,10 +109,5 @@ def plots(visualizer: AltitudesStudiesVisualizerForNonStationaryModels): # visualizer.studies.plot_mean_maxima_against_altitude(std=std) -def plot_individual_aic(visualizer): - OneFoldFit.best_estimator_minimizes_total_aic = False - plots(visualizer) - - if __name__ == '__main__': main() diff --git a/projects/projected_snowfall/elevation_temporal_model_for_projections/utils_projected_visualizer.py b/projects/projected_snowfall/elevation_temporal_model_for_projections/utils_projected_visualizer.py new file mode 100644 index 0000000000000000000000000000000000000000..f3bd8d953e60b4beb0f3bc2dab3af272d85fc919 --- /dev/null +++ b/projects/projected_snowfall/elevation_temporal_model_for_projections/utils_projected_visualizer.py @@ -0,0 +1,44 @@ +from extreme_fit.model.margin_model.polynomial_margin_model.utils import \ + ALTITUDINAL_GEV_MODELS_BASED_ON_POINTWISE_ANALYSIS +from projects.altitude_spatial_model.altitudes_fit.altitudes_studies import AltitudesStudies +from projects.altitude_spatial_model.altitudes_fit.one_fold_analysis.altitudes_studies_visualizer_for_non_stationary_models import \ + AltitudesStudiesVisualizerForNonStationaryModels + + +def load_projected_visualizer_list(season, study_class, altitudes_list, massif_names, model_must_pass_the_test=True, **kwargs_study): + model_classes = ALTITUDINAL_GEV_MODELS_BASED_ON_POINTWISE_ANALYSIS + visualizer_list = [] + # Load all studies + for altitudes in altitudes_list: + studies = AltitudesStudies(study_class, altitudes, season=season, **kwargs_study) + visualizer = AltitudesStudiesVisualizerForNonStationaryModels(studies=studies, + model_classes=model_classes, + massif_names=massif_names, + show=False, + temporal_covariate_for_fit=None, + confidence_interval_based_on_delta_method=False, + display_only_model_that_pass_anderson_test=model_must_pass_the_test + ) + visualizer_list.append(visualizer) + compute_and_assign_max_abs(visualizer_list) + + return visualizer_list + + +def compute_and_assign_max_abs(visualizer_list): + # Compute the max abs for all metrics + d = {} + for method_name in AltitudesStudiesVisualizerForNonStationaryModels.moment_names: + for order in AltitudesStudiesVisualizerForNonStationaryModels.orders: + c = (method_name, order) + max_abs = max([ + max([abs(e) for e in v.method_name_and_order_to_d(method_name, order).values() + ]) for v in visualizer_list]) + d[c] = max_abs + # Assign the max abs dictionary + for v in visualizer_list: + v._method_name_and_order_to_max_abs = d + # Compute the max abs for the shape parameter + max_abs_for_shape = max([max([abs(e) for e in v.massif_name_to_shape.values()]) for v in visualizer_list]) + for v in visualizer_list: + v._max_abs_for_shape = max_abs_for_shape diff --git a/projects/elevation_temporal_model_for_projections/visualizer_for_projection_ensemble.py b/projects/projected_snowfall/elevation_temporal_model_for_projections/visualizer_for_projection_ensemble.py similarity index 97% rename from projects/elevation_temporal_model_for_projections/visualizer_for_projection_ensemble.py rename to projects/projected_snowfall/elevation_temporal_model_for_projections/visualizer_for_projection_ensemble.py index 29ad21306be0626cda8aa4adb207d49987a681e3..a88cc1a9faf5ad4fe4a7c286f47f946222e02c6b 100644 --- a/projects/elevation_temporal_model_for_projections/visualizer_for_projection_ensemble.py +++ b/projects/projected_snowfall/elevation_temporal_model_for_projections/visualizer_for_projection_ensemble.py @@ -33,25 +33,35 @@ from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset class VisualizerForProjectionEnsemble(StudyVisualizer): - def __init__(self, studies: AltitudesStudies, + def __init__(self, gcm_rcm_couple_to_altitude_studies: Dict[str,AltitudesStudies], model_classes: List[AbstractSpatioTemporalPolynomialModel], show=False, + ensemble_fit_classes=None, massif_names=None, fit_method=MarginFitMethod.extremes_fevd_mle, temporal_covariate_for_fit=None, - display_only_model_that_pass_anderson_test=True, + display_only_model_that_pass_gof_test=False, confidence_interval_based_on_delta_method=False ): - super().__init__(studies.study, show=show, save_to_file=not show) - self.studies = studies + studies = list(gcm_rcm_couple_to_altitude_studies.values())[0] + study = studies.study + super().__init__(study, show=show, save_to_file=not show) + self.ensemble_fit_classes = ensemble_fit_classes + self.gcm_rcm_couple_to_altitude_studies = gcm_rcm_couple_to_altitude_studies self.non_stationary_models = model_classes self.fit_method = fit_method self.temporal_covariate_for_fit = temporal_covariate_for_fit - self.display_only_model_that_pass_test = display_only_model_that_pass_anderson_test - self.massif_names = massif_names if massif_names is not None else self.study.all_massif_names() + self.display_only_model_that_pass_test = display_only_model_that_pass_gof_test + self.massif_names = massif_names if massif_names is not None else study.all_massif_names() self.massif_name_to_massif_id = {m: i for i, m in enumerate(self.massif_names)} - self.altitude_group = get_altitude_group_from_altitudes(self.studies.altitudes) + self.altitude_group = get_altitude_group_from_altitudes(studies.altitudes) self.confidence_interval_based_on_delta_method = confidence_interval_based_on_delta_method + + # Load ensemble_fit mapper + ensemble_fit_class_to_object = {} + for ensemble_fit_class in ensemble_fit_classes: + pass + # Load one fold fit self.massif_name_to_massif_altitudes = {} self._massif_name_to_one_fold_fit = {}