Commit 10bc2a5b authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[COORDINATES] add spatial_index attributes. add test accordingly.

parent f93657e4
No related merge requests found
Showing with 32 additions and 9 deletions
+32 -9
...@@ -168,6 +168,9 @@ class AbstractCoordinates(object): ...@@ -168,6 +168,9 @@ class AbstractCoordinates(object):
else: else:
return self.df_coordinates(split).loc[:, self.coordinates_spatial_names].drop_duplicates() return self.df_coordinates(split).loc[:, self.coordinates_spatial_names].drop_duplicates()
def spatial_index(self, split: Split = Split.all) -> pd.Index:
return self.df_spatial_coordinates(split).index
# Temporal attributes # Temporal attributes
@property @property
......
...@@ -17,12 +17,15 @@ class AbstractSpatioTemporalCoordinates(AbstractCoordinates): ...@@ -17,12 +17,15 @@ class AbstractSpatioTemporalCoordinates(AbstractCoordinates):
return super().from_df_and_slicer(df, SpatioTemporalSlicer, train_split_ratio) return super().from_df_and_slicer(df, SpatioTemporalSlicer, train_split_ratio)
@classmethod @classmethod
def generate_df_spatio_temporal(cls, df_spatial, nb_steps): def from_df_spatial_and_nb_steps(cls, df_spatial, nb_steps, train_split_ratio: float = None, start=0):
# df_temporal = ConsecutiveTemporalCoordinates.df_temporal(nb_temporal_steps=nb_temporal_steps)
df_time_steps = [] df_time_steps = []
index_type = type(df_spatial.index[0])
for t in range(nb_steps): for t in range(nb_steps):
df_time_step = df_spatial.copy() df_time_step = df_spatial.copy()
df_time_step[cls.COORDINATE_T] = t df_time_step[cls.COORDINATE_T] = start + t
index_suffix = index_type(t + len(df_spatial))
time_step_index = [i + index_suffix for i in df_spatial.index] if t > 0 else df_spatial.index
df_time_step.index = time_step_index
df_time_steps.append(df_time_step) df_time_steps.append(df_time_step)
df_time_steps = pd.concat(df_time_steps, ignore_index=True) df_time_steps = pd.concat(df_time_steps)
return df_time_steps return cls.from_df(df=df_time_steps, train_split_ratio=train_split_ratio)
\ No newline at end of file
...@@ -15,8 +15,7 @@ class GeneratedSpatioTemporalCoordinates(AbstractSpatioTemporalCoordinates): ...@@ -15,8 +15,7 @@ class GeneratedSpatioTemporalCoordinates(AbstractSpatioTemporalCoordinates):
assert cls.SPATIAL_COORDINATES_CLASS is not None assert cls.SPATIAL_COORDINATES_CLASS is not None
assert hasattr(cls.SPATIAL_COORDINATES_CLASS, 'df_spatial') assert hasattr(cls.SPATIAL_COORDINATES_CLASS, 'df_spatial')
df_spatial = cls.SPATIAL_COORDINATES_CLASS.df_spatial(nb_points=nb_points) df_spatial = cls.SPATIAL_COORDINATES_CLASS.df_spatial(nb_points=nb_points)
df_time_steps = cls.generate_df_spatio_temporal(df_spatial, nb_steps) return cls.from_df_spatial_and_nb_steps(df_spatial, nb_steps, train_split_ratio)
return cls.from_df(df=df_time_steps, train_split_ratio=train_split_ratio)
class UniformSpatioTemporalCoordinates(GeneratedSpatioTemporalCoordinates): class UniformSpatioTemporalCoordinates(GeneratedSpatioTemporalCoordinates):
......
...@@ -4,8 +4,9 @@ from collections import Counter, OrderedDict ...@@ -4,8 +4,9 @@ from collections import Counter, OrderedDict
from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates
from spatio_temporal_dataset.coordinates.spatio_temporal_coordinates.generated_spatio_temporal_coordinates import \ from spatio_temporal_dataset.coordinates.spatio_temporal_coordinates.generated_spatio_temporal_coordinates import \
UniformSpatioTemporalCoordinates UniformSpatioTemporalCoordinates, GeneratedSpatioTemporalCoordinates
from spatio_temporal_dataset.coordinates.spatial_coordinates.coordinates_1D import UniformSpatialCoordinates from spatio_temporal_dataset.coordinates.spatial_coordinates.coordinates_1D import UniformSpatialCoordinates, \
LinSpaceSpatialCoordinates
from spatio_temporal_dataset.coordinates.spatial_coordinates.alps_station_2D_coordinates import \ from spatio_temporal_dataset.coordinates.spatial_coordinates.alps_station_2D_coordinates import \
AlpsStation2DCoordinatesBetweenZeroAndOne AlpsStation2DCoordinatesBetweenZeroAndOne
from spatio_temporal_dataset.coordinates.spatial_coordinates.alps_station_3D_coordinates import \ from spatio_temporal_dataset.coordinates.spatial_coordinates.alps_station_3D_coordinates import \
...@@ -52,6 +53,23 @@ class SpatioTemporalCoordinates(unittest.TestCase): ...@@ -52,6 +53,23 @@ class SpatioTemporalCoordinates(unittest.TestCase):
good_count = c == Counter([2, 2, 2, 2]) or c == Counter([0, 0, 4, 4]) good_count = c == Counter([2, 2, 2, 2]) or c == Counter([0, 0, 4, 4])
self.assertTrue(good_count) self.assertTrue(good_count)
def test_unique_spatio_temporal_index_and_matching_spatial_index(self):
spatial_coordinates = LinSpaceSpatialCoordinates.from_nb_points(self.nb_points)
spatial_indexes = [[10, 11, 12, 13], ['a', 'b', 'c', 'd']]
for spatial_index in spatial_indexes:
spatial_coordinates.df_all_coordinates.index = spatial_index
df_spatial = spatial_coordinates.df_spatial_coordinates()
coordinates = GeneratedSpatioTemporalCoordinates.from_df_spatial_and_nb_steps(df_spatial=df_spatial,
nb_steps=self.nb_steps)
# the uniqueness of each spatio temporal index is not garanteed by the current algo
# it will work in classical cases, and raise an assert when uniqueness is needed (when using a slicer)
index1 = pd.Series(spatial_coordinates.spatial_index())
index2 = pd.Series(coordinates.spatial_index())
ind = index1 != index2 # type: pd.Series
self.assertEqual(sum(ind), 0, msg="spatial_coordinates:\n{} \n!= spatio_temporal_coordinates \n{}".
format(index1.loc[ind], index2.loc[ind]))
def test_ordered_coordinates(self): def test_ordered_coordinates(self):
# Order coordinates, to ensure that the first dimension/the second dimension and so on.. # Order coordinates, to ensure that the first dimension/the second dimension and so on..
# Always are in the same order to a given type (e.g. spatio_temporal= of coordinates # Always are in the same order to a given type (e.g. spatio_temporal= of coordinates
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment