diff --git a/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py b/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py index a07ed9faa22f1e9eca1a68005ddf7a473890ceeb..0c1a1a1d33886741956c1f7ef518702bf9ffb00a 100644 --- a/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py +++ b/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py @@ -31,35 +31,3 @@ class AbstractQuantileEstimator(AbstractEstimator, ABC): raise NotImplementedError -class QuantileEstimatorFromMargin(LinearMarginEstimator, AbstractQuantileEstimator): - - def __init__(self, dataset: AbstractDataset, margin_model: AbstractTemporalLinearMarginModel, quantile): - super().__init__(dataset=dataset, quantile=quantile, margin_model=margin_model) - - @cached_property - def function_from_fit(self) -> AbstractQuantileFunction: - linear_margin_function = super().function_from_fit # type: AbstractMarginFunction - return QuantileFunctionFromMarginFunction(self.dataset.coordinates, linear_margin_function, self.quantile) - - -class QuantileRegressionEstimator(AbstractQuantileEstimator): - - def __init__(self, dataset: AbstractDataset, quantile: float, quantile_regression_model_class: type, **kwargs): - super().__init__(dataset, quantile, **kwargs) - self.quantile_regression_model = quantile_regression_model_class(dataset, quantile) # type: AbstractQuantileRegressionModel - - def _fit(self) -> AbstractResultFromModelFit: - return self.quantile_regression_model.fit() - - @cached_property - def function_from_fit(self) -> AbstractQuantileFunction: - result_from_model_fit = self.result_from_model_fit # type: ResultFromQuantreg - coefs = result_from_model_fit.coefficients - nb_coefs = len(coefs) - dims = list(range(nb_coefs-1)) - idx_to_coef = dict(zip([-1] + dims, coefs)) - linear_coef = LinearCoef(idx_to_coef=idx_to_coef) - param_function = LinearParamFunction(dims=dims, coordinates=self.dataset.coordinates.coordinates_values(), - linear_coef=linear_coef) - return QuantileFunctionFromParamFunction(coordinates=self.dataset.coordinates, - param_function=param_function) diff --git a/extreme_fit/estimator/quantile_estimator/quantile_estimator_from_margin.py b/extreme_fit/estimator/quantile_estimator/quantile_estimator_from_margin.py new file mode 100644 index 0000000000000000000000000000000000000000..fa130c1d0daa4bf6e922acdabc52e980dc3f05f5 --- /dev/null +++ b/extreme_fit/estimator/quantile_estimator/quantile_estimator_from_margin.py @@ -0,0 +1,31 @@ +from abc import ABC + +import numpy as np +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_estimator import AbstractQuantileEstimator +from extreme_fit.function.abstract_quantile_function import AbstractQuantileFunction, \ + QuantileFunctionFromMarginFunction, QuantileFunctionFromParamFunction +from extreme_fit.function.margin_function.abstract_margin_function import AbstractMarginFunction +from extreme_fit.function.param_function.linear_coef import LinearCoef +from extreme_fit.function.param_function.param_function import LinearParamFunction +from extreme_fit.model.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \ + AbstractTemporalLinearMarginModel +from extreme_fit.model.margin_model.linear_margin_model.linear_margin_model import LinearMarginModel +from extreme_fit.model.quantile_model.quantile_regression_model import AbstractQuantileRegressionModel +from extreme_fit.model.result_from_model_fit.abstract_result_from_model_fit import AbstractResultFromModelFit +from extreme_fit.model.result_from_model_fit.result_from_quantilreg import ResultFromQuantreg +from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset + + +class QuantileEstimatorFromMargin(LinearMarginEstimator, AbstractQuantileEstimator): + + def __init__(self, dataset: AbstractDataset, margin_model: AbstractTemporalLinearMarginModel, quantile): + super().__init__(dataset=dataset, quantile=quantile, margin_model=margin_model) + + @cached_property + def function_from_fit(self) -> AbstractQuantileFunction: + linear_margin_function = super().function_from_fit # type: AbstractMarginFunction + return QuantileFunctionFromMarginFunction(self.dataset.coordinates, linear_margin_function, self.quantile) diff --git a/extreme_fit/estimator/quantile_estimator/quantile_estimator_from_regression.py b/extreme_fit/estimator/quantile_estimator/quantile_estimator_from_regression.py new file mode 100644 index 0000000000000000000000000000000000000000..6cdc634c99aeed7238f06d22f53b53e03cd70d0d --- /dev/null +++ b/extreme_fit/estimator/quantile_estimator/quantile_estimator_from_regression.py @@ -0,0 +1,44 @@ +from abc import ABC + +import numpy as np +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_estimator import AbstractQuantileEstimator +from extreme_fit.function.abstract_quantile_function import AbstractQuantileFunction, \ + QuantileFunctionFromMarginFunction, QuantileFunctionFromParamFunction +from extreme_fit.function.margin_function.abstract_margin_function import AbstractMarginFunction +from extreme_fit.function.param_function.linear_coef import LinearCoef +from extreme_fit.function.param_function.param_function import LinearParamFunction +from extreme_fit.model.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \ + AbstractTemporalLinearMarginModel +from extreme_fit.model.margin_model.linear_margin_model.linear_margin_model import LinearMarginModel +from extreme_fit.model.quantile_model.quantile_regression_model import AbstractQuantileRegressionModel +from extreme_fit.model.result_from_model_fit.abstract_result_from_model_fit import AbstractResultFromModelFit +from extreme_fit.model.result_from_model_fit.result_from_quantilreg import ResultFromQuantreg +from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset + + +class QuantileRegressionEstimator(AbstractQuantileEstimator): + + def __init__(self, dataset: AbstractDataset, quantile: float, quantile_regression_model_class: type, **kwargs): + super().__init__(dataset, quantile, **kwargs) + self.quantile_regression_model = quantile_regression_model_class(dataset, + quantile) # type: AbstractQuantileRegressionModel + + def _fit(self) -> AbstractResultFromModelFit: + return self.quantile_regression_model.fit() + + @cached_property + def function_from_fit(self) -> AbstractQuantileFunction: + result_from_model_fit = self.result_from_model_fit # type: ResultFromQuantreg + coefs = result_from_model_fit.coefficients + nb_coefs = len(coefs) + dims = list(range(nb_coefs - 1)) + idx_to_coef = dict(zip([-1] + dims, coefs)) + linear_coef = LinearCoef(idx_to_coef=idx_to_coef) + param_function = LinearParamFunction(dims=dims, coordinates=self.dataset.coordinates.coordinates_values(), + linear_coef=linear_coef) + return QuantileFunctionFromParamFunction(coordinates=self.dataset.coordinates, + param_function=param_function) diff --git a/test/test_extreme_fit/test_estimator/test_quantile_estimator.py b/test/test_extreme_fit/test_estimator/test_quantile_estimator.py index 44840c15b830821ecb916fc2125c494855249851..ab8a4d606e533213067106fc430b23407c7ed50d 100644 --- a/test/test_extreme_fit/test_estimator/test_quantile_estimator.py +++ b/test/test_extreme_fit/test_estimator/test_quantile_estimator.py @@ -1,7 +1,7 @@ import unittest -from extreme_fit.estimator.quantile_estimator.abstract_quantile_estimator import QuantileEstimatorFromMargin, \ - QuantileRegressionEstimator +from extreme_fit.estimator.quantile_estimator.quantile_estimator_from_margin import QuantileEstimatorFromMargin +from extreme_fit.estimator.quantile_estimator.quantile_estimator_from_regression import QuantileRegressionEstimator from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel 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, \