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