diff --git a/spatio_temporal_dataset/spatial_coordinates/abstract_coordinates.py b/spatio_temporal_dataset/spatial_coordinates/abstract_coordinates.py index ed6bca63c2df83ec20002f8e0da95e24692841fe..e6cfba0b9eaa8bb3cf61c6cb804f9054f72bf3f0 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 4e8c4a594e3e5fff0f81bc3b815e3d87e1ac868a..fb1335eac9e6ff336d6037607bc532e6d1359631 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 81cbc1b33e799ce15db1194390da222e664c5021..e49a6add9d5efdf1279ae440858c5caffd7deead 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 1ef1de44e78d5fd68924654d412e9d164a9b4ad8..36608d6fdaee3f27ec1b81eeb918616d2458b95f 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()