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 998e53b49922d596cd447e47d404f14843baca99..549a997a98c0996adbb55044871b94233252e3c5 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 @@ -128,7 +128,8 @@ class AbstractStudy(object): date = datetime.datetime(year=year - 1, month=8, day=1, hour=6, minute=0, second=0) days = [] for i in range(366): - days.append(date_to_str(date)) + day = date_to_str(date) + days.append(day) date += datetime.timedelta(days=1) if date.month == 8 and date.day == 1: break 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 2109bf323095a8142145f415025152401b1be5e4..3cb375ca4274100b3b46cb29110846460d379c3e 100644 --- a/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py +++ b/projects/altitude_spatial_model/altitudes_fit/main_altitudes_studies.py @@ -39,7 +39,7 @@ def main(): , SafranPrecipitation3Days][:1] altitudes = [1800, 2100, 2400] study_classes = [SafranSnowfall1Day, SafranSnowfall3Days, SafranSnowfall5Days, SafranSnowfall7Days][:1] - # study_classes = [SafranPrecipitation1Day][:1] + study_classes = [SafranPrecipitation1Day][:1] # Common parameters # altitudes = [600, 900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600] diff --git a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitude_group.py b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitude_group.py index 07e569441e6f95a78674818f9d74a8cfb60ad9ea..72d694b2222cb8261312115ce59e74fb48eb8c2a 100644 --- a/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitude_group.py +++ b/projects/altitude_spatial_model/altitudes_fit/one_fold_analysis/altitude_group.py @@ -6,6 +6,8 @@ altitudes_for_groups = [ [1800, 2100, 2400], [2700, 3000, 3300] ] + + # altitudes_for_groups = [ # [600, 900, 1200, 1500, 1800], # [1500, 1800, 2100, 2400, 2700], @@ -67,6 +69,7 @@ class DefaultAltitudeGroup(AbstractAltitudeGroup): def reference_altitude(self): return 500 + def get_altitude_group_from_altitudes(altitudes): s = set(altitudes) if s == set(altitudes_for_groups[0]): diff --git a/projects/altitude_spatial_model/seasonal_analysis/main_season_repartition_of_maxima.py b/projects/altitude_spatial_model/seasonal_analysis/main_season_repartition_of_maxima.py new file mode 100644 index 0000000000000000000000000000000000000000..77562d85ac6c7f13f65520a611797db9bce96404 --- /dev/null +++ b/projects/altitude_spatial_model/seasonal_analysis/main_season_repartition_of_maxima.py @@ -0,0 +1,86 @@ +import matplotlib.pyplot as plt +import operator +import calendar + +import numpy as np + +from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day +from extreme_data.meteo_france_data.scm_models_data.visualization.study_visualizer import StudyVisualizer +from projects.altitude_spatial_model.altitudes_fit.altitudes_studies import AltitudesStudies +from projects.altitude_spatial_model.altitudes_fit.one_fold_analysis.altitude_group import altitudes_for_groups, \ + get_altitude_group_from_altitudes + + +def plot_season_repartition_of_maxima(studies, massif_names, title='', idx=0): + + + month_to_name = {month: calendar.month_name[month] for month in range(1, 13)} + + all_years = studies.study.ordered_years + title += ['-1959-2019', '-past-1959-1988', '-recent-1990-2019'][idx] + color = ['grey', 'red', 'green'][idx] + years = [all_years, all_years[:30], all_years[-30:]][idx] + ax = plt.gca() + ax2 = ax.twinx() + + month_to_maxima = get_month_to_maxima(massif_names, studies, years) + # PLot percentages for each month + ordered_months = [8, 9, 10, 11, 12] + [1, 2, 3, 4, 5, 6, 7] + nb_total_maxima = sum([len(v) for v in month_to_maxima.values()]) + percentage_maxima = [100 * len(month_to_maxima[month]) / nb_total_maxima for month in ordered_months] + month_names = [month_to_name[m][:3] for m in ordered_months] + ax.bar(month_names, percentage_maxima, width=0.5, + color=color, edgecolor=color, label='Percentage of maxima', + linewidth=2) + mean_maxima = [np.mean(month_to_maxima[month]) for month in ordered_months] + # Plot mean maxima for each month + ax2.plot(month_names, mean_maxima) + + ax.set_ylabel('Percentages of annual maxima') + ax.set_ylim((0, 30)) + ax.grid() + ax2.set_ylabel('Mean annual maxima') + ax2.set_ylim((0, 100)) + + studies.show_or_save_to_file(plot_name=title) + plt.close() + + +def get_month_to_maxima(massif_names, studies, years): + month_to_maxima = {i: [] for i in range(1, 13)} + massif_names = set(massif_names) + for study in studies.altitude_to_study.values(): + massif_ids = [i for i, m in enumerate(study.study_massif_names) if m in massif_names] + for year in years: + annual_maxima = study.year_to_annual_maxima[year][massif_ids] + annual_maxima_index = study.year_to_annual_maxima_index[year][massif_ids] + days = study.year_to_days[year] + days_for_annual_maxima = operator.itemgetter(*annual_maxima_index)(days) + months = [int(d.split('-')[1]) for d in days_for_annual_maxima] + for month, annual_maximum in zip(months, annual_maxima): + month_to_maxima[month].append(annual_maximum) + return month_to_maxima + + +if __name__ == '__main__': + study_class = SafranSnowfall1Day + 'Vercors' + + norht_massif_names = ['Oisans', 'Grandes-Rousses', 'Haute-Maurienne', 'Vanoise', + 'Maurienne', 'Belledonne', 'Chartreuse', 'Haute-Tarentaise', + 'Beaufortain', 'Bauges', 'Mont-Blanc', 'Aravis', 'Chablais'] + south_massif_names = ['Mercantour', 'Ubaye', 'Haut_Var-Haut_Verdon', 'Parpaillon', 'Champsaur', + 'Devoluy', 'Queyras', 'Pelvoux', 'Thabor'] + + + for altitudes in altitudes_for_groups: + studies = AltitudesStudies(study_class, altitudes) + elevation = get_altitude_group_from_altitudes(altitudes).reference_altitude + + # for idx in range(3): + for idx in range(1): + for masssif_names, region_name in zip([norht_massif_names, south_massif_names], + ['North', 'South']): + plot_season_repartition_of_maxima(studies, masssif_names, '{} {}'.format(region_name, elevation), + idx=idx) +