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 53840c3012ec072795f8570d4cc91a5bea20d85f..54e7da27ba973f0227d2d89da13ae7694484b5cc 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 @@ -198,8 +198,10 @@ class AbstractStudy(object): return list(chain(*list(self.year_to_days.values()))) @property - def all_daily_series(self): - all_daily_series = np.concatenate(list(self.year_to_daily_time_serie_array.values())) + def all_daily_series(self) -> np.ndarray: + """Return an array of approximate shape (total_number_of_days, 23) x """ + all_daily_series = np.concatenate([ time_serie_array + for time_serie_array in self.year_to_daily_time_serie_array.values()]) assert len(all_daily_series) == len(self.all_days) return all_daily_series diff --git a/projects/contrasting_trends_in_snow_loads/snow_load_impact/__init__.py b/projects/contrasting_trends_in_snow_loads/snowfall fraction of total precipitation/__init__.py similarity index 100% rename from projects/contrasting_trends_in_snow_loads/snow_load_impact/__init__.py rename to projects/contrasting_trends_in_snow_loads/snowfall fraction of total precipitation/__init__.py diff --git a/projects/contrasting_trends_in_snow_loads/snowfall fraction of total precipitation/daily snowfall fraction.py b/projects/contrasting_trends_in_snow_loads/snowfall fraction of total precipitation/daily snowfall fraction.py new file mode 100644 index 0000000000000000000000000000000000000000..fcee72d3c979181568ad7a44a872cd96ce902075 --- /dev/null +++ b/projects/contrasting_trends_in_snow_loads/snowfall fraction of total precipitation/daily snowfall fraction.py @@ -0,0 +1,47 @@ +import numpy as np +import matplotlib.pyplot as plt +from scipy.ndimage import gaussian_filter, gaussian_filter1d + +from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranRainfall1Day, SafranTemperature, \ + SafranSnowfall1Day + + +def plot_snowfall_fraction(ax, altitude, temperature_array, snowfall_array, rainfall_array): + if ax is None: + ax = plt.gca() + lim = 10 + bins = np.linspace(-lim, lim, num=(4 * 2 * lim) + 1) + inds = np.digitize(temperature_array, bins) + snowfall_fractions = [] + for j in range(1, len(bins)): + mask = inds == j + fraction = np.mean(snowfall_array[mask]) / np.mean(snowfall_array[mask] + rainfall_array[mask]) + snowfall_fractions.append(fraction) + new_snowfall_fractions = 100 * gaussian_filter1d(snowfall_fractions, sigma=0.5) + x = bins[:-1] + 0.125 + + ax.plot(x, new_snowfall_fractions, label=altitude) + ax.set_ylabel('Snowfall fraction (%)') + ax.set_xlabel('Daily surface air temperature (T)') + ax.legend() + + +def daily_snowfall_fraction(ax, altitude, year_min=1959, year_max=2019): + temperature_study = SafranTemperature(altitude=altitude) + study_rainfall = SafranRainfall1Day(altitude=altitude) + study_snowfall = SafranSnowfall1Day(altitude=altitude) + all_time_series = [temperature_study.all_daily_series, study_snowfall.all_daily_series, + study_rainfall.all_daily_series] + plot_snowfall_fraction(ax, *[np.concatenate(t) for t in all_time_series]) + + +def daily_snowfall_fraction_wrt_altitude(): + ax = plt.gca() + for altitude in [900, 1800, 2700]: + daily_snowfall_fraction(ax, altitude) + plt.show() + + +if __name__ == '__main__': + daily_snowfall_fraction_wrt_altitude() + # daily_snowfall_fraction(altitude=900) diff --git a/projects/contrasting_trends_in_snow_loads/snow_load_impact/short_snow_load_partition.py b/projects/contrasting_trends_in_snow_loads/snowfall fraction of total precipitation/short_snow_load_partition.py similarity index 100% rename from projects/contrasting_trends_in_snow_loads/snow_load_impact/short_snow_load_partition.py rename to projects/contrasting_trends_in_snow_loads/snowfall fraction of total precipitation/short_snow_load_partition.py 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 56ab48da17cc964629b2f00ecf44cd527191bf3e..16cfbe9c4091b0128d5c600d83d890fa2eaa9d9b 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 @@ -82,6 +82,12 @@ class TestSCMSafranSnowfall(TestSCMStudy): # Assert that the massif names are the same between SAFRAN and the coordinate file assert not set(self.study.study_massif_names).symmetric_difference(set(df_centroid['NOM'])) + def test_all_data(self): + all_daily_series = self.study.all_daily_series + self.assertEqual(all_daily_series.ndim, 2) + self.assertEqual(all_daily_series.shape[1], 23) + self.assertEqual(all_daily_series.shape[0], 22280) + class TestSCMPrecipitation(TestSCMStudy):