From 339cf062db1421050e49436a72e950ff61ab8168 Mon Sep 17 00:00:00 2001 From: Le Roux Erwan <erwan.le-roux@irstea.fr> Date: Wed, 18 Mar 2020 15:27:03 +0100 Subject: [PATCH] [paper 1] add quantile regression --- .../abstract_quantile_estimator.py | 30 ++++++++++++++ .../abstract_quantile_function.py | 14 +++++++ .../test_estimator/test_margin_estimators.py | 3 -- .../test_estimator/test_quantile_estimator.py | 41 +++++++++++++++++++ 4 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py create mode 100644 extreme_fit/estimator/quantile_estimator/abstract_quantile_function.py create mode 100644 test/test_extreme_fit/test_estimator/test_quantile_estimator.py diff --git a/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py b/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py new file mode 100644 index 00000000..739c8929 --- /dev/null +++ b/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py @@ -0,0 +1,30 @@ +from cached_property import cached_property + +from extreme_fit.estimator.abstract_estimator import AbstractEstimator +from extreme_fit.estimator.margin_estimator.abstract_margin_estimator import LinearMarginEstimator +from extreme_fit.estimator.quantile_estimator.abstract_quantile_function import AbstractQuantileFunction +from extreme_fit.model.margin_model.linear_margin_model.linear_margin_model import LinearMarginModel +from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset + + +class AbstractQuantileEstimator(AbstractEstimator): + + def __init__(self, quantile: float, **kwargs): + super().__init__(**kwargs) + assert 0 < quantile < 1 + self.quantile = quantile + + @cached_property + def quantile_function_from_fit(self) -> AbstractQuantileFunction: + pass + + +class QuantileEstimatorFromMargin(AbstractQuantileEstimator, LinearMarginEstimator): + + def __init__(self, dataset: AbstractDataset, margin_model: LinearMarginModel, quantile): + super().__init__(dataset=dataset, quantile=quantile, margin_model=margin_model) + + @cached_property + def quantile_function_from_fit(self) -> AbstractQuantileFunction: + linear_margin_function = super().margin_function_from_fit + return AbstractQuantileFunction(linear_margin_function, self.quantile) diff --git a/extreme_fit/estimator/quantile_estimator/abstract_quantile_function.py b/extreme_fit/estimator/quantile_estimator/abstract_quantile_function.py new file mode 100644 index 00000000..d39b121f --- /dev/null +++ b/extreme_fit/estimator/quantile_estimator/abstract_quantile_function.py @@ -0,0 +1,14 @@ +import numpy as np + +from extreme_fit.model.margin_model.margin_function.abstract_margin_function import AbstractMarginFunction + + +class AbstractQuantileFunction(object): + + def __init__(self, margin_function: AbstractMarginFunction, quantile: float): + self.margin_function = margin_function + self.quantile = quantile + + def get_quantile(self, coordinate: np.ndarray) -> float: + gev_params = self.margin_function.get_gev_params(coordinate) + return gev_params.quantile(self.quantile) \ No newline at end of file diff --git a/test/test_extreme_fit/test_estimator/test_margin_estimators.py b/test/test_extreme_fit/test_estimator/test_margin_estimators.py index 36cf25bc..7f5eabb2 100644 --- a/test/test_extreme_fit/test_estimator/test_margin_estimators.py +++ b/test/test_extreme_fit/test_estimator/test_margin_estimators.py @@ -40,6 +40,3 @@ class TestSmoothMarginEstimator(unittest.TestCase): if __name__ == '__main__': unittest.main() - # t = TestSmoothMarginEstimator() - # t.test_smooth_margin_estimator_spatio_temporal() - # t.tearDown() diff --git a/test/test_extreme_fit/test_estimator/test_quantile_estimator.py b/test/test_extreme_fit/test_estimator/test_quantile_estimator.py new file mode 100644 index 00000000..9bf1a3c1 --- /dev/null +++ b/test/test_extreme_fit/test_estimator/test_quantile_estimator.py @@ -0,0 +1,41 @@ +import unittest + +from extreme_fit.estimator.quantile_estimator.abstract_quantile_estimator import QuantileEstimatorFromMargin +from spatio_temporal_dataset.dataset.simulation_dataset import MarginDataset +from test.test_utils import load_test_1D_and_2D_spatial_coordinates, load_test_spatiotemporal_coordinates, \ + load_smooth_margin_models + + +class TestSmoothMarginEstimator(unittest.TestCase): + DISPLAY = False + + def test_smooth_margin_estimator_spatial(self): + self.nb_points = 2 + self.nb_obs = 2 + self.coordinates = load_test_1D_and_2D_spatial_coordinates(nb_points=self.nb_points) + + def test_smooth_margin_estimator_spatio_temporal(self): + self.nb_points = 2 + self.nb_steps = 2 + self.nb_obs = 1 + self.coordinates = load_test_spatiotemporal_coordinates(nb_steps=self.nb_steps, nb_points=self.nb_points) + + def tearDown(self) -> None: + quantile = 0.98 + for coordinates in self.coordinates: + constant_margin_model = load_smooth_margin_models(coordinates=coordinates)[0] + dataset = MarginDataset.from_sampling(nb_obs=self.nb_obs, + margin_model=constant_margin_model, + coordinates=coordinates) + quantile_estimators = [QuantileEstimatorFromMargin(dataset, constant_margin_model, quantile)] + help(QuantileEstimatorFromMargin) + + for quantile_estimator in quantile_estimators: + quantile_estimator.fit() + print(quantile_estimator.margin_function_from_fit) + + # self.assertTrue(True) + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file -- GitLab