diff --git a/extreme_data/edf_data/weather_types.py b/extreme_data/edf_data/weather_types.py index ca2c74dcb8d11ae2d4ff30b1e05d50beefbf72f3..519b85a84079246c1d6a85bed5c8d886f34e4014 100644 --- a/extreme_data/edf_data/weather_types.py +++ b/extreme_data/edf_data/weather_types.py @@ -1,5 +1,8 @@ +from datetime import datetime + import pandas as pd +from extreme_data.meteo_france_data.scm_models_data.utils import date_to_str from root_utils import get_full_path relative_path = r'local/EDF_data/Weather_types/CatalogueTT_EDF_France0_5308.txt' @@ -13,7 +16,10 @@ def load_df_weather_types() -> pd.DataFrame: for i, l in enumerate(f): if i >= 7: l = str(l).split('"')[1:] - weather_types.append((l[0], int(l[1][2]))) + wp = int(l[1][2]) + day, month, year = [int(e) for e in l[0].split('/')] + date_str = date_to_str(datetime(year=year, month=month, day=day)) + weather_types.append((date_str, wp)) df = pd.DataFrame(weather_types, columns=['Date', 'WP']) df.set_index('Date', inplace=True) return df 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 366ee0bb7c400a25a5880a02b10d5548e069170f..a36101eb4bfc10cd94d800c8a7de47253798e2e2 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 @@ -19,9 +19,9 @@ from matplotlib.colors import Normalize from netCDF4 import Dataset from extreme_data.meteo_france_data.scm_models_data.abstract_variable import AbstractVariable -from extreme_data.meteo_france_data.scm_models_data.scm_constants import ALTITUDES, ZS_INT_23, ZS_INT_MASK, LONGITUDES, \ +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 + ORDERED_ALLSLOPES_SLOPES, ORDERED_ALLSLOPES_MASSIFNUM, date_to_str 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 \ AbstractMarginFunction @@ -84,13 +84,20 @@ class AbstractStudy(object): date = datetime.datetime(year=year, month=8, day=1, hour=6, minute=0, second=0) days = [] for i in range(366): - days.append(str(date).split()[0]) + days.append(date_to_str(date)) date += datetime.timedelta(days=1) if date.month == 8 and date.day == 1: break year_to_days[year] = days return year_to_days + @cached_property + def year_to_wps(self): + year_max_with_data = self.year_max - 1 + assert 1954 <= self.year_min and year_max_with_data <= 2008, \ + 'Weather patterns are not available between {} and {}'.format(self.year_min, self.year_max) + pass + @property def all_days(self): return list(chain(*list(self.year_to_days.values()))) @@ -177,6 +184,8 @@ class AbstractStudy(object): """ Load daily observations """ + + @cached_property def year_to_daily_time_serie_array(self) -> OrderedDict: return self._year_to_daily_time_serie_array @@ -594,3 +603,7 @@ class AbstractStudy(object): mask_massif = np.array(img) mask_french_alps += mask_massif return ~np.array(mask_french_alps, dtype=bool) + + + + diff --git a/extreme_data/meteo_france_data/scm_models_data/crocus/taline_data.py b/extreme_data/meteo_france_data/scm_models_data/crocus/taline_data.py deleted file mode 100644 index 2f992812445b355730898167e0e5543179699d53..0000000000000000000000000000000000000000 --- a/extreme_data/meteo_france_data/scm_models_data/crocus/taline_data.py +++ /dev/null @@ -1,22 +0,0 @@ -from collections import OrderedDict - -import numpy as np -import pandas as pd - -from extreme_data.meteo_france_data.scm_models_data.crocus.crocus import CrocusDepth -from extreme_data.meteo_france_data.scm_models_data.scm_constants import ALTITUDES -from root_utils import get_display_name_from_object_type - -massif_name = 'Queyras' -study_class = CrocusDepth -all_days = study_class(altitude=0).all_days -altitude_to_queyras_depth = OrderedDict() -for altitude in ALTITUDES[:]: - study = study_class(altitude=altitude, orientation=90.0) - if massif_name in study.study_massif_names: - idx_queyras = study.study_massif_names.index(massif_name) - queyras_all_daily_series = study.all_daily_series[:, idx_queyras] - altitude_to_queyras_depth[altitude] = queyras_all_daily_series -df = pd.DataFrame.from_dict(altitude_to_queyras_depth) -df.index = all_days -df.to_csv('{}_{}_90.csv'.format(massif_name, get_display_name_from_object_type(study_class))) \ No newline at end of file diff --git a/extreme_data/meteo_france_data/scm_models_data/scm_constants.py b/extreme_data/meteo_france_data/scm_models_data/utils.py similarity index 99% rename from extreme_data/meteo_france_data/scm_models_data/scm_constants.py rename to extreme_data/meteo_france_data/scm_models_data/utils.py index 0bbf64f50362fec3efc0a35e80a29628499ee815..0ae808471c4e8ca394a428750eae2094ae86106d 100644 --- a/extreme_data/meteo_france_data/scm_models_data/scm_constants.py +++ b/extreme_data/meteo_france_data/scm_models_data/utils.py @@ -2,8 +2,14 @@ """ ZS was extracted from a netcdf file """ +from datetime import datetime + import numpy as np + +def date_to_str(date: datetime) -> str: + return str(date).split()[0] + ZS = """[ 300. 600. 900. 1200. 1500. 1800. 2100. 2400. 2700. 3000. 3300. 300. 600. 900. 1200. 1500. 1800. 2100. 2400. 2700. 3000. 300. 600. 900. 1200. 1500. 1800. 2100. 2400. 2700. 3000. 3300. 3600. 3900. 4200. 4500. diff --git a/test/test_extreme_data/test_edf_data/test_weather_types.py b/test/test_extreme_data/test_edf_data/test_weather_types.py index afa1d9b67673da09812ab1bc9e70f0d9fc149da1..1b70bf900629b375a20a735316db24e262104fd7 100644 --- a/test/test_extreme_data/test_edf_data/test_weather_types.py +++ b/test/test_extreme_data/test_edf_data/test_weather_types.py @@ -1,9 +1,12 @@ import unittest +from datetime import datetime import pandas as pd from extreme_data.edf_data.weather_types import load_df_weather_types +from extreme_data.meteo_france_data.scm_models_data.crocus.crocus import CrocusSwe3Days from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranTemperature +from extreme_data.meteo_france_data.scm_models_data.utils import date_to_str class TestWeatherTypes(unittest.TestCase): @@ -11,10 +14,21 @@ class TestWeatherTypes(unittest.TestCase): def test_df_weather_types(self): df = load_df_weather_types() self.assertEqual(len(df), 20354) - first = df.iloc[0].values[0] - last = df.iloc[-1].values[0] - self.assertEqual(first, 5) - self.assertEqual(last, 8) + # Assert values + self.assertEqual(df.iloc[0, :].values[0], 5) + self.assertEqual(df.iloc[-1, :].values[0], 8) + # Assert keys + self.assertEqual(date_to_str(datetime(year=1953, month=1, day=1)), df.index[0]) + self.assertEqual(date_to_str(datetime(year=2008, month=9, day=22)), df.index[-1]) + + def test_assertion_wps(self): + with self.assertRaises(AssertionError): + print(CrocusSwe3Days(altitude=900, year_max=2020).year_to_wps) + with self.assertRaises(AssertionError): + print(CrocusSwe3Days(altitude=900, year_min=1952).year_to_wps) + study = CrocusSwe3Days(altitude=900, year_min=1954, year_max=2008) + d = study.year_to_wps + self.assertTrue(True) def test_yearly_percentages(self): # Expected Percentages come from the original paper diff --git a/test/test_extreme_data/test_meteo_france_data/test_SCM_oriented_data.py b/test/test_extreme_data/test_meteo_france_data/test_SCM_oriented_data.py index 4152e86705f8bc51c47948ce320c32977c6e349a..a21c7ea2bcb8f318f141efef49320dec3ca65b11 100644 --- a/test/test_extreme_data/test_meteo_france_data/test_SCM_oriented_data.py +++ b/test/test_extreme_data/test_meteo_france_data/test_SCM_oriented_data.py @@ -6,7 +6,7 @@ import pandas as pd from extreme_data.meteo_france_data.scm_models_data.crocus.crocus import CrocusSwe3Days from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall -from extreme_data.meteo_france_data.scm_models_data.scm_constants import SLOPES +from extreme_data.meteo_france_data.scm_models_data.utils import SLOPES class TestSCMOrientedData(unittest.TestCase):