From ea4fd9524de4d0a20d16d6d36e5e65840b502573 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Fri, 10 May 2019 14:38:10 +0200
Subject: [PATCH] [MAX STABLE] add starting point for non stationary full
 estimator. fix display in non stationary trends

---
 .../study_visualization/non_stationary_trends.py    |  6 +-----
 .../full_estimator/abstract_full_estimator.py       | 13 +++++++++++--
 .../margin_estimator/abstract_margin_estimator.py   |  1 +
 .../margin_model/parametric_margin_model.py         |  3 ---
 .../test_extreme_models/test_max_stable_temporal.py |  8 --------
 5 files changed, 13 insertions(+), 18 deletions(-)

diff --git a/experiment/meteo_france_SCM_study/visualization/study_visualization/non_stationary_trends.py b/experiment/meteo_france_SCM_study/visualization/study_visualization/non_stationary_trends.py
index 4300cf2f..889fd80a 100644
--- a/experiment/meteo_france_SCM_study/visualization/study_visualization/non_stationary_trends.py
+++ b/experiment/meteo_france_SCM_study/visualization/study_visualization/non_stationary_trends.py
@@ -81,16 +81,12 @@ class AbstractNonStationaryTrendTest(object):
         mu1_trends = [self.get_mu1(starting_point=year) for year in years]
         ax2 = ax.twinx()
         color_mu1 = 'c'
-        ax.plot(years, mu1_trends, color_mu1 + 'o-')
+        ax2.plot(years, mu1_trends, color_mu1 + 'o-')
         ax2.set_ylabel('mu1 parameter', color=color_mu1)
 
         ax.set_xlabel('starting year for the linear trend of mu1')
         align_yaxis_on_zero(ax, ax2)
         title = self.display_name
-        first = mu1_trends[0]
-        last = mu1_trends[-1]
-        title += '\n mu1: first {}\nlast {}'.format(first, last)
-        title += '; equals? {}'.format(first == last)
         ax.set_title(title)
         ax.legend()
 
diff --git a/extreme_estimator/estimator/full_estimator/abstract_full_estimator.py b/extreme_estimator/estimator/full_estimator/abstract_full_estimator.py
index c3933c2c..1c472b1a 100644
--- a/extreme_estimator/estimator/full_estimator/abstract_full_estimator.py
+++ b/extreme_estimator/estimator/full_estimator/abstract_full_estimator.py
@@ -56,12 +56,21 @@ class FullEstimatorInASingleStepWithSmoothMargin(AbstractFullEstimator):
     def margin_function_start_fit(self):
         return self.linear_margin_model.margin_function_start_fit
 
+    @property
+    def df_coordinates_spat(self):
+        return self.dataset.coordinates.df_spatial_coordinates(self.train_split)
+
+    @property
+    def df_coordinates_temp(self):
+        df_coordinates_temp = self.dataset.coordinates.df_temporal_coordinates(self.train_split)
+        return self.linear_margin_model.add_starting_temporal_point(df_coordinates_temp)
+
     def _fit(self):
         # Estimate both the margin and the max-stable structure
         self._result_from_fit = self.max_stable_model.fitmaxstab(
             data_gev=self.dataset.maxima_gev_for_spatial_extremes_package(self.train_split),
-            df_coordinates_spat=self.dataset.coordinates.df_spatial_coordinates(self.train_split),
-            df_coordinates_temp=self.dataset.coordinates.df_temporal_coordinates(self.train_split),
+            df_coordinates_spat=self.df_coordinates_spat,
+            df_coordinates_temp=self.df_coordinates_temp,
             fit_marge=True,
             fit_marge_form_dict=self.linear_margin_model.margin_function_start_fit.form_dict,
             margin_start_dict=self.linear_margin_model.margin_function_start_fit.coef_dict
diff --git a/extreme_estimator/estimator/margin_estimator/abstract_margin_estimator.py b/extreme_estimator/estimator/margin_estimator/abstract_margin_estimator.py
index 38f8e5c3..3456cd45 100644
--- a/extreme_estimator/estimator/margin_estimator/abstract_margin_estimator.py
+++ b/extreme_estimator/estimator/margin_estimator/abstract_margin_estimator.py
@@ -32,6 +32,7 @@ class LinearMarginEstimator(AbstractMarginEstimator):
         maxima_gev_specialized = self.dataset.maxima_gev_for_spatial_extremes_package(self.train_split)
         df_coordinates_spat = self.dataset.coordinates.df_spatial_coordinates(self.train_split)
         df_coordinates_temp = self.dataset.coordinates.df_temporal_coordinates(self.train_split)
+        df_coordinates_temp = self.margin_model.add_starting_temporal_point(df_coordinates_temp)
         self._result_from_fit = self.margin_model.fitmargin_from_maxima_gev(data=maxima_gev_specialized,
                                                                             df_coordinates_spat=df_coordinates_spat,
                                                                             df_coordinates_temp=df_coordinates_temp)
diff --git a/extreme_estimator/extreme_models/margin_model/parametric_margin_model.py b/extreme_estimator/extreme_models/margin_model/parametric_margin_model.py
index 81abad9c..f589f6ee 100644
--- a/extreme_estimator/extreme_models/margin_model/parametric_margin_model.py
+++ b/extreme_estimator/extreme_models/margin_model/parametric_margin_model.py
@@ -38,9 +38,6 @@ class ParametricMarginModel(AbstractMarginModel, ABC):
                                   df_coordinates_temp: pd.DataFrame) -> ResultFromFit:
         assert data.shape[1] == len(df_coordinates_spat)
 
-        # Modify df_coordinates_temp
-        df_coordinates_temp = self.add_starting_temporal_point(df_coordinates_temp)
-
         # Margin formula for fitspatgev
         fit_params = get_margin_formula(self.margin_function_start_fit.form_dict)
 
diff --git a/test/test_extreme_estimator/test_extreme_models/test_max_stable_temporal.py b/test/test_extreme_estimator/test_extreme_models/test_max_stable_temporal.py
index 27ceac3e..fa221e4b 100644
--- a/test/test_extreme_estimator/test_extreme_models/test_max_stable_temporal.py
+++ b/test/test_extreme_estimator/test_extreme_models/test_max_stable_temporal.py
@@ -99,14 +99,6 @@ class TestMaxStableTemporal(unittest.TestCase):
         # Create two different estimators
         estimator1 = self.fit_non_stationary_estimator(starting_point=3)
         estimator2 = self.fit_non_stationary_estimator(starting_point=20)
-
-        for starting_point in range(3, 20):
-            estimator = self.fit_non_stationary_estimator(starting_point=starting_point)
-            print(estimator.margin_function_fitted.starting_point)
-            print(estimator.margin_function_fitted.coef_dict)
-            print(estimator.margin_function_fitted.mu0)
-            print(estimator.margin_function_fitted.mu1_temporal_trend)
-
         mu1_estimator1 = estimator1.margin_function_fitted.mu1_temporal_trend
         mu1_estimator2 = estimator2.margin_function_fitted.mu1_temporal_trend
         self.assertNotEqual(mu1_estimator1, mu1_estimator2)
-- 
GitLab