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 0ea553492616660b523ab9114aadbac99217627d..43696208f02528068fd63d3b83d98e40613c9dd9 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 @@ -98,8 +98,10 @@ class AbstractStudy(object): year_to_first_index_and_last_index = OrderedDict() first_day, last_day = first_day_and_last_day(self.season) for year, all_days in self.year_to_all_days.items(): - first_index = all_days.index('{}-{}'.format(year - 1, first_day)) - last_index = all_days.index('{}-{}'.format(year, last_day)) + year_first_index = year - 1 if self.season is not Season.spring else year + year_last_index = year - 1 if self.season is Season.automn else year + first_index = all_days.index('{}-{}'.format(year_first_index, first_day)) + last_index = all_days.index('{}-{}'.format(year_last_index, last_day)) year_to_first_index_and_last_index[year] = (first_index, last_index) return year_to_first_index_and_last_index diff --git a/extreme_data/meteo_france_data/scm_models_data/utils.py b/extreme_data/meteo_france_data/scm_models_data/utils.py index 396cf0f5681ef58e3576c96a32b7376f37b269b2..dec1d7ea6ceb5cb37cb9311f14329973493a7ef1 100644 --- a/extreme_data/meteo_france_data/scm_models_data/utils.py +++ b/extreme_data/meteo_france_data/scm_models_data/utils.py @@ -19,7 +19,9 @@ def date_to_str(date: datetime) -> str: class Season(Enum): annual = 0 winter_extended = 1 - # i could add the classical seasons if needed + winter = 2 + spring = 3 + automn = 4 def season_to_str(season): @@ -36,7 +38,10 @@ class FrenchRegion(Enum): def first_day_and_last_day(season): season_to_start_day_and_last_day = { Season.annual: ('08-01', '07-31'), - Season.winter_extended: ('11-01', '05-31') + Season.winter_extended: ('11-01', '05-31'), + Season.winter: ('12-01', '02-28'), + Season.spring: ('03-01', '05-31'), + Season.automn: ('09-01', '11-30'), } return season_to_start_day_and_last_day[season] diff --git a/extreme_data/meteo_france_data/scm_models_data/visualization/study_visualizer.py b/extreme_data/meteo_france_data/scm_models_data/visualization/study_visualizer.py index 78d84b8f401b9ce8ef93cc94dbaf7a13341a0c47..91c427a3e6011b63a99693240dc4c397e21d0502 100644 --- a/extreme_data/meteo_france_data/scm_models_data/visualization/study_visualizer.py +++ b/extreme_data/meteo_france_data/scm_models_data/visualization/study_visualizer.py @@ -13,6 +13,7 @@ import numpy as np import pandas as pd import seaborn as sns +from extreme_data.meteo_france_data.scm_models_data.utils import season_to_str from extreme_data.meteo_france_data.scm_models_data.visualization.plot_utils import load_plot from extreme_fit.estimator.margin_estimator.utils import fitted_stationary_gev from extreme_fit.model.margin_model.utils import fitmethod_to_str @@ -554,6 +555,7 @@ class StudyVisualizer(VisualizationParameters): plt.show() if self.save_to_file: main_title, specific_title = '_'.join(self.study.title.split()).split('/') + main_title += season_to_str(self.study.season) if folder_for_variable: filename = "{}/{}/".format(VERSION_TIME, main_title) else: diff --git a/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py b/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py index 6f87bf5def6e909f68c87c9ecc03e7c3697ffd15..5bd6c2aeeab9af9486f34fd46601d3f9ddfc5244 100644 --- a/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py +++ b/projects/altitude_spatial_model/altitudes_fit/altitudes_studies.py @@ -107,10 +107,10 @@ class AltitudesStudies(object): # Some visualization - def show_or_save_to_file(self, plot_name, show=False): + def show_or_save_to_file(self, plot_name, show=False, no_title=False): study_visualizer = StudyVisualizer(study=self.study, show=show, save_to_file=not show) study_visualizer.plot_name = plot_name - study_visualizer.show_or_save_to_file(add_classic_title=False, dpi=500) + study_visualizer.show_or_save_to_file(add_classic_title=False, dpi=500, no_title=no_title) def run_for_each_massif(self, function, massif_names, **kwargs): massif_names = massif_names if massif_names is not None else self.study.all_massif_names() @@ -131,12 +131,13 @@ class AltitudesStudies(object): ax.plot(x, y, linewidth=2, label=label) ax.xaxis.set_ticks(x[1::10]) ax.tick_params(axis='both', which='major', labelsize=13) - ax.legend() + handles, labels = ax.get_legend_handles_labels() + ax.legend(handles[::-1], labels[::-1]) plot_name = 'Annual maxima of {} in {}'.format(SCM_STUDY_CLASS_TO_ABBREVIATION[self.study_class], massif_name.replace('_', ' ')) ax.set_ylabel('{} ({})'.format(plot_name, self.study.variable_unit), fontsize=15) ax.set_xlabel('years', fontsize=15) - self.show_or_save_to_file(plot_name=plot_name, show=show) + self.show_or_save_to_file(plot_name=plot_name, show=show, no_title=True) ax.clear() def plot_mean_maxima_against_altitude(self, massif_names=None, show=False, std=False, change=False): 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 46242d6c64a0e900efcadb23603c603668ec2e1b..097490a56bc3d8f5e501d2b0d2e8dbcc2be2d383 100644 --- a/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py +++ b/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py @@ -48,24 +48,29 @@ def plot_moments(studies, massif_names=None): def main(): - altitudes = [900, 1200, 1500, 1800, 2100, 2400, 2700, 3000][4:7] + # altitudes = [900, 1200, 1500, 1800, 2100, 2400, 2700, 3000][4:7] # altitudes = [900, 1200, 1500, 1800, 2100, 2400, 2700, 3000][:] - # altitudes = [900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600, 3900] + # todo: l ecart pour les saisons de l automne ou de sprint + # vient probablement de certains zéros pas pris en compte pour le fit, + # mais pris en compte pour le calcul de mon aic + 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 = [SafranSnowfall1Day, SafranPrecipitation1Day, - SafranSnowfall3Days, SafranPrecipitation3Days][:1] + SafranSnowfall3Days, SafranPrecipitation3Days][:] + seasons = [Season.automn, Season.winter, Season.spring][::-1] massif_names = None # massif_names = ['Aravis'] # massif_names = ['Chartreuse', 'Belledonne'] - for study_class in study_classes: - print('change study class') - studies = AltitudesStudies(study_class, altitudes, season=Season.winter_extended) - plot_time_series(studies, massif_names) - plot_moments(studies, massif_names) - plot_altitudinal_fit(studies, massif_names) + for season in seasons: + for study_class in study_classes: + studies = AltitudesStudies(study_class, altitudes, season=season) + print('inner loop', season, study_class) + plot_time_series(studies, massif_names) + plot_moments(studies, massif_names) + plot_altitudinal_fit(studies, massif_names) if __name__ == '__main__': 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 index 63b186b625fbc5d7195a082d251e6c831f49906d..387a5acff4a374851a90ed1417a624ab474a3b4d 100644 --- 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 @@ -103,11 +103,11 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): for evaluate_coordinate in [False, True]: if evaluate_coordinate: coef_name += 'evaluated at coordinates' - for m in massif_name_to_best_coef.values(): + for massif_name in massif_name_to_best_coef.keys(): if AbstractCoordinates.COORDINATE_X in coordinate_name: - massif_name_to_best_coef[m] *= np.power(1000, degree) + massif_name_to_best_coef[massif_name] *= np.power(1000, degree) if AbstractCoordinates.COORDINATE_T in coordinate_name: - massif_name_to_best_coef[m] *= np.power(1000, degree) + massif_name_to_best_coef[massif_name] *= np.power(2019, degree) self.plot_best_coef_map(coef_name.replace('_', ''), massif_name_to_best_coef) def plot_best_coef_map(self, coef_name, massif_name_to_best_coef): diff --git a/test/test_extreme_data/test_meteo_france_data/test_SCM_study.py b/test/test_extreme_data/test_meteo_france_data/test_SCM_study.py index f9716643b4d574a0e8fde560717fb73fc8411019..6d0af7e6221e58fe46c269e1211698e49c4f6645 100644 --- a/test/test_extreme_data/test_meteo_france_data/test_SCM_study.py +++ b/test/test_extreme_data/test_meteo_france_data/test_SCM_study.py @@ -24,7 +24,7 @@ class TestSCMAllStudy(unittest.TestCase): self.assertEqual('{}-08-01'.format(year - 1), first_day) self.assertEqual('{}-07-31'.format(year), last_day) - def test_year_to_winter_date(self): + def test_year_to_winter_extended_date(self): year = 2019 study = SafranSnowfall(altitude=900, year_min=year, year_max=year, season=Season.winter_extended) first_day, *_, last_day = study.year_to_days[year]