From ef6232d4eaff6c798808e450697c31221e2fd329 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Wed, 25 Mar 2020 15:28:25 +0100
Subject: [PATCH] [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.

---
 extreme_data/edf_data/weather_types.py        |  8 ++++++-
 .../scm_models_data/abstract_study.py         | 19 +++++++++++++---
 .../scm_models_data/crocus/taline_data.py     | 22 -------------------
 .../{scm_constants.py => utils.py}            |  6 +++++
 .../test_edf_data/test_weather_types.py       | 22 +++++++++++++++----
 .../test_SCM_oriented_data.py                 |  2 +-
 6 files changed, 48 insertions(+), 31 deletions(-)
 delete mode 100644 extreme_data/meteo_france_data/scm_models_data/crocus/taline_data.py
 rename extreme_data/meteo_france_data/scm_models_data/{scm_constants.py => utils.py} (99%)

diff --git a/extreme_data/edf_data/weather_types.py b/extreme_data/edf_data/weather_types.py
index ca2c74dc..519b85a8 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 366ee0bb..a36101eb 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 2f992812..00000000
--- 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 0bbf64f5..0ae80847 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 afa1d9b6..1b70bf90 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 4152e867..a21c7ea2 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):
-- 
GitLab