From cdcbd7e65cd958a02fea5cdace6ab7e543273cee Mon Sep 17 00:00:00 2001 From: Le Roux Erwan <erwan.le-roux@irstea.fr> Date: Wed, 17 Jul 2019 15:05:21 +0200 Subject: [PATCH] [GEV TREND TEST] rename and refactor the code for one parameter gev trend test (to prepare the introduction of tests with two parameters) --- .../altitude_hypercube_visualizer.py | 8 +- .../main_fast_hypercube_one_altitudes.py | 4 +- .../main_fast_hypercube_several_altitudes.py | 4 +- .../main_files/main_full_hypercube.py | 4 +- .../main_studies_visualizer.py | 2 +- .../main_study_visualizer.py | 4 +- .../study_visualization/study_visualizer.py | 2 +- .../stations_data/main_station_comparison.py | 2 +- .../main_station_comparison_all_altitudes.py | 6 +- .../comparisons_visualization.py | 2 +- .../main0_comparison_with_observations.py | 0 ...main3_non_stationary_strength_evolution.py | 8 +- experiment/paper1_steps/utils.py | 2 +- ...int_test.py => abstract_gev_trend_test.py} | 97 +++++-------------- .../gev_trend_test_one_parameter.py | 53 ++++++++++ .../gev_trend_test_two_parameters.py | 0 .../trend_analysis/univariate_test/utils.py | 6 +- test/test_experiment/test_SCM_study.py | 5 +- test/test_experiment/test_hypercube.py | 4 +- 19 files changed, 107 insertions(+), 106 deletions(-) create mode 100644 experiment/paper1_steps/hard extreme evolution - annual maxima/main0_comparison_with_observations.py rename experiment/trend_analysis/univariate_test/{abstract_gev_change_point_test.py => abstract_gev_trend_test.py} (65%) create mode 100644 experiment/trend_analysis/univariate_test/gev_trend_test_one_parameter.py create mode 100644 experiment/trend_analysis/univariate_test/gev_trend_test_two_parameters.py 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 df073708..5db8641c 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 a4c57959..77152f09 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 5b2a3fcf..822bd604 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 d8fff38a..ee7d7047 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 4b47fcbe..c3bfd1ec 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 8b6e82bd..4bc1d621 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 a038c142..d4fa910e 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 9aaddcda..46076629 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 9f1456bb..1d5f2e99 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 5ccecce6..4e1b2427 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 00000000..e69de29b 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 790b9203..7801d504 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 3aa74c75..290d2b10 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 6417491e..24381cc7 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 00000000..87967e03 --- /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 00000000..e69de29b diff --git a/experiment/trend_analysis/univariate_test/utils.py b/experiment/trend_analysis/univariate_test/utils.py index 475a8855..23da2440 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 395e5c2f..8c0e1e67 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 3609c59c..b80a08b2 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): -- GitLab