From b2947f4665d4c5e498e96e58454b1c57f4e35d84 Mon Sep 17 00:00:00 2001 From: Le Roux Erwan <erwan.le-roux@irstea.fr> Date: Tue, 31 Mar 2020 15:00:38 +0200 Subject: [PATCH] [contrasting project] add test for study loader. refactor their init function to have a better error message. --- .../scm_models_data/safran/safran.py | 73 ++++++++++--------- .../estimator/margin_estimator/utils.py | 4 +- .../presentation/statistical_model.py | 7 +- .../test_meteo_france_data/test_SCM_study.py | 14 +++- 4 files changed, 56 insertions(+), 42 deletions(-) diff --git a/extreme_data/meteo_france_data/scm_models_data/safran/safran.py b/extreme_data/meteo_france_data/scm_models_data/safran/safran.py index 1d1a9d46..8eecfc81 100644 --- a/extreme_data/meteo_france_data/scm_models_data/safran/safran.py +++ b/extreme_data/meteo_france_data/scm_models_data/safran/safran.py @@ -22,33 +22,32 @@ class Safran(AbstractStudy): class SafranSnowfall(Safran, CumulatedStudy): - def __init__(self, *args, **kwargs): - CumulatedStudy.__init__(self, SafranSnowfallVariable, *args, **kwargs) - Safran.__init__(self, SafranSnowfallVariable, *args, **kwargs) + def __init__(self, **kwargs): + super().__init__(SafranSnowfallVariable, **kwargs) class SafranSnowfall1Day(SafranSnowfall): - def __init__(self, *args, **kwargs): - super().__init__(nb_consecutive_days=1, *args, **kwargs) + def __init__(self, **kwargs): + super().__init__(nb_consecutive_days=1, **kwargs) class SafranSnowfall3Days(SafranSnowfall): - def __init__(self, *args, **kwargs): - super().__init__(nb_consecutive_days=3, *args, **kwargs) + def __init__(self, **kwargs): + super().__init__(nb_consecutive_days=3, **kwargs) class SafranSnowfall5Days(SafranSnowfall): - def __init__(self, *args, **kwargs): - super().__init__(nb_consecutive_days=5, *args, **kwargs) + def __init__(self, **kwargs): + super().__init__(nb_consecutive_days=5, **kwargs) class SafranSnowfall7Days(SafranSnowfall): - def __init__(self, *args, **kwargs): - super().__init__(nb_consecutive_days=7, *args, **kwargs) + def __init__(self, **kwargs): + super().__init__(nb_consecutive_days=7, **kwargs) class ExtendedSafranSnowfall(AbstractExtendedStudy, SafranSnowfall): @@ -57,38 +56,38 @@ class ExtendedSafranSnowfall(AbstractExtendedStudy, SafranSnowfall): class SafranRainfall(CumulatedStudy, Safran): - def __init__(self, *args, **kwargs): - super().__init__(SafranRainfallVariable, *args, **kwargs) + def __init__(self, **kwargs): + super().__init__(SafranRainfallVariable, **kwargs) class SafranRainfall1Day(SafranRainfall): - def __init__(self, *args, **kwargs): - super().__init__(nb_consecutive_days=1, *args, **kwargs) + def __init__(self, **kwargs): + super().__init__(nb_consecutive_days=1, **kwargs) class SafranRainfall3Days(SafranRainfall): - def __init__(self, *args, **kwargs): - super().__init__(nb_consecutive_days=3, *args, **kwargs) + def __init__(self, **kwargs): + super().__init__(nb_consecutive_days=3, **kwargs) class SafranRainfall5Days(SafranRainfall): - def __init__(self, *args, **kwargs): - super().__init__(nb_consecutive_days=5, *args, **kwargs) + def __init__(self, **kwargs): + super().__init__(nb_consecutive_days=5, **kwargs) class SafranRainfall7Days(SafranRainfall): - def __init__(self, *args, **kwargs): - super().__init__(nb_consecutive_days=7, *args, **kwargs) + def __init__(self, **kwargs): + super().__init__(nb_consecutive_days=7, **kwargs) class SafranPrecipitation(CumulatedStudy, Safran): - def __init__(self, *args, **kwargs): - super().__init__(SafranTotalPrecipVariable, *args, **kwargs) + def __init__(self, **kwargs): + super().__init__(SafranTotalPrecipVariable, **kwargs) def load_variable_array(self, dataset): return [np.array(dataset.variables[k]) for k in self.load_keyword()] @@ -100,26 +99,26 @@ class SafranPrecipitation(CumulatedStudy, Safran): class SafranPrecipitation1Day(SafranPrecipitation): - def __init__(self, *args, **kwargs): - super().__init__(nb_consecutive_days=1, *args, **kwargs) + def __init__(self, **kwargs): + super().__init__(nb_consecutive_days=1, **kwargs) class SafranPrecipitation3Days(SafranPrecipitation): - def __init__(self, *args, **kwargs): - super().__init__(nb_consecutive_days=3, *args, **kwargs) + def __init__(self, **kwargs): + super().__init__(nb_consecutive_days=3, **kwargs) class SafranPrecipitation5Days(SafranPrecipitation): - def __init__(self, *args, **kwargs): - super().__init__(nb_consecutive_days=5, *args, **kwargs) + def __init__(self, **kwargs): + super().__init__(nb_consecutive_days=5, **kwargs) class SafranPrecipitation7Days(SafranPrecipitation): - def __init__(self, *args, **kwargs): - super().__init__(nb_consecutive_days=7, *args, **kwargs) + def __init__(self, **kwargs): + super().__init__(nb_consecutive_days=7, **kwargs) class ExtendedSafranPrecipitation(AbstractExtendedStudy, SafranPrecipitation): @@ -128,14 +127,20 @@ class ExtendedSafranPrecipitation(AbstractExtendedStudy, SafranPrecipitation): class SafranTemperature(Safran): - def __init__(self, *args, **kwargs): - super().__init__(SafranTemperatureVariable, *args, **kwargs) + def __init__(self, **kwargs): + super().__init__(SafranTemperatureVariable, **kwargs) def annual_aggregation_function(self, *args, **kwargs): return np.mean(*args, **kwargs) if __name__ == '__main__': - study = SafranRainfall1Day() + altitude = 900 + year_min = 1959 + year_max = 2000 + study = SafranRainfall1Day(altitude, year_min=year_min, year_max=year_max) + d = study.year_to_dataset_ordered_dict[1959] + print(d.keywords) + print(d.variables.keys()) print(study.year_to_annual_maxima[1959]) print(study.ordered_years) diff --git a/extreme_fit/estimator/margin_estimator/utils.py b/extreme_fit/estimator/margin_estimator/utils.py index 95dc74d0..df580526 100644 --- a/extreme_fit/estimator/margin_estimator/utils.py +++ b/extreme_fit/estimator/margin_estimator/utils.py @@ -2,6 +2,8 @@ import pandas as pd from extreme_fit.distribution.gev.gev_params import GevParams from extreme_fit.estimator.margin_estimator.abstract_margin_estimator import LinearMarginEstimator +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 from spatio_temporal_dataset.coordinates.temporal_coordinates.generated_temporal_coordinates import \ ConsecutiveTemporalCoordinates @@ -20,7 +22,7 @@ def fitted_linear_margin_estimator(model_class, coordinates, dataset, starting_y return estimator -def fitted_stationary_gev(x_gev, fit_method, model_class=StationaryTemporalModel, starting_year=None, +def fitted_stationary_gev(x_gev, fit_method=TemporalMarginFitMethod.is_mev_gev_fit, model_class=StationaryTemporalModel, starting_year=None, transformation_class=CenteredScaledNormalization) -> GevParams: coordinates = ConsecutiveTemporalCoordinates.from_nb_temporal_steps(nb_temporal_steps=len(x_gev), transformation_class=CenteredScaledNormalization) diff --git a/projects/exceeding_snow_loads/presentation/statistical_model.py b/projects/exceeding_snow_loads/presentation/statistical_model.py index 1a5e8dcd..72bdf968 100644 --- a/projects/exceeding_snow_loads/presentation/statistical_model.py +++ b/projects/exceeding_snow_loads/presentation/statistical_model.py @@ -25,6 +25,7 @@ def binomial_observation(): plt.yticks([0.0, 1.0], ['Heads', 'Tails']) ax.plot(time, data, color=color, label=label, linewidth=4) + def histogram_for_gev(): import matplotlib.pyplot as plt from extreme_data.meteo_france_data.scm_models_data.crocus.crocus import CrocusSnowLoadTotal @@ -53,9 +54,6 @@ def histogram_for_gev(): ax.set_ylim([0, 0.3]) - - - def histogram_for_normal(): ax = plt.gca() linewidth = 5 @@ -71,9 +69,8 @@ def histogram_for_normal(): ax.set_ylim([0, 0.6]) - if __name__ == '__main__': # binomial_observation() # histogram_for_gev() histogram_for_normal() - plt.show() \ No newline at end of file + plt.show() diff --git a/test/test_extreme_data/test_meteo_france_data/test_SCM_study.py b/test/test_extreme_data/test_meteo_france_data/test_SCM_study.py index 9c829c99..56ab48da 100644 --- a/test/test_extreme_data/test_meteo_france_data/test_SCM_study.py +++ b/test/test_extreme_data/test_meteo_france_data/test_SCM_study.py @@ -4,9 +4,10 @@ from random import sample import pandas as pd +from extreme_data.meteo_france_data.scm_models_data.crocus.crocus import CrocusSnowLoad3Days from extreme_data.meteo_france_data.scm_models_data.safran.cumulated_study import NB_DAYS from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall, SafranTemperature, \ - SafranPrecipitation + SafranPrecipitation, SafranSnowfall3Days, SafranRainfall3Days from extreme_data.meteo_france_data.scm_models_data.utils import SeasonForTheMaxima from extreme_data.meteo_france_data.scm_models_data.visualization.main_study_visualizer import \ study_iterator_global, SCM_STUDIES, ALL_ALTITUDES @@ -33,9 +34,10 @@ class TestSCMAllStudy(unittest.TestCase): self.assertEqual(len(days), len(daily_time_series)) def test_instantiate_studies(self): + study_classes = SCM_STUDIES nb_sample = 2 for nb_days in sample(set(NB_DAYS), k=nb_sample): - for study in study_iterator_global(study_classes=SCM_STUDIES, + for study in study_iterator_global(study_classes=study_classes, only_first_one=False, verbose=False, altitudes=sample(set(ALL_ALTITUDES), k=nb_sample), nb_days=nb_days): first_path_file = study.ordered_years_and_path_files[0][0] @@ -44,6 +46,14 @@ class TestSCMAllStudy(unittest.TestCase): msg='{} days for type {}'.format(nb_days, get_display_name_from_object_type( type(variable_object)))) + def test_instantiate_studies_with_number_of_days(self): + altitude = 900 + year_min = 1959 + year_max = 2000 + study_classes = [SafranSnowfall3Days, SafranRainfall3Days, CrocusSnowLoad3Days] + for study_class in study_classes: + study_class(altitude=altitude, year_min=year_min, year_max=year_max) + class TestSCMStudy(unittest.TestCase): -- GitLab