diff --git a/projects/contrasting_trends_in_snow_loads/altitunal_fit/altitudes_studies.py b/projects/contrasting_trends_in_snow_loads/altitunal_fit/altitudes_studies.py
index aad06c85267ce31a038a25cbba67cdcff4cb70b0..727671b1356b33aed098cb32f9e9a762e9f301c5 100644
--- a/projects/contrasting_trends_in_snow_loads/altitunal_fit/altitudes_studies.py
+++ b/projects/contrasting_trends_in_snow_loads/altitunal_fit/altitudes_studies.py
@@ -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 \
     ConsecutiveTemporalCoordinates
 from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset
+from spatio_temporal_dataset.spatio_temporal_observations.annual_maxima_observations import AnnualMaxima
 
 
 class AltitudesStudies(object):
@@ -22,7 +23,7 @@ class AltitudesStudies(object):
         self.spatial_transformation_class = spatial_transformation_class
         self.temporal_transformation_class = temporal_transformation_class
         self.altitudes = altitudes
-        self.altitude_to_study = OrderedDict()
+        self.altitude_to_study = OrderedDict() # type: OrderedDict[int, AbstractStudy]
         for altitude in self.altitudes:
             study = study_class(altitude=altitude, **kwargs_study)
             self.altitude_to_study[altitude] = study
@@ -31,11 +32,30 @@ class AltitudesStudies(object):
     def study(self) -> AbstractStudy:
         return list(self.altitude_to_study.values())[0]
 
-    def get_dataset(self, massif_name, slicer) -> AbstractDataset:
-        pass
+    # Dataset Loader
+
+    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
 
+    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
     def temporal_coordinates(self):
         return ConsecutiveTemporalCoordinates.from_nb_temporal_steps(nb_temporal_steps=self.study.nb_years,
@@ -57,13 +77,3 @@ class AltitudesStudies(object):
 
     def random_s_split_temporal(self, 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)
diff --git a/spatio_temporal_dataset/spatio_temporal_observations/annual_maxima_observations.py b/spatio_temporal_dataset/spatio_temporal_observations/annual_maxima_observations.py
index 98122f23ec32b953c735ba4a0882fbc750e72f23..9c59937e96fbc4ef442dbdd92819d9d2cdaf4c19 100644
--- a/spatio_temporal_dataset/spatio_temporal_observations/annual_maxima_observations.py
+++ b/spatio_temporal_dataset/spatio_temporal_observations/annual_maxima_observations.py
@@ -15,11 +15,16 @@ from spatio_temporal_dataset.spatio_temporal_observations.daily_observations imp
 
 
 class AnnualMaxima(AbstractSpatioTemporalObservations):
-    """
-    Index are stations index
-    Columns are the annual of the maxima
-    """
-    pass
+
+    @classmethod
+    def from_coordinates(cls, coordinates: AbstractCoordinates, coordinate_values_to_maxima):
+        index_to_maxima = {}
+        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):
diff --git a/test/test_projects/test_contrasting/test_altitudes_studies.py b/test/test_projects/test_contrasting/test_altitudes_studies.py
index b943fa66ce9c7c9f1eaa46f3ca666d3a4e8722c7..ced0f89fe7cbfd7b031d26eb33f08340641c2e8a 100644
--- a/test/test_projects/test_contrasting/test_altitudes_studies.py
+++ b/test/test_projects/test_contrasting/test_altitudes_studies.py
@@ -42,6 +42,36 @@ class TestSpatioTemporalCoordinates(TestAltitudesStudies):
         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__':
diff --git a/test/test_spatio_temporal_dataset/test_spatio_temporal_observations.py b/test/test_spatio_temporal_dataset/test_spatio_temporal_observations.py
index 4786e54c1764354d59b7704d2e19dfc8a4537d91..de24b0d6ba9bf8fafe4b9dfb724cb99bcb78ec9f 100644
--- a/test/test_spatio_temporal_dataset/test_spatio_temporal_observations.py
+++ b/test/test_spatio_temporal_dataset/test_spatio_temporal_observations.py
@@ -7,11 +7,16 @@ from extreme_fit.distribution.abstract_params import AbstractParams
 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.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 \
     ConsecutiveTemporalCoordinates
 from spatio_temporal_dataset.spatio_temporal_observations.abstract_spatio_temporal_observations import \
     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
 
 
@@ -27,6 +32,23 @@ class TestSpatioTemporalObservations(unittest.TestCase):
         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):
 
     def setUp(self) -> None: