From f5d7549e746114959784dfae1e232580623fb99a Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Thu, 26 Nov 2020 12:13:24 +0100
Subject: [PATCH] add angle for ribatet

---
 .../scm_models_data/abstract_study.py         | 18 ++++-
 ...the_maxima.py => day_for_the_maxima_v1.py} |  0
 .../ribatet/day_for_the_maxima_v2.py          | 69 +++++++++++++++++++
 3 files changed, 85 insertions(+), 2 deletions(-)
 rename extreme_data/meteo_france_data/scm_models_data/case_studies/ribatet/{day_for_the_maxima.py => day_for_the_maxima_v1.py} (100%)
 create mode 100644 extreme_data/meteo_france_data/scm_models_data/case_studies/ribatet/day_for_the_maxima_v2.py

diff --git a/extreme_data/meteo_france_data/scm_models_data/abstract_study.py b/extreme_data/meteo_france_data/scm_models_data/abstract_study.py
index 8390c92d..9376dc8c 100644
--- a/extreme_data/meteo_france_data/scm_models_data/abstract_study.py
+++ b/extreme_data/meteo_france_data/scm_models_data/abstract_study.py
@@ -291,6 +291,15 @@ class AbstractStudy(object):
             massif_name_to_annual_maxima_index[massif_name] = index
         return massif_name_to_annual_maxima_index
 
+    @cached_property
+    def massif_name_to_annual_maxima_angle(self):
+        normalization_denominator = [366 if year % 4 == 0 else 365 for year in self.ordered_years]
+        massif_name_to_annual_maxima_angle = OrderedDict()
+        for massif_name, annual_maxima_index in self.massif_name_to_annual_maxima_index.items():
+            angle = 2 * np.pi * np.array(annual_maxima_index) / np.array(normalization_denominator)
+            massif_name_to_annual_maxima_angle[massif_name] = angle
+        return massif_name_to_annual_maxima_angle
+
     @cached_property
     def massif_name_to_annual_maxima(self):
         massif_name_to_annual_maxima = OrderedDict()
@@ -469,14 +478,19 @@ class AbstractStudy(object):
 
     @property
     def _save_excel_with_longitutde_and_latitude(self):
+        df = self.df_latitude_longitude
+        print(df.head())
+        df.to_csv('S2M_latitude_and_longitude_for_the_centroid_of_each_massif.csv')
+
+    @property
+    def df_latitude_longitude(self):
         any_ordered_dict = list(self.year_to_dataset_ordered_dict.values())[0]
         print(any_ordered_dict.variables.keys())
         longitude = np.array(any_ordered_dict.variables['LON'])[self.flat_mask]
         latitude = np.array(any_ordered_dict.variables['LAT'])[self.flat_mask]
         data = [longitude, latitude]
         df = pd.DataFrame(data=data, index=['Longitude', 'Latitude'], columns=self.study_massif_names).transpose()
-        print(df.head())
-        df.to_csv('S2M_latitude_and_longitude_for_the_centroid_of_each_massif.csv')
+        return df
 
     @property
     def missing_massif_name(self):
diff --git a/extreme_data/meteo_france_data/scm_models_data/case_studies/ribatet/day_for_the_maxima.py b/extreme_data/meteo_france_data/scm_models_data/case_studies/ribatet/day_for_the_maxima_v1.py
similarity index 100%
rename from extreme_data/meteo_france_data/scm_models_data/case_studies/ribatet/day_for_the_maxima.py
rename to extreme_data/meteo_france_data/scm_models_data/case_studies/ribatet/day_for_the_maxima_v1.py
diff --git a/extreme_data/meteo_france_data/scm_models_data/case_studies/ribatet/day_for_the_maxima_v2.py b/extreme_data/meteo_france_data/scm_models_data/case_studies/ribatet/day_for_the_maxima_v2.py
new file mode 100644
index 00000000..89bc87c4
--- /dev/null
+++ b/extreme_data/meteo_france_data/scm_models_data/case_studies/ribatet/day_for_the_maxima_v2.py
@@ -0,0 +1,69 @@
+import pandas as pd
+import numpy as np
+import xlsxwriter
+
+
+from extreme_data.meteo_france_data.scm_models_data.abstract_study import AbstractStudy
+from extreme_data.meteo_france_data.scm_models_data.crocus.crocus import CrocusDepth, CrocusSwe3Days
+from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day, SafranSnowfall3Days
+from extreme_data.meteo_france_data.scm_models_data.utils import FrenchRegion
+from extreme_data.meteo_france_data.scm_models_data.visualization.main_study_visualizer import \
+    SCM_STUDY_CLASS_TO_ABBREVIATION
+from extreme_fit.estimator.margin_estimator.utils import fitted_stationary_gev
+from projects.altitude_spatial_model.altitudes_fit.altitudes_studies import AltitudesStudies
+
+
+def generate_excel_with_annual_maxima(fast=True, maxima_dates=False):
+    if fast:
+        altitudes = [900, 1200]
+    else:
+        altitudes = [900, 1200, 1500, 1800, 2100]
+    study_class = SafranSnowfall1Day
+    study_name = 'annual maxima of ' + SCM_STUDY_CLASS_TO_ABBREVIATION[study_class]
+    if maxima_dates:
+        study_name += ' - number of days since 1st August, e.g. 1 represents the 2nd of August'
+    writer = pd.ExcelWriter('{}.xlsx'.format(study_name), engine='xlsxwriter')
+    altitude_studies = AltitudesStudies(study_class, altitudes)
+    for altitude, study in altitude_studies.altitude_to_study.items():
+        write_df_with_annual_maxima_v2(altitude, writer, study, maxima_dates)
+    writer.save()
+
+
+def write_df_with_annual_maxima_v2(altitude, writer, study, maxima_dates=False) -> pd.DataFrame:
+    df = study.df_latitude_longitude
+    data_list = []
+    for massif_name in df.index:
+        if maxima_dates:
+            values = study.massif_name_to_annual_maxima_angle[massif_name]
+        else:
+            raise NotImplementedError
+        data_list.append(values)
+    data = np.array(data_list)
+    df2 = pd.DataFrame(data=data, index=df.index, columns=study.ordered_years).astype(float)
+    df = pd.concat([df, df2], axis=1)
+    print(df.head())
+    df.to_excel(writer, sheet_name='altitude = {} m'.format(altitude))
+
+def write_df_with_annual_maxima(massif_name, writer, altitude_studies, maxima_dates=False) -> pd.DataFrame:
+    columns = []
+    altitudes = []
+    for altitude, study in altitude_studies.altitude_to_study.items():
+        df_maxima = study.observations_annual_maxima.df_maxima_gev
+        if massif_name in study.study_massif_names:
+            altitudes.append(altitude)
+            s = df_maxima.loc[massif_name]
+            if maxima_dates:
+                values = study.massif_name_to_annual_maxima_index[massif_name]
+                s = pd.Series(index=s.index, data=values)
+                # s.values = np.array(values)
+            # Fit the data and add the parameters as the first columns
+            columns.append(s)
+    df = pd.concat(columns, axis=1)
+    altitude_str = [str(a) + ' m' for a in altitudes]
+    df.columns = altitude_str
+    df.to_excel(writer, sheet_name=massif_name)
+    return df
+
+
+if __name__ == '__main__':
+    generate_excel_with_annual_maxima(fast=False, maxima_dates=True)
-- 
GitLab