From a3e040da9a31b6d81a7f8de79b0d89258fca4122 Mon Sep 17 00:00:00 2001
From: Le Roux Erwan <erwan.le-roux@irstea.fr>
Date: Tue, 6 Nov 2018 13:58:27 +0100
Subject: [PATCH] [SPATIAL COORDINATES] add nb_points class constructor to any
 abstract_coordinates object.

---
 .../abstract_coordinates.py                   | 22 ++++++++++++++++---
 .../alps_station_coordinates.py               | 18 +++++++++++++--
 .../generated_coordinates.py                  | 15 +------------
 .../normalized_coordinates.py                 |  7 ------
 4 files changed, 36 insertions(+), 26 deletions(-)

diff --git a/spatio_temporal_dataset/spatial_coordinates/abstract_coordinates.py b/spatio_temporal_dataset/spatial_coordinates/abstract_coordinates.py
index ed6bca63..e6cfba0b 100644
--- a/spatio_temporal_dataset/spatial_coordinates/abstract_coordinates.py
+++ b/spatio_temporal_dataset/spatial_coordinates/abstract_coordinates.py
@@ -26,12 +26,29 @@ class AbstractSpatialCoordinates(object):
         s_split = df[cls.COORD_SPLIT] if cls.COORD_SPLIT in df.columns else None
         return cls(df_coord=df_coord, s_split=s_split)
 
+    @property
+    def df(self):
+        return self.df_coord if self.s_split is None else self.df_coord.join(self.s_split)
+
     @classmethod
-    def from_csv(cls, csv_path):
+    def from_csv(cls, csv_path=None):
+        assert csv_path is not None
         assert op.exists(csv_path)
         df = pd.read_csv(csv_path)
         return cls.from_df(df)
 
+    @classmethod
+    def from_nb_points(cls, nb_points, **kwargs):
+        # Call the default class method from csv
+        coordinates = cls.from_csv()  # type: AbstractSpatialCoordinates
+        # Sample randomly nb_points coordinates
+        nb_coordinates = len(coordinates)
+        if nb_points > nb_coordinates:
+            raise Exception('Nb coordinates in csv: {} < Nb points desired: {}'.format(nb_coordinates, nb_points))
+        else:
+            df_sample = pd.DataFrame.sample(coordinates.df, n=nb_points)
+            return cls.from_df(df=df_sample)
+
     def coord_x_y_values(self, df_coord: pd.DataFrame) -> np.ndarray:
         return df_coord.loc[:, [self.COORD_X, self.COORD_Y]].values
 
@@ -56,8 +73,7 @@ class AbstractSpatialCoordinates(object):
     def index(self):
         return self.df_coord.index
 
-    @property
-    def nb_points(self):
+    def __len__(self):
         return len(self.df_coord)
 
     def visualization(self):
diff --git a/spatio_temporal_dataset/spatial_coordinates/alps_station_coordinates.py b/spatio_temporal_dataset/spatial_coordinates/alps_station_coordinates.py
index 4e8c4a59..fb1335ea 100644
--- a/spatio_temporal_dataset/spatial_coordinates/alps_station_coordinates.py
+++ b/spatio_temporal_dataset/spatial_coordinates/alps_station_coordinates.py
@@ -2,10 +2,12 @@ import pandas as pd
 import os.path as op
 
 from spatio_temporal_dataset.spatial_coordinates.abstract_coordinates import AbstractSpatialCoordinates
+from spatio_temporal_dataset.spatial_coordinates.normalized_coordinates import BetweenZeroAndOneNormalization, \
+    NormalizedCoordinates
 from utils import get_full_path
 
 
-class AlpsStationCoordinate(AbstractSpatialCoordinates):
+class AlpsStationCoordinates(AbstractSpatialCoordinates):
     RELATIVE_PATH = r'local/spatio_temporal_datasets/Gilles  - precipitations'
     FULL_PATH = get_full_path(relative_path=RELATIVE_PATH)
 
@@ -31,7 +33,19 @@ class AlpsStationCoordinate(AbstractSpatialCoordinates):
         print(df.index)
 
 
+class AlpsStationCoordinatesBetweenZeroAndOne(AlpsStationCoordinates):
+
+    @classmethod
+    def from_csv(cls, csv_file='coord-lambert2'):
+        coord = super().from_csv(csv_file)
+        return NormalizedCoordinates.from_coordinates(spatial_coordinates=coord,
+                                                      normalizing_function=BetweenZeroAndOneNormalization())
+
+
 if __name__ == '__main__':
     # AlpsStationCoordinate.transform_txt_into_csv()
-    coord = AlpsStationCoordinate.from_csv()
+    # coord = AlpsStationCoordinates.from_csv()
+    # coord = AlpsStationCoordinates.from_nb_points(nb_points=60)
+    # coord = AlpsStationCoordinatesBetweenZeroAndOne.from_csv()
+    coord = AlpsStationCoordinatesBetweenZeroAndOne.from_nb_points(nb_points=60)
     coord.visualization()
diff --git a/spatio_temporal_dataset/spatial_coordinates/generated_coordinates.py b/spatio_temporal_dataset/spatial_coordinates/generated_coordinates.py
index 81cbc1b3..e49a6add 100644
--- a/spatio_temporal_dataset/spatial_coordinates/generated_coordinates.py
+++ b/spatio_temporal_dataset/spatial_coordinates/generated_coordinates.py
@@ -7,20 +7,7 @@ from spatio_temporal_dataset.spatial_coordinates.abstract_coordinates import Abs
 import matplotlib.pyplot as plt
 
 
-class SimulatedCoordinates(AbstractSpatialCoordinates):
-    """
-    Common manipulation on generated coordinates
-    """
-
-    def __init__(self, df_coord, s_split=None):
-        super().__init__(df_coord, s_split)
-
-    @classmethod
-    def from_nb_points(cls, nb_points, **kwargs):
-        pass
-
-
-class CircleCoordinates(SimulatedCoordinates):
+class CircleCoordinates(AbstractSpatialCoordinates):
 
     @classmethod
     def from_nb_points(cls, nb_points, **kwargs):
diff --git a/spatio_temporal_dataset/spatial_coordinates/normalized_coordinates.py b/spatio_temporal_dataset/spatial_coordinates/normalized_coordinates.py
index 1ef1de44..36608d6f 100644
--- a/spatio_temporal_dataset/spatial_coordinates/normalized_coordinates.py
+++ b/spatio_temporal_dataset/spatial_coordinates/normalized_coordinates.py
@@ -1,7 +1,5 @@
 import pandas as pd
-
 from spatio_temporal_dataset.spatial_coordinates.abstract_coordinates import AbstractSpatialCoordinates
-from spatio_temporal_dataset.spatial_coordinates.alps_station_coordinates import AlpsStationCoordinate
 
 
 class AbstractNormalizingFunction(object):
@@ -59,8 +57,3 @@ class BetweenZeroAndOneNormalization(UniformNormalization):
         return s_coord_scaled
 
 
-if __name__ == '__main__':
-    coord = AlpsStationCoordinate.from_csv()
-    normalized_coord = NormalizedCoordinates.from_coordinates(spatial_coordinates=coord,
-                                                              normalizing_function=BetweenZeroAndOneNormalization())
-    normalized_coord.visualization()
-- 
GitLab