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

[contrasting project] add test assertion for the weather patterns. rename...

[contrasting project] add test assertion for the weather patterns. rename constant file to utils.py. add some function to create a standard str for the dates.
parent 507dfce8
No related merge requests found
Showing with 48 additions and 31 deletions
+48 -31
from datetime import datetime
import pandas as pd 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 from root_utils import get_full_path
relative_path = r'local/EDF_data/Weather_types/CatalogueTT_EDF_France0_5308.txt' relative_path = r'local/EDF_data/Weather_types/CatalogueTT_EDF_France0_5308.txt'
...@@ -13,7 +16,10 @@ def load_df_weather_types() -> pd.DataFrame: ...@@ -13,7 +16,10 @@ def load_df_weather_types() -> pd.DataFrame:
for i, l in enumerate(f): for i, l in enumerate(f):
if i >= 7: if i >= 7:
l = str(l).split('"')[1:] 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 = pd.DataFrame(weather_types, columns=['Date', 'WP'])
df.set_index('Date', inplace=True) df.set_index('Date', inplace=True)
return df return df
......
...@@ -19,9 +19,9 @@ from matplotlib.colors import Normalize ...@@ -19,9 +19,9 @@ from matplotlib.colors import Normalize
from netCDF4 import Dataset 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.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, \ 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_data.meteo_france_data.scm_models_data.visualization.utils import get_km_formatter
from extreme_fit.function.margin_function.abstract_margin_function import \ from extreme_fit.function.margin_function.abstract_margin_function import \
AbstractMarginFunction AbstractMarginFunction
...@@ -84,13 +84,20 @@ class AbstractStudy(object): ...@@ -84,13 +84,20 @@ class AbstractStudy(object):
date = datetime.datetime(year=year, month=8, day=1, hour=6, minute=0, second=0) date = datetime.datetime(year=year, month=8, day=1, hour=6, minute=0, second=0)
days = [] days = []
for i in range(366): for i in range(366):
days.append(str(date).split()[0]) days.append(date_to_str(date))
date += datetime.timedelta(days=1) date += datetime.timedelta(days=1)
if date.month == 8 and date.day == 1: if date.month == 8 and date.day == 1:
break break
year_to_days[year] = days year_to_days[year] = days
return year_to_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 @property
def all_days(self): def all_days(self):
return list(chain(*list(self.year_to_days.values()))) return list(chain(*list(self.year_to_days.values())))
...@@ -177,6 +184,8 @@ class AbstractStudy(object): ...@@ -177,6 +184,8 @@ class AbstractStudy(object):
""" Load daily observations """ """ Load daily observations """
@cached_property @cached_property
def year_to_daily_time_serie_array(self) -> OrderedDict: def year_to_daily_time_serie_array(self) -> OrderedDict:
return self._year_to_daily_time_serie_array return self._year_to_daily_time_serie_array
...@@ -594,3 +603,7 @@ class AbstractStudy(object): ...@@ -594,3 +603,7 @@ class AbstractStudy(object):
mask_massif = np.array(img) mask_massif = np.array(img)
mask_french_alps += mask_massif mask_french_alps += mask_massif
return ~np.array(mask_french_alps, dtype=bool) return ~np.array(mask_french_alps, dtype=bool)
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
...@@ -2,8 +2,14 @@ ...@@ -2,8 +2,14 @@
""" """
ZS was extracted from a netcdf file ZS was extracted from a netcdf file
""" """
from datetime import datetime
import numpy as np 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. 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. 600. 900. 1200. 1500. 1800. 2100. 2400. 2700. 3000. 300. 600. 900.
1200. 1500. 1800. 2100. 2400. 2700. 3000. 3300. 3600. 3900. 4200. 4500. 1200. 1500. 1800. 2100. 2400. 2700. 3000. 3300. 3600. 3900. 4200. 4500.
......
import unittest import unittest
from datetime import datetime
import pandas as pd import pandas as pd
from extreme_data.edf_data.weather_types import load_df_weather_types 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.safran.safran import SafranTemperature
from extreme_data.meteo_france_data.scm_models_data.utils import date_to_str
class TestWeatherTypes(unittest.TestCase): class TestWeatherTypes(unittest.TestCase):
...@@ -11,10 +14,21 @@ class TestWeatherTypes(unittest.TestCase): ...@@ -11,10 +14,21 @@ class TestWeatherTypes(unittest.TestCase):
def test_df_weather_types(self): def test_df_weather_types(self):
df = load_df_weather_types() df = load_df_weather_types()
self.assertEqual(len(df), 20354) self.assertEqual(len(df), 20354)
first = df.iloc[0].values[0] # Assert values
last = df.iloc[-1].values[0] self.assertEqual(df.iloc[0, :].values[0], 5)
self.assertEqual(first, 5) self.assertEqual(df.iloc[-1, :].values[0], 8)
self.assertEqual(last, 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): def test_yearly_percentages(self):
# Expected Percentages come from the original paper # Expected Percentages come from the original paper
......
...@@ -6,7 +6,7 @@ import pandas as pd ...@@ -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.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.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): class TestSCMOrientedData(unittest.TestCase):
......
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