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