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 424bfb1441fcb47e41b32e30b4ba86ca6e7fb1b7..32d1fcfbffe95d0685a97337d2db17ca6e37cd16 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 @@ -23,7 +23,7 @@ from extreme_data.edf_data.weather_types import load_df_weather_types from extreme_data.meteo_france_data.scm_models_data.abstract_variable import AbstractVariable from extreme_data.meteo_france_data.scm_models_data.utils import ALTITUDES, ZS_INT_23, ZS_INT_MASK, LONGITUDES, \ LATITUDES, ORIENTATIONS, SLOPES, ORDERED_ALLSLOPES_ALTITUDES, ORDERED_ALLSLOPES_ORIENTATIONS, \ - ORDERED_ALLSLOPES_SLOPES, ORDERED_ALLSLOPES_MASSIFNUM, date_to_str, WP_PATTERN_MAX_YEAR, SeasonForTheMaxima, \ + ORDERED_ALLSLOPES_SLOPES, ORDERED_ALLSLOPES_MASSIFNUM, date_to_str, WP_PATTERN_MAX_YEAR, Season, \ first_day_and_last_day, FrenchRegion, ZS_INT_MASK_PYRENNES, alps_massif_order, ZS_INT_MASK_PYRENNES_LIST from extreme_data.meteo_france_data.scm_models_data.visualization.utils import get_km_formatter from extreme_fit.function.margin_function.abstract_margin_function import \ @@ -65,9 +65,10 @@ class AbstractStudy(object): # REANALYSIS_FOLDER = 'SAFRAN_montagne-CROCUS_2019/postes/reanalysis' - def __init__(self, variable_class: type, altitude: int = 1800, year_min=YEAR_MIN, year_max=YEAR_MAX, + def __init__(self, variable_class: type, altitude: int = 1800, + year_min=YEAR_MIN, year_max=YEAR_MAX, multiprocessing=True, orientation=None, slope=20.0, - season=SeasonForTheMaxima.annual, + season=Season.annual, french_region=FrenchRegion.alps, split_years=None): assert isinstance(altitude, int), type(altitude) diff --git a/projects/contrasting_trends_in_snow_loads/gorman_figures/figure 3/__init__.py b/extreme_data/meteo_france_data/scm_models_data/case_studies/__init__.py similarity index 100% rename from projects/contrasting_trends_in_snow_loads/gorman_figures/figure 3/__init__.py rename to extreme_data/meteo_france_data/scm_models_data/case_studies/__init__.py diff --git a/extreme_data/meteo_france_data/scm_models_data/case_studies/nico/__init__.py b/extreme_data/meteo_france_data/scm_models_data/case_studies/nico/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/extreme_data/meteo_france_data/scm_models_data/case_studies/refuge_sarradet.py b/extreme_data/meteo_france_data/scm_models_data/case_studies/nico/refuge_sarradet.py similarity index 100% rename from extreme_data/meteo_france_data/scm_models_data/case_studies/refuge_sarradet.py rename to extreme_data/meteo_france_data/scm_models_data/case_studies/nico/refuge_sarradet.py diff --git a/extreme_data/meteo_france_data/scm_models_data/case_studies/taline/__init__.py b/extreme_data/meteo_france_data/scm_models_data/case_studies/taline/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/extreme_data/meteo_france_data/scm_models_data/case_studies/taline/taline.py b/extreme_data/meteo_france_data/scm_models_data/case_studies/taline/taline.py new file mode 100644 index 0000000000000000000000000000000000000000..afa23740c24b6a332c3bab8cddc07698aa46ba04 --- /dev/null +++ b/extreme_data/meteo_france_data/scm_models_data/case_studies/taline/taline.py @@ -0,0 +1,33 @@ +from collections import OrderedDict + +import pandas as pd + +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 CrocusDepthIn3Days, CrocusDepthWet, CrocusDepth +from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranTemperature, SafranSnowfall1Day, \ + SafranPrecipitation1Day +from extreme_data.meteo_france_data.scm_models_data.utils import Season +from extreme_data.meteo_france_data.scm_models_data.visualization.main_study_visualizer import ALL_ALTITUDES + +massifs_names = ['Queyras', 'Thabor', 'Haute-Maurienne'][:] +study_classes = [SafranTemperature, SafranSnowfall1Day, SafranPrecipitation1Day, + CrocusDepth, CrocusDepthIn3Days, CrocusDepthWet][:] +altitudes = ALL_ALTITUDES +season = Season.annual +for massif_name in massifs_names: + writer = pd.ExcelWriter('{}.xlsx'.format(massif_name), engine='xlsxwriter') + for study_class in study_classes: + altitude_to_time_serie = OrderedDict() + for altitude in altitudes: + study = study_class(altitude=altitude) # type: AbstractStudy + if massif_name in study.study_massif_names: + massif_id = study.massif_name_to_massif_id[massif_name] + time_serie = study.all_daily_series[:, massif_id] + altitude_to_time_serie[altitude] = time_serie + df = pd.DataFrame(altitude_to_time_serie, columns=altitudes, index=study.all_days) + print(df.head()) + df.to_excel(writer, sheet_name=study.variable_name) + writer.save() + + + diff --git a/extreme_data/meteo_france_data/scm_models_data/crocus/crocus.py b/extreme_data/meteo_france_data/scm_models_data/crocus/crocus.py index 2aed6b08c410043666aba2004947e340a10b4e1e..ff0473ca1ff0f28ee91c65550b7e81e96a2bd0ab 100644 --- a/extreme_data/meteo_france_data/scm_models_data/crocus/crocus.py +++ b/extreme_data/meteo_france_data/scm_models_data/crocus/crocus.py @@ -7,22 +7,28 @@ from extreme_data.meteo_france_data.scm_models_data.abstract_study import Abstra from extreme_data.meteo_france_data.scm_models_data.crocus.crocus_variables import CrocusTotalSweVariable, \ CrocusDepthVariable, CrocusRecentSweVariableThreeDays, TotalSnowLoadVariable, RecentSnowLoadVariableThreeDays, \ CrocusSnowLoadEurocodeVariable, CrocusDensityVariable, RecentSnowLoadVariableFiveDays, \ - RecentSnowLoadVariableSevenDays, RecentSnowLoadVariableOneDay + RecentSnowLoadVariableSevenDays, RecentSnowLoadVariableOneDay, CrocusVariable, CrocusDepthIn3DaysVariable, \ + CrocusDepthWetVariable class Crocus(AbstractStudy): """ In the Crocus data, there is no 'massifsList' variable, thus we assume massifs are ordered just like Safran data """ + CROCUS_VARIABLES = [CrocusTotalSweVariable, CrocusDepthVariable, CrocusRecentSweVariableThreeDays, + RecentSnowLoadVariableThreeDays, TotalSnowLoadVariable, + CrocusSnowLoadEurocodeVariable, + CrocusDensityVariable, + RecentSnowLoadVariableOneDay, + RecentSnowLoadVariableFiveDays, + RecentSnowLoadVariableSevenDays, + CrocusDepthWetVariable, + CrocusDepthIn3DaysVariable + ] def __init__(self, variable_class, *args, **kwargs): - assert variable_class in [CrocusTotalSweVariable, CrocusDepthVariable, CrocusRecentSweVariableThreeDays, - RecentSnowLoadVariableThreeDays, TotalSnowLoadVariable, - CrocusSnowLoadEurocodeVariable, - CrocusDensityVariable, - RecentSnowLoadVariableOneDay, - RecentSnowLoadVariableFiveDays, - RecentSnowLoadVariableSevenDays] + assert issubclass(variable_class, CrocusVariable) + assert variable_class in self.CROCUS_VARIABLES super().__init__(variable_class, *args, **kwargs) self.model_name = 'Crocus' @@ -86,6 +92,18 @@ class ExtendedCrocusSweTotal(AbstractExtendedStudy, CrocusSweTotal): pass +class CrocusDepthIn3Days(Crocus): + + def __init__(self, *args, **kwargs): + Crocus.__init__(self, CrocusDepthIn3DaysVariable, *args, **kwargs) + + +class CrocusDepthWet(Crocus): + + def __init__(self, *args, **kwargs): + Crocus.__init__(self, CrocusDepthWetVariable, *args, **kwargs) + + class CrocusDepth(Crocus): def __init__(self, *args, **kwargs): diff --git a/extreme_data/meteo_france_data/scm_models_data/crocus/crocus_variables.py b/extreme_data/meteo_france_data/scm_models_data/crocus/crocus_variables.py index 8b4c7c9d7fc174080e55ee27feb48fbfb64e96d2..77896b70591f34f3c2f03e63956094f15446ef3d 100644 --- a/extreme_data/meteo_france_data/scm_models_data/crocus/crocus_variables.py +++ b/extreme_data/meteo_france_data/scm_models_data/crocus/crocus_variables.py @@ -90,6 +90,24 @@ class CrocusDepthVariable(CrocusVariable): return "DSN_T_ISBA" +class CrocusDepthIn3DaysVariable(CrocusVariable): + NAME = 'Snow Depth in 3 days' + UNIT = 'm' + + @classmethod + def keyword(cls): + return "SD_3DY_ISBA" + + +class CrocusDepthWetVariable(CrocusVariable): + NAME = 'Wet Snow Depth' + UNIT = 'm' + + @classmethod + def keyword(cls): + return "WET_TH_ISBA" + + class CrocusDensityVariable(CrocusVariable): NAME = 'Snow Density' # UNIT = '$\\textnormal{kg m}^{-3}$' diff --git a/extreme_data/meteo_france_data/scm_models_data/safran/safran_variable.py b/extreme_data/meteo_france_data/scm_models_data/safran/safran_variable.py index b1966f5d8503e2884d2a6c3ef731cb5889a8fcc5..1b4df798dee5fdfc620565fee6490927dbf5b69c 100644 --- a/extreme_data/meteo_france_data/scm_models_data/safran/safran_variable.py +++ b/extreme_data/meteo_france_data/scm_models_data/safran/safran_variable.py @@ -70,6 +70,7 @@ class SafranSnowfallVariable(AbstractVariable): class SafranRainfallVariable(SafranSnowfallVariable): """Warning: this corresponds to water falling. Total precipitaiton equals Rainfall + Snowfall""" NAME = 'Rainfall' + UNIT = 'kg $m^{-2}$' @classmethod def keyword(cls): @@ -77,7 +78,8 @@ class SafranRainfallVariable(SafranSnowfallVariable): class SafranTotalPrecipVariable(AbstractVariable): - NAME = 'Precipitation' + NAME = 'Precipitation'[:6] + UNIT = 'kg $m^{-2}$' def __init__(self, snow_variable_array, rain_variable_array, nb_consecutive_days=3): super().__init__(None) 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 97c8c2ea54e8831438e18385d65875e2ec108762..396cf0f5681ef58e3576c96a32b7376f37b269b2 100644 --- a/extreme_data/meteo_france_data/scm_models_data/utils.py +++ b/extreme_data/meteo_france_data/scm_models_data/utils.py @@ -16,7 +16,7 @@ def date_to_str(date: datetime) -> str: return str(date).split()[0] -class SeasonForTheMaxima(Enum): +class Season(Enum): annual = 0 winter_extended = 1 # i could add the classical seasons if needed @@ -35,8 +35,8 @@ class FrenchRegion(Enum): def first_day_and_last_day(season): season_to_start_day_and_last_day = { - SeasonForTheMaxima.annual: ('08-01', '07-31'), - SeasonForTheMaxima.winter_extended: ('11-01', '05-31') + Season.annual: ('08-01', '07-31'), + Season.winter_extended: ('11-01', '05-31') } return season_to_start_day_and_last_day[season] diff --git a/extreme_trend/visualizers/utils.py b/extreme_trend/visualizers/utils.py index ab8b1b17d51084b1825da16c1893bab94e39548e..a38b202f9fbbe6e318c3c1b9f195bfcee2612f07 100644 --- a/extreme_trend/visualizers/utils.py +++ b/extreme_trend/visualizers/utils.py @@ -1,6 +1,6 @@ from collections import OrderedDict -from extreme_data.meteo_france_data.scm_models_data.utils import SeasonForTheMaxima +from extreme_data.meteo_france_data.scm_models_data.utils import Season from extreme_fit.model.margin_model.utils import \ MarginFitMethod from extreme_trend.visualizers.study_visualizer_for_non_stationary_trends import \ @@ -12,7 +12,7 @@ def load_altitude_to_visualizer(altitudes, massif_names, model_subsets_for_uncer study_visualizer_class=StudyVisualizerForNonStationaryTrends, save_to_file=True, multiprocessing=True, - season=SeasonForTheMaxima.annual): + season=Season.annual): fit_method = MarginFitMethod.extremes_fevd_mle altitude_to_visualizer = OrderedDict() for altitude in altitudes: diff --git a/projects/contrasting_trends_in_snow_loads/gorman_figures/temperature_of_snowfall_maxima.py b/projects/contrasting_trends_in_snow_loads/gorman_figures/temperature_of_snowfall_maxima.py index a47ec2ee6e5dd40dff7e8dd3cb44ef5480034c65..e6ff09c261c077d24e37e95fde86a57b5a9546db 100644 --- a/projects/contrasting_trends_in_snow_loads/gorman_figures/temperature_of_snowfall_maxima.py +++ b/projects/contrasting_trends_in_snow_loads/gorman_figures/temperature_of_snowfall_maxima.py @@ -2,7 +2,7 @@ import matplotlib as mpl mpl.rcParams['text.usetex'] = True mpl.rcParams['text.latex.preamble'] = [r'\usepackage{amsmath}'] -from extreme_data.meteo_france_data.scm_models_data.utils import SeasonForTheMaxima, season_to_str +from extreme_data.meteo_france_data.scm_models_data.utils import Season, season_to_str from collections import OrderedDict @@ -16,7 +16,7 @@ from projects.contrasting_trends_in_snow_loads.gorman_figures.daily_snowfall_fra def distribution_temperature_of_maxima_of_snowfall(altitudes, temperature_at_maxima=True): - season = SeasonForTheMaxima.annual if temperature_at_maxima else SeasonForTheMaxima.winter_extended + season = Season.annual if temperature_at_maxima else Season.winter_extended # Load the temperature corresponding to the maxima of snowfall altitude_to_maxima_temperature = OrderedDict() altitude_to_optimal_temperature = OrderedDict() diff --git a/projects/contrasting_trends_in_snow_loads/spatial trends/main_spatial_relative_change_in_maxima_at_fixed_altitude.py b/projects/contrasting_trends_in_snow_loads/spatial trends/main_spatial_relative_change_in_maxima_at_fixed_altitude.py index bf00db685b583c83bd7ded2962c86f079e17c528..99425900b880c081d2bf7b755d690ad5d98fdbea 100644 --- a/projects/contrasting_trends_in_snow_loads/spatial trends/main_spatial_relative_change_in_maxima_at_fixed_altitude.py +++ b/projects/contrasting_trends_in_snow_loads/spatial trends/main_spatial_relative_change_in_maxima_at_fixed_altitude.py @@ -6,7 +6,7 @@ from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranS SafranNormalizedPreciptationRateOnWetDays, SafranNormalizedPreciptationRate from extreme_data.meteo_france_data.scm_models_data.safran.safran_variable import \ SafranNormalizedPrecipitationRateOnWetDaysVariable -from extreme_data.meteo_france_data.scm_models_data.utils import SeasonForTheMaxima +from extreme_data.meteo_france_data.scm_models_data.utils import Season from extreme_data.meteo_france_data.scm_models_data.visualization.study_visualizer import \ StudyVisualizer import matplotlib.pyplot as plt @@ -24,7 +24,7 @@ def relative_change_in_maxima_wrt_altitude(): for altitude in altitudes: ax = plt.gca() - study = study_class(altitude=altitude, season=SeasonForTheMaxima.winter_extended) + study = study_class(altitude=altitude, season=Season.winter_extended) # study = study_class(altitude=altitude, nb_consecutive_days=3) massif_name_to_value = {} for massif_name in study.study_massif_names: diff --git a/projects/contrasting_trends_in_snow_loads/weather_types_analysis/main_distribution_wps.py b/projects/contrasting_trends_in_snow_loads/weather_types_analysis/main_distribution_wps.py index 2ff47881c213c08e44917a81cb4efaf1c9c33d0c..73863db9bdba02a01455d0bde4f88227466bd4b6 100644 --- a/projects/contrasting_trends_in_snow_loads/weather_types_analysis/main_distribution_wps.py +++ b/projects/contrasting_trends_in_snow_loads/weather_types_analysis/main_distribution_wps.py @@ -5,7 +5,7 @@ from extreme_data.meteo_france_data.scm_models_data.abstract_extended_study impo from extreme_data.meteo_france_data.scm_models_data.crocus.crocus import CrocusSnowLoad3Days, CrocusSnowLoad1Day from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranPrecipitation1Day, \ SafranPrecipitation3Days -from extreme_data.meteo_france_data.scm_models_data.utils import SeasonForTheMaxima +from extreme_data.meteo_france_data.scm_models_data.utils import Season def main_spatial_distribution_wps(study_class, year_min=1959, year_max=2008, limit_for_the_percentage=None): 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 cc218d4bc8732dc581f6f4234b11357e296d12a2..f9716643b4d574a0e8fde560717fb73fc8411019 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 @@ -9,7 +9,7 @@ from extreme_data.meteo_france_data.scm_models_data.crocus.crocus import CrocusS from extreme_data.meteo_france_data.scm_models_data.safran.cumulated_study import NB_DAYS from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall, SafranTemperature, \ SafranPrecipitation, SafranSnowfall3Days, SafranRainfall3Days, SafranNormalizedPreciptationRateOnWetDays -from extreme_data.meteo_france_data.scm_models_data.utils import SeasonForTheMaxima +from extreme_data.meteo_france_data.scm_models_data.utils import Season from extreme_data.meteo_france_data.scm_models_data.visualization.main_study_visualizer import \ study_iterator_global, SCM_STUDIES, ALL_ALTITUDES, SCM_STUDY_CLASS_TO_ABBREVIATION from root_utils import get_display_name_from_object_type @@ -26,7 +26,7 @@ class TestSCMAllStudy(unittest.TestCase): def test_year_to_winter_date(self): year = 2019 - study = SafranSnowfall(altitude=900, year_min=year, year_max=year, season=SeasonForTheMaxima.winter_extended) + study = SafranSnowfall(altitude=900, year_min=year, year_max=year, season=Season.winter_extended) first_day, *_, last_day = study.year_to_days[year] self.assertEqual('{}-11-01'.format(year - 1), first_day) self.assertEqual('{}-05-31'.format(year), last_day) diff --git a/test/test_extreme_data/test_meteo_france_data/test_variables.py b/test/test_extreme_data/test_meteo_france_data/test_variables.py index be0476835cbb010fa98cce9cb1e2b53e0ae3ee35..7d60934bb583b5605d6c24c48ba4d7c8d69887f8 100644 --- a/test/test_extreme_data/test_meteo_france_data/test_variables.py +++ b/test/test_extreme_data/test_meteo_france_data/test_variables.py @@ -2,19 +2,19 @@ import unittest import numpy as np +from extreme_data.meteo_france_data.scm_models_data.crocus.crocus import Crocus, CrocusDepth from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall, Safran from extreme_data.meteo_france_data.scm_models_data.safran.safran_variable import SafranTemperatureVariable -class TestSafranVariables(unittest.TestCase): +class TestVariables(unittest.TestCase): def setUp(self) -> None: - super().setUp() - study = SafranSnowfall(year_max=1960) - self.dataset = study.year_to_dataset_ordered_dict[1959] + self.dataset = None + self.variables = None - def test_variables(self): - for variable_class in Safran.SAFRAN_VARIABLES: + def run_test_variables(self): + for variable_class in self.variables: keywords = variable_class.keyword() names = keywords if isinstance(keywords, list) else [keywords] variable_arrays = [np.array(self.dataset.variables[name]) for name in names] @@ -22,5 +22,29 @@ class TestSafranVariables(unittest.TestCase): self.assertTrue(True) +class TestSafranVariables(TestVariables): + + def setUp(self) -> None: + super().setUp() + study = SafranSnowfall(year_max=1960) + self.dataset = study.year_to_dataset_ordered_dict[1959] + self.variables = Safran.SAFRAN_VARIABLES + + def test_variables(self): + self.run_test_variables() + + +class TestCrocusVariables(TestVariables): + + def setUp(self) -> None: + super().setUp() + study = CrocusDepth(year_max=1960) + self.dataset = study.year_to_dataset_ordered_dict[1959] + self.variables = Crocus.CROCUS_VARIABLES + + def test_variables(self): + self.run_test_variables() +if __name__ == '__main__': + unittest.main()