Commit 04c160f5 authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[contrasting project] add spatio_temporal dataset to altitudes_studies.py

parent d61e48a9
No related merge requests found
Showing with 86 additions and 19 deletions
+86 -19
...@@ -12,6 +12,7 @@ from spatio_temporal_dataset.coordinates.spatio_temporal_coordinates.abstract_sp ...@@ -12,6 +12,7 @@ from spatio_temporal_dataset.coordinates.spatio_temporal_coordinates.abstract_sp
from spatio_temporal_dataset.coordinates.temporal_coordinates.generated_temporal_coordinates import \ from spatio_temporal_dataset.coordinates.temporal_coordinates.generated_temporal_coordinates import \
ConsecutiveTemporalCoordinates ConsecutiveTemporalCoordinates
from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset
from spatio_temporal_dataset.spatio_temporal_observations.annual_maxima_observations import AnnualMaxima
class AltitudesStudies(object): class AltitudesStudies(object):
...@@ -22,7 +23,7 @@ class AltitudesStudies(object): ...@@ -22,7 +23,7 @@ class AltitudesStudies(object):
self.spatial_transformation_class = spatial_transformation_class self.spatial_transformation_class = spatial_transformation_class
self.temporal_transformation_class = temporal_transformation_class self.temporal_transformation_class = temporal_transformation_class
self.altitudes = altitudes self.altitudes = altitudes
self.altitude_to_study = OrderedDict() self.altitude_to_study = OrderedDict() # type: OrderedDict[int, AbstractStudy]
for altitude in self.altitudes: for altitude in self.altitudes:
study = study_class(altitude=altitude, **kwargs_study) study = study_class(altitude=altitude, **kwargs_study)
self.altitude_to_study[altitude] = study self.altitude_to_study[altitude] = study
...@@ -31,11 +32,30 @@ class AltitudesStudies(object): ...@@ -31,11 +32,30 @@ class AltitudesStudies(object):
def study(self) -> AbstractStudy: def study(self) -> AbstractStudy:
return list(self.altitude_to_study.values())[0] return list(self.altitude_to_study.values())[0]
def get_dataset(self, massif_name, slicer) -> AbstractDataset: # Dataset Loader
pass
def spatio_temporal_dataset(self, massif_name, s_split_spatial: pd.Series = None, s_split_temporal: pd.Series = None):
coordinates = self.spatio_temporal_coordinates(s_split_spatial, s_split_temporal)
coordinate_values_to_maxima = {}
for altitude in self.altitudes:
study = self.altitude_to_study[altitude]
for year, maxima in zip(study.ordered_years, study.massif_name_to_annual_maxima[massif_name]):
coordinate_values_to_maxima[(altitude, year)] = [maxima]
observations = AnnualMaxima.from_coordinates(coordinates, coordinate_values_to_maxima)
return AbstractDataset(observations=observations, coordinates=coordinates)
# Coordinates Loader # Coordinates Loader
def spatio_temporal_coordinates(self, s_split_spatial: pd.Series = None, s_split_temporal: pd.Series = None):
slicer_class = AbstractCoordinates.slicer_class_from_s_splits(s_split_spatial=s_split_spatial,
s_split_temporal=s_split_temporal)
return AbstractSpatioTemporalCoordinates(slicer_class=slicer_class,
s_split_spatial=s_split_spatial,
s_split_temporal=s_split_temporal,
transformation_class=self.spatial_transformation_class,
spatial_coordinates=self.spatial_coordinates,
temporal_coordinates=self.temporal_coordinates)
@cached_property @cached_property
def temporal_coordinates(self): def temporal_coordinates(self):
return ConsecutiveTemporalCoordinates.from_nb_temporal_steps(nb_temporal_steps=self.study.nb_years, return ConsecutiveTemporalCoordinates.from_nb_temporal_steps(nb_temporal_steps=self.study.nb_years,
...@@ -57,13 +77,3 @@ class AltitudesStudies(object): ...@@ -57,13 +77,3 @@ class AltitudesStudies(object):
def random_s_split_temporal(self, train_split_ratio): def random_s_split_temporal(self, train_split_ratio):
return AbstractCoordinates.temporal_s_split_from_df(self._df_coordinates, train_split_ratio) return AbstractCoordinates.temporal_s_split_from_df(self._df_coordinates, train_split_ratio)
def spatio_temporal_coordinates(self, s_split_spatial: pd.Series = None, s_split_temporal: pd.Series = None):
slicer_class = AbstractCoordinates.slicer_class_from_s_splits(s_split_spatial=s_split_spatial,
s_split_temporal=s_split_temporal)
return AbstractSpatioTemporalCoordinates(slicer_class=slicer_class,
s_split_spatial=s_split_spatial,
s_split_temporal=s_split_temporal,
transformation_class=self.spatial_transformation_class,
spatial_coordinates=self.spatial_coordinates,
temporal_coordinates=self.temporal_coordinates)
...@@ -15,11 +15,16 @@ from spatio_temporal_dataset.spatio_temporal_observations.daily_observations imp ...@@ -15,11 +15,16 @@ from spatio_temporal_dataset.spatio_temporal_observations.daily_observations imp
class AnnualMaxima(AbstractSpatioTemporalObservations): class AnnualMaxima(AbstractSpatioTemporalObservations):
"""
Index are stations index @classmethod
Columns are the annual of the maxima def from_coordinates(cls, coordinates: AbstractCoordinates, coordinate_values_to_maxima):
""" index_to_maxima = {}
pass for i, coordinate_values in coordinates.df_all_coordinates.iterrows():
coordinate_values = tuple([int(v) for v in coordinate_values])
index_to_maxima[i] = coordinate_values_to_maxima[coordinate_values]
df = pd.DataFrame(index_to_maxima).transpose()
df.index = coordinates.index
return cls(df_maxima_gev=df)
class MarginAnnualMaxima(AnnualMaxima): class MarginAnnualMaxima(AnnualMaxima):
......
...@@ -42,6 +42,36 @@ class TestSpatioTemporalCoordinates(TestAltitudesStudies): ...@@ -42,6 +42,36 @@ class TestSpatioTemporalCoordinates(TestAltitudesStudies):
self.assertEqual(coordinates.coordinates_values(split=Split.test_spatiotemporal).shape, (1, 2)) self.assertEqual(coordinates.coordinates_values(split=Split.test_spatiotemporal).shape, (1, 2))
class TestSpatioTemporalDataset(TestAltitudesStudies):
def setUp(self) -> None:
super().setUp()
self.massif_name = "Vercors"
def test_temporal_split(self):
s_split_temporal = self.studies.random_s_split_temporal(train_split_ratio=0.75)
dataset = self.studies.spatio_temporal_dataset(massif_name=self.massif_name,
s_split_temporal=s_split_temporal)
self.assertEqual(len(dataset.maxima_gev(split=Split.train_temporal)), 6)
self.assertEqual(len(dataset.maxima_gev(split=Split.test_temporal)), 2)
def test_spatial_split(self):
s_split_spatial = self.studies.random_s_split_spatial(train_split_ratio=0.5)
dataset = self.studies.spatio_temporal_dataset(massif_name=self.massif_name,
s_split_spatial=s_split_spatial)
self.assertEqual(len(dataset.maxima_gev(split=Split.train_spatial)), 4)
self.assertEqual(len(dataset.maxima_gev(split=Split.test_spatial)), 4)
def test_spatio_temporal_split(self):
s_split_spatial = self.studies.random_s_split_spatial(train_split_ratio=0.5)
s_split_temporal = self.studies.random_s_split_temporal(train_split_ratio=0.75)
dataset = self.studies.spatio_temporal_dataset(massif_name=self.massif_name,
s_split_spatial=s_split_spatial,
s_split_temporal=s_split_temporal)
self.assertEqual(len(dataset.maxima_gev(split=Split.train_spatiotemporal)), 3)
self.assertEqual(len(dataset.maxima_gev(split=Split.test_spatiotemporal)), 1)
self.assertEqual(len(dataset.maxima_gev(split=Split.test_spatiotemporal_temporal)), 1)
self.assertEqual(len(dataset.maxima_gev(split=Split.test_spatiotemporal_spatial)), 3)
if __name__ == '__main__': if __name__ == '__main__':
......
...@@ -7,11 +7,16 @@ from extreme_fit.distribution.abstract_params import AbstractParams ...@@ -7,11 +7,16 @@ from extreme_fit.distribution.abstract_params import AbstractParams
from extreme_fit.distribution.exp_params import ExpParams from extreme_fit.distribution.exp_params import ExpParams
from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel
from extreme_fit.model.utils import set_seed_for_test from extreme_fit.model.utils import set_seed_for_test
from spatio_temporal_dataset.coordinates.spatial_coordinates.abstract_spatial_coordinates import \
AbstractSpatialCoordinates
from spatio_temporal_dataset.coordinates.spatio_temporal_coordinates.abstract_spatio_temporal_coordinates import \
AbstractSpatioTemporalCoordinates
from spatio_temporal_dataset.coordinates.temporal_coordinates.generated_temporal_coordinates import \ from spatio_temporal_dataset.coordinates.temporal_coordinates.generated_temporal_coordinates import \
ConsecutiveTemporalCoordinates ConsecutiveTemporalCoordinates
from spatio_temporal_dataset.spatio_temporal_observations.abstract_spatio_temporal_observations import \ from spatio_temporal_dataset.spatio_temporal_observations.abstract_spatio_temporal_observations import \
AbstractSpatioTemporalObservations AbstractSpatioTemporalObservations
from spatio_temporal_dataset.spatio_temporal_observations.annual_maxima_observations import DailyExpAnnualMaxima from spatio_temporal_dataset.spatio_temporal_observations.annual_maxima_observations import DailyExpAnnualMaxima, \
AnnualMaxima
from spatio_temporal_dataset.spatio_temporal_observations.daily_observations import DailyExp from spatio_temporal_dataset.spatio_temporal_observations.daily_observations import DailyExp
...@@ -27,6 +32,23 @@ class TestSpatioTemporalObservations(unittest.TestCase): ...@@ -27,6 +32,23 @@ class TestSpatioTemporalObservations(unittest.TestCase):
self.assertTrue(np.equal(example, maxima_frech).all(), msg="{} {}".format(example, maxima_frech)) self.assertTrue(np.equal(example, maxima_frech).all(), msg="{} {}".format(example, maxima_frech))
class TestAnnualMaximaFromDict(unittest.TestCase):
def test_annual_maxima_from_dict(self):
temporal_coordinates = ConsecutiveTemporalCoordinates.from_nb_temporal_steps(nb_temporal_steps=2)
spatial_coordinates = AbstractSpatialCoordinates.from_list_x_coordinates([300, 600])
coordinates = AbstractSpatioTemporalCoordinates(spatial_coordinates=spatial_coordinates,
temporal_coordinates=temporal_coordinates)
coordinate_values_to_maxima = {
(300, 0): [1, 2],
(300, 1): [3, 4],
(600, 0): [1, 2],
(600, 1): [3, 4],
}
observations = AnnualMaxima.from_coordinates(coordinates, coordinate_values_to_maxima)
self.assertEqual(observations.df_maxima_gev.iloc[1, 1], 2)
class TestDailyObservations(unittest.TestCase): class TestDailyObservations(unittest.TestCase):
def setUp(self) -> None: def setUp(self) -> None:
......
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