Commit a5ff99e1 authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[contrasting project] add SafranNormalizedPreciptationRateOnWetDays.

parent 0d9a9405
No related merge requests found
Showing with 63 additions and 7 deletions
+63 -7
from collections import OrderedDict
import numpy as np
from extreme_data.meteo_france_data.scm_models_data.abstract_extended_study import AbstractExtendedStudy
......@@ -5,14 +7,15 @@ from extreme_data.meteo_france_data.scm_models_data.abstract_study import Abstra
from extreme_data.meteo_france_data.scm_models_data.abstract_variable import AbstractVariable
from extreme_data.meteo_france_data.scm_models_data.safran.cumulated_study import CumulatedStudy
from extreme_data.meteo_france_data.scm_models_data.safran.safran_variable import SafranSnowfallVariable, \
SafranRainfallVariable, SafranTemperatureVariable, SafranTotalPrecipVariable
SafranRainfallVariable, SafranTemperatureVariable, SafranTotalPrecipVariable, \
SafranNormalizedPrecipitationRateOnWetDaysVariable
class Safran(AbstractStudy):
def __init__(self, variable_class: type, *args, **kwargs):
assert variable_class in [SafranSnowfallVariable, SafranRainfallVariable, SafranTemperatureVariable,
SafranTotalPrecipVariable]
SafranTotalPrecipVariable, SafranNormalizedPrecipitationRateOnWetDaysVariable]
super().__init__(variable_class, *args, **kwargs)
self.model_name = 'Safran'
......@@ -84,6 +87,31 @@ class SafranRainfall7Days(SafranRainfall):
super().__init__(nb_consecutive_days=7, **kwargs)
class SafranNormalizedPreciptationRateOnWetDays(CumulatedStudy, Safran):
def __init__(self, **kwargs):
super().__init__(SafranNormalizedPrecipitationRateOnWetDaysVariable, **kwargs)
def load_variable_array(self, dataset):
return [np.array(dataset.variables[k]) for k in self.load_keyword()]
def instantiate_variable_object(self, variable_array) -> AbstractVariable:
variable_array_temperature, variable_array_snowfall, variable_array_rainfall = variable_array
return self.variable_class(variable_array_temperature,
variable_array_snowfall, variable_array_rainfall, self.nb_consecutive_days)
@property
def _year_to_daily_time_serie_array(self) -> OrderedDict:
# Filter and keep only values different than np.nan
year_to_time_series = super()._year_to_daily_time_serie_array
updated_year_to_time_series = OrderedDict()
for year, time_serie in year_to_time_series.items():
time_serie_without_nan = time_serie[~np.isnan(time_serie)]
assert not np.isnan(time_serie_without_nan).any()
updated_year_to_time_series[year] = time_serie_without_nan
return updated_year_to_time_series
class SafranPrecipitation(CumulatedStudy, Safran):
def __init__(self, **kwargs):
......@@ -138,7 +166,7 @@ if __name__ == '__main__':
altitude = 900
year_min = 1959
year_max = 2000
study = SafranRainfall1Day(altitude, year_min=year_min, year_max=year_max)
study = SafranNormalizedPreciptationRateOnWetDays(altitude=altitude, year_min=year_min, year_max=year_max)
d = study.year_to_dataset_ordered_dict[1959]
print(d.keywords)
print(d.variables.keys())
......
......@@ -94,6 +94,27 @@ class SafranTotalPrecipVariable(AbstractVariable):
return self._daily_time_serie_array
class SafranNormalizedPrecipitationRateOnWetDaysVariable(AbstractVariable):
def __init__(self, temperature_variable_array, snow_variable_array, rain_variable_array, nb_consecutive_days):
super().__init__(None)
temperature = SafranTemperatureVariable(temperature_variable_array)
total_precipitation = SafranTotalPrecipVariable(snow_variable_array, rain_variable_array, nb_consecutive_days)
beta = 0.06
self._daily_time_serie_array = np.exp(-beta * temperature.daily_time_serie_array) \
* total_precipitation.daily_time_serie_array
mask_for_nan_values = total_precipitation.daily_time_serie_array < 0.01
self._daily_time_serie_array[mask_for_nan_values] = np.nan
@classmethod
def keyword(cls):
return [SafranTemperatureVariable.keyword(), SafranSnowfallVariable.keyword(), SafranRainfallVariable.keyword()]
@property
def daily_time_serie_array(self) -> np.ndarray:
return self._daily_time_serie_array
class SafranTemperatureVariable(AbstractVariable):
NAME = 'Temperature'
UNIT = 'Celsius Degrees'
......
......@@ -93,6 +93,6 @@ def daily_snowfall_fraction_wrt_time():
if __name__ == '__main__':
daily_snowfall_fraction_wrt_altitude(fast=False)
# daily_snowfall_fraction_wrt_altitude(fast=False)
# daily_snowfall_fraction_wrt_time()
# ratio_of_past_and_recent_daily_snowfall_fraction_wrt_altitude()
ratio_of_past_and_recent_daily_snowfall_fraction_wrt_altitude()
import os.path as op
import numpy as np
import unittest
from random import sample
......@@ -7,7 +8,7 @@ import pandas as pd
from extreme_data.meteo_france_data.scm_models_data.crocus.crocus import CrocusSnowLoad3Days
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
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.visualization.main_study_visualizer import \
study_iterator_global, SCM_STUDIES, ALL_ALTITUDES
......@@ -55,6 +56,13 @@ class TestSCMAllStudy(unittest.TestCase):
study_class(altitude=altitude, year_min=year_min, year_max=year_max)
class TestSCMSafranNormalizedPrecipitationRateOnWetDays(unittest.TestCase):
def test_annual_maxima(self):
study = SafranNormalizedPreciptationRateOnWetDays(year_max=1960)
self.assertFalse(np.isnan(study.year_to_annual_maxima[1959]).any())
class TestSCMStudy(unittest.TestCase):
def setUp(self) -> None:
......@@ -88,7 +96,6 @@ class TestSCMSafranSnowfall(TestSCMStudy):
self.assertEqual(all_daily_series.shape[1], 23)
self.assertEqual(all_daily_series.shape[0], 22280)
class TestSCMPrecipitation(TestSCMStudy):
def setUp(self) -> None:
......
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