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 df073708baf44d4678761b6d39abdb46059523dd..5db8641c49de4bef291c110af1eb2929763df068 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 @@ -9,7 +9,7 @@ from experiment.meteo_france_data.scm_models_data.visualization.study_visualizat SCM_STUDY_NAME_TO_COLOR, SCM_STUDY_NAME_TO_ABBREVIATION, SCM_STUDY_CLASS_TO_ABBREVIATION, SCM_STUDIES_NAMES from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.study_visualizer import \ StudyVisualizer -from experiment.trend_analysis.univariate_test.abstract_gev_change_point_test import AbstractGevChangePointTest +from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import AbstractGevTrendTest from experiment.trend_analysis.univariate_test.abstract_univariate_test import AbstractUnivariateTest from extreme_estimator.margin_fits.gev.gev_params import GevParams from utils import get_display_name_from_object_type @@ -320,7 +320,7 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): int(massif_to_constant[m]), "+" if massif_to_strength[m] > 0 else "", round(massif_to_strength[m] * massif_to_constant[m], 1), - AbstractGevChangePointTest.nb_years_for_quantile_evolution) + AbstractGevTrendTest.nb_years_for_quantile_evolution) for m in massif_to_strength} else: massif_name_to_value = massif_to_year @@ -342,8 +342,8 @@ class AltitudeHypercubeVisualizer(AbstractHypercubeVisualizer): title += ' until starting_year={}'.format(self.last_starting_year) title += ' with {} test'.format(get_display_name_from_object_type(self.trend_test_class)) if self.reduce_strength_array: - title += '\nEvolution of the quantile {} every {} years'.format(AbstractGevChangePointTest.quantile_for_strength, - AbstractGevChangePointTest.nb_years_for_quantile_evolution) + title += '\nEvolution of the quantile {} every {} years'.format(AbstractGevTrendTest.quantile_for_strength, + AbstractGevTrendTest.nb_years_for_quantile_evolution) if set: plt.suptitle(title) return title 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 a4c57959adf59c1339aadc8cb85eb3e48a96525f..77152f090a091159986014ac121a48694581c5cd 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 @@ -12,7 +12,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.abstract_gev_change_point_test import GevLocationChangePointTest +from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevLocationTrendTest def get_fast_parameters(altitude=1800): @@ -21,7 +21,7 @@ def get_fast_parameters(altitude=1800): nb_data_reduced_for_speed = 4 altitudes = [altitude] last_starting_year = None - trend_test_class = GevLocationChangePointTest + trend_test_class = GevLocationTrendTest return altitudes, last_starting_year, nb_data_reduced_for_speed, only_first_one, save_to_file, trend_test_class 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 5b2a3fcf74f596051e4c7f30532a7628c413a314..822bd604e5a2a7fc82b907a0f0fcaff8aa4602ea 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 @@ -11,7 +11,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.abstract_gev_change_point_test import GevLocationChangePointTest +from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevLocationTrendTest def get_fast_parameters(altitude=None): @@ -23,7 +23,7 @@ def get_fast_parameters(altitude=None): else: altitudes = [ALL_ALTITUDES[3], ALL_ALTITUDES[-7]] last_starting_year = None - trend_test_class = GevLocationChangePointTest + trend_test_class = GevLocationTrendTest return altitudes, last_starting_year, nb_data_reduced_for_speed, only_first_one, save_to_file, trend_test_class 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 d8fff38a4b0c5d3908f97ee323248453f6ef368d..ee7d7047a2eaa435939ddaea5c59612ae8451ac0 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 @@ -11,7 +11,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.abstract_gev_change_point_test import GevLocationChangePointTest +from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevLocationTrendTest def get_full_parameters(altitude=None): @@ -24,7 +24,7 @@ def get_full_parameters(altitude=None): altitudes = ALL_ALTITUDES[3:-6] first_starting_year = 1958 + 10 last_starting_year = 2017 - 10 - trend_test_class = GevLocationChangePointTest + trend_test_class = GevLocationTrendTest return altitudes, first_starting_year, last_starting_year, nb_data_reduced_for_speed, only_first_one, save_to_file, trend_test_class 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 4b47fcbe6efd2564ec9e3b112bf2d6a76b9d40bd..c3bfd1ec9cca5db94288bbada639c67abb38acec 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_change_point_test import GevLocationChangePointTest, \ +from experiment.trend_analysis.univariate_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 8b6e82bd277378138917ee6b458ca23612660838..4bc1d621192865c7e484e12392130092a1c87a2b 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 @@ -13,7 +13,7 @@ from experiment.meteo_france_data.scm_models_data.safran.safran import SafranSno from collections import OrderedDict -from experiment.trend_analysis.univariate_test.abstract_gev_change_point_test import GevLocationChangePointTest +from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevLocationTrendTest from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation.uniform_normalization import \ BetweenZeroAndOneNormalization, BetweenMinusOneAndOneNormalization from utils import get_display_name_from_object_type @@ -209,7 +209,7 @@ def trend_analysis(): complete_non_stationary_trend_analysis=True) # study_visualizer.visualize_all_independent_temporal_trend() # study_visualizer.visualize_temporal_trend_relevance() - study_visualizer.df_trend_spatio_temporal(GevLocationChangePointTest, + study_visualizer.df_trend_spatio_temporal(GevLocationTrendTest, starting_years=[1958, 1980], nb_massif_for_fast_mode=2) diff --git a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py index a038c142d3956f2bb0bc7b17722050c8237a757d..d4fa910e29b50086458b975f3d136da5cab11c58 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/study_visualizer.py @@ -15,7 +15,7 @@ import seaborn as sns from experiment.meteo_france_data.scm_models_data.abstract_extended_study import AbstractExtendedStudy from experiment.trend_analysis.abstract_score import MeanScore, AbstractTrendScore from experiment.meteo_france_data.scm_models_data.abstract_study import AbstractStudy -from experiment.trend_analysis.univariate_test.abstract_gev_change_point_test import AbstractGevChangePointTest +from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import AbstractGevTrendTest from experiment.trend_analysis.univariate_test.abstract_univariate_test import AbstractUnivariateTest from experiment.trend_analysis.non_stationary_trends import \ ConditionalIndedendenceLocationTrendTest, MaxStableLocationTrendTest, IndependenceLocationTrendTest 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 9aaddcda1431cf51ef060769ff163b4fa105b4b2..46076629cff0bad018fc3fd9bdc411659a5da916 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_change_point_test import GevLocationChangePointTest, \ +from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import GevLocationChangePointTest, \ GevScaleChangePointTest, GevShapeChangePointTest diff --git a/experiment/meteo_france_data/stations_data/main_station_comparison_all_altitudes.py b/experiment/meteo_france_data/stations_data/main_station_comparison_all_altitudes.py index 9f1456bb50b4fb8e2d73cd9afa48974e9bdd17fa..1d5f2e995bdb1efb1948f8b800a5ddc022088f77 100644 --- a/experiment/meteo_france_data/stations_data/main_station_comparison_all_altitudes.py +++ b/experiment/meteo_france_data/stations_data/main_station_comparison_all_altitudes.py @@ -1,9 +1,7 @@ from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.main_study_visualizer import \ - ALL_ALTITUDES_WITH_20_STATIONS_AT_LEAST, ALL_ALTITUDES + ALL_ALTITUDES 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_change_point_test import GevLocationChangePointTest, \ - GevScaleChangePointTest, GevShapeChangePointTest + ComparisonsVisualization # Create the map with the average error per massif diff --git a/experiment/meteo_france_data/stations_data/visualization/comparisons_visualization/comparisons_visualization.py b/experiment/meteo_france_data/stations_data/visualization/comparisons_visualization/comparisons_visualization.py index 5ccecce66168bfcf277505d3078d2430f593751f..4e1b2427d660924c5e51acb65736c86c06b4fe22 100644 --- a/experiment/meteo_france_data/stations_data/visualization/comparisons_visualization/comparisons_visualization.py +++ b/experiment/meteo_france_data/stations_data/visualization/comparisons_visualization/comparisons_visualization.py @@ -14,7 +14,7 @@ from experiment.meteo_france_data.scm_models_data.visualization.study_visualizat VisualizationParameters from experiment.meteo_france_data.stations_data.comparison_analysis import ComparisonAnalysis, MASSIF_COLUMN_NAME, \ REANALYSE_STR, ALTITUDE_COLUMN_NAME, STATION_COLUMN_NAME -from experiment.trend_analysis.univariate_test.abstract_gev_change_point_test import GevLocationChangePointTest +from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import GevLocationChangePointTest from experiment.trend_analysis.univariate_test.abstract_univariate_test import AbstractUnivariateTest from experiment.trend_analysis.univariate_test.utils import compute_gev_change_point_test_results from extreme_estimator.extreme_models.result_from_fit import ResultFromIsmev diff --git a/experiment/paper1_steps/hard extreme evolution - annual maxima/main0_comparison_with_observations.py b/experiment/paper1_steps/hard extreme evolution - annual maxima/main0_comparison_with_observations.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/experiment/paper1_steps/hard extreme evolution - annual maxima/main3_non_stationary_strength_evolution.py b/experiment/paper1_steps/hard extreme evolution - annual maxima/main3_non_stationary_strength_evolution.py index 790b9203e86f115149587d295ce6c9ad918d7bc4..7801d504c2e10ee152367736e94ad84ecc0e5d04 100644 --- a/experiment/paper1_steps/hard extreme evolution - annual maxima/main3_non_stationary_strength_evolution.py +++ b/experiment/paper1_steps/hard extreme evolution - annual maxima/main3_non_stationary_strength_evolution.py @@ -2,8 +2,8 @@ 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.abstract_gev_change_point_test import GevLocationChangePointTest, \ - GevScaleChangePointTest +from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevScaleTrendTest, \ + GevLocationTrendTest """ Visualize the 0.99 quantile initial value and its evolution @@ -15,14 +15,14 @@ def main_fast_spatial_risk_evolution(): for altitude in FULL_ALTITUDES[-1:]: vizualiser = get_full_altitude_visualizer(Altitude_Hypercube_Year_Visualizer, altitude=altitude, exact_starting_year=1958, reduce_strength_array=True, - trend_test_class=GevScaleChangePointTest) + trend_test_class=GevScaleTrendTest) # vizualiser.save_to_file = False vizualiser.visualize_massif_trend_test_one_altitude() def main_full_spatial_risk_evolution(): for altitude in FULL_ALTITUDES[:]: - for trend_test_class in [GevLocationChangePointTest, GevScaleChangePointTest][:]: + for trend_test_class in [GevLocationTrendTest, GevScaleTrendTest][:]: vizualiser = get_full_altitude_visualizer(Altitude_Hypercube_Year_Visualizer, altitude=altitude, exact_starting_year=1958, reduce_strength_array=True, trend_test_class=trend_test_class) diff --git a/experiment/paper1_steps/utils.py b/experiment/paper1_steps/utils.py index 3aa74c75592aa3a9d25ab22845a22bc242077b79..290d2b10b332352a49d73ec8461dfedbe7a0b76c 100644 --- a/experiment/paper1_steps/utils.py +++ b/experiment/paper1_steps/utils.py @@ -7,7 +7,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.abstract_gev_change_point_test import GevScaleChangePointTest, \ +from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import GevScaleChangePointTest, \ GevLocationChangePointTest FULL_ALTITUDES = [900, 1200, 1500, 1800, 2100, 2400, 2700, 3000] diff --git a/experiment/trend_analysis/univariate_test/abstract_gev_change_point_test.py b/experiment/trend_analysis/univariate_test/abstract_gev_trend_test.py similarity index 65% rename from experiment/trend_analysis/univariate_test/abstract_gev_change_point_test.py rename to experiment/trend_analysis/univariate_test/abstract_gev_trend_test.py index 6417491e792ab6537c7a9ad68c6613c6133ff25e..24381cc78892353a3b628d2f18ca382f2fea5c80 100644 --- a/experiment/trend_analysis/univariate_test/abstract_gev_change_point_test.py +++ b/experiment/trend_analysis/univariate_test/abstract_gev_trend_test.py @@ -19,7 +19,7 @@ from spatio_temporal_dataset.spatio_temporal_observations.abstract_spatio_tempor AbstractSpatioTemporalObservations -class AbstractGevChangePointTest(AbstractUnivariateTest): +class AbstractGevTrendTest(AbstractUnivariateTest): RRunTimeError_TREND = 'R RunTimeError trend' # I should use the quantile from the Eurocode for the buildings quantile_for_strength = 0.98 @@ -34,15 +34,11 @@ class AbstractGevChangePointTest(AbstractUnivariateTest): self.coordinates = AbstractTemporalCoordinates.from_df(df, transformation_class=CenteredScaledNormalization) # type: AbstractTemporalCoordinates self.dataset = AbstractDataset(observations=observations, coordinates=self.coordinates) - # For the moment, we chose: - # -the 0.99 quantile (even if for building maybe we should use the 1/50 so 0.98 quantile) - # -to see the evolution between two successive years try: # Fit stationary model self.stationary_estimator = LinearMarginEstimator(self.dataset, StationaryStationModel(self.coordinates)) self.stationary_estimator.fit() - # Fit non stationary model non_stationary_model = non_stationary_model_class(self.coordinates, starting_point=self.starting_year) self.non_stationary_estimator = LinearMarginEstimator(self.dataset, non_stationary_model) @@ -51,6 +47,8 @@ class AbstractGevChangePointTest(AbstractUnivariateTest): except SafeRunException: self.crashed = True + # Type of trends + @classmethod def real_trend_types(cls): return super().real_trend_types() + [cls.RRunTimeError_TREND] @@ -63,12 +61,25 @@ class AbstractGevChangePointTest(AbstractUnivariateTest): return real_trend_types @property - def likelihood_ratio(self): - return self.non_stationary_deviance - self.stationary_deviance + def test_trend_type(self) -> str: + if self.crashed: + return self.RRunTimeError_TREND + else: + return super().test_trend_type + + # Likelihood ratio test @property - def non_stationary_constant_gev_params(self) -> GevParams: - return self.non_stationary_estimator.result_from_fit.constant_gev_params + def is_significant(self) -> bool: + return self.likelihood_ratio > chi2.ppf(q=1 - self.SIGNIFICANCE_LEVEL, df=self.degree_freedom_chi2) + + @property + def degree_freedom_chi2(self) -> int: + raise NotImplementedError + + @property + def likelihood_ratio(self): + return self.non_stationary_deviance - self.stationary_deviance @property def stationary_deviance(self): @@ -91,35 +102,11 @@ class AbstractGevChangePointTest(AbstractUnivariateTest): else: return self.non_stationary_estimator.result_from_fit.nllh - @property - def is_significant(self) -> bool: - return self.likelihood_ratio > chi2.ppf(q=1 - self.SIGNIFICANCE_LEVEL, df=1) - - # Add a trend type that correspond to run that crashed - - # @classmethod - # def trend_type_to_style(cls): - # trend_type_to_style = super().trend_type_to_style() - # trend_type_to_style[cls.RRunTimeError_TREND] = 'b:' - # return trend_type_to_style - - @property - def test_trend_type(self) -> str: - if self.crashed: - return self.RRunTimeError_TREND - else: - return super().test_trend_type - - def get_coef(self, estimator, coef_name): - return estimator.margin_function_fitted.get_coef(self.gev_param_name, coef_name) + # Evolution of the GEV parameters and corresponding quantiles @property - def non_stationary_intercept_coef(self): - return self.get_coef(self.non_stationary_estimator, LinearCoef.INTERCEPT_NAME) - - @property - def non_stationary_linear_coef(self): - return self.get_coef(self.non_stationary_estimator, AbstractCoordinates.COORDINATE_T) + def non_stationary_constant_gev_params(self) -> GevParams: + return self.non_stationary_estimator.result_from_fit.constant_gev_params @property def test_trend_slope_strength(self): @@ -140,43 +127,5 @@ class AbstractGevChangePointTest(AbstractUnivariateTest): else: return self.non_stationary_constant_gev_params.quantile(p=self.quantile_for_strength) - @property - def percentage_of_change_per_year(self): - ratio = np.abs(self.non_stationary_linear_coef) / np.abs(self.non_stationary_intercept_coef) - scaled_ratio = ratio * self.coordinates.transformed_distance_between_two_successive_years - percentage_of_change_per_year = 100 * scaled_ratio - return percentage_of_change_per_year[0] - - @property - def test_sign(self) -> int: - return np.sign(self.non_stationary_linear_coef) - - -class GevLocationChangePointTest(AbstractGevChangePointTest): - - def __init__(self, years, maxima, starting_year): - super().__init__(years, maxima, starting_year, - NonStationaryLocationStationModel, GevParams.LOC) - - def _slope_strength(self): - return self.non_stationary_constant_gev_params.quantile_strength_evolution_ratio(p=self.quantile_for_strength, - mu1=self.non_stationary_linear_coef) - - -class GevScaleChangePointTest(AbstractGevChangePointTest): - - def __init__(self, years, maxima, starting_year): - super().__init__(years, maxima, starting_year, - NonStationaryScaleStationModel, GevParams.SCALE) - - def _slope_strength(self): - return self.non_stationary_constant_gev_params.quantile_strength_evolution_ratio( - p=self.quantile_for_strength, - sigma1=self.non_stationary_linear_coef) - -class GevShapeChangePointTest(AbstractGevChangePointTest): - def __init__(self, years, maxima, starting_year): - super().__init__(years, maxima, starting_year, - NonStationaryShapeStationModel, GevParams.SHAPE) diff --git a/experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py b/experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py new file mode 100644 index 0000000000000000000000000000000000000000..87967e031930380a01d5a2268e11502fcd0beecd --- /dev/null +++ b/experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py @@ -0,0 +1,53 @@ +from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import AbstractGevTrendTest +from extreme_estimator.extreme_models.margin_model.temporal_linear_margin_model import StationaryStationModel, \ + NonStationaryLocationStationModel, NonStationaryScaleStationModel, NonStationaryShapeStationModel +from extreme_estimator.margin_fits.gev.gev_params import GevParams +import numpy as np + +from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates + + +class GevTrendTestOneParameter(AbstractGevTrendTest): + + @property + def degree_freedom_chi2(self) -> int: + return 1 + + @property + def test_sign(self) -> int: + return np.sign(self.non_stationary_linear_coef) + + @property + def non_stationary_linear_coef(self): + return self.non_stationary_estimator.margin_function_fitted.get_coef(self.gev_param_name, + AbstractCoordinates.COORDINATE_T) + + +class GevLocationTrendTest(GevTrendTestOneParameter): + + def __init__(self, years, maxima, starting_year): + super().__init__(years, maxima, starting_year, + NonStationaryLocationStationModel, GevParams.LOC) + + def _slope_strength(self): + return self.non_stationary_constant_gev_params.quantile_strength_evolution_ratio(p=self.quantile_for_strength, + mu1=self.non_stationary_linear_coef) + + +class GevScaleTrendTest(GevTrendTestOneParameter): + + def __init__(self, years, maxima, starting_year): + super().__init__(years, maxima, starting_year, + NonStationaryScaleStationModel, GevParams.SCALE) + + def _slope_strength(self): + return self.non_stationary_constant_gev_params.quantile_strength_evolution_ratio( + p=self.quantile_for_strength, + sigma1=self.non_stationary_linear_coef) + + +class GevShapeTrendTest(GevTrendTestOneParameter): + + def __init__(self, years, maxima, starting_year): + super().__init__(years, maxima, starting_year, + NonStationaryShapeStationModel, GevParams.SHAPE) diff --git a/experiment/trend_analysis/univariate_test/gev_trend_test_two_parameters.py b/experiment/trend_analysis/univariate_test/gev_trend_test_two_parameters.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/experiment/trend_analysis/univariate_test/utils.py b/experiment/trend_analysis/univariate_test/utils.py index 475a8855789a8ec40197a9b7084040bd7b946047..23da244001c680333507712a6dc2b988fa4c3776 100644 --- a/experiment/trend_analysis/univariate_test/utils.py +++ b/experiment/trend_analysis/univariate_test/utils.py @@ -2,13 +2,13 @@ from multiprocessing.pool import Pool import numpy as np -from experiment.trend_analysis.univariate_test.abstract_gev_change_point_test import AbstractGevChangePointTest +from experiment.trend_analysis.univariate_test.abstract_gev_trend_test import AbstractGevTrendTest from utils import NB_CORES def compute_gev_change_point_test_result(smooth_maxima, starting_year, trend_test_class, years): - trend_test = trend_test_class(years, smooth_maxima, starting_year) # type: AbstractGevChangePointTest - assert isinstance(trend_test, AbstractGevChangePointTest) + trend_test = trend_test_class(years, smooth_maxima, starting_year) # type: AbstractGevTrendTest + assert isinstance(trend_test, AbstractGevTrendTest) return trend_test.test_trend_type, trend_test.test_trend_slope_strength, trend_test.non_stationary_nllh, trend_test.test_trend_constant_quantile, trend_test.non_stationary_deviance, trend_test.stationary_deviance diff --git a/test/test_experiment/test_SCM_study.py b/test/test_experiment/test_SCM_study.py index 395e5c2fedc0dc3df23dcd2ca695bda09ef4471f..8c0e1e675d4ddc71c575405f027948bcd9af022d 100644 --- a/test/test_experiment/test_SCM_study.py +++ b/test/test_experiment/test_SCM_study.py @@ -12,7 +12,7 @@ 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.abstract_gev_change_point_test import GevLocationChangePointTest +from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevLocationTrendTest from utils import get_display_name_from_object_type @@ -22,7 +22,8 @@ class TestSCMAllStudy(unittest.TestCase): for study_class in [ExtendedSafranSnowfall]: for study in study_iterator(study_class, only_first_one=True, verbose=False): study_visualizer = StudyVisualizer(study, show=False, save_to_file=False, multiprocessing=True) - study_visualizer.df_trend_spatio_temporal(GevLocationChangePointTest, [1958, 1959, 1960], nb_massif_for_change_point_test=3, + study_visualizer.df_trend_spatio_temporal(GevLocationTrendTest, [1958, 1959, 1960], + nb_massif_for_change_point_test=3, sample_one_massif_from_each_region=False) self.assertTrue(True) diff --git a/test/test_experiment/test_hypercube.py b/test/test_experiment/test_hypercube.py index 3609c59c47b70f20dac9b54bce9cc22791e68b59..b80a08b236e01674960336d4c15e1f0528fc7889 100644 --- a/test/test_experiment/test_hypercube.py +++ b/test/test_experiment/test_hypercube.py @@ -12,7 +12,7 @@ from experiment.meteo_france_data.scm_models_data.visualization.study_visualizat study_iterator from experiment.meteo_france_data.scm_models_data.visualization.study_visualization.study_visualizer import \ StudyVisualizer -from experiment.trend_analysis.univariate_test.abstract_gev_change_point_test import GevLocationChangePointTest +from experiment.trend_analysis.univariate_test.gev_trend_test_one_parameter import GevLocationTrendTest from extreme_estimator.extreme_models.utils import set_seed_for_test @@ -27,7 +27,7 @@ class TestHypercube(unittest.TestCase): for study in study_iterator(study_class=SafranSnowfall, only_first_one=False, altitudes=altitudes, verbose=self.DISPLAY)] self.altitude_to_visualizer = OrderedDict(zip(altitudes, visualizers)) - self.trend_test_class = GevLocationChangePointTest + self.trend_test_class = GevLocationTrendTest self.nb_data_reduced_for_speed = 4 # def test_altitude_hypercube_visualizer(self):