Commit 16f92175 authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[SCM] add permutation which correspond to the sum of rainfall & snowfall. add...

[SCM] add permutation which correspond to the sum of rainfall & snowfall. add test based on Durand paper.
parent 7ee3d7cd
No related merge requests found
Showing with 56 additions and 25 deletions
+56 -25
...@@ -4,13 +4,14 @@ from experiment.meteo_france_SCM_study.abstract_extended_study import AbstractEx ...@@ -4,13 +4,14 @@ from experiment.meteo_france_SCM_study.abstract_extended_study import AbstractEx
from experiment.meteo_france_SCM_study.abstract_study import AbstractStudy from experiment.meteo_france_SCM_study.abstract_study import AbstractStudy
from experiment.meteo_france_SCM_study.abstract_variable import AbstractVariable from experiment.meteo_france_SCM_study.abstract_variable import AbstractVariable
from experiment.meteo_france_SCM_study.safran.safran_variable import SafranSnowfallVariable, \ from experiment.meteo_france_SCM_study.safran.safran_variable import SafranSnowfallVariable, \
SafranPrecipitationVariable, SafranTemperatureVariable SafranRainfallVariable, SafranTemperatureVariable, SafranTotalPrecipVariable
class Safran(AbstractStudy): class Safran(AbstractStudy):
def __init__(self, variable_class: type, *args, **kwargs): def __init__(self, variable_class: type, *args, **kwargs):
assert variable_class in [SafranSnowfallVariable, SafranPrecipitationVariable, SafranTemperatureVariable] assert variable_class in [SafranSnowfallVariable, SafranRainfallVariable, SafranTemperatureVariable,
SafranTotalPrecipVariable]
super().__init__(variable_class, *args, **kwargs) super().__init__(variable_class, *args, **kwargs)
self.model_name = 'Safran' self.model_name = 'Safran'
...@@ -42,10 +43,16 @@ class ExtendedSafranSnowfall(AbstractExtendedStudy, SafranSnowfall): ...@@ -42,10 +43,16 @@ class ExtendedSafranSnowfall(AbstractExtendedStudy, SafranSnowfall):
pass pass
class SafranPrecipitation(SafranFrequency): class SafranRainfall(SafranFrequency):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(SafranPrecipitationVariable, *args, **kwargs) super().__init__(SafranRainfallVariable, *args, **kwargs)
class SafranTotalPrecip(SafranFrequency):
def __init__(self, *args, **kwargs):
super().__init__(SafranTotalPrecipVariable, *args, **kwargs)
class SafranTemperature(Safran): class SafranTemperature(Safran):
......
...@@ -28,6 +28,15 @@ class SafranSnowfallVariable(AbstractVariable): ...@@ -28,6 +28,15 @@ class SafranSnowfallVariable(AbstractVariable):
self.nb_consecutive_days_of_snowfall = nb_consecutive_days_of_snowfall self.nb_consecutive_days_of_snowfall = nb_consecutive_days_of_snowfall
# Compute the daily snowfall in kg/m2 # Compute the daily snowfall in kg/m2
snowfall_rates = np.array(dataset.variables[keyword]) snowfall_rates = np.array(dataset.variables[keyword])
# Compute the mean snowrate, then multiply it by 60 * 60 * 24
# day_duration_in_seconds = 24 * 60 * 60
# nb_days = len(snowfall_rates) // 24
# print(nb_days)
# daily_snowrate = [np.mean(snowfall_rates[24 * i:24 * (i + 1) + 1], axis=0) for i in range(nb_days)]
# self.daily_snowfall = day_duration_in_seconds * np.array(daily_snowrate)
# Compute the hourly snowfall first, then aggregate
mean_snowfall_rates = 0.5 * (snowfall_rates[:-1] + snowfall_rates[1:]) mean_snowfall_rates = 0.5 * (snowfall_rates[:-1] + snowfall_rates[1:])
hourly_snowfall = 60 * 60 * mean_snowfall_rates hourly_snowfall = 60 * 60 * mean_snowfall_rates
# Transform the snowfall amount into a dataframe # Transform the snowfall amount into a dataframe
...@@ -40,17 +49,30 @@ class SafranSnowfallVariable(AbstractVariable): ...@@ -40,17 +49,30 @@ class SafranSnowfallVariable(AbstractVariable):
shifted_list = [self.daily_snowfall[i:] for i in range(self.nb_consecutive_days_of_snowfall)] shifted_list = [self.daily_snowfall[i:] for i in range(self.nb_consecutive_days_of_snowfall)]
# First element of shifted_list is of length n, Second element of length n-1, Third element n-2.... # First element of shifted_list is of length n, Second element of length n-1, Third element n-2....
# The zip is done with respect to the shortest list # The zip is done with respect to the shortest list
snowfall_in_consecutive_days = [sum(e) for e in zip(*shifted_list)] snowfall_in_consecutive_days = np.array([sum(e) for e in zip(*shifted_list)])
# The returned array is of size n-nb_days+1 x nb_massif # The returned array is of size n-nb_days+1 x nb_massif
return np.array(snowfall_in_consecutive_days) return snowfall_in_consecutive_days
class SafranPrecipitationVariable(SafranSnowfallVariable): class SafranRainfallVariable(SafranSnowfallVariable):
def __init__(self, dataset, altitude, nb_consecutive_days_of_snowfall=1, keyword='Rainf'): def __init__(self, dataset, altitude, nb_consecutive_days_of_snowfall=1, keyword='Rainf'):
super().__init__(dataset, altitude, nb_consecutive_days_of_snowfall, keyword) super().__init__(dataset, altitude, nb_consecutive_days_of_snowfall, keyword)
class SafranTotalPrecipVariable(AbstractVariable):
def __init__(self, dataset, altitude):
super().__init__(dataset, altitude)
self.snow_precipitation = SafranSnowfallVariable(dataset=dataset, altitude=altitude)
self.rain_precipitation = SafranRainfallVariable(dataset=dataset, altitude=altitude)
@property
def daily_time_serie_array(self) -> np.ndarray:
return self.snow_precipitation.daily_time_serie_array + self.rain_precipitation.daily_time_serie_array
class SafranTemperatureVariable(AbstractVariable): class SafranTemperatureVariable(AbstractVariable):
def __init__(self, dataset, altitude, keyword='Tair'): def __init__(self, dataset, altitude, keyword='Tair'):
......
from experiment.meteo_france_SCM_study.abstract_study import AbstractStudy from experiment.meteo_france_SCM_study.abstract_study import AbstractStudy
from experiment.meteo_france_SCM_study.crocus.crocus import CrocusDepth, CrocusSwe, ExtendedCrocusDepth, \ from experiment.meteo_france_SCM_study.crocus.crocus import CrocusDepth, CrocusSwe, ExtendedCrocusDepth, \
ExtendedCrocusSwe ExtendedCrocusSwe
from experiment.meteo_france_SCM_study.safran.safran import SafranSnowfall, ExtendedSafranSnowfall, SafranPrecipitation, \ from experiment.meteo_france_SCM_study.safran.safran import SafranSnowfall, ExtendedSafranSnowfall, SafranRainfall, \
SafranTemperature SafranTemperature, SafranTotalPrecip
from experiment.meteo_france_SCM_study.visualization.study_visualization.study_visualizer import StudyVisualizer from experiment.meteo_france_SCM_study.visualization.study_visualization.study_visualizer import StudyVisualizer
from collections import OrderedDict from collections import OrderedDict
...@@ -49,7 +49,7 @@ def extended_visualization(): ...@@ -49,7 +49,7 @@ def extended_visualization():
def annual_mean_vizu_compare_durand_study(): def annual_mean_vizu_compare_durand_study():
for study_class in [SafranPrecipitation, SafranSnowfall, SafranTemperature][2:]: for study_class in [SafranTotalPrecip, SafranRainfall, SafranSnowfall, SafranTemperature][:1]:
study = study_class(altitude=1800, year_min=1958, year_max=2002) study = study_class(altitude=1800, year_min=1958, year_max=2002)
study_visualizer = StudyVisualizer(study) study_visualizer = StudyVisualizer(study)
study_visualizer.visualize_annual_mean_values() study_visualizer.visualize_annual_mean_values()
...@@ -59,7 +59,7 @@ def normal_visualization(): ...@@ -59,7 +59,7 @@ def normal_visualization():
save_to_file = False save_to_file = False
only_first_one = True only_first_one = True
# for study_class in SCM_STUDIES[:1]: # for study_class in SCM_STUDIES[:1]:
for study_class in [SafranPrecipitation, SafranSnowfall, SafranTemperature][1:]: for study_class in [SafranRainfall, SafranSnowfall, SafranTemperature][1:]:
for study in study_iterator(study_class, only_first_one=only_first_one): for study in study_iterator(study_class, only_first_one=only_first_one):
study_visualizer = StudyVisualizer(study, save_to_file=save_to_file) study_visualizer = StudyVisualizer(study, save_to_file=save_to_file)
# study_visualizer.visualize_independent_margin_fits(threshold=[None, 20, 40, 60][0]) # study_visualizer.visualize_independent_margin_fits(threshold=[None, 20, 40, 60][0])
......
...@@ -315,6 +315,7 @@ class StudyVisualizer(object): ...@@ -315,6 +315,7 @@ class StudyVisualizer(object):
massif_name_to_value = OrderedDict() massif_name_to_value = OrderedDict()
df_annual_total = self.study.df_annual_total df_annual_total = self.study.df_annual_total
for massif_id, massif_name in enumerate(self.study.safran_massif_names): for massif_id, massif_name in enumerate(self.study.safran_massif_names):
# We take the mean over all the annual values
massif_name_to_value[massif_name] = df_annual_total.loc[:, massif_name].mean() massif_name_to_value[massif_name] = df_annual_total.loc[:, massif_name].mean()
self.study.visualize_study(ax=ax, massif_name_to_value=massif_name_to_value, show=self.show) self.study.visualize_study(ax=ax, massif_name_to_value=massif_name_to_value, show=self.show)
......
...@@ -6,7 +6,7 @@ import pandas as pd ...@@ -6,7 +6,7 @@ import pandas as pd
from experiment.meteo_france_SCM_study.crocus.crocus import ExtendedCrocusSwe from experiment.meteo_france_SCM_study.crocus.crocus import ExtendedCrocusSwe
from experiment.meteo_france_SCM_study.visualization.study_visualization.main_study_visualizer import study_iterator from experiment.meteo_france_SCM_study.visualization.study_visualization.main_study_visualizer import study_iterator
from experiment.meteo_france_SCM_study.safran.safran import SafranSnowfall, ExtendedSafranSnowfall, SafranTemperature, \ from experiment.meteo_france_SCM_study.safran.safran import SafranSnowfall, ExtendedSafranSnowfall, SafranTemperature, \
SafranPrecipitation SafranRainfall, SafranTotalPrecip
from experiment.meteo_france_SCM_study.visualization.study_visualization.study_visualizer import StudyVisualizer from experiment.meteo_france_SCM_study.visualization.study_visualization.study_visualizer import StudyVisualizer
from test.test_utils import load_scm_studies from test.test_utils import load_scm_studies
...@@ -61,15 +61,16 @@ class TestSCMPrecipitation(TestSCMStudy): ...@@ -61,15 +61,16 @@ class TestSCMPrecipitation(TestSCMStudy):
def setUp(self) -> None: def setUp(self) -> None:
super().setUp() super().setUp()
self.study = SafranPrecipitation(altitude=1800, year_min=1958, year_max=2002) self.study = SafranTotalPrecip(altitude=1800, year_min=1958, year_max=2002)
# def test_durand(self): def test_durand(self):
# # Test based on Durand paper # Test based on Durand paper
# # Test for the mean temperature between 1958 and 2002 # (some small differences probably due to the fact that SAFRAN model has evolved since then)
# self.check({ # Test for the mean total precipitation (rainfall + snowfall) between 1958 and 2002
# "Mercantour": 1340, self.check({
# 'Chablais': 1928, "Mercantour": 1346,
# }) 'Chablais': 1928,
})
def round(self, f): def round(self, f):
return int(f) return int(f)
......
...@@ -13,8 +13,8 @@ from extreme_estimator.extreme_models.max_stable_model.abstract_max_stable_model ...@@ -13,8 +13,8 @@ from extreme_estimator.extreme_models.max_stable_model.abstract_max_stable_model
AbstractMaxStableModelWithCovarianceFunction, CovarianceFunction AbstractMaxStableModelWithCovarianceFunction, CovarianceFunction
from extreme_estimator.extreme_models.max_stable_model.max_stable_models import Smith, BrownResnick, Schlather, \ from extreme_estimator.extreme_models.max_stable_model.max_stable_models import Smith, BrownResnick, Schlather, \
Geometric, ExtremalT, ISchlather Geometric, ExtremalT, ISchlather
from experiment.meteo_france_SCM_study.safran.safran import SafranSnowfall, Safran, SafranPrecipitation, \ from experiment.meteo_france_SCM_study.safran.safran import SafranSnowfall, Safran, SafranRainfall, \
SafranTemperature SafranTemperature, SafranTotalPrecip
from spatio_temporal_dataset.coordinates.spatial_coordinates.alps_station_3D_coordinates import \ from spatio_temporal_dataset.coordinates.spatial_coordinates.alps_station_3D_coordinates import \
AlpsStation3DCoordinatesWithAnisotropy AlpsStation3DCoordinatesWithAnisotropy
from spatio_temporal_dataset.coordinates.spatial_coordinates.generated_spatial_coordinates import \ from spatio_temporal_dataset.coordinates.spatial_coordinates.generated_spatial_coordinates import \
...@@ -98,8 +98,8 @@ def load_test_spatiotemporal_coordinates(nb_points, nb_steps, train_split_ratio= ...@@ -98,8 +98,8 @@ def load_test_spatiotemporal_coordinates(nb_points, nb_steps, train_split_ratio=
def load_safran_studies(altitudes) -> List[Safran]: def load_safran_studies(altitudes) -> List[Safran]:
nb_days_list = [1] nb_days_list = [1]
safran_studies = [safran_class(altitude=safran_altitude, nb_consecutive_days=nb_days) safran_studies = [safran_class(altitude=safran_altitude, nb_consecutive_days=nb_days)
for safran_altitude in altitudes for nb_days in nb_days_list for safran_altitude in altitudes for nb_days in nb_days_list
for safran_class in [SafranSnowfall, SafranPrecipitation]] for safran_class in [SafranSnowfall, SafranRainfall, SafranTotalPrecip]]
safran_studies += [SafranTemperature(altitude) for altitude in altitudes] safran_studies += [SafranTemperature(altitude) for altitude in altitudes]
return safran_studies return safran_studies
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment