From 04a73d0a9367271eb63310ff97b29349901a32b5 Mon Sep 17 00:00:00 2001 From: Le Roux Erwan <erwan.le-roux@irstea.fr> Date: Thu, 19 Mar 2020 21:32:42 +0100 Subject: [PATCH] [refactor] refactor test_quantile_estimator.py. Quantile estimators works for any temporal coordinates. --- .../abstract_quantile_estimator.py | 10 +++++++--- .../quantile_regression_model.py | 7 +++++-- .../result_from_quantilreg.py | 3 ++- .../test_estimator/test_quantile_estimator.py | 18 ++++++------------ test/test_utils.py | 4 ++-- 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py b/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py index f308053b..a07ed9fa 100644 --- a/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py +++ b/extreme_fit/estimator/quantile_estimator/abstract_quantile_estimator.py @@ -10,6 +10,8 @@ from extreme_fit.function.abstract_quantile_function import AbstractQuantileFunc 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 @@ -31,7 +33,7 @@ class AbstractQuantileEstimator(AbstractEstimator, ABC): class QuantileEstimatorFromMargin(LinearMarginEstimator, AbstractQuantileEstimator): - def __init__(self, dataset: AbstractDataset, margin_model: LinearMarginModel, quantile): + def __init__(self, dataset: AbstractDataset, margin_model: AbstractTemporalLinearMarginModel, quantile): super().__init__(dataset=dataset, quantile=quantile, margin_model=margin_model) @cached_property @@ -53,8 +55,10 @@ class QuantileRegressionEstimator(AbstractQuantileEstimator): def function_from_fit(self) -> AbstractQuantileFunction: result_from_model_fit = self.result_from_model_fit # type: ResultFromQuantreg coefs = result_from_model_fit.coefficients - dims = list(np.arange(len(coefs)) - 1) - linear_coef = LinearCoef('quantile', idx_to_coef=dict(zip(dims, coefs))) + 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, diff --git a/extreme_fit/model/quantile_model/quantile_regression_model.py b/extreme_fit/model/quantile_model/quantile_regression_model.py index 66c99e29..88459f77 100644 --- a/extreme_fit/model/quantile_model/quantile_regression_model.py +++ b/extreme_fit/model/quantile_model/quantile_regression_model.py @@ -4,6 +4,7 @@ from rpy2 import robjects from extreme_fit.model.abstract_model import AbstractModel from extreme_fit.model.result_from_model_fit.result_from_quantilreg import ResultFromQuantreg from extreme_fit.model.utils import r, safe_run_r_estimator, get_coord_df +from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset @@ -47,8 +48,10 @@ class ConstantQuantileRegressionModel(AbstractQuantileRegressionModel): return '1' -class AllCoordinatesQuantileRegressionModel(AbstractQuantileRegressionModel): +class TemporalCoordinatesQuantileRegressionModel(AbstractQuantileRegressionModel): @property def formula_str(self): - return '+'.join(self.dataset.coordinates.coordinates_names[-1:]) + assert self.dataset.coordinates.has_temporal_coordinates \ + and not self.dataset.coordinates.has_spatial_coordinates + return AbstractCoordinates.COORDINATE_T diff --git a/extreme_fit/model/result_from_model_fit/result_from_quantilreg.py b/extreme_fit/model/result_from_model_fit/result_from_quantilreg.py index d04af928..4e726952 100644 --- a/extreme_fit/model/result_from_model_fit/result_from_quantilreg.py +++ b/extreme_fit/model/result_from_model_fit/result_from_quantilreg.py @@ -1,3 +1,4 @@ +import numpy as np from cached_property import cached_property from extreme_fit.function.param_function.param_function import LinearParamFunction @@ -8,4 +9,4 @@ class ResultFromQuantreg(AbstractResultFromModelFit): @property def coefficients(self): - return self.name_to_value['coefficients'] + return np.array(self.name_to_value['coefficients']) 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 eea9482c..44840c15 100644 --- a/test/test_extreme_fit/test_estimator/test_quantile_estimator.py +++ b/test/test_extreme_fit/test_estimator/test_quantile_estimator.py @@ -2,29 +2,23 @@ import unittest from extreme_fit.estimator.quantile_estimator.abstract_quantile_estimator import QuantileEstimatorFromMargin, \ 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, \ - load_smooth_margin_models, load_smooth_quantile_model_classes + load_smooth_margin_models, load_smooth_quantile_model_classes, load_test_temporal_coordinates class TestQuantileEstimator(unittest.TestCase): DISPLAY = False - def test_smooth_margin_estimator_spatial(self): + def test_quantile_estimator_temporal(self): self.nb_points = 20 self.nb_obs = 1 - self.coordinates = load_test_1D_and_2D_spatial_coordinates(nb_points=self.nb_points)[:1] + self.coordinates = load_test_temporal_coordinates(nb_steps=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.5 for coordinates in self.coordinates: - constant_margin_model = load_smooth_margin_models(coordinates=coordinates)[0] + constant_margin_model = StationaryTemporalModel(coordinates) dataset = MarginDataset.from_sampling(nb_obs=self.nb_obs, margin_model=constant_margin_model, coordinates=coordinates) @@ -32,7 +26,7 @@ class TestQuantileEstimator(unittest.TestCase): quantile_estimators = [ QuantileEstimatorFromMargin(dataset, constant_margin_model, quantile), ] - for quantile_model_class in load_smooth_quantile_model_classes()[:1]: + for quantile_model_class in load_smooth_quantile_model_classes()[:]: quantile_estimator = QuantileRegressionEstimator(dataset, quantile, quantile_model_class) quantile_estimators.append(quantile_estimator) diff --git a/test/test_utils.py b/test/test_utils.py index cb7e9e41..169983c9 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -18,7 +18,7 @@ from extreme_fit.model.max_stable_model.max_stable_models import Smith, BrownRes from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall, Safran, SafranRainfall, \ SafranTemperature, SafranPrecipitation from extreme_fit.model.quantile_model.quantile_regression_model import ConstantQuantileRegressionModel, \ - AllCoordinatesQuantileRegressionModel + TemporalCoordinatesQuantileRegressionModel from spatio_temporal_dataset.coordinates.spatial_coordinates.abstract_spatial_coordinates import \ AbstractSpatialCoordinates from spatio_temporal_dataset.coordinates.spatial_coordinates.alps_station_3D_coordinates import \ @@ -43,7 +43,7 @@ TEST_3D_SPATIAL_COORDINATES = [AlpsStation3DCoordinatesWithAnisotropy] TEST_TEMPORAL_COORDINATES = [ConsecutiveTemporalCoordinates] TEST_SPATIO_TEMPORAL_COORDINATES = [UniformSpatioTemporalCoordinates, LinSpaceSpatial2DSpatioTemporalCoordinates] TEST_MARGIN_TYPES = [ConstantMarginModel, LinearAllParametersAllDimsMarginModel][:] -TEST_QUANTILES_TYPES = [ConstantQuantileRegressionModel, AllCoordinatesQuantileRegressionModel][:] +TEST_QUANTILES_TYPES = [ConstantQuantileRegressionModel, TemporalCoordinatesQuantileRegressionModel][:] TEST_NON_STATIONARY_TEMPORAL_MARGIN_TYPES = [NonStationaryLocationTemporalModel, NonStationaryScaleTemporalModel, NonStationaryShapeTemporalModel] TEST_MAX_STABLE_ESTIMATOR = [MaxStableEstimator] -- GitLab