diff --git a/experiment/meteo_france_data/plot/create_shifted_cmap.py b/experiment/meteo_france_data/plot/create_shifted_cmap.py index dd49798ca6057e8b70c6cf78d0a162753a4bc501..7f6fc9706d61b705c20c0833ddf5a1c723667ea2 100644 --- a/experiment/meteo_france_data/plot/create_shifted_cmap.py +++ b/experiment/meteo_france_data/plot/create_shifted_cmap.py @@ -9,7 +9,7 @@ from experiment.meteo_france_data.plot.shifted_color_map import shiftedColorMap from extreme_fit.distribution.abstract_params import AbstractParams -def get_shifted_map(vmin, vmax): +def get_shifted_map(vmin, vmax, cmap=plt.cm.bwr): # Load the shifted cmap to center on a middle point if vmin < 0 < vmax: midpoint = 1 - vmax / (vmax + abs(vmin)) @@ -19,7 +19,7 @@ def get_shifted_map(vmin, vmax): midpoint = 0.0 else: raise ValueError('Unexpected values: vmin={}, vmax={}'.format(vmin, vmax)) - cmap = [plt.cm.coolwarm, plt.cm.bwr, plt.cm.seismic][1] + # cmap = [plt.cm.coolwarm, plt.cm.bwr, plt.cm.seismic][1] shifted_cmap = shiftedColorMap(cmap, midpoint=midpoint, name='shifted') return shifted_cmap diff --git a/experiment/meteo_france_data/scm_models_data/abstract_study.py b/experiment/meteo_france_data/scm_models_data/abstract_study.py index e773ac0f7bfaf80bb8c4331b12604c644b5331cb..d511884e565db80e4719fb9f8f2b53ac09f60885 100644 --- a/experiment/meteo_france_data/scm_models_data/abstract_study.py +++ b/experiment/meteo_france_data/scm_models_data/abstract_study.py @@ -310,6 +310,7 @@ class AbstractStudy(object): massif_name_to_hatch_boolean_list=None, norm=None, massif_name_to_marker_style=None, + marker_style_to_label_name=None, ticks_values_and_labels=None, ): if ax is None: @@ -402,7 +403,7 @@ class AbstractStudy(object): # Add legend for the marker if massif_name_to_marker_style is not None: - legend_elements = cls.get_legend_for_model_symbol(markersize=8) + legend_elements = cls.get_legend_for_model_symbol(marker_style_to_label_name, markersize=8) ax.legend(handles=legend_elements, bbox_to_anchor=(0.01, 0.03), loc='lower left') ax.annotate("Filled symbol = significant trend ", xy=(0.05, 0.015), xycoords='axes fraction', fontsize=7) @@ -412,13 +413,11 @@ class AbstractStudy(object): return ax @classmethod - def get_legend_for_model_symbol(cls, markersize): - labels = ['\mathcal{M}_{\mu_1}', '\mathcal{M}_{\sigma_1}', '\mathcal{M}_{\mu_1, \sigma_1}'] - markers = ["s", "^", "D"] + def get_legend_for_model_symbol(cls, marker_style_to_label_name, markersize): legend_elements = [ Line2D([0], [0], marker=marker, color='w', label='${}$'.format(label), markerfacecolor='w', markeredgecolor='k', markersize=markersize) - for label, marker in zip(labels, markers) + for marker, label in marker_style_to_label_name.items() ] return legend_elements 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 ae0e53898ba7588b7177ab3063d96388d57deaea..52c60ce4e55feafb5f4023f0ab8eadddccb2a46d 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 @@ -1,16 +1,16 @@ import numpy as np import pandas as pd import matplotlib.pyplot as plt -from matplotlib.ticker import FormatStrFormatter, ScalarFormatter +from matplotlib.ticker import ScalarFormatter from scipy.ndimage import gaussian_filter from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.abstract_hypercube_visualizer import \ AbstractHypercubeVisualizer from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.main_study_visualizer import \ - SCM_STUDY_NAME_TO_COLOR, SCM_STUDY_NAME_TO_ABBREVIATION, SCM_STUDY_CLASS_TO_ABBREVIATION, SCM_STUDIES_NAMES + SCM_STUDY_NAME_TO_COLOR, SCM_STUDY_NAME_TO_ABBREVIATION, SCM_STUDY_CLASS_TO_ABBREVIATION from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.study_visualizer import \ StudyVisualizer -from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import AbstractGevTrendTest +from experiment.trend_analysis.univariate_test.extreme_trend_test.abstract_gev_trend_test import AbstractGevTrendTest from experiment.trend_analysis.univariate_test.abstract_univariate_test import AbstractUnivariateTest from root_utils import get_display_name_from_object_type diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_fast_hypercube_one_altitudes.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_fast_hypercube_one_altitudes.py index 77152f090a091159986014ac121a48694581c5cd..bd461db47012ab2142b0147e853e20e732674e6f 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_fast_hypercube_one_altitudes.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_fast_hypercube_one_altitudes.py @@ -1,18 +1,13 @@ import time from experiment.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall -from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.altitude_hypercube_visualizer import \ - AltitudeHypercubeVisualizer from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.altitude_hypercube_visualizer_extended import \ - AltitudeHypercubeVisualizerBisExtended, QuantityHypercubeWithoutTrendExtended, \ - AltitudeHypercubeVisualizerWithoutTrendExtended, QuantityHypercubeWithoutTrend -from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.quantity_altitude_visualizer import \ - QuantityAltitudeHypercubeVisualizer + AltitudeHypercubeVisualizerBisExtended, QuantityHypercubeWithoutTrend from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.utils_hypercube import \ load_altitude_visualizer, load_quantity_visualizer from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.main_study_visualizer import \ - ALL_ALTITUDES, SCM_STUDIES -from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevLocationTrendTest + SCM_STUDIES +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter import GevLocationTrendTest def get_fast_parameters(altitude=1800): diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_fast_hypercube_several_altitudes.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_fast_hypercube_several_altitudes.py index 086e668bbcbe22053e9937e232abc6c72c37f854..d29f20a20128453559ecd5f71e822dd59050c2cd 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_fast_hypercube_several_altitudes.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_fast_hypercube_several_altitudes.py @@ -6,7 +6,7 @@ from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visual load_altitude_visualizer, load_quantity_visualizer from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.main_study_visualizer import \ ALL_ALTITUDES, SCM_STUDIES -from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevLocationTrendTest +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter import GevLocationTrendTest def get_fast_parameters(altitude=None): diff --git a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_full_hypercube.py b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_full_hypercube.py index 21311fc226b259ed6063df1202555e875a49bbd5..4fb4fbdd85e376be1b5f971fb2bcb15bd34c72b7 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_full_hypercube.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/hypercube_visualization/main_files/main_full_hypercube.py @@ -6,7 +6,7 @@ from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visual load_altitude_visualizer, load_quantity_visualizer from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.main_study_visualizer import \ ALL_ALTITUDES, SCM_STUDIES -from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevLocationTrendTest +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter import GevLocationTrendTest def get_full_parameters(altitude=None, offset_starting_year=10): diff --git a/experiment/meteo_france_data/scm_models_data/visualization/studies_visualization/main_studies_visualizer.py b/experiment/meteo_france_data/scm_models_data/visualization/studies_visualization/main_studies_visualizer.py index c3bfd1ec9cca5db94288bbada639c67abb38acec..3fbb7e9d8fa6b2b8c712c63c064daab4d0b1165f 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/studies_visualization/main_studies_visualizer.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/studies_visualization/main_studies_visualizer.py @@ -1,6 +1,6 @@ import time from experiment.trend_analysis.abstract_score import MannKendall, WeigthedScore, MeanScore, MedianScore -from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import GevLocationChangePointTest, \ +from experiment.trend_analysis.univariate_test.extreme_trend_test.abstract_gev_trend_test import GevLocationChangePointTest, \ GevScaleChangePointTest, GevShapeChangePointTest from experiment.trend_analysis.univariate_test.abstract_univariate_test import MannKendallTrendTest from experiment.meteo_france_data.scm_models_data.safran.safran import ExtendedSafranTotalPrecip diff --git a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/main_study_visualizer.py b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/main_study_visualizer.py index bc8a70583a36fab8274021a2c5450be36cc63781..1b9e076e8a86f1b36f6ec7c4381f4cb684dc8992 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/main_study_visualizer.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/main_study_visualizer.py @@ -18,7 +18,8 @@ from experiment.meteo_france_data.scm_models_data.safran.safran import SafranSno from collections import OrderedDict -from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevLocationTrendTest +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter.gev_trend_test_one_parameter import \ + GevLocationTrendTest from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation.uniform_normalization import \ BetweenZeroAndOneNormalization, BetweenMinusOneAndOneNormalization from root_utils import get_display_name_from_object_type diff --git a/experiment/meteo_france_data/stations_data/main_station_comparison.py b/experiment/meteo_france_data/stations_data/main_station_comparison.py index 46076629cff0bad018fc3fd9bdc411659a5da916..fa5cf0d0a2ded453510dee0674aeb95cd8b241d6 100644 --- a/experiment/meteo_france_data/stations_data/main_station_comparison.py +++ b/experiment/meteo_france_data/stations_data/main_station_comparison.py @@ -2,7 +2,7 @@ from experiment.meteo_france_data.scm_models_data.visualization.study_visualizat ALL_ALTITUDES_WITH_20_STATIONS_AT_LEAST from experiment.meteo_france_data.stations_data.visualization.comparisons_visualization.comparisons_visualization import \ ComparisonsVisualization, path_backup_csv_file -from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import GevLocationChangePointTest, \ +from experiment.trend_analysis.univariate_test.extreme_trend_test.abstract_gev_trend_test import GevLocationChangePointTest, \ GevScaleChangePointTest, GevShapeChangePointTest diff --git a/experiment/paper1_old/1 - non stationary model choice/main3_non_stationary_strength_evolution.py b/experiment/paper1_old/1 - non stationary model choice/main3_non_stationary_strength_evolution.py index 78f9ba369cf70ab5f6e2728b3b26fd124fdb7fa6..1f0b6ae185221451fb31560633790effa2b0c175 100644 --- a/experiment/paper1_old/1 - non stationary model choice/main3_non_stationary_strength_evolution.py +++ b/experiment/paper1_old/1 - non stationary model choice/main3_non_stationary_strength_evolution.py @@ -2,9 +2,9 @@ import time from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.altitude_year_hypercube_visualizer import \ Altitude_Hypercube_Year_Visualizer -from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevScaleTrendTest, \ +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter import GevScaleTrendTest, \ GevLocationTrendTest -from experiment.trend_analysis.univariate_test.gev_trend_test_two_parameters import GevLocationAndScaleTrendTest +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_two_parameters.gev_trend_test_two_parameters import GevLocationAndScaleTrendTest """ Visualize the 0.99 quantile initial value and its evolution diff --git a/experiment/paper1_old/1 - non stationary model choice/main4_common_spatial_altitude_starting_years_impact.py b/experiment/paper1_old/1 - non stationary model choice/main4_common_spatial_altitude_starting_years_impact.py index a6f8594c1251e3ca862c7d28eb460076ce3682d5..20571443bfa4255a73e707583beed270b962ddae 100644 --- a/experiment/paper1_old/1 - non stationary model choice/main4_common_spatial_altitude_starting_years_impact.py +++ b/experiment/paper1_old/1 - non stationary model choice/main4_common_spatial_altitude_starting_years_impact.py @@ -2,9 +2,7 @@ import time from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.altitude_year_hypercube_visualizer import \ Altitude_Hypercube_Year_Visualizer, AltitudeHypercubeVisualizerWithoutTrendType -from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevScaleTrendTest, \ - GevLocationTrendTest -from experiment.trend_analysis.univariate_test.gev_trend_test_two_parameters import GevLocationAndScaleTrendTest +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_two_parameters.gev_trend_test_two_parameters import GevLocationAndScaleTrendTest """ Visualize the 0.99 quantile initial value and its evolution diff --git a/experiment/paper1_old/1 - non stationary model choice/main4_common_spatial_starting_years_impact.py b/experiment/paper1_old/1 - non stationary model choice/main4_common_spatial_starting_years_impact.py index 46636df97ac38e10dce5dd3cdfe66ea4dc00198d..ef62be2facefbb67ae021328f2c7997c9d5b1597 100644 --- a/experiment/paper1_old/1 - non stationary model choice/main4_common_spatial_starting_years_impact.py +++ b/experiment/paper1_old/1 - non stationary model choice/main4_common_spatial_starting_years_impact.py @@ -2,9 +2,7 @@ import time from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.altitude_year_hypercube_visualizer import \ Altitude_Hypercube_Year_Visualizer, AltitudeHypercubeVisualizerWithoutTrendType -from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevScaleTrendTest, \ - GevLocationTrendTest -from experiment.trend_analysis.univariate_test.gev_trend_test_two_parameters import GevLocationAndScaleTrendTest +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_two_parameters.gev_trend_test_two_parameters import GevLocationAndScaleTrendTest """ Visualize the 0.99 quantile initial value and its evolution diff --git a/experiment/paper1_old/1 - non stationary model choice/main4_individual_starting_years_impact.py b/experiment/paper1_old/1 - non stationary model choice/main4_individual_starting_years_impact.py index 1d9bcaa1d1e036e9ea77f4052deb84015560f868..8f952b0cea1d70939763892cad93bfbba806c0da 100644 --- a/experiment/paper1_old/1 - non stationary model choice/main4_individual_starting_years_impact.py +++ b/experiment/paper1_old/1 - non stationary model choice/main4_individual_starting_years_impact.py @@ -2,9 +2,7 @@ import time from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.altitude_year_hypercube_visualizer import \ Altitude_Hypercube_Year_Visualizer -from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevScaleTrendTest, \ - GevLocationTrendTest -from experiment.trend_analysis.univariate_test.gev_trend_test_two_parameters import GevLocationAndScaleTrendTest +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_two_parameters.gev_trend_test_two_parameters import GevLocationAndScaleTrendTest """ Visualize the 0.99 quantile initial value and its evolution diff --git a/experiment/paper1_old/poster_EVAN2019/main_poster_EVAN2019.py b/experiment/paper1_old/poster_EVAN2019/main_poster_EVAN2019.py index 530c55f3b7a6582056a9af8382a5481680016edb..7670f92b769f8be1328078478a7f5ac6a91423ba 100644 --- a/experiment/paper1_old/poster_EVAN2019/main_poster_EVAN2019.py +++ b/experiment/paper1_old/poster_EVAN2019/main_poster_EVAN2019.py @@ -1,12 +1,11 @@ -from experiment.meteo_france_data.scm_models_data.crocus.crocus import CrocusDepth, CrocusSweTotal, CrocusSwe3Days -from experiment.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall +from experiment.meteo_france_data.scm_models_data.crocus.crocus import CrocusSwe3Days from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.altitude_year_hypercube_visualizer import \ Altitude_Hypercube_Year_Visualizer, AltitudeHypercubeVisualizerWithoutTrendType from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.main_study_visualizer import \ SCM_STUDIES -from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevScaleTrendTest, \ +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter import GevScaleTrendTest, \ GevLocationTrendTest -from experiment.trend_analysis.univariate_test.gev_trend_test_two_parameters import GevLocationAndScaleTrendTest +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_two_parameters.gev_trend_test_two_parameters import GevLocationAndScaleTrendTest from experiment.paper1_old.utils import get_full_altitude_visualizer POSTER_ALTITUDES = [900, 1800, 2700] diff --git a/experiment/paper1_old/poster_EVAN2019/shape_prior_check/some_experiment_EVAN.py b/experiment/paper1_old/poster_EVAN2019/shape_prior_check/some_experiment_EVAN.py index 0fc0501f9343a1897841d77d6a723a16fb7a6a86..02d5f8ca81322a752e365f1666c6d515a1b4dc90 100644 --- a/experiment/paper1_old/poster_EVAN2019/shape_prior_check/some_experiment_EVAN.py +++ b/experiment/paper1_old/poster_EVAN2019/shape_prior_check/some_experiment_EVAN.py @@ -1,14 +1,10 @@ -from experiment.meteo_france_data.scm_models_data.crocus.crocus import CrocusDepth, CrocusSweTotal, CrocusSwe3Days -from experiment.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.altitude_year_hypercube_visualizer import \ - Altitude_Hypercube_Year_Visualizer, AltitudeHypercubeVisualizerWithoutTrendType -from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.main_study_visualizer import \ - SCM_STUDIES -from experiment.trend_analysis.univariate_test.abstract_comparison_non_stationary_model import ComparisonAgainstMu, \ + Altitude_Hypercube_Year_Visualizer +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter.abstract_comparison_non_stationary_model import ComparisonAgainstMu, \ ComparisonAgainstSigma -from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevScaleTrendTest, \ +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter import GevScaleTrendTest, \ GevLocationTrendTest -from experiment.trend_analysis.univariate_test.gev_trend_test_two_parameters import GevLocationAndScaleTrendTest +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_two_parameters.gev_trend_test_two_parameters import GevLocationAndScaleTrendTest from experiment.paper1_old.utils import get_full_altitude_visualizer POSTER_ALTITUDES = [900, 1800, 2700] diff --git a/experiment/paper1_old/utils.py b/experiment/paper1_old/utils.py index 0634dbf539abc272f2ac33cda11ba0570ebac122..55caf1fee2060ab9f5a45bb8d183e00ac818e96b 100644 --- a/experiment/paper1_old/utils.py +++ b/experiment/paper1_old/utils.py @@ -3,7 +3,7 @@ from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visual get_full_parameters from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.utils_hypercube import \ load_altitude_visualizer -from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevLocationTrendTest +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter import GevLocationTrendTest FULL_ALTITUDES = [900, 1200, 1500, 1800, 2100, 2400, 2700, 3000] diff --git a/experiment/paper_past_snow_loads/check_mle_convergence_for_trends/main_shape_repartition.py b/experiment/paper_past_snow_loads/check_mle_convergence_for_trends/main_shape_repartition.py index 269885571a49918a02704efa0d02205e752b885d..953661f262c8e10a8d3352cceac547c0d8841bbb 100644 --- a/experiment/paper_past_snow_loads/check_mle_convergence_for_trends/main_shape_repartition.py +++ b/experiment/paper_past_snow_loads/check_mle_convergence_for_trends/main_shape_repartition.py @@ -1,6 +1,6 @@ from experiment.meteo_france_data.scm_models_data.crocus.crocus import CrocusSnowLoadTotal from experiment.paper_past_snow_loads.check_mle_convergence_for_trends.study_visualizer_for_shape_repartition import \ - StudyVisualizerForShape, StudyVisualizerGumbel + StudyVisualizerForShape, StudyVisualizerGumbel, StudyVisualizerAll from experiment.paper_past_snow_loads.paper_main_utils import load_altitude_to_visualizer @@ -20,11 +20,14 @@ def main_shape_repartition(altitudes, massif_names=None, max_abs_tdrl = max([visualizer.max_abs_change for visualizer in visualizers_for_altitudes]) for visualizer in visualizers_for_altitudes: # visualizer.plot_trends(max_abs_tdrl, add_colorbar=visualizer.study.altitude == 2700) - visualizer.plot_trends(max_abs_tdrl, add_colorbar=True) + # visualizer.plot_trends(max_abs_tdrl, add_colorbar=True) + visualizer.plot_trends() 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], study_visualizer_class=StudyVisualizerGumbel) + main_shape_repartition([900], study_visualizer_class=StudyVisualizerAll, save_to_file=False) + # main_shape_repartition([300, 600, 900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600, 3900, 4200], + # study_visualizer_class=StudyVisualizerAll, save_to_file=True) diff --git a/experiment/paper_past_snow_loads/check_mle_convergence_for_trends/study_visualizer_for_shape_repartition.py b/experiment/paper_past_snow_loads/check_mle_convergence_for_trends/study_visualizer_for_shape_repartition.py index d7b62f8e46f9239d8d635c8dd985fc6967889d6d..9368d8ef278552191bdcc32db425bb9b1ef45422 100644 --- a/experiment/paper_past_snow_loads/check_mle_convergence_for_trends/study_visualizer_for_shape_repartition.py +++ b/experiment/paper_past_snow_loads/check_mle_convergence_for_trends/study_visualizer_for_shape_repartition.py @@ -1,10 +1,12 @@ +import matplotlib 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.paper_past_snow_loads.study_visualizer_for_non_stationary_trends import \ StudyVisualizerForNonStationaryTrends from experiment.trend_analysis.abstract_score import MeanScore -from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevLocationTrendTest, \ +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter import \ GevStationaryVersusGumbel @@ -41,8 +43,12 @@ class StudyVisualizerForShape(StudyVisualizerForNonStationaryTrends): def graduation(self): return 0.1 + @cached_property + def cmap(self): + return get_shifted_map(-self._max_abs_change, self._max_abs_change, matplotlib.cm.get_cmap('BrBG_r')) + -class StudyVisualizerGumbel(StudyVisualizerForNonStationaryTrends): +class StudyVisualizerGumbel(StudyVisualizerForShape): def __init__(self, study: AbstractStudy, show=True, save_to_file=False, only_one_graph=False, only_first_row=False, vertical_kde_plot=False, year_for_kde_plot=None, plot_block_maxima_quantiles=False, @@ -59,3 +65,19 @@ class StudyVisualizerGumbel(StudyVisualizerForNonStationaryTrends): # Assign default argument for the non stationary trends self.non_stationary_trend_test = [GevStationaryVersusGumbel] self.non_stationary_trend_test_to_marker = dict(zip(self.non_stationary_trend_test, ["o"])) + + +class StudyVisualizerAll(StudyVisualizerForShape): + + def __init__(self, study: AbstractStudy, show=True, save_to_file=False, only_one_graph=False, only_first_row=False, + vertical_kde_plot=False, year_for_kde_plot=None, plot_block_maxima_quantiles=False, + temporal_non_stationarity=False, transformation_class=None, verbose=False, multiprocessing=False, + complete_non_stationary_trend_analysis=False, normalization_under_one_observations=True, + score_class=MeanScore, uncertainty_methods=None, non_stationary_contexts=None, + uncertainty_massif_names=None, effective_temporal_covariate=2017, relative_change_trend_plot=True): + 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, + transformation_class, verbose, multiprocessing, complete_non_stationary_trend_analysis, + normalization_under_one_observations, score_class, uncertainty_methods, + non_stationary_contexts, uncertainty_massif_names, effective_temporal_covariate, + relative_change_trend_plot) 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 65332ae34f5f90351ce69dad7c3d8a141af41c0f..1ee9c7bb673c17648933fa7df935d865b5e8f446 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 @@ -19,6 +19,7 @@ mpl.rcParams['text.usetex'] = True mpl.rcParams['text.latex.preamble'] = [r'\usepackage{amsmath}'] import matplotlib.pyplot as plt + def minor_result(altitude): """Plot trends for a single altitude to be fast""" visualizer = StudyVisualizerForNonStationaryTrends(CrocusSnowLoadTotal(altitude=altitude), multiprocessing=True, @@ -26,10 +27,12 @@ def minor_result(altitude): visualizer.plot_trends() plt.show() + def compute_minimized_aic(visualizer): _ = visualizer.massif_name_to_minimized_aic_non_stationary_trend_test return True + def intermediate_result(altitudes, massif_names=None, non_stationary_uncertainty=None, uncertainty_methods=None, study_class=CrocusSnowLoadTotal, @@ -65,7 +68,7 @@ def intermediate_result(altitudes, massif_names=None, if altitude in altitudes_for_plot_trend] max_abs_tdrl = max([visualizer.max_abs_change for visualizer in visualizers_for_altitudes]) for visualizer in visualizers_for_altitudes: - visualizer.plot_trends(max_abs_tdrl, add_colorbar=visualizer.study.altitude==2700) + visualizer.plot_trends(max_abs_tdrl, add_colorbar=visualizer.study.altitude == 2700) # Plot graph plot_uncertainty_massifs(altitude_to_visualizer) @@ -92,15 +95,15 @@ if __name__ == '__main__': # ConfidenceIntervalMethodFromExtremes.ci_mle][1:], # non_stationary_uncertainty=[False, True][1:], # multiprocessing=True) - intermediate_result(altitudes=paper_altitudes, massif_names=['Maurienne'], - uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.my_bayes, - ConfidenceIntervalMethodFromExtremes.ci_mle][:], - non_stationary_uncertainty=[False, True][:], - multiprocessing=True) + # intermediate_result(altitudes=paper_altitudes, massif_names=['Maurienne'], + # uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.my_bayes, + # ConfidenceIntervalMethodFromExtremes.ci_mle][:], + # non_stationary_uncertainty=[False, True][:], + # multiprocessing=True) # intermediate_result(altitudes=[900, 1200], massif_names=None) # intermediate_result(ALL_ALTITUDES_WITHOUT_NAN) # intermediate_result(paper_altitudes) - # minor_result(altitude=900) + minor_result(altitude=900) # intermediate_result(altitudes=[1500, 1800], massif_names=['Chartreuse'], # uncertainty_methods=[ConfidenceIntervalMethodFromExtremes.ci_mle, # ConfidenceIntervalMethodFromExtremes.ci_bayes], diff --git a/experiment/paper_past_snow_loads/result_trends_and_return_levels/plot_uncertainty_curves.py b/experiment/paper_past_snow_loads/result_trends_and_return_levels/plot_uncertainty_curves.py index d1da622ff079626d5907892b5f06bdceba3af79f..8c0ac530463856bde162a0e1c42aa24845ea9715 100644 --- a/experiment/paper_past_snow_loads/result_trends_and_return_levels/plot_uncertainty_curves.py +++ b/experiment/paper_past_snow_loads/result_trends_and_return_levels/plot_uncertainty_curves.py @@ -152,7 +152,8 @@ def plot_tdrl_bars(altitude_to_visualizer, ax, massif_name, valid_altitudes, leg # Better to plot all the markers on the same line ax.plot([altitude], 0, **marker_kwargs) # Add a legend plot - legend_elements = AbstractStudy.get_legend_for_model_symbol(markersize=9) + visualizer = visualizers[0] + legend_elements = AbstractStudy.get_legend_for_model_symbol(visualizer.marker_to_label, markersize=9) ax2 = ax.twinx() # ax2.legend(handles=legend_elements, bbox_to_anchor=(0.93, 0.7), loc='upper right') # ax2.annotate("Filled symbol = significant trend ", xy=(0.85, 0.5), xycoords='axes fraction', fontsize=7) diff --git a/experiment/paper_past_snow_loads/study_visualizer_for_non_stationary_trends.py b/experiment/paper_past_snow_loads/study_visualizer_for_non_stationary_trends.py index 976efe49d3fd662b8d9186d40c59d3dd804c1ec1..ba766f4c09e1fa1270b048e442e58935e9edde49 100644 --- a/experiment/paper_past_snow_loads/study_visualizer_for_non_stationary_trends.py +++ b/experiment/paper_past_snow_loads/study_visualizer_for_non_stationary_trends.py @@ -1,7 +1,6 @@ -from collections import OrderedDict import matplotlib.pyplot as plt from multiprocessing.pool import Pool -from typing import Dict, Tuple +from typing import Dict import numpy as np from cached_property import cached_property @@ -14,12 +13,18 @@ from experiment.meteo_france_data.scm_models_data.visualization.study_visualizat StudyVisualizer from experiment.paper_past_snow_loads.check_mcmc_convergence_for_return_levels.gelman_convergence_test import \ compute_gelman_convergence_value -from experiment.paper_past_snow_loads.paper_utils import dpi_paper1_figure from experiment.trend_analysis.abstract_score import MeanScore -from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import AbstractGevTrendTest -from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevScaleTrendTest, \ - GevLocationTrendTest -from experiment.trend_analysis.univariate_test.gev_trend_test_two_parameters import GevLocationAndScaleTrendTest +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.gev_trend_test_one_parameter import \ + GevLocationTrendTest, GevScaleTrendTest +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter.gumbel_trend_test_one_parameter import \ + GumbelLocationTrendTest, GevStationaryVersusGumbel, GumbelScaleTrendTest, GumbelVersusGumbel +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_three_parameters.gumbel_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 \ + GevLocationAndScaleTrendTest +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_two_parameters.gumbel_test_two_parameters import \ + GumbelLocationAndScaleTrendTest from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel from extreme_fit.model.result_from_model_fit.result_from_extremes.confidence_interval_method import \ ConfidenceIntervalMethodFromExtremes @@ -39,12 +44,14 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer): non_stationary_contexts=None, uncertainty_massif_names=None, effective_temporal_covariate=2017, - relative_change_trend_plot=True): + relative_change_trend_plot=True, + non_stationary_trend_test_to_marker=None): 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, transformation_class, verbose, multiprocessing, complete_non_stationary_trend_analysis, normalization_under_one_observations, score_class) # Add some attributes + self.non_stationary_trend_test_to_marker = non_stationary_trend_test_to_marker self.relative_change_trend_plot = relative_change_trend_plot self.effective_temporal_covariate = effective_temporal_covariate self.non_stationary_contexts = non_stationary_contexts @@ -58,10 +65,19 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer): ConfidenceIntervalMethodFromExtremes.ci_mle][1:] if self.uncertainty_massif_names is None: self.uncertainty_massif_names = self.study.study_massif_names - # Assign default argument for the non stationary trends - self.non_stationary_trend_test = [GevLocationTrendTest, GevScaleTrendTest, GevLocationAndScaleTrendTest] - self.non_stationary_trend_test_to_marker = dict(zip(self.non_stationary_trend_test, ["s", "^", "D"])) - + 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, + # GevLocationTrendTest, GevScaleTrendTest, GevLocationAndScaleTrendTest, + # ] + self.non_stationary_trend_test = [GumbelVersusGumbel, GevLocationAndScaleTrendTestAgainstGumbel] + self.non_stationary_trend_test_to_marker = {t: t.marker for t in self.non_stationary_trend_test} + # ["v", "^", "D", "X", "x", 7, 6, "d"])) + else: + self.non_stationary_trend_test = list(self.non_stationary_trend_test_to_marker.keys()) + self.marker_to_label = {t.marker: t.label for t in self.non_stationary_trend_test} self.global_max_abs_change = None # Utils @@ -125,6 +141,7 @@ class StudyVisualizerForNonStationaryTrends(StudyVisualizer): axis_off=False, show_label=False, add_colorbar=add_colorbar, massif_name_to_marker_style=self.massif_name_to_marker_style, + marker_style_to_label_name=self.marker_to_label, massif_name_to_color=self.massif_name_to_color, cmap=self.cmap, show=False, diff --git a/experiment/trend_analysis/univariate_test/abstract_trend_test.py b/experiment/trend_analysis/univariate_test/abstract_trend_test.py deleted file mode 100644 index 9304b779d4a9641cef1c7933c7489bc43f2cef63..0000000000000000000000000000000000000000 --- a/experiment/trend_analysis/univariate_test/abstract_trend_test.py +++ /dev/null @@ -1,40 +0,0 @@ -import warnings - -import numpy as np - -from experiment.trend_analysis.univariate_test.mann_kendall_test import mann_kendall_test -from experiment.trend_analysis.abstract_score import MannKendall -from experiment.trend_analysis.univariate_test.abstract_univariate_test import AbstractUnivariateTest - - -class MannKendallTrendTest(AbstractUnivariateTest): - - def __init__(self, years, maxima, starting_year): - super().__init__(years, maxima, starting_year) - score = MannKendall() - # Compute score value - detailed_score = score.get_detailed_score(self.years_after_starting_year, self.maxima_after_starting_year) - self.score_value = detailed_score[0] - # Compute the Mann Kendall Test - MK, S = mann_kendall_test(t=self.years_after_starting_year, - x=self.maxima_after_starting_year, - eps=1e-5, - alpha=self.SIGNIFICANCE_LEVEL, - Ha='upordown') - # Raise warning if scores are differents - if S != self.score_value: - warnings.warn('S={} is different that score_value={}'.format(S, self.score_value), WarningScoreValue) - self.MK = MK - - @property - def test_sign(self) -> int: - return np.sign(self.score_value) - - @property - def is_significant(self) -> bool: - assert 'reject' in self.MK or 'accept' in self.MK - return 'accept' in self.MK - - -class SpearmanRhoTrendTest(AbstractUnivariateTest): - pass diff --git a/experiment/trend_analysis/univariate_test/extreme_trend_test/__init__.py b/experiment/trend_analysis/univariate_test/extreme_trend_test/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/experiment/trend_analysis/univariate_test/abstract_gev_trend_test.py b/experiment/trend_analysis/univariate_test/extreme_trend_test/abstract_gev_trend_test.py similarity index 97% rename from experiment/trend_analysis/univariate_test/abstract_gev_trend_test.py rename to experiment/trend_analysis/univariate_test/extreme_trend_test/abstract_gev_trend_test.py index 8d3b47b0ee9f1124bb9d67c3adfbb628cab007cd..907716d99222397508a4ce5312029dae7a3234ff 100644 --- a/experiment/trend_analysis/univariate_test/abstract_gev_trend_test.py +++ b/experiment/trend_analysis/univariate_test/extreme_trend_test/abstract_gev_trend_test.py @@ -14,6 +14,7 @@ from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_m StationaryTemporalModel from extreme_fit.model.utils import SafeRunException from extreme_fit.distribution.gev.gev_params import GevParams +from root_utils import classproperty from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates @@ -193,3 +194,13 @@ class AbstractGevTrendTest(AbstractUnivariateTest): return 0.0 else: return self.unconstrained_estimator_gev_params.quantile(p=self.quantile_level) + + # Some class properties for display purpose + + @classproperty + def marker(self): + raise NotImplementedError + + @classproperty + def label(self): + return '\\mathcal{M}_{%s}' diff --git a/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_one_parameter/__init__.py b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_one_parameter/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/experiment/trend_analysis/univariate_test/abstract_comparison_non_stationary_model.py b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_one_parameter/abstract_comparison_non_stationary_model.py similarity index 69% rename from experiment/trend_analysis/univariate_test/abstract_comparison_non_stationary_model.py rename to experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_one_parameter/abstract_comparison_non_stationary_model.py index cfd2dc5e2496a27ac0dd2c96ba912d1790dcb0a1..ee92cf5e080b0d6ab9ee018913bf6e645c6ddb91 100644 --- a/experiment/trend_analysis/univariate_test/abstract_comparison_non_stationary_model.py +++ b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_one_parameter/abstract_comparison_non_stationary_model.py @@ -1,23 +1,14 @@ 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 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.gev_trend_test_one_parameter import \ + GevTrendTestOneParameter +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_two_parameters.gev_trend_test_two_parameters import GevLocationAndScaleTrendTest from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import \ NonStationaryLocationTemporalModel, NonStationaryScaleTemporalModel import numpy as np -class AbstractComparisonNonStationaryModel(AbstractGevTrendTest): - - @property - def degree_freedom_chi2(self) -> int: - raise NotImplementedError - - -class AbstractComparisonNonStationaryModelOneParameter(AbstractComparisonNonStationaryModel): - - @property - def degree_freedom_chi2(self) -> int: - return 1 +class AbstractComparisonNonStationaryModelOneParameter(GevTrendTestOneParameter): @property def test_sign(self) -> int: diff --git a/experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_one_parameter/gev_trend_test_one_parameter.py similarity index 87% rename from experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py rename to experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_one_parameter/gev_trend_test_one_parameter.py index 5a89e207965f2aaee22ef922e00188d9a57c2e84..d09c5a3bd7cb18ccb900eadf276dfa2cdfc60b7b 100644 --- a/experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py +++ b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_one_parameter/gev_trend_test_one_parameter.py @@ -1,8 +1,8 @@ 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.extreme_trend_test.abstract_gev_trend_test import AbstractGevTrendTest from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import \ NonStationaryLocationTemporalModel, NonStationaryScaleTemporalModel, NonStationaryShapeTemporalModel, \ - StationaryTemporalModel, GumbelTemporalModel + StationaryTemporalModel from extreme_fit.distribution.gev.gev_params import GevParams @@ -86,10 +86,3 @@ class GevShapeTrendTest(GevTrendTestOneParameterAgainstStationary): quantile_level=quantile_level) -class GevStationaryVersusGumbel(GevTrendTestOneParameter): - - def __init__(self, years, maxima, starting_year, quantile_level=EUROCODE_QUANTILE): - super().__init__(years, maxima, starting_year, - unconstrained_model_class=StationaryTemporalModel, - constrained_model_class=GumbelTemporalModel, - quantile_level=quantile_level) 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 new file mode 100644 index 0000000000000000000000000000000000000000..71df50439809d1ebc789bfed81ff5be6af96c83d --- /dev/null +++ b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_one_parameter/gumbel_trend_test_one_parameter.py @@ -0,0 +1,92 @@ +# Comparison with the Gumbel model +from experiment.eurocode_data.utils import EUROCODE_QUANTILE +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter.gev_trend_test_one_parameter import \ + GevTrendTestOneParameter, GevTrendTestOneParameterAgainstStationary +from extreme_fit.distribution.gev.gev_params import GevParams +from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel, \ + GumbelTemporalModel, NonStationaryLocationGumbelModel, NonStationaryScaleGumbelModel +from root_utils import classproperty + + +class GumbelVersusGumbel(GevTrendTestOneParameter): + + def __init__(self, years, maxima, starting_year, quantile_level=EUROCODE_QUANTILE): + super().__init__(years, maxima, starting_year, + unconstrained_model_class=GumbelTemporalModel, + constrained_model_class=GumbelTemporalModel, + quantile_level=quantile_level) + + @property + def is_significant(self) -> bool: + return False + + @property + def total_number_of_parameters_for_unconstrained_model(self) -> int: + return 2 + + @property + def time_derivative_of_return_level(self): + return super().time_derivative_of_return_level() + + @classproperty + def label(self): + return super().label % '0' + + @classproperty + def marker(self): + return 'x' + + def _slope_strength(self): + return 0.0 + + +class GevStationaryVersusGumbel(GevTrendTestOneParameter): + + def __init__(self, years, maxima, starting_year, quantile_level=EUROCODE_QUANTILE): + super().__init__(years, maxima, starting_year, + unconstrained_model_class=StationaryTemporalModel, + constrained_model_class=GumbelTemporalModel, + quantile_level=quantile_level) + + @property + def total_number_of_parameters_for_unconstrained_model(self) -> int: + return 3 + + def _slope_strength(self): + return 0.0 + +class GumbelLocationTrendTest(GevTrendTestOneParameterAgainstStationary): + + def __init__(self, years, maxima, starting_year, quantile_level=EUROCODE_QUANTILE): + super().__init__(years, maxima, starting_year, + unconstrained_model_class=NonStationaryLocationGumbelModel, + gev_param_name=GevParams.LOC, + quantile_level=quantile_level, + constrained_model_class=GumbelTemporalModel) + + @property + def total_number_of_parameters_for_unconstrained_model(self) -> int: + return 3 + + def _slope_strength(self): + return self.unconstrained_estimator_gev_params.time_derivative_of_return_level(p=self.quantile_level, + mu1=self.non_stationary_linear_coef) + + +class GumbelScaleTrendTest(GevTrendTestOneParameterAgainstStationary): + + def __init__(self, years, maxima, starting_year, quantile_level=EUROCODE_QUANTILE): + super().__init__(years, maxima, starting_year, + unconstrained_model_class=NonStationaryScaleGumbelModel, + gev_param_name=GevParams.SCALE, + quantile_level=quantile_level, + constrained_model_class=GumbelTemporalModel) + + def _slope_strength(self): + return self.unconstrained_estimator_gev_params.time_derivative_of_return_level( + p=self.quantile_level, + sigma1=self.non_stationary_linear_coef) + + @property + def total_number_of_parameters_for_unconstrained_model(self) -> int: + return 3 diff --git a/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_three_parameters/__init__.py b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_three_parameters/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_three_parameters/gumbel_trend_test_three_parameters.py b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_three_parameters/gumbel_trend_test_three_parameters.py new file mode 100644 index 0000000000000000000000000000000000000000..b5f6cbccb05e878a30af1626ca9957f9c668c4cc --- /dev/null +++ b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_three_parameters/gumbel_trend_test_three_parameters.py @@ -0,0 +1,48 @@ +from experiment.eurocode_data.utils import EUROCODE_QUANTILE +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_two_parameters.gev_trend_test_two_parameters import \ + GevLocationAndScaleTrendTest +from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel +from experiment.eurocode_data.utils import EUROCODE_QUANTILE +from experiment.trend_analysis.univariate_test.extreme_trend_test.abstract_gev_trend_test import AbstractGevTrendTest +from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import \ + NonStationaryLocationAndScaleTemporalModel, StationaryTemporalModel, NonStationaryLocationAndScaleGumbelModel, \ + GumbelTemporalModel +from extreme_fit.distribution.gev.gev_params import GevParams +from root_utils import classproperty + + +class GevTrendTestThreeParameters(AbstractGevTrendTest): + + @property + def degree_freedom_chi2(self) -> int: + return 3 + + +class GevLocationAndScaleTrendTestAgainstGumbel(GevTrendTestThreeParameters): + + def __init__(self, years, maxima, starting_year, quantile_level=EUROCODE_QUANTILE): + super().__init__(years, maxima, starting_year, + unconstrained_model_class=NonStationaryLocationAndScaleTemporalModel, + constrained_model_class=GumbelTemporalModel, + quantile_level=quantile_level) + + @property + def mu1(self): + return self.get_non_stationary_linear_coef(gev_param_name=GevParams.LOC) + + @property + def sigma1(self): + return self.get_non_stationary_linear_coef(gev_param_name=GevParams.SCALE) + + def _slope_strength(self): + return self.unconstrained_estimator_gev_params.time_derivative_of_return_level(p=self.quantile_level, + mu1=self.mu1, + sigma1=self.sigma1) + + @classproperty + def label(self): + return super().label % '\\zeta_0, \\mu_1, \\sigma_1' + + @classproperty + def marker(self): + return 'd' diff --git a/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_two_parameters/__init__.py b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_two_parameters/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/experiment/trend_analysis/univariate_test/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 similarity index 90% rename from experiment/trend_analysis/univariate_test/gev_trend_test_two_parameters.py rename to experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_two_parameters/gev_trend_test_two_parameters.py index 2bd8a106a4ff125fd09735104797e159c6f5bfe1..89cd18b3934073de5820832f2cf0079cd93ef255 100644 --- a/experiment/trend_analysis/univariate_test/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 @@ -1,7 +1,8 @@ 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.extreme_trend_test.abstract_gev_trend_test import AbstractGevTrendTest from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import \ - NonStationaryLocationAndScaleTemporalModel, StationaryTemporalModel + NonStationaryLocationAndScaleTemporalModel, StationaryTemporalModel, NonStationaryLocationAndScaleGumbelModel, \ + GumbelTemporalModel from extreme_fit.distribution.gev.gev_params import GevParams @@ -42,3 +43,5 @@ class GevLocationAndScaleTrendTest(GevTrendTestTwoParameters): @property def variance_difference_same_sign_as_slope_strenght(self) -> bool: return self.same_sign(self.sigma1, self._slope_strength()) + + 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 new file mode 100644 index 0000000000000000000000000000000000000000..ea7648ac5f5fb38a65bb98f9bd37acd9f1e6e8f2 --- /dev/null +++ b/experiment/trend_analysis/univariate_test/extreme_trend_test/trend_test_two_parameters/gumbel_test_two_parameters.py @@ -0,0 +1,32 @@ +from experiment.eurocode_data.utils import EUROCODE_QUANTILE +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_two_parameters.gev_trend_test_two_parameters import \ + GevTrendTestTwoParameters +from extreme_fit.distribution.gev.gev_params import GevParams +from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import \ + NonStationaryLocationAndScaleGumbelModel, GumbelTemporalModel + + +class GumbelLocationAndScaleTrendTest(GevTrendTestTwoParameters): + + def __init__(self, years, maxima, starting_year, quantile_level=EUROCODE_QUANTILE): + super().__init__(years, maxima, starting_year, + unconstrained_model_class=NonStationaryLocationAndScaleGumbelModel, + constrained_model_class=GumbelTemporalModel, + quantile_level=quantile_level) + + @property + def total_number_of_parameters_for_unconstrained_model(self) -> int: + return 4 + + @property + def mu1(self): + return self.get_non_stationary_linear_coef(gev_param_name=GevParams.LOC) + + @property + def sigma1(self): + return self.get_non_stationary_linear_coef(gev_param_name=GevParams.SCALE) + + def _slope_strength(self): + return self.unconstrained_estimator_gev_params.time_derivative_of_return_level(p=self.quantile_level, + mu1=self.mu1, + sigma1=self.sigma1) diff --git a/experiment/trend_analysis/univariate_test/mann_kendall_test.py b/experiment/trend_analysis/univariate_test/mann_kendall_test.py deleted file mode 100644 index 8402791d2e8c6b4fd2bae4a6132e76ceaac4bb76..0000000000000000000000000000000000000000 --- a/experiment/trend_analysis/univariate_test/mann_kendall_test.py +++ /dev/null @@ -1,146 +0,0 @@ -# Created: Mon Apr 17, 2017 01:18PM -# Last modified: Mon Apr 17, 2017 09:24PM -# Copyright: Bedartha Goswami <goswami@uni-potsdam.de> - -# This code was adapted from: https://up-rs-esp.github.io/mkt/ - -import numpy as np -from scipy.special import ndtri, ndtr -import sys - - -def mann_kendall_test(t, x, eps=None, alpha=None, Ha=None): - """ - Runs the Mann-Kendall test for trend in time series data. - - Parameters - ---------- - t : 1D numpy.ndarray - array of the time points of measurements - x : 1D numpy.ndarray - array containing the measurements corresponding to entries of 't' - eps : scalar, float, greater than zero - least count error of measurements which help determine ties in the data - alpha : scalar, float, greater than zero - significance level of the statistical test (Type I error) - Ha : string, options include 'up', 'down', 'upordown' - type of test: one-sided ('up' or 'down') or two-sided ('updown') - - Returns - ------- - MK : string - result of the statistical test indicating whether or not to accept hte - alternative hypothesis 'Ha' - m : scalar, float - slope of the linear fit to the data - c : scalar, float - intercept of the linear fit to the data - p : scalar, float, greater than zero - p-value of the obtained Z-score statistic for the Mann-Kendall test - - Raises - ------ - AssertionError : error - least count error of measurements 'eps' is not given - AssertionError : error - significance level of test 'alpha' is not given - AssertionError : error - alternative hypothesis 'Ha' is not given - - """ - # assert a least count for the measurements x - assert eps, "Please provide least count error for measurements 'x'" - assert alpha, "Please provide significance level 'alpha' for the test" - assert Ha, "Please provide the alternative hypothesis 'Ha'" - - # estimate sign of all possible (n(n-1)) / 2 differences - n = len(t) - sgn = np.zeros((n, n), dtype="int") - for i in range(n): - tmp = x - x[i] - tmp[np.where(np.fabs(tmp) <= eps)] = 0. - sgn[i] = np.sign(tmp) - - # estimate mean of the sign of all possible differences - S = sgn[np.triu_indices(n, k=1)].sum() - - # estimate variance of the sign of all possible differences - # 1. Determine no. of tie groups 'p' and no. of ties in each group 'q' - np.fill_diagonal(sgn, eps * 1E6) - i, j = np.where(sgn == 0.) - ties = np.unique(x[i]) - p = len(ties) - q = np.zeros(len(ties), dtype="int") - for k in range(p): - idx = np.where(np.fabs(x - ties[k]) < eps)[0] - q[k] = len(idx) - # 2. Determine the two terms in the variance calculation - term1 = n * (n - 1) * (2 * n + 5) - term2 = (q * (q - 1) * (2 * q + 5)).sum() - # 3. estimate variance - varS = float(term1 - term2) / 18. - - # Compute the Z-score based on above estimated mean and variance - if S > eps: - Zmk = (S - 1) / np.sqrt(varS) - elif np.fabs(S) <= eps: - Zmk = 0. - elif S < -eps: - Zmk = (S + 1) / np.sqrt(varS) - - # compute test based on given 'alpha' and alternative hypothesis - # note: for all the following cases, the null hypothesis Ho is: - # Ho := there is no monotonic trend - # - # Ha := There is an upward monotonic trend - if Ha == "up": - Z_ = ndtri(1. - alpha) - if Zmk >= Z_: - MK = "accept Ha := upward trend" - else: - MK = "reject Ha := upward trend" - # Ha := There is a downward monotonic trend - elif Ha == "down": - Z_ = ndtri(1. - alpha) - if Zmk <= -Z_: - MK = "accept Ha := downward trend" - else: - MK = "reject Ha := downward trend" - # Ha := There is an upward OR downward monotonic trend - elif Ha == "upordown": - Z_ = ndtri(1. - alpha / 2.) - if np.fabs(Zmk) >= Z_: - MK = "accept Ha := upward OR downward trend" - else: - MK = "reject Ha := upward OR downward trend" - - # ---------- - # AS A BONUS - # ---------- - # # estimate the slope and intercept of the line - # m = np.corrcoef(t, x)[0, 1] * (np.std(x) / np.std(t)) - # c = np.mean(x) - m * np.mean(t) - # - # - # # ---------- - # # AS A BONUS - # # ---------- - # # estimate the p-value for the obtained Z-score Zmk - # if S > eps: - # if Ha == "up": - # p = 1. - ndtr(Zmk) - # elif Ha == "down": - # p = ndtr(Zmk) - # elif Ha == "upordown": - # p = 0.5 * (1. - ndtr(Zmk)) - # elif np.fabs(S) <= eps: - # p = 0.5 - # elif S < -eps: - # if Ha == "up": - # p = 1. - ndtr(Zmk) - # elif Ha == "down": - # p = ndtr(Zmk) - # elif Ha == "upordown": - # p = 0.5 * (ndtr(Zmk)) - - return MK, S diff --git a/experiment/trend_analysis/univariate_test/univariate_test_results.py b/experiment/trend_analysis/univariate_test/univariate_test_results.py index 009da7831c00d58c669170367f945bd7663ce383..a319c72e37b201c5b26d247029ad8cc066f567a8 100644 --- a/experiment/trend_analysis/univariate_test/univariate_test_results.py +++ b/experiment/trend_analysis/univariate_test/univariate_test_results.py @@ -2,9 +2,9 @@ from multiprocessing.pool import Pool import numpy as np -from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import AbstractGevTrendTest +from experiment.trend_analysis.univariate_test.extreme_trend_test.abstract_gev_trend_test import AbstractGevTrendTest from extreme_fit.model.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \ - AbstractTemporalLinearMarginModel, TemporalMarginFitMethod + TemporalMarginFitMethod from root_utils import NB_CORES diff --git a/extreme_fit/model/margin_model/linear_margin_model/temporal_linear_margin_models.py b/extreme_fit/model/margin_model/linear_margin_model/temporal_linear_margin_models.py index e6a54751d2b670a546f2bf8cc1216af6a129cfef..23be15751f9048bd74497c626c4c7fd3abc5b638 100644 --- a/extreme_fit/model/margin_model/linear_margin_model/temporal_linear_margin_models.py +++ b/extreme_fit/model/margin_model/linear_margin_model/temporal_linear_margin_models.py @@ -11,15 +11,6 @@ class StationaryTemporalModel(AbstractTemporalLinearMarginModel): super().load_margin_functions({}) -class GumbelTemporalModel(StationaryTemporalModel): - - def __init__(self, coordinates: AbstractCoordinates, use_start_value=False, params_start_fit=None, - params_sample=None, starting_point=None, fit_method=TemporalMarginFitMethod.is_mev_gev_fit, - nb_iterations_for_bayesian_fit=5000, params_start_fit_bayesian=None): - super().__init__(coordinates, use_start_value, params_start_fit, params_sample, starting_point, fit_method, - nb_iterations_for_bayesian_fit, params_start_fit_bayesian, type_for_MLE="Gumbel") - - class NonStationaryLocationTemporalModel(AbstractTemporalLinearMarginModel): def load_margin_functions(self, gev_param_name_to_dims=None): @@ -73,3 +64,22 @@ class NonStationaryLocationAndScaleTemporalModel(AbstractTemporalLinearMarginMod @property def sigl(self): return 1 + + +class GumbelTemporalModel(StationaryTemporalModel): + + def __init__(self, coordinates: AbstractCoordinates, use_start_value=False, params_start_fit=None, + params_sample=None, starting_point=None, fit_method=TemporalMarginFitMethod.is_mev_gev_fit, + nb_iterations_for_bayesian_fit=5000, params_start_fit_bayesian=None): + super().__init__(coordinates, use_start_value, params_start_fit, params_sample, starting_point, fit_method, + nb_iterations_for_bayesian_fit, params_start_fit_bayesian, type_for_MLE="Gumbel") + + +class NonStationaryLocationGumbelModel(GumbelTemporalModel, NonStationaryLocationTemporalModel): + pass + +class NonStationaryScaleGumbelModel(GumbelTemporalModel, NonStationaryScaleTemporalModel): + pass + +class NonStationaryLocationAndScaleGumbelModel(GumbelTemporalModel, NonStationaryLocationAndScaleTemporalModel): + pass \ No newline at end of file diff --git a/extreme_fit/model/result_from_model_fit/utils.py b/extreme_fit/model/result_from_model_fit/utils.py index 03d95a07f6a37dc3c32ba63cbe75ad798258a6b0..d98b6b5375c65b4454bf084860b173917477333e 100644 --- a/extreme_fit/model/result_from_model_fit/utils.py +++ b/extreme_fit/model/result_from_model_fit/utils.py @@ -19,7 +19,7 @@ def get_margin_coef_ordered_dict(gev_param_name_to_dim, mle_values, type_for_mle for gev_param_name in GevParams.PARAM_NAMES: # Add intercept (i.e. stationary parameter) intercept_coef_name = LinearCoef.coef_template_str(gev_param_name, LinearCoef.INTERCEPT_NAME).format(1) - if type_for_mle == "Gumbel" and i == 2: + if type_for_mle == "Gumbel" and gev_param_name == GevParams.SHAPE: coef_value = 0 else: coef_value = mle_values[i] diff --git a/test/test_experiment/test_SCM_study.py b/test/test_experiment/test_SCM_study.py index 7a0aa485325cb3420c07c24b6ccdc57bdbadc31f..542cb35e979016f603804ad016288aa512efd5b6 100644 --- a/test/test_experiment/test_SCM_study.py +++ b/test/test_experiment/test_SCM_study.py @@ -12,7 +12,8 @@ from experiment.meteo_france_data.scm_models_data.visualization.study_visualizat study_iterator, study_iterator_global, SCM_STUDIES, ALL_ALTITUDES from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.study_visualizer import \ StudyVisualizer -from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevLocationTrendTest +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter.gev_trend_test_one_parameter import \ + GevLocationTrendTest from root_utils import get_display_name_from_object_type diff --git a/test/test_experiment/test_hypercube.py b/test/test_experiment/test_hypercube.py index ad3b15e63ad7e712445f473800acdf2032540047..80446d443f02fb818671d13305bda286aa26361e 100644 --- a/test/test_experiment/test_hypercube.py +++ b/test/test_experiment/test_hypercube.py @@ -4,15 +4,14 @@ from collections import OrderedDict import numpy as np from experiment.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall -from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.altitude_hypercube_visualizer import \ - AltitudeHypercubeVisualizer from experiment.meteo_france_data.scm_models_data.visualization.hypercube_visualization.altitude_year_hypercube_visualizer import \ Altitude_Hypercube_Year_Visualizer from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.main_study_visualizer import \ study_iterator from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.study_visualizer import \ StudyVisualizer -from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevLocationTrendTest +from experiment.trend_analysis.univariate_test.extreme_trend_test.trend_test_one_parameter.gev_trend_test_one_parameter import \ + GevLocationTrendTest from extreme_fit.model.utils import set_seed_for_test diff --git a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_bayesian.py b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_bayesian.py index 868521460f7a94c890694fbc4f9b5b8e77a892cc..ec0b6977c4e4667d9ac714534080fcf54c956218 100644 --- a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_bayesian.py +++ b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_bayesian.py @@ -3,7 +3,7 @@ import unittest import numpy as np import pandas as pd -from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import fitted_linear_margin_estimator +from experiment.trend_analysis.univariate_test.extreme_trend_test.abstract_gev_trend_test import fitted_linear_margin_estimator from extreme_fit.model.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \ TemporalMarginFitMethod from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel, \ diff --git a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_gumbel.py b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_gumbel.py index 2996bb21bd55e6dd8518d43fb06e9b388a32672f..8aee8f21c4e6ba22e464b46b03dc19a4ddd34115 100644 --- a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_gumbel.py +++ b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_gumbel.py @@ -3,11 +3,10 @@ import unittest import numpy as np import pandas as pd -from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import fitted_linear_margin_estimator +from experiment.trend_analysis.univariate_test.extreme_trend_test.abstract_gev_trend_test import fitted_linear_margin_estimator from extreme_fit.model.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \ TemporalMarginFitMethod -from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel, \ - NonStationaryLocationTemporalModel, NonStationaryLocationAndScaleTemporalModel, GumbelTemporalModel +from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import GumbelTemporalModel from extreme_fit.model.utils import r, set_seed_r from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates from spatio_temporal_dataset.coordinates.temporal_coordinates.abstract_temporal_coordinates import \ diff --git a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_mle.py b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_mle.py index 0d420386f879e805c32d2de566462b366df78c3b..f1dc68ff26a85c86f0dc6fa947c7a565ed521a09 100644 --- a/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_mle.py +++ b/test/test_extreme_fit/test_distribution/test_gev/test_gev_temporal_extremes_mle.py @@ -3,7 +3,7 @@ import unittest import numpy as np import pandas as pd -from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import fitted_linear_margin_estimator +from experiment.trend_analysis.univariate_test.extreme_trend_test.abstract_gev_trend_test import fitted_linear_margin_estimator from extreme_fit.model.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \ TemporalMarginFitMethod from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel, \