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