From 2c42bae4de0b1ba9847397a4d63b633fc7edcb4b Mon Sep 17 00:00:00 2001 From: Le Roux Erwan <erwan.le-roux@irstea.fr> Date: Wed, 24 Jun 2020 17:58:02 +0200 Subject: [PATCH] [contrasting] refactor folders for altitudes_fit, add one_fold_fit.py --- .../altitudes_fit/altitudes_studies.py | 11 +++--- .../altitudes_fit/main_altitudes_studies.py | 35 +++++++++++++------ .../one_fold_analysis/__init__.py | 0 ...es_visualizer_for_non_stationary_models.py | 27 ++++++++++++++ .../one_fold_analysis/one_fold_fit.py | 20 +++++++++++ .../two_fold_analysis/__init__.py | 0 .../two_fold_datasets_generator.py | 0 .../two_fold_detail_fit.py | 2 +- .../{ => two_fold_analysis}/two_fold_fit.py | 6 ++-- .../{ => two_fold_analysis}/utils.py | 0 spatio_temporal_dataset/slicer/utils.py | 10 ++++++ .../test_gev_spatio_temporal_extremes_mle.py | 21 ++--------- .../test_two_fold_datasets_generator.py | 2 +- .../test_contrasting/test_two_fold_fit.py | 8 ++--- 14 files changed, 99 insertions(+), 43 deletions(-) create mode 100644 projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/__init__.py create mode 100644 projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitudes_studies_visualizer_for_non_stationary_models.py create mode 100644 projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py create mode 100644 projects/altitude_spatial_model/altitudes_fit/two_fold_analysis/__init__.py rename projects/altitude_spatial_model/altitudes_fit/{ => two_fold_analysis}/two_fold_datasets_generator.py (100%) rename projects/altitude_spatial_model/altitudes_fit/{ => two_fold_analysis}/two_fold_detail_fit.py (96%) rename projects/altitude_spatial_model/altitudes_fit/{ => two_fold_analysis}/two_fold_fit.py (82%) rename projects/altitude_spatial_model/altitudes_fit/{ => two_fold_analysis}/utils.py (100%) create mode 100644 spatio_temporal_dataset/slicer/utils.py diff --git a/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py b/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py index 34a8b7ff..9bbadcf2 100644 --- a/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py +++ b/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py @@ -17,6 +17,7 @@ from spatio_temporal_dataset.coordinates.spatio_temporal_coordinates.abstract_sp from spatio_temporal_dataset.coordinates.temporal_coordinates.generated_temporal_coordinates import \ ConsecutiveTemporalCoordinates from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset +from spatio_temporal_dataset.slicer.utils import get_slicer_class_from_s_splits from spatio_temporal_dataset.spatio_temporal_observations.annual_maxima_observations import AnnualMaxima import matplotlib.pyplot as plt @@ -43,20 +44,20 @@ class AltitudesStudies(object): def spatio_temporal_dataset(self, massif_name, s_split_spatial: pd.Series = None, s_split_temporal: pd.Series = None): - coordinates = self.spatio_temporal_coordinates(s_split_spatial, s_split_temporal) coordinate_values_to_maxima = {} for altitude in self.altitudes: study = self.altitude_to_study[altitude] - for year, maxima in zip(study.ordered_years, study.massif_name_to_annual_maxima[massif_name]): - coordinate_values_to_maxima[(altitude, year)] = [maxima] + if massif_name in study.study_massif_names: + for year, maxima in zip(study.ordered_years, study.massif_name_to_annual_maxima[massif_name]): + coordinate_values_to_maxima[(altitude, year)] = [maxima] + coordinates = self.spatio_temporal_coordinates(s_split_spatial, s_split_temporal) observations = AnnualMaxima.from_coordinates(coordinates, coordinate_values_to_maxima) return AbstractDataset(observations=observations, coordinates=coordinates) # Coordinates Loader def spatio_temporal_coordinates(self, s_split_spatial: pd.Series = None, s_split_temporal: pd.Series = None): - slicer_class = AbstractCoordinates.slicer_class_from_s_splits(s_split_spatial=s_split_spatial, - s_split_temporal=s_split_temporal) + slicer_class = get_slicer_class_from_s_splits(s_split_spatial, s_split_temporal) return AbstractSpatioTemporalCoordinates(slicer_class=slicer_class, s_split_spatial=s_split_spatial, s_split_temporal=s_split_temporal, diff --git a/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py b/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py index d4f058db..60832aca 100644 --- a/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py +++ b/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py @@ -2,27 +2,42 @@ from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranS SafranSnowfall5Days, SafranSnowfall7Days, SafranPrecipitation1Day, SafranPrecipitation3Days, \ SafranPrecipitation5Days, SafranPrecipitation7Days from extreme_data.meteo_france_data.scm_models_data.utils import Season +from extreme_fit.model.margin_model.polynomial_margin_model.utils import ALTITUDINAL_MODELS from projects.altitude_spatial_model.altitudes_fit.altitudes_studies import AltitudesStudies +from projects.altitude_spatial_model.altitudes_fit.one_fold_analysis.altitudes_studies_visualizer_for_non_stationary_models import \ + AltitudesStudiesVisualizerForNonStationaryModels -def main_plots_moments(): +def plot_altitudinal_fit(studies): + visualizer = AltitudesStudiesVisualizerForNonStationaryModels(studies=studies, + model_classes=ALTITUDINAL_MODELS, + massif_names=['Belledonne']) + + +def plot_time_series(studies): + studies.plot_maxima_time_series() + + +def plot_moments(studies): + for std in [True, False][1:]: + for change in [True, False, None]: + studies.plot_mean_maxima_against_altitude(std=std, change=change) + + +def main(): altitudes = [900, 1200, 1500, 1800, 2100, 2400, 2700, 3000] # altitudes = [900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600, 3900] study_classes = [SafranSnowfall1Day, SafranSnowfall3Days, SafranSnowfall5Days, SafranSnowfall7Days][:2] study_classes = [SafranPrecipitation1Day, SafranPrecipitation3Days, SafranPrecipitation5Days, SafranPrecipitation7Days][:] - study_classes = [SafranPrecipitation1Day, SafranSnowfall1Day, SafranSnowfall3Days, SafranPrecipitation3Days][2:] + study_classes = [SafranPrecipitation1Day, SafranSnowfall1Day, SafranSnowfall3Days, SafranPrecipitation3Days][:1] for study_class in study_classes: - studies = AltitudesStudies(study_class, altitudes, season=Season.winter_extended) - # massifs_names = ['Vercors', 'Chartreuse', 'Belledonne'] - # studies.plot_mean_maxima_against_altitude(massif_names=massifs_names, show=True) - # studies.plot_maxima_time_series() - for std in [True, False][1:]: - for change in [True, False, None]: - studies.plot_mean_maxima_against_altitude(std=std, change=change) + # plot_time_series(studies) + # plot_moments(studies) + plot_altitudinal_fit(studies) if __name__ == '__main__': - main_plots_moments() + main() diff --git a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/__init__.py b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitudes_studies_visualizer_for_non_stationary_models.py b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitudes_studies_visualizer_for_non_stationary_models.py new file mode 100644 index 00000000..9feb94a2 --- /dev/null +++ b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitudes_studies_visualizer_for_non_stationary_models.py @@ -0,0 +1,27 @@ +from typing import List + +from extreme_data.meteo_france_data.scm_models_data.abstract_study import AbstractStudy +from extreme_data.meteo_france_data.scm_models_data.visualization.study_visualizer import StudyVisualizer +from extreme_fit.model.margin_model.polynomial_margin_model.spatio_temporal_polynomial_model import \ + AbstractSpatioTemporalPolynomialModel +from projects.altitude_spatial_model.altitudes_fit.altitudes_studies import AltitudesStudies +from projects.altitude_spatial_model.altitudes_fit.one_fold_analysis.one_fold_fit import \ + OneFoldFit + + +class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): + + def __init__(self, studies: AltitudesStudies, + model_classes: List[AbstractSpatioTemporalPolynomialModel], + show=False, + massif_names=None): + study = studies.study + self.massif_names = massif_names if massif_names is not None else self.study.study_massif_names + self.studies = studies + self.non_stationary_models = model_classes + super().__init__(study, show=show, save_to_file=not show) + self.massif_name_to_one_fold_fit = {} + for massif_name in self.massif_names: + dataset = studies.spatio_temporal_dataset(massif_name=massif_name) + old_fold_fit = OneFoldFit(dataset, model_classes) + self.massif_name_to_one_fold_fit[massif_name] = old_fold_fit \ No newline at end of file diff --git a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py new file mode 100644 index 00000000..f1486e10 --- /dev/null +++ b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/one_fold_fit.py @@ -0,0 +1,20 @@ +from extreme_fit.estimator.margin_estimator.utils import fitted_linear_margin_estimator_short +from extreme_fit.model.margin_model.utils import MarginFitMethod + + +class OneFoldFit(object): + + def __init__(self, dataset, models_classes, fit_method=MarginFitMethod.extremes_fevd_mle): + self.dataset = dataset + self.models_classes = models_classes + self.fit_method = fit_method + + # Fit Estimators + self.model_class_to_estimator = {} + for model_class in models_classes: + self.model_class_to_estimator[model_class] = fitted_linear_margin_estimator_short(model_class=model_class, + dataset=self.dataset, + fit_method=self.fit_method) + # Some display + for estimator in self.model_class_to_estimator.values(): + print(estimator.result_from_model_fit.aic) diff --git a/projects/altitude_spatial_model/altitudes_fit/two_fold_analysis/__init__.py b/projects/altitude_spatial_model/altitudes_fit/two_fold_analysis/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/projects/altitude_spatial_model/altitudes_fit/two_fold_datasets_generator.py b/projects/altitude_spatial_model/altitudes_fit/two_fold_analysis/two_fold_datasets_generator.py similarity index 100% rename from projects/altitude_spatial_model/altitudes_fit/two_fold_datasets_generator.py rename to projects/altitude_spatial_model/altitudes_fit/two_fold_analysis/two_fold_datasets_generator.py diff --git a/projects/altitude_spatial_model/altitudes_fit/two_fold_detail_fit.py b/projects/altitude_spatial_model/altitudes_fit/two_fold_analysis/two_fold_detail_fit.py similarity index 96% rename from projects/altitude_spatial_model/altitudes_fit/two_fold_detail_fit.py rename to projects/altitude_spatial_model/altitudes_fit/two_fold_analysis/two_fold_detail_fit.py index 9e716608..e166d28c 100644 --- a/projects/altitude_spatial_model/altitudes_fit/two_fold_detail_fit.py +++ b/projects/altitude_spatial_model/altitudes_fit/two_fold_analysis/two_fold_detail_fit.py @@ -4,7 +4,7 @@ import numpy as np from extreme_fit.estimator.margin_estimator.abstract_margin_estimator import LinearMarginEstimator from extreme_fit.estimator.margin_estimator.utils import fitted_linear_margin_estimator_short -from projects.altitude_spatial_model.altitudes_fit.utils import get_key_with_min_value, Score, Grouping +from projects.altitude_spatial_model.altitudes_fit.two_fold_analysis.utils import get_key_with_min_value, Score, Grouping from spatio_temporal_dataset.slicer.split import Split diff --git a/projects/altitude_spatial_model/altitudes_fit/two_fold_fit.py b/projects/altitude_spatial_model/altitudes_fit/two_fold_analysis/two_fold_fit.py similarity index 82% rename from projects/altitude_spatial_model/altitudes_fit/two_fold_fit.py rename to projects/altitude_spatial_model/altitudes_fit/two_fold_analysis/two_fold_fit.py index b5593f46..faedb05c 100644 --- a/projects/altitude_spatial_model/altitudes_fit/two_fold_fit.py +++ b/projects/altitude_spatial_model/altitudes_fit/two_fold_analysis/two_fold_fit.py @@ -4,9 +4,9 @@ from cached_property import cached_property from extreme_fit.model.margin_model.utils import \ MarginFitMethod -from projects.altitude_spatial_model.altitudes_fit.two_fold_datasets_generator import TwoFoldDatasetsGenerator -from projects.altitude_spatial_model.altitudes_fit.two_fold_detail_fit import TwoFoldMassifFit -from projects.altitude_spatial_model.altitudes_fit.utils import Score, Grouping +from projects.altitude_spatial_model.altitudes_fit.two_fold_analysis.two_fold_datasets_generator import TwoFoldDatasetsGenerator +from projects.altitude_spatial_model.altitudes_fit.two_fold_analysis.two_fold_detail_fit import TwoFoldMassifFit +from projects.altitude_spatial_model.altitudes_fit.two_fold_analysis.utils import Score, Grouping class TwoFoldFit(object): diff --git a/projects/altitude_spatial_model/altitudes_fit/utils.py b/projects/altitude_spatial_model/altitudes_fit/two_fold_analysis/utils.py similarity index 100% rename from projects/altitude_spatial_model/altitudes_fit/utils.py rename to projects/altitude_spatial_model/altitudes_fit/two_fold_analysis/utils.py diff --git a/spatio_temporal_dataset/slicer/utils.py b/spatio_temporal_dataset/slicer/utils.py new file mode 100644 index 00000000..20e34ce2 --- /dev/null +++ b/spatio_temporal_dataset/slicer/utils.py @@ -0,0 +1,10 @@ +from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates +from spatio_temporal_dataset.slicer.spatio_temporal_slicer import SpatioTemporalSlicer + + +def get_slicer_class_from_s_splits(s_split_spatial, s_split_temporal): + if s_split_temporal is None and s_split_spatial is None: + return SpatioTemporalSlicer + else: + return AbstractCoordinates.slicer_class_from_s_splits(s_split_spatial=s_split_spatial, + s_split_temporal=s_split_temporal) diff --git a/test/test_extreme_fit/test_estimator/test_gev_spatio_temporal_extremes_mle.py b/test/test_extreme_fit/test_estimator/test_gev_spatio_temporal_extremes_mle.py index 7d336ecd..9af269f3 100644 --- a/test/test_extreme_fit/test_estimator/test_gev_spatio_temporal_extremes_mle.py +++ b/test/test_extreme_fit/test_estimator/test_gev_spatio_temporal_extremes_mle.py @@ -1,31 +1,14 @@ import unittest -import numpy as np -import pandas as pd - from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day -from extreme_fit.distribution.gev.gev_params import GevParams -from extreme_fit.model.margin_model.polynomial_margin_model.polynomial_margin_model import \ - NonStationaryQuadraticLocationModel, \ - NonStationaryQuadraticScaleModel, NonStationaryQuadraticLocationGumbelModel, NonStationaryQuadraticScaleGumbelModel from extreme_fit.model.margin_model.polynomial_margin_model.spatio_temporal_polynomial_model import \ NonStationaryLocationSpatioTemporalLinearityModel, NonStationaryLocationSpatioTemporalLinearityModel2 from extreme_fit.model.margin_model.polynomial_margin_model.utils import ALTITUDINAL_MODELS -from extreme_trend.abstract_gev_trend_test import fitted_linear_margin_estimator from extreme_fit.model.margin_model.utils import \ MarginFitMethod -from extreme_fit.model.utils import r, set_seed_r from projects.altitude_spatial_model.altitudes_fit.altitudes_studies import AltitudesStudies -from projects.altitude_spatial_model.altitudes_fit.two_fold_datasets_generator import TwoFoldDatasetsGenerator -from projects.altitude_spatial_model.altitudes_fit.two_fold_fit import TwoFoldFit -from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates -from spatio_temporal_dataset.coordinates.temporal_coordinates.abstract_temporal_coordinates import \ - AbstractTemporalCoordinates -from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset -from spatio_temporal_dataset.slicer.split import Split -from spatio_temporal_dataset.spatio_temporal_observations.abstract_spatio_temporal_observations import \ - AbstractSpatioTemporalObservations -from test.test_projects.test_contrasting.test_two_fold_fit import load_two_fold_fit +from projects.altitude_spatial_model.altitudes_fit.two_fold_analysis.two_fold_datasets_generator import TwoFoldDatasetsGenerator +from projects.altitude_spatial_model.altitudes_fit.two_fold_analysis.two_fold_fit import TwoFoldFit class TestGevTemporalQuadraticExtremesMle(unittest.TestCase): diff --git a/test/test_projects/test_contrasting/test_two_fold_datasets_generator.py b/test/test_projects/test_contrasting/test_two_fold_datasets_generator.py index 0cf0cb46..9cbf5a16 100644 --- a/test/test_projects/test_contrasting/test_two_fold_datasets_generator.py +++ b/test/test_projects/test_contrasting/test_two_fold_datasets_generator.py @@ -3,7 +3,7 @@ import numpy as np from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day from projects.altitude_spatial_model.altitudes_fit.altitudes_studies import AltitudesStudies -from projects.altitude_spatial_model.altitudes_fit.two_fold_datasets_generator import TwoFoldDatasetsGenerator +from projects.altitude_spatial_model.altitudes_fit.two_fold_analysis.two_fold_datasets_generator import TwoFoldDatasetsGenerator from spatio_temporal_dataset.slicer.split import Split diff --git a/test/test_projects/test_contrasting/test_two_fold_fit.py b/test/test_projects/test_contrasting/test_two_fold_fit.py index eb49b9b6..5c9c72c4 100644 --- a/test/test_projects/test_contrasting/test_two_fold_fit.py +++ b/test/test_projects/test_contrasting/test_two_fold_fit.py @@ -7,10 +7,10 @@ from extreme_fit.model.margin_model.linear_margin_model.linear_margin_model impo from extreme_fit.model.margin_model.utils import MarginFitMethod from extreme_fit.model.utils import set_seed_for_test from projects.altitude_spatial_model.altitudes_fit.altitudes_studies import AltitudesStudies -from projects.altitude_spatial_model.altitudes_fit.two_fold_datasets_generator import TwoFoldDatasetsGenerator -from projects.altitude_spatial_model.altitudes_fit.two_fold_detail_fit import TwoFoldModelFit -from projects.altitude_spatial_model.altitudes_fit.two_fold_fit import TwoFoldFit -from projects.altitude_spatial_model.altitudes_fit.utils import Score +from projects.altitude_spatial_model.altitudes_fit.two_fold_analysis.two_fold_datasets_generator import TwoFoldDatasetsGenerator +from projects.altitude_spatial_model.altitudes_fit.two_fold_analysis.two_fold_detail_fit import TwoFoldModelFit +from projects.altitude_spatial_model.altitudes_fit.two_fold_analysis.two_fold_fit import TwoFoldFit +from projects.altitude_spatial_model.altitudes_fit.two_fold_analysis.utils import Score from spatio_temporal_dataset.slicer.split import Split -- GitLab