diff --git a/extreme_fit/estimator/full_estimator/abstract_full_estimator.py b/extreme_fit/estimator/full_estimator/abstract_full_estimator.py index b6ff59ce572d0c4c3200296cd5f00dc5d0ed4061..022bb4d3947fae1785989f14a26de0400db43421 100644 --- a/extreme_fit/estimator/full_estimator/abstract_full_estimator.py +++ b/extreme_fit/estimator/full_estimator/abstract_full_estimator.py @@ -59,11 +59,11 @@ class FullEstimatorInASingleStepWithSmoothMargin(AbstractFullEstimator): super().__init__(dataset) self.max_stable_model = max_stable_model self.linear_margin_model = margin_model - assert isinstance(self.margin_function_start_fit, LinearMarginFunction) + assert isinstance(self.margin_function, LinearMarginFunction) @property - def margin_function_start_fit(self): - return self.linear_margin_model.margin_function_start_fit + def margin_function(self): + return self.linear_margin_model.margin_function @property def df_coordinates_spat(self): @@ -81,8 +81,8 @@ class FullEstimatorInASingleStepWithSmoothMargin(AbstractFullEstimator): df_coordinates_spat=self.df_coordinates_spat, df_coordinates_temp=self.df_coordinates_temp, fit_marge=True, - fit_marge_form_dict=self.linear_margin_model.margin_function_start_fit.form_dict, - margin_start_dict=self.linear_margin_model.margin_function_start_fit.coef_dict + fit_marge_form_dict=self.linear_margin_model.margin_function.form_dict, + margin_start_dict=self.linear_margin_model.margin_function.coef_dict ) @cached_property diff --git a/extreme_fit/estimator/utils.py b/extreme_fit/estimator/utils.py index a7446b45bd83f2d1aae856cdd0fefde1a816ebe2..d8b5e97e1af29e3353212ad0bdc615549e5b3fbb 100644 --- a/extreme_fit/estimator/utils.py +++ b/extreme_fit/estimator/utils.py @@ -10,7 +10,7 @@ def load_margin_function(estimator: AbstractEstimator, margin_model: LinearMargi if coef_dict is None: coef_dict = estimator.result_from_model_fit.margin_coef_ordered_dict return margin_function_class.from_coef_dict(coordinates=estimator.dataset.coordinates, - param_name_to_dims=margin_model.margin_function_start_fit.param_name_to_dims, + param_name_to_dims=margin_model.margin_function.param_name_to_dims, coef_dict=coef_dict, starting_point=margin_model.starting_point) diff --git a/extreme_fit/model/abstract_model.py b/extreme_fit/model/abstract_model.py index 71fe7319db2cd738920f0e4ef626d3ff80f422aa..331d275365931a3604c8889057b4616b785df772 100644 --- a/extreme_fit/model/abstract_model.py +++ b/extreme_fit/model/abstract_model.py @@ -4,11 +4,6 @@ class AbstractModel(object): self.default_params = None self.user_params_sample = params_sample - @property - def params_start_fit(self) -> dict: - # return self.default_params.copy() - return self.params_sample.copy() - @property def params_sample(self) -> dict: return self.merge_params(default_params=self.default_params, input_params=self.user_params_sample) diff --git a/extreme_fit/model/margin_model/abstract_margin_model.py b/extreme_fit/model/margin_model/abstract_margin_model.py index f3129472da53c7d81a98d07ffb17db0febe73470..8358b41edb49334559e7f252e61946e3c76d8639 100644 --- a/extreme_fit/model/margin_model/abstract_margin_model.py +++ b/extreme_fit/model/margin_model/abstract_margin_model.py @@ -14,9 +14,8 @@ from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoo class AbstractMarginModel(AbstractModel, ABC): """ - An AbstractMarginModel has two main AbstractMarginFunction attributes: - -margin_function_sample for sampling - -margin_function_start_fit for starting to fit + An AbstractMarginModel has one AbstractMarginFunction attribute: + -margin_function """ def __init__(self, coordinates: AbstractCoordinates, params_sample=None, @@ -24,8 +23,8 @@ class AbstractMarginModel(AbstractModel, ABC): super().__init__(params_sample) assert isinstance(coordinates, AbstractCoordinates), type(coordinates) self.coordinates = coordinates - self.margin_function_sample = None # type: AbstractMarginFunction - self.margin_function_start_fit = None # type: AbstractMarginFunction + self.margin_function = None # type: AbstractMarginFunction + self.margin_function = None # type: AbstractMarginFunction self.params_class = params_class self.load_margin_functions() @@ -34,11 +33,8 @@ class AbstractMarginModel(AbstractModel, ABC): def default_load_margin_functions(self, margin_function_class): # todo: check it i could remove these attributes - self.margin_function_sample = margin_function_class(coordinates=self.coordinates, - default_params=self.params_class.from_dict(self.params_sample)) - self.margin_function_start_fit = margin_function_class(coordinates=self.coordinates, - default_params=self.params_class.from_dict( - self.params_start_fit)) + self.margin_function = margin_function_class(coordinates=self.coordinates, + default_params=self.params_class.from_dict(self.params_sample)) # Conversion class methods @@ -67,14 +63,14 @@ class AbstractMarginModel(AbstractModel, ABC): # Sampling methods def rmargin_from_maxima_frech(self, maxima_frech: np.ndarray, coordinates_values: np.ndarray) -> np.ndarray: - maxima_gev = self.frech2gev(maxima_frech, coordinates_values, self.margin_function_sample) + maxima_gev = self.frech2gev(maxima_frech, coordinates_values, self.margin_function) return maxima_gev def rmargin_from_nb_obs(self, nb_obs: int, coordinates_values: np.ndarray, sample_r_function='rgev') -> np.ndarray: maxima_gev = [] for coordinate in coordinates_values: - gev_params = self.margin_function_sample.get_params(coordinate) + gev_params = self.margin_function.get_params(coordinate) x_gev = r(sample_r_function)(nb_obs, **gev_params.to_dict()) assert not np.isnan(x_gev).any(), 'params={} generated Nan values'.format(gev_params.__str__()) maxima_gev.append(x_gev) diff --git a/extreme_fit/model/margin_model/linear_margin_model/abstract_temporal_linear_margin_model.py b/extreme_fit/model/margin_model/linear_margin_model/abstract_temporal_linear_margin_model.py index 1005c89de4ea3fb94b5b633c87bd6809a488c22f..5e1d147b8fa6a899c2d25666fad6c7351c61d27c 100644 --- a/extreme_fit/model/margin_model/linear_margin_model/abstract_temporal_linear_margin_model.py +++ b/extreme_fit/model/margin_model/linear_margin_model/abstract_temporal_linear_margin_model.py @@ -60,7 +60,7 @@ class AbstractTemporalLinearMarginModel(LinearMarginModel): res = safe_run_r_estimator(function=r('gev.fit'), xdat=x, y=y, mul=self.mul, sigl=self.sigl, shl=self.shl) - return ResultFromIsmev(res, self.margin_function_start_fit.param_name_to_dims) + return ResultFromIsmev(res, self.margin_function.param_name_to_dims) # Gev fit with extRemes package @@ -77,7 +77,7 @@ class AbstractTemporalLinearMarginModel(LinearMarginModel): def run_fevd_fixed(self, df_coordinates_temp, method, x): if self.fit_method == MarginFitMethod.extremes_fevd_l_moments: - assert self.margin_function_start_fit.is_a_stationary_model + assert self.margin_function.is_a_stationary_model r_type_argument_kwargs, y = self.extreme_arguments(df_coordinates_temp) res = safe_run_r_estimator(function=r('fevd_fixed'), x=x, @@ -86,7 +86,7 @@ class AbstractTemporalLinearMarginModel(LinearMarginModel): method=method, **r_type_argument_kwargs ) - return ResultFromMleExtremes(res, self.margin_function_start_fit.param_name_to_dims, + return ResultFromMleExtremes(res, self.margin_function.param_name_to_dims, type_for_mle=self.type_for_mle) def extremes_fevd_bayesian_fit(self, x, df_coordinates_temp) -> AbstractResultFromExtremes: @@ -95,8 +95,8 @@ class AbstractTemporalLinearMarginModel(LinearMarginModel): r_type_argument_kwargs['initial'] = r.list(**params_initial_fit) # Assert for any non-stationary model that the shape parameter is constant # (because the prior function considers that the last parameter should be the shape) - assert GevParams.SHAPE not in self.margin_function_start_fit.param_name_to_dims \ - or len(self.margin_function_start_fit.param_name_to_dims[GevParams.SHAPE]) == 1 + assert GevParams.SHAPE not in self.margin_function.param_name_to_dims \ + or len(self.margin_function.param_name_to_dims[GevParams.SHAPE]) == 1 res = safe_run_r_estimator(function=r('fevd_fixed'), x=x, data=y, @@ -106,14 +106,14 @@ class AbstractTemporalLinearMarginModel(LinearMarginModel): iter=self.nb_iterations_for_bayesian_fit, **r_type_argument_kwargs ) - return ResultFromBayesianExtremes(res, self.margin_function_start_fit.param_name_to_dims) + return ResultFromBayesianExtremes(res, self.margin_function.param_name_to_dims) def extreme_arguments(self, df_coordinates_temp): # Disable the use of log sigma parametrization r_type_argument_kwargs = {'use.phi': False, 'verbose': False} # Load parameters - r_type_argument_kwargs.update(get_margin_formula_extremes(self.margin_function_start_fit.form_dict)) + r_type_argument_kwargs.update(get_margin_formula_extremes(self.margin_function.form_dict)) y = get_coord_df(df_coordinates_temp) return r_type_argument_kwargs, y diff --git a/extreme_fit/model/margin_model/linear_margin_model/linear_margin_model.py b/extreme_fit/model/margin_model/linear_margin_model/linear_margin_model.py index 23ecd372f38e214a152eaadd55d3437453f5a618..f6091c29514a851159dea019cf26b8700c7ab69b 100644 --- a/extreme_fit/model/margin_model/linear_margin_model/linear_margin_model.py +++ b/extreme_fit/model/margin_model/linear_margin_model/linear_margin_model.py @@ -23,19 +23,11 @@ class LinearMarginModel(ParametricMarginModel): # Load sample coef coef_sample = self.param_name_to_linear_coef(param_name_and_dim_to_coef=self.params_sample) - self.margin_function_sample = LinearMarginFunction(coordinates=self.coordinates, - param_name_to_coef=coef_sample, - param_name_to_dims=param_name_to_dims, - starting_point=self.starting_point, - params_class=self.params_class) - - # Load start fit coef - coef_start_fit = self.param_name_to_linear_coef(param_name_and_dim_to_coef=self.params_start_fit) - self.margin_function_start_fit = LinearMarginFunction(coordinates=self.coordinates, - param_name_to_coef=coef_start_fit, - param_name_to_dims=param_name_to_dims, - starting_point=self.starting_point, - params_class=self.params_class) + self.margin_function = LinearMarginFunction(coordinates=self.coordinates, + param_name_to_coef=coef_sample, + param_name_to_dims=param_name_to_dims, + starting_point=self.starting_point, + params_class=self.params_class) @property def default_param_name_and_dim_to_coef(self) -> dict: diff --git a/extreme_fit/model/margin_model/parametric_margin_model.py b/extreme_fit/model/margin_model/parametric_margin_model.py index e9af27077a3b7bf2f4677d55d05061da0ff4cf03..3e638248a11397b69e498b3e9b7944a530b58ca9 100644 --- a/extreme_fit/model/margin_model/parametric_margin_model.py +++ b/extreme_fit/model/margin_model/parametric_margin_model.py @@ -24,8 +24,7 @@ class ParametricMarginModel(AbstractMarginModel, ABC): """ self.fit_method = fit_method self.starting_point = starting_point - self.margin_function_sample = None # type: ParametricMarginFunction - self.margin_function_start_fit = None # type: ParametricMarginFunction + self.margin_function = None # type: ParametricMarginFunction self.drop_duplicates = True super().__init__(coordinates, params_sample, params_class) @@ -39,12 +38,12 @@ class ParametricMarginModel(AbstractMarginModel, ABC): def fit_from_spatial_extremes(self, data, df_coordinates_spat, df_coordinates_temp): # Margin formula for fitspatgev - fit_params = get_margin_formula_spatial_extreme(self.margin_function_start_fit.form_dict) + fit_params = get_margin_formula_spatial_extreme(self.margin_function.form_dict) # Covariables covariables = get_coord(df_coordinates=df_coordinates_spat) fit_params['temp.cov'] = get_coord(df_coordinates=df_coordinates_temp) # Start parameters - coef_dict = self.margin_function_start_fit.coef_dict + coef_dict = self.margin_function.coef_dict # fit_params['start'] = r.list(**coef_dict) res = safe_run_r_estimator(function=r.fitspatgev, data=data, start_dict=coef_dict, diff --git a/extreme_fit/model/margin_model/spline_margin_model.py b/extreme_fit/model/margin_model/spline_margin_model.py index cfe0e1b04a3475579c53d77a7c0c0548dfb48867..f9fec6a4209463bb63624e38a10d3f10f08ac7b3 100644 --- a/extreme_fit/model/margin_model/spline_margin_model.py +++ b/extreme_fit/model/margin_model/spline_margin_model.py @@ -37,17 +37,11 @@ class SplineMarginModel(ParametricMarginModel): param_name_to_nb_knots = {param_name: 2 for param_name in GevParams.PARAM_NAMES} # Load sample coef - self.margin_function_sample = SplineMarginFunction(coordinates=self.coordinates, - param_name_to_dims=param_name_to_dims, - param_name_to_coef=param_name_to_coef, - param_name_to_nb_knots=param_name_to_nb_knots, - degree=degree) - # Load start fit coef - self.margin_function_start_fit = SplineMarginFunction(coordinates=self.coordinates, - param_name_to_dims=param_name_to_dims, - param_name_to_coef=param_name_to_coef, - param_name_to_nb_knots=param_name_to_nb_knots, - degree=degree) + self.margin_function = SplineMarginFunction(coordinates=self.coordinates, + param_name_to_dims=param_name_to_dims, + param_name_to_coef=param_name_to_coef, + param_name_to_nb_knots=param_name_to_nb_knots, + degree=degree) class ConstantSplineMarginModel(SplineMarginModel): diff --git a/extreme_fit/model/max_stable_model/abstract_max_stable_model.py b/extreme_fit/model/max_stable_model/abstract_max_stable_model.py index 40634790f32cae5c0d16b8498dca4419cf8abf29..8e7cb652f55d7ce08b80f59189527813b1e5216d 100644 --- a/extreme_fit/model/max_stable_model/abstract_max_stable_model.py +++ b/extreme_fit/model/max_stable_model/abstract_max_stable_model.py @@ -49,7 +49,7 @@ class AbstractMaxStableModel(AbstractModel): # Prepare the fit_params (a dictionary containing all additional parameters) fit_params = self.cov_mod_param.copy() - start_dict = self.params_start_fit + start_dict = self.params_sample # Remove some parameters that should only be used either in 1D or 2D case, otherwise fitmaxstab crashes start_dict = self.remove_unused_parameters(start_dict, fitmaxstab_with_one_dimensional_data) if fit_marge: diff --git a/projects/quantile_regression_vs_evt/annual_maxima_simulation/abstract_annual_maxima_simulation.py b/projects/quantile_regression_vs_evt/annual_maxima_simulation/abstract_annual_maxima_simulation.py index 29bfb2b7dc2c1184764f10c9772b1fe3b4fb88b0..1ba0cc19aa478ebb353ce01d83e717c480269740 100644 --- a/projects/quantile_regression_vs_evt/annual_maxima_simulation/abstract_annual_maxima_simulation.py +++ b/projects/quantile_regression_vs_evt/annual_maxima_simulation/abstract_annual_maxima_simulation.py @@ -47,7 +47,7 @@ class AnnualMaximaSimulation(AbstractSimulation): last_coordinate = coordinates.coordinates_values()[-1] # Compute true value margin_model = self.time_series_lengths_to_margin_model[length] - true_gev_params = margin_model.margin_function_sample.get_params(last_coordinate) + true_gev_params = margin_model.margin_function.get_params(last_coordinate) true_quantile = true_gev_params.quantile(self.quantile_data) # Compute estimated values estimated_quantiles = [estimator.function_from_fit.get_quantile(last_coordinate) for estimator in estimators] 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 9a5a5c552fe13e38d25c7cb7017facd2787bacca..2d998f99c5df07b82f29f34d23d3cc06c7f5eccf 100644 --- a/test/test_extreme_fit/test_estimator/test_margin_estimators.py +++ b/test/test_extreme_fit/test_estimator/test_margin_estimators.py @@ -33,7 +33,7 @@ class TestSmoothMarginEstimator(unittest.TestCase): print(estimator.result_from_model_fit.name_to_value.keys()) # Plot if self.DISPLAY: - margin_model.margin_function_sample.visualize_function(show=True) + margin_model.margin_function.visualize_function(show=True) estimator.function_from_fit.visualize_function(show=True) self.assertTrue(True) diff --git a/test/test_extreme_fit/test_function/test_margin_function.py b/test/test_extreme_fit/test_function/test_margin_function.py index 10f83b7ba76a3a95f2884c18d6299fba6a8324f9..25f4443766727bbe008fdcf468fc4f1cff295f80 100644 --- a/test/test_extreme_fit/test_function/test_margin_function.py +++ b/test/test_extreme_fit/test_function/test_margin_function.py @@ -30,7 +30,7 @@ class MarginFunction(unittest.TestCase): 'tempCoeffLoc1': 1, 'tempCoeffScale1': 1, 'tempCoeffShape1': 1} margin_function = self.margin_function_class.from_coef_dict(coordinates, - margin_model.margin_function_sample.param_name_to_dims, + margin_model.margin_function.param_name_to_dims, coef_dict) gev_param = margin_function.get_params(coordinate=np.array([0.5, 1.0]), is_transformed=False) self.assertEqual({'loc': 2, 'scale': 2, 'shape': 2}, gev_param.to_dict()) @@ -44,7 +44,7 @@ class MarginFunction(unittest.TestCase): 'scaleCoeff2': 1, 'shapeCoeff1': 0, 'shapeCoeff2': 1} margin_function = self.margin_function_class.from_coef_dict(coordinates, - margin_model.margin_function_sample.param_name_to_dims, + margin_model.margin_function.param_name_to_dims, coef_dict) gev_param = margin_function.get_params(coordinate=np.array([1]), is_transformed=False) self.assertEqual({'loc': 3, 'scale': 1, 'shape': 1}, gev_param.to_dict()) diff --git a/test/test_extreme_fit/test_model/test_margin_model.py b/test/test_extreme_fit/test_model/test_margin_model.py index 5bae40a6d793a3c17977ebe6f3b51218a6ac9bf8..626a624b3ff4ca9fd9d71fc612d60c5086c3accf 100644 --- a/test/test_extreme_fit/test_model/test_margin_model.py +++ b/test/test_extreme_fit/test_model/test_margin_model.py @@ -14,7 +14,7 @@ class TestVisualizationLinearMarginModel(unittest.TestCase): margin_model_class = LinearAllParametersAllDimsMarginModel def tearDown(self) -> None: - self.margin_model.margin_function_sample.visualize_function(show=self.DISPLAY) + self.margin_model.margin_function.visualize_function(show=self.DISPLAY) self.assertTrue(True) def test_example_visualization_1D(self): @@ -37,7 +37,7 @@ class TestVisualizationSplineMarginModel(unittest.TestCase): margin_model_class = Degree1SplineMarginModel def tearDown(self) -> None: - self.margin_model.margin_function_sample.visualize_function(show=self.DISPLAY) + self.margin_model.margin_function.visualize_function(show=self.DISPLAY) self.assertTrue(True) def test_example_visualization_1D_spline(self): @@ -50,7 +50,7 @@ class TestVisualizationSplineMarginModel(unittest.TestCase): # TODO: add a similar test than in the linear case # # Assert that the grid correspond to what we expect in a simple case # AbstractMarginFunction.VISUALIZATION_RESOLUTION = 2 - # grid = self.margin_model.margin_function_sample.grid_2D['loc'] + # grid = self.margin_model.margin_function.grid_2D['loc'] # true_grid = np.array([[0.98, 1.0], [1.0, 1.02]]) # self.assertTrue((grid == true_grid).all(), msg="\nexpected:\n{}, \nfound:\n{}".format(true_grid, grid)) diff --git a/test/test_extreme_fit/test_model/test_margin_temporal.py b/test/test_extreme_fit/test_model/test_margin_temporal.py index 59b0ee359b25db16c86ba8f46888764ae7328db0..dc1f602b5287583546dd01ecb0de01c7d5ca480e 100644 --- a/test/test_extreme_fit/test_model/test_margin_temporal.py +++ b/test/test_extreme_fit/test_model/test_margin_temporal.py @@ -56,7 +56,7 @@ class TestMarginTemporal(unittest.TestCase): # By default, estimator find the good margin self.assertNotEqual(estimator.function_from_fit.mu1_temporal_trend, 0.0) self.assertAlmostEqual(estimator.function_from_fit.mu1_temporal_trend, - self.smooth_margin_model.margin_function_sample.mu1_temporal_trend, + self.smooth_margin_model.margin_function.mu1_temporal_trend, places=3) # Checks starting point parameter are well passed self.assertEqual(2, estimator.function_from_fit.starting_point) diff --git a/test/test_extreme_fit/test_model/test_max_stable_temporal.py b/test/test_extreme_fit/test_model/test_max_stable_temporal.py index dc4d8934ee39581a76d82f5a73c3cd0cd86d5f17..38591b03839d97c3fc80dd2c176a2dbeb369772f 100644 --- a/test/test_extreme_fit/test_model/test_max_stable_temporal.py +++ b/test/test_extreme_fit/test_model/test_max_stable_temporal.py @@ -61,7 +61,7 @@ class TestMaxStableTemporal(unittest.TestCase): # By default, estimator find the good margin self.assertNotEqual(estimator.function_from_fit.mu1_temporal_trend, 0.0) self.assertAlmostEqual(estimator.function_from_fit.mu1_temporal_trend, - self.smooth_margin_model.margin_function_sample.mu1_temporal_trend, + self.smooth_margin_model.margin_function.mu1_temporal_trend, places=2) # Checks starting point parameter are well passed self.assertEqual(2, estimator.function_from_fit.starting_point) 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 a484b7abf6b8c2ec3230da4218903455ac5a1546..5b3e6f28572b4988924da469e844cd2d1b10d47a 100644 --- a/test/test_spatio_temporal_dataset/test_spatio_temporal_observations.py +++ b/test/test_spatio_temporal_dataset/test_spatio_temporal_observations.py @@ -63,7 +63,7 @@ class TestDailyObservations(unittest.TestCase): def test_instance_exp_params(self): last_coordinate = self.coordinates.coordinates_values()[-1] - params = self.margin_model.margin_function_sample.get_params(last_coordinate) + params = self.margin_model.margin_function.get_params(last_coordinate) self.assertIsInstance(params, ExpParams) def test_exponential_observations(self):