From f04d85cc8028a2721d7d5e8ec866ff8022797bb5 Mon Sep 17 00:00:00 2001
From: Christophe Guyeux <christophe.guyeux@univ-fcomte.fr>
Date: Tue, 18 Feb 2020 10:06:15 +0100
Subject: [PATCH] The module to generate the y variable is now created

---
 config/learn.cfg            |   6 ++-
 config/targets/sdis25.cfg   |   6 +++
 main.py                     |  11 ++--
 predictops/engine.py        |  19 ++++++-
 predictops/target/all.py    |  18 -------
 predictops/target/target.py | 103 ++++++++++++++++++++++++++++++++++++
 predictops/target/toarea.py |  15 +++---
 7 files changed, 142 insertions(+), 36 deletions(-)
 create mode 100644 config/targets/sdis25.cfg
 delete mode 100644 predictops/target/all.py
 create mode 100644 predictops/target/target.py

diff --git a/config/learn.cfg b/config/learn.cfg
index 9475c78..f6b2e43 100644
--- a/config/learn.cfg
+++ b/config/learn.cfg
@@ -16,4 +16,8 @@ ephemeris   = (Path.cwd() / 'config') / 'features' / 'feature_ephemeris.cfg'
 
 [PREPROCESSING]
 fill_method = spline
-order       = 3
\ No newline at end of file
+order       = 3
+
+
+[TARGET]
+config = (Path.cwd() / 'config') / 'targets' / 'sdis25.cfg'
diff --git a/config/targets/sdis25.cfg b/config/targets/sdis25.cfg
new file mode 100644
index 0000000..712e93b
--- /dev/null
+++ b/config/targets/sdis25.cfg
@@ -0,0 +1,6 @@
+[SPECIFICATION]
+origin      = False
+destination = False
+
+[DATA]
+csv_file = (Path.cwd() / 'data') / 'targets' / 'sdis25' / 'interventions.csv'
\ No newline at end of file
diff --git a/main.py b/main.py
index 9e35b2d..969054c 100644
--- a/main.py
+++ b/main.py
@@ -1,7 +1,5 @@
 from predictops.engine import Engine
 from predictops.learn.preprocessing import Preprocessing
-from predictops.target.all import All
-from predictops.target.toarea import ToArea
 
 from logging import getLogger
 from logging.config import fileConfig
@@ -18,16 +16,14 @@ if __name__ == '__main__':
     engine = Engine(config_file = config)
 
     engine.add_features()
-    #print(engine.X)
-    process = Preprocessing(config_file = config, dict_features = engine.X)
+    engine.add_target()
 
+    process = Preprocessing(config_file = config, dict_features = engine.X)
 
-    #print(engine.X[datetime.strptime('06/30/2010 21:00:00', '%m/%d/%Y %H:%M:%S')])
     print(process.dataframe.head(n=20))
     print(process.dataframe.tail(n=20))
 
-
-    target = All(stream_file = Path.cwd() / 'data' / 'targets' / 'sdis25' / 'interventions.csv')
+    #target = toarea(stream_file = Path.cwd() / 'data' / 'targets' / 'sdis25' / 'interventions.csv')
 
 
     exit()
@@ -36,6 +32,5 @@ if __name__ == '__main__':
     Doubs = depts.loc[depts['nom'] == 'Doubs'].iloc[0]
 
     ToArea(area=Doubs.geometry,
-           start = start, end = end,
            csv_file = Path.cwd() / 'data' / 'targets' / 'sdis25' / 'interventions.csv')
 
diff --git a/predictops/engine.py b/predictops/engine.py
index 8ba5043..dedd265 100644
--- a/predictops/engine.py
+++ b/predictops/engine.py
@@ -7,6 +7,7 @@ from shutil import rmtree
 
 from .source.ephemeris import Ephemeris
 from .source.meteofrance import MeteoFrance
+from .target.target import Target
 
 fileConfig((Path.cwd() / 'config') / 'logging.cfg')
 logger = getLogger()
@@ -26,7 +27,6 @@ class Engine:
                                    self._config['DATETIME'].getfloat('hourStep'))
 
         self._X = {}
-        self._Y = {}
 
 
 
@@ -65,10 +65,25 @@ class Engine:
                 self._X.setdefault(date,{}).update(dated_features[date])
 
 
+    def add_target(self):
+        self._target = Target(config_file = eval(self._config['TARGET']['config']),
+                              start = self._start, end = self._end,
+                              timestep = self._timestep)
+
+
     @property
     def X(self):
         return self._X
 
     @X.setter
     def X(self, x):
-        self._X = x
\ No newline at end of file
+        self._X = x
+
+
+    @property
+    def y(self):
+        return self._target.y
+
+    @y.setter
+    def end(self, y):
+        self._target.y = y
diff --git a/predictops/target/all.py b/predictops/target/all.py
deleted file mode 100644
index 0d9d72b..0000000
--- a/predictops/target/all.py
+++ /dev/null
@@ -1,18 +0,0 @@
-from csv import DictReader
-
-class All:
-
-    _start = None
-    _end   = None
-
-    def __init__(self, stream_file = None):
-        self._stream_file = stream_file
-        self._get_located_interventions()
-
-
-    def _get_located_interventions(self):
-        with open(self._stream_file) as f:
-            reader = DictReader(f, delimiter=',')
-            for row in reader:
-                print(row)
-
diff --git a/predictops/target/target.py b/predictops/target/target.py
new file mode 100644
index 0000000..b998120
--- /dev/null
+++ b/predictops/target/target.py
@@ -0,0 +1,103 @@
+from configparser import ConfigParser
+from csv import DictReader
+from datetime import datetime, timedelta
+from logging import getLogger
+from logging.config import fileConfig
+from pathlib import Path
+
+fileConfig((Path.cwd() / 'config') / 'logging.cfg')
+logger = getLogger()
+
+
+class Target:
+
+    def __init__(self, config_file = None,
+                 start = None, end = None, timestep = None):
+
+        self._config = ConfigParser()
+        self._config.read(config_file)
+
+        self._start = start
+        self._end = end
+        self._timestep = timestep
+
+        logger.info('Initialization of target variable')
+        self._y = {}
+        current = self._start
+        while current <= self._end:
+            self._y[current] = 0
+            current += self._timestep
+
+        self._timestep = timestep
+        self._stream_file = eval(self._config['DATA']['csv_file'])
+        self._get_located_interventions()
+
+
+
+    @property
+    def start(self):
+        return self._start
+
+    @start.setter
+    def start(self, x):
+        self._start = x
+
+
+    @property
+    def end(self):
+        return self._end
+
+    @end.setter
+    def end(self, x):
+        self._end = x
+
+
+    @property
+    def y(self):
+        return self._y
+
+    @y.setter
+    def end(self, y):
+        self._y = y
+
+
+
+    def _get_located_interventions(self):
+        if not self._config['SPECIFICATION'].getboolean('origin')\
+           and not self._config['SPECIFICATION'].getboolean('destination'):
+            logger.info('Integrating interventions for the whole area')
+            with open(self._stream_file) as f:
+                reader = DictReader(f, delimiter=',')
+                for row in reader:
+                    if row['start'] != '':
+                        start_interv = datetime.strptime(row['start'], '%d/%m/%Y %H:%M:%S')
+                        start_interv = start_interv.replace(minute=0)
+                        end_interv = datetime.strptime(row['end'], '%d/%m/%Y %H:%M:%S')
+                        end_interv = end_interv.replace(minute=0)
+                        if not (start_interv > self._end or end_interv < self._start):
+                            if start_interv < self._start and end_interv <= self._end:
+                                current = self._start
+                                while current <= end_interv:
+                                    self._y[current] += 1
+                                    current += self._timestep
+                            elif start_interv >= self._start and end_interv > self._end:
+                                current = start_interv
+                                while current not in self._y:
+                                    current -= timedelta(hours=1)
+                                while current <= self._end:
+                                    self._y[current] += 1
+                                    current += self._timestep
+                            elif start_interv >= self._start and end_interv <= self._end:
+                                current = start_interv
+                                while current not in self._y:
+                                    current -= timedelta(hours=1)
+                                while current <= end_interv:
+                                    self._y[current] += 1
+                                    current += self._timestep
+
+
+
+
+
+
+
diff --git a/predictops/target/toarea.py b/predictops/target/toarea.py
index 1454e9d..aa6911b 100644
--- a/predictops/target/toarea.py
+++ b/predictops/target/toarea.py
@@ -3,21 +3,22 @@ from datetime import datetime
 
 class ToArea:
 
-    def __init__(self, area = None,
-                 start = datetime.strptime('19960101000000', '%Y%m%d%H%M%S'),
-                 end = datetime.now(),
-                 csv_file = None):
+    def __init__(self, area = None, stream_file = None):
 
         self._area = area
-        self._csv_file = csv_file
+        self._stream_file = stream_file
         self._get_located_interventions()
 
 
     def _get_located_interventions(self):
-        with open(self._csv_file) as f:
+        with open(self._stream_file) as f:
             reader = DictReader(f, delimiter=',')
             for row in reader:
-                print(row)
+                start = datetime.strptime(row['start'], '%d/%m/%Y %H:%M:%S')
+                start.minute = 0
+                end   = datetime.strptime(row['end'], '%d/%m/%Y %H:%M:%S')
+                end.minute = 0
+
 
 
 
-- 
2.39.5