From 1114b27bd2f65f37800a70b6cf77a62d76956250 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Fri, 20 Mar 2020 16:42:36 +0100
Subject: [PATCH] [quantile regression project] add test_non_stationary_run for
 simulations

---
 .../quantile_estimator_from_margin.py         |  5 +++--
 .../linear_margin_model.py                    |  4 ++--
 .../GevSimulation.py                          | 20 +++++++++++++++++--
 .../test_gev_simulations.py                   | 15 +++++++++++---
 4 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/extreme_fit/estimator/quantile_estimator/quantile_estimator_from_margin.py b/extreme_fit/estimator/quantile_estimator/quantile_estimator_from_margin.py
index 83763c91..6a65903a 100644
--- a/extreme_fit/estimator/quantile_estimator/quantile_estimator_from_margin.py
+++ b/extreme_fit/estimator/quantile_estimator/quantile_estimator_from_margin.py
@@ -12,7 +12,7 @@ from extreme_fit.function.margin_function.abstract_margin_function import Abstra
 from extreme_fit.function.param_function.linear_coef import LinearCoef
 from extreme_fit.function.param_function.param_function import LinearParamFunction
 from extreme_fit.model.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \
-    AbstractTemporalLinearMarginModel
+    AbstractTemporalLinearMarginModel, TemporalMarginFitMethod
 from extreme_fit.model.margin_model.linear_margin_model.linear_margin_model import LinearMarginModel
 from extreme_fit.model.quantile_model.quantile_regression_model import AbstractQuantileRegressionModel
 from extreme_fit.model.result_from_model_fit.abstract_result_from_model_fit import AbstractResultFromModelFit
@@ -23,7 +23,8 @@ from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset
 class QuantileEstimatorFromMargin(LinearMarginEstimator, AbstractQuantileEstimator):
 
     def __init__(self, dataset: AbstractDataset, quantile, margin_model_class: type):
-        super().__init__(dataset=dataset, quantile=quantile, margin_model=margin_model_class(dataset.coordinates))
+        margin_model = margin_model_class(dataset.coordinates, fit_method=TemporalMarginFitMethod.extremes_fevd_mle)
+        super().__init__(dataset=dataset, quantile=quantile, margin_model=margin_model)
 
     @cached_property
     def function_from_fit(self) -> AbstractQuantileFunction:
diff --git a/extreme_fit/model/margin_model/linear_margin_model/linear_margin_model.py b/extreme_fit/model/margin_model/linear_margin_model/linear_margin_model.py
index 82b6afbd..11fcb150 100644
--- a/extreme_fit/model/margin_model/linear_margin_model/linear_margin_model.py
+++ b/extreme_fit/model/margin_model/linear_margin_model/linear_margin_model.py
@@ -7,12 +7,12 @@ from extreme_fit.distribution.gev.gev_params import GevParams
 class LinearMarginModel(ParametricMarginModel):
 
     @classmethod
-    def from_coef_list(cls, coordinates, gev_param_name_to_coef_list):
+    def from_coef_list(cls, coordinates, gev_param_name_to_coef_list, **kwargs):
         params = {}
         for gev_param_name in GevParams.PARAM_NAMES:
             for idx, coef in enumerate(gev_param_name_to_coef_list[gev_param_name], -1):
                 params[(gev_param_name, idx)] = coef
-        return cls(coordinates, params_sample=params, params_start_fit=params)
+        return cls(coordinates, params_sample=params, params_start_fit=params, **kwargs)
 
     def load_margin_functions(self, gev_param_name_to_dims=None):
         assert gev_param_name_to_dims is not None, 'LinearMarginModel cannot be used for sampling/fitting \n' \
diff --git a/projects/quantile_regression_vs_evt/GevSimulation.py b/projects/quantile_regression_vs_evt/GevSimulation.py
index 9ce61302..e6d66047 100644
--- a/projects/quantile_regression_vs_evt/GevSimulation.py
+++ b/projects/quantile_regression_vs_evt/GevSimulation.py
@@ -7,7 +7,10 @@ from cached_property import cached_property
 from extreme_fit.distribution.gev.gev_params import GevParams
 from extreme_fit.estimator.quantile_estimator.abstract_quantile_estimator import AbstractQuantileEstimator
 from extreme_fit.model.margin_model.abstract_margin_model import AbstractMarginModel
-from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel
+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, \
+    NonStationaryLocationTemporalModel
 from projects.quantile_regression_vs_evt.AbstractSimulation import AbstractSimulation
 from spatio_temporal_dataset.spatio_temporal_observations.abstract_spatio_temporal_observations import \
     AbstractSpatioTemporalObservations
@@ -52,4 +55,17 @@ class StationarySimulation(GevSimulation):
             GevParams.SHAPE: [0],
             GevParams.SCALE: [1],
         }
-        return StationaryTemporalModel.from_coef_list(coordinates, gev_param_name_to_coef_list)
+        return StationaryTemporalModel.from_coef_list(coordinates, gev_param_name_to_coef_list,
+                                                      fit_method=TemporalMarginFitMethod.extremes_fevd_mle)
+
+
+class NonStationaryLocationSimulation(GevSimulation):
+
+    def create_model(self, coordinates):
+        gev_param_name_to_coef_list = {
+            GevParams.LOC: [0, 1],
+            GevParams.SHAPE: [0],
+            GevParams.SCALE: [1],
+        }
+        return NonStationaryLocationTemporalModel.from_coef_list(coordinates, gev_param_name_to_coef_list,
+                                                                 fit_method=TemporalMarginFitMethod.extremes_fevd_mle)
diff --git a/test/test_projects/test_quantile_regression/test_gev_simulations.py b/test/test_projects/test_quantile_regression/test_gev_simulations.py
index 455bd518..c2657ac6 100644
--- a/test/test_projects/test_quantile_regression/test_gev_simulations.py
+++ b/test/test_projects/test_quantile_regression/test_gev_simulations.py
@@ -1,8 +1,11 @@
 import unittest
 
-from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel
-from extreme_fit.model.quantile_model.quantile_regression_model import ConstantQuantileRegressionModel
-from projects.quantile_regression_vs_evt.GevSimulation import GevSimulation, StationarySimulation
+from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel, \
+    NonStationaryLocationTemporalModel
+from extreme_fit.model.quantile_model.quantile_regression_model import ConstantQuantileRegressionModel, \
+    TemporalCoordinatesQuantileRegressionModel
+from projects.quantile_regression_vs_evt.GevSimulation import GevSimulation, StationarySimulation, \
+    NonStationaryLocationSimulation
 
 
 class TestGevSimulations(unittest.TestCase):
@@ -13,6 +16,12 @@ class TestGevSimulations(unittest.TestCase):
                                           model_classes=[StationaryTemporalModel, ConstantQuantileRegressionModel])
         simulation.plot_error_for_last_year_quantile(self.DISPLAY)
 
+    def test_non_stationary_run(self):
+        simulation = NonStationaryLocationSimulation(nb_time_series=1, quantile=0.5, time_series_lengths=[50, 60],
+                                                     model_classes=[NonStationaryLocationTemporalModel,
+                                                                    TemporalCoordinatesQuantileRegressionModel])
+        simulation.plot_error_for_last_year_quantile(self.DISPLAY)
+
 
 if __name__ == '__main__':
     unittest.main()
-- 
GitLab