From aaaaf1c5c2e512b73044fb26d44f9281b0d98d75 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Wed, 25 Mar 2020 16:12:10 +0100
Subject: [PATCH] [contrasting project] modify year_to_days to match with the
 definition.

---
 .../scm_models_data/abstract_study.py          | 13 ++++++++++---
 .../test_edf_data/test_weather_types.py        | 18 ++++++++++++++----
 .../test_meteo_france_data/test_SCM_study.py   |  7 +++++++
 3 files changed, 31 insertions(+), 7 deletions(-)

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 fb266947..64fd8cc2 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
@@ -18,6 +18,7 @@ from PIL import ImageDraw
 from matplotlib.colors import Normalize
 from netCDF4 import Dataset
 
+from extreme_data.edf_data.weather_types import load_df_weather_types
 from extreme_data.meteo_france_data.scm_models_data.abstract_variable import AbstractVariable
 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, \
@@ -81,7 +82,7 @@ class AbstractStudy(object):
         # Map each year to the 'days since year-08-01 06:00:00'
         year_to_days = OrderedDict()
         for year in self.ordered_years:
-            date = datetime.datetime(year=year, month=8, day=1, hour=6, minute=0, second=0)
+            date = datetime.datetime(year=year-1, month=8, day=1, hour=6, minute=0, second=0)
             days = []
             for i in range(366):
                 days.append(date_to_str(date))
@@ -95,7 +96,14 @@ class AbstractStudy(object):
     def year_to_wps(self):
         assert 1954 <= self.year_min and self.year_max <= WP_PATTERN_MAX_YEAR, \
             'Weather patterns are not available between {} and {}'.format(self.year_min, self.year_max)
-        pass
+        year_to_wps = {}
+        for year, days in self.year_to_days.items():
+            year_to_wps[year] = self.df_weather_types.loc[days].iloc[:, 0].values
+        return year_to_wps
+
+    @cached_property
+    def df_weather_types(self):
+        return load_df_weather_types()
 
     @property
     def all_days(self):
@@ -144,7 +152,6 @@ class AbstractStudy(object):
         year_to_annual_maxima = OrderedDict()
         for year, time_serie in self._year_to_max_daily_time_serie.items():
             annual_maxima = np.concatenate((time_serie[:91], time_serie[-61:]), axis=0).max(axis=0)
-            print(annual_maxima)
             year_to_annual_maxima[year] = annual_maxima
         return year_to_annual_maxima
 
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 71cc814d..c400f4ab 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,11 +1,12 @@
 import unittest
+import numpy as np
 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.safran.safran import SafranTemperature, SafranPrecipitation1Day
 from extreme_data.meteo_france_data.scm_models_data.utils import date_to_str
 
 
@@ -45,9 +46,18 @@ class TestWeatherTypes(unittest.TestCase):
         # wp_to_found_percentages = wp_to_found_percentages.astype(int)
         self.assertEqual(wp_to_expected_percentages, wp_to_found_percentages)
 
-    def test_anticyclonique_weather_pattern(self):
-        study = CrocusSwe3Days(altitude=900, year_min=1954, year_max=2008)
-        pass
+    # def test_anticyclonique_weather_pattern(self):
+    #     study = SafranPrecipitation1Day(altitude=900, year_min=1954, year_max=2008)
+    #     p = []
+    #     for year, wps in study.year_to_wps.items():
+    #         daily_time_serie_array = study.year_to_daily_time_serie_array[year]
+    #         self.assertEqual(len(daily_time_serie_array), len(wps))
+    #         precipitation_on_anticlonic_days = np.max(daily_time_serie_array[np.array(wps) == 8, :], axis=1)
+    #         print('NB anticlonic days', len(precipitation_on_anticlonic_days))
+    #         p.extend(precipitation_on_anticlonic_days)
+    #     p = sorted(p)[::-1]
+    #     print(p[:5])
+    #     self.assertLess(p[0], 10)
 
 
 
diff --git a/test/test_extreme_data/test_meteo_france_data/test_SCM_study.py b/test/test_extreme_data/test_meteo_france_data/test_SCM_study.py
index 7d355027..c3ff62e7 100644
--- a/test/test_extreme_data/test_meteo_france_data/test_SCM_study.py
+++ b/test/test_extreme_data/test_meteo_france_data/test_SCM_study.py
@@ -14,6 +14,13 @@ from root_utils import get_display_name_from_object_type
 
 class TestSCMAllStudy(unittest.TestCase):
 
+    def test_year_to_date(self):
+        year = 2019
+        study = SafranSnowfall(altitude=900, year_min=year, year_max=year)
+        first_day, *_, last_day = study.year_to_days[year]
+        self.assertIn(str(year-1), first_day)
+        self.assertIn(str(year), last_day)
+
     def test_instantiate_studies(self):
         nb_sample = 2
         for nb_days in sample(set(NB_DAYS), k=nb_sample):
-- 
GitLab