diff --git a/experiment/meteo_france_SCM_study/abstract_study.py b/experiment/meteo_france_SCM_study/abstract_study.py index ab121ceae9e346cd05fa2a96c4f0ab0a8746d49d..1f2aac2d93704661043adb3675339b71963f74e2 100644 --- a/experiment/meteo_france_SCM_study/abstract_study.py +++ b/experiment/meteo_france_SCM_study/abstract_study.py @@ -160,14 +160,17 @@ class AbstractStudy(object): @cached_property def massifs_coordinates(self) -> AbstractSpatialCoordinates: + # Build coordinate object from df_centroid + return AbstractSpatialCoordinates.from_df(self.df_spatial()) + + def df_spatial(self): # Coordinate object that represents the massif coordinates in Lambert extended df_centroid = self.load_df_centroid() for coord_column in [AbstractCoordinates.COORDINATE_X, AbstractCoordinates.COORDINATE_Y]: df_centroid.loc[:, coord_column] = df_centroid[coord_column].str.replace(',', '.').astype(float) # Filter, keep massifs present at the altitude of interest df_centroid = df_centroid.loc[self.study_massif_names] - # Build coordinate object from df_centroid - return AbstractSpatialCoordinates.from_df(df_centroid) + return df_centroid def load_df_centroid(self) -> pd.DataFrame: # Load df_centroid containing all the massif names diff --git a/experiment/meteo_france_SCM_study/visualization/study_visualization/main_study_visualizer.py b/experiment/meteo_france_SCM_study/visualization/study_visualization/main_study_visualizer.py index 0abcf0e6a57a32c0db5e673329a17e469373c2c4..8a654900372da6ce03ede6e90d3ca50a1a0e49c5 100644 --- a/experiment/meteo_france_SCM_study/visualization/study_visualization/main_study_visualizer.py +++ b/experiment/meteo_france_SCM_study/visualization/study_visualization/main_study_visualizer.py @@ -7,8 +7,8 @@ from experiment.meteo_france_SCM_study.safran.safran import SafranSnowfall, Exte from experiment.meteo_france_SCM_study.visualization.study_visualization.study_visualizer import StudyVisualizer from collections import OrderedDict -from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation.transformation_2D import \ - BetweenZeroAndOne2DNormalization +from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation.uniform_normalization import \ + BetweenZeroAndOneNormalization, BetweenMinusOneAndOneNormalization SCM_STUDIES = [SafranSnowfall, CrocusSwe, CrocusDepth] SCM_EXTENDED_STUDIES = [ExtendedSafranSnowfall, ExtendedCrocusSwe, ExtendedCrocusDepth] @@ -114,15 +114,16 @@ def complete_analysis(only_first_one=False): def trend_analysis(): - save_to_file = True - only_first_one = False + save_to_file = False + only_first_one = True # [0, 300, 600, 900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600, 3900, 4200, 4500, 4800] to test for others altitudes = [300, 1200, 2100, 3000][-1:] + normalization_class = [BetweenZeroAndOneNormalization, BetweenMinusOneAndOneNormalization][1] study_classes = [CrocusSwe, CrocusDepth, SafranSnowfall, SafranRainfall, SafranTemperature][:1] for study in study_iterator_global(study_classes, only_first_one=only_first_one, altitudes=altitudes): study_visualizer = StudyVisualizer(study, save_to_file=save_to_file, - transformation_2D=BetweenZeroAndOne2DNormalization()) - study_visualizer.visualize_temporal_trend_relevance(complete_analysis=True) + transformation_class=normalization_class) + study_visualizer.visualize_temporal_trend_relevance(complete_analysis=False) if __name__ == '__main__': diff --git a/experiment/meteo_france_SCM_study/visualization/study_visualization/non_stationary_trends.py b/experiment/meteo_france_SCM_study/visualization/study_visualization/non_stationary_trends.py index 77050e97f29b6436d3476a0b50f3f5ac7aba81d0..822268e9f8145ae01a006595e7fcdd29c33d5408 100644 --- a/experiment/meteo_france_SCM_study/visualization/study_visualization/non_stationary_trends.py +++ b/experiment/meteo_france_SCM_study/visualization/study_visualization/non_stationary_trends.py @@ -54,12 +54,7 @@ class AbstractNonStationaryTrendTest(object): return margin_function.mu1_temporal_trend def visualize(self, ax, complete_analysis=True): - # Define the year_min and year_max for the starting point - if complete_analysis: - year_min, year_max, step = 1960, 1990, 1 - else: - year_min, year_max, step = 1960, 1990, 10 - years = list(range(year_min, year_max + 1, step)) + years = self.years(complete_analysis) # Plot differences stationary_metric = self.get_metric(self.stationary_margin_model_class, starting_point=None) @@ -90,6 +85,15 @@ class AbstractNonStationaryTrendTest(object): ax.set_title(title) ax.legend() + def years(self, complete_analysis=True): + # Define the year_min and year_max for the starting point + if complete_analysis: + year_min, year_max, step = 1960, 1990, 1 + else: + year_min, year_max, step = 1960, 1990, 10 + years = list(range(year_min, year_max + 1, step)) + return years + @property def display_name(self): raise NotImplementedError diff --git a/experiment/meteo_france_SCM_study/visualization/study_visualization/study_visualizer.py b/experiment/meteo_france_SCM_study/visualization/study_visualization/study_visualizer.py index f479d985a732b276d434425012f47a34fb6eac90..7fb9b0135c4c8b58962a24209fade298c96059ef 100644 --- a/experiment/meteo_france_SCM_study/visualization/study_visualization/study_visualizer.py +++ b/experiment/meteo_france_SCM_study/visualization/study_visualization/study_visualizer.py @@ -28,10 +28,12 @@ from extreme_estimator.margin_fits.gev.gev_params import GevParams from extreme_estimator.margin_fits.gev.gevmle_fit import GevMleFit from extreme_estimator.margin_fits.gpd.gpd_params import GpdParams from extreme_estimator.margin_fits.gpd.gpdmle_fit import GpdMleFit +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.transformed_coordinates.transformation.transformation_2D import \ - Transformation2D +from spatio_temporal_dataset.coordinates.temporal_coordinates.generated_temporal_coordinates import \ + ConsecutiveTemporalCoordinates from spatio_temporal_dataset.coordinates.transformed_coordinates.transformed_coordinates import TransformedCoordinates from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset from test.test_utils import load_test_max_stable_models @@ -45,7 +47,7 @@ class StudyVisualizer(object): def __init__(self, study: AbstractStudy, show=True, save_to_file=False, only_one_graph=False, only_first_row=False, vertical_kde_plot=False, year_for_kde_plot=None, plot_block_maxima_quantiles=False, temporal_non_stationarity=False, - transformation_2D=None): + transformation_class=None): self.temporal_non_stationarity = temporal_non_stationarity self.only_first_row = only_first_row self.only_one_graph = only_one_graph @@ -59,7 +61,7 @@ class StudyVisualizer(object): self._observations = None self.default_covariance_function = CovarianceFunction.powexp - self.transformation_2D = transformation_2D # type: Union[None, Transformation2D] + self.transformation_class = transformation_class # KDE PLOT ARGUMENTS self.vertical_kde_plot = vertical_kde_plot @@ -91,21 +93,34 @@ class StudyVisualizer(object): self._dataset = AbstractDataset(self.observations, self.coordinates) return self._dataset + @property + def spatial_coordinates(self): + return AbstractSpatialCoordinates.from_df(df=self.study.df_spatial(), + transformation_class=self.transformation_class) + + @property + def temporal_coordinates(self): + start, stop = self.study.start_year_and_stop_year + nb_steps = stop - start + 1 + temporal_coordinates = ConsecutiveTemporalCoordinates.from_nb_temporal_steps(nb_temporal_steps=nb_steps, + start=start, + transformation_class=self.transformation_class) + return temporal_coordinates + + @property + def spatio_temporal_coordinates(self): + return AbstractSpatioTemporalCoordinates.from_spatial_coordinates_and_temporal_coordinates( + spatial_coordinates=self.spatial_coordinates, temporal_coordinates=self.temporal_coordinates) + @property def coordinates(self): if self._coordinates is None: - coordinates = self.study.massifs_coordinates - if self.transformation_2D is not None: - coordinates = TransformedCoordinates.from_coordinates(coordinates=coordinates, - transformation_function=self.transformation_2D) if self.temporal_non_stationarity: - # Build spatio temporal dataset from a temporal dataset - df_spatial = coordinates.df_spatial_coordinates() - start, stop = self.study.start_year_and_stop_year - nb_steps = stop - start + 1 - coordinates = AbstractSpatioTemporalCoordinates.from_df_spatial_and_nb_steps(df_spatial=df_spatial, - nb_steps=nb_steps, - start=start) + # Build spatio temporal coordinates from a spatial coordinates and a temporal coordinates + coordinates = self.spatio_temporal_coordinates + else: + # By default otherwise, we only keep the spatial coordinates + coordinates = self.spatial_coordinates self._coordinates = coordinates return self._coordinates diff --git a/extreme_estimator/estimator/abstract_estimator.py b/extreme_estimator/estimator/abstract_estimator.py index 857fef72b9d33d0f060412f036aba0f80a6ff04f..1b8ac471f656efc7a3a3d7321b799aa14ce0b34f 100644 --- a/extreme_estimator/estimator/abstract_estimator.py +++ b/extreme_estimator/estimator/abstract_estimator.py @@ -56,7 +56,7 @@ class AbstractEstimator(object): return LinearMarginFunction.from_coef_dict(coordinates=self.dataset.coordinates, gev_param_name_to_dims=margin_model.margin_function_start_fit.gev_param_name_to_dims, coef_dict=self.result_from_fit.margin_coef_dict, - starting_point=margin_model.starting_point) + starting_point=margin_model.transformed_starting_point) # @property # def max_stable_fitted(self) -> AbstractMarginFunction: diff --git a/extreme_estimator/extreme_models/margin_model/fitspatgev.R b/extreme_estimator/extreme_models/margin_model/fitspatgev.R index e7fd380e2f9ccec0a42126dda1a552ee262ac988..7b9525b74216ea7eb6e8b1b07dcf0c85460613f8 100644 --- a/extreme_estimator/extreme_models/margin_model/fitspatgev.R +++ b/extreme_estimator/extreme_models/margin_model/fitspatgev.R @@ -107,7 +107,6 @@ fitspatgev_3D_test <- function (n.obs){ loc.form <- update(loc.form, y ~ .) scale.form <- update(scale.form, y ~ .) shape.form <- update(shape.form, y ~ .) - print('here') print(use.temp.cov) if (use.temp.cov[1]) temp.form.loc <- update(temp.form.loc, y ~ . + 0) diff --git a/extreme_estimator/extreme_models/margin_model/linear_margin_model.py b/extreme_estimator/extreme_models/margin_model/linear_margin_model.py index 14b1b7d9fdf8ce3d2f332f923567215b96be5c32..87f361f3e26d997f27bf6e1f5b8a6b57cbda9402 100644 --- a/extreme_estimator/extreme_models/margin_model/linear_margin_model.py +++ b/extreme_estimator/extreme_models/margin_model/linear_margin_model.py @@ -28,14 +28,14 @@ class LinearMarginModel(ParametricMarginModel): self.margin_function_sample = LinearMarginFunction(coordinates=self.coordinates, gev_param_name_to_coef=coef_sample, gev_param_name_to_dims=gev_param_name_to_dims, - starting_point=self.starting_point) + transformed_starting_point=self.transformed_starting_point) # Load start fit coef coef_start_fit = self.gev_param_name_to_linear_coef(param_name_and_dim_to_coef=self.params_start_fit) self.margin_function_start_fit = LinearMarginFunction(coordinates=self.coordinates, gev_param_name_to_coef=coef_start_fit, gev_param_name_to_dims=gev_param_name_to_dims, - starting_point=self.starting_point) + transformed_starting_point=self.transformed_starting_point) @property def default_param_name_and_dim_to_coef(self) -> dict: diff --git a/extreme_estimator/extreme_models/margin_model/margin_function/independent_margin_function.py b/extreme_estimator/extreme_models/margin_model/margin_function/independent_margin_function.py index 25350f19758727cef00a0844c8e92fa346319e65..74df6423ba8fcd0ca477b43519040cdce40ef38b 100644 --- a/extreme_estimator/extreme_models/margin_model/margin_function/independent_margin_function.py +++ b/extreme_estimator/extreme_models/margin_model/margin_function/independent_margin_function.py @@ -23,10 +23,11 @@ class IndependentMarginFunction(AbstractMarginFunction): """Each GEV parameter is computed independently through its corresponding param_function""" assert self.gev_param_name_to_param_function is not None assert len(self.gev_param_name_to_param_function) == 3 + transformed_coordinate = self.coordinates.transform(coordinate) gev_params = {} for gev_param_name in GevParams.PARAM_NAMES: param_function = self.gev_param_name_to_param_function[gev_param_name] - gev_params[gev_param_name] = param_function.get_gev_param_value(coordinate) + gev_params[gev_param_name] = param_function.get_gev_param_value(transformed_coordinate) return GevParams.from_dict(gev_params) diff --git a/extreme_estimator/extreme_models/margin_model/margin_function/linear_margin_function.py b/extreme_estimator/extreme_models/margin_model/margin_function/linear_margin_function.py index e65281cc3b291d794e8992530a2a664d39f70428..4c72f5faaf076bdcce3c541ab052d1312bb5c196 100644 --- a/extreme_estimator/extreme_models/margin_model/margin_function/linear_margin_function.py +++ b/extreme_estimator/extreme_models/margin_model/margin_function/linear_margin_function.py @@ -28,9 +28,9 @@ class LinearMarginFunction(ParametricMarginFunction): COEF_CLASS = LinearCoef def __init__(self, coordinates: AbstractCoordinates, gev_param_name_to_dims: Dict[str, List[int]], - gev_param_name_to_coef: Dict[str, AbstractCoef], starting_point: Union[None, int] = None): + gev_param_name_to_coef: Dict[str, AbstractCoef], transformed_starting_point: Union[None, int] = None): self.gev_param_name_to_coef = None # type: Union[None, Dict[str, LinearCoef]] - super().__init__(coordinates, gev_param_name_to_dims, gev_param_name_to_coef, starting_point) + super().__init__(coordinates, gev_param_name_to_dims, gev_param_name_to_coef, transformed_starting_point) def load_specific_param_function(self, gev_param_name) -> AbstractParamFunction: return LinearParamFunction(dims=self.gev_param_name_to_dims[gev_param_name], diff --git a/extreme_estimator/extreme_models/margin_model/margin_function/parametric_margin_function.py b/extreme_estimator/extreme_models/margin_model/margin_function/parametric_margin_function.py index 09337e6d98986763a6eefb11746c1a34dbfd3395..601ebb8b43f5d2778db3fc3afcf7d6e63f066e9c 100644 --- a/extreme_estimator/extreme_models/margin_model/margin_function/parametric_margin_function.py +++ b/extreme_estimator/extreme_models/margin_model/margin_function/parametric_margin_function.py @@ -31,9 +31,9 @@ class ParametricMarginFunction(IndependentMarginFunction): COEF_CLASS = None def __init__(self, coordinates: AbstractCoordinates, gev_param_name_to_dims: Dict[str, List[int]], - gev_param_name_to_coef: Dict[str, AbstractCoef], starting_point: Union[None, int] = None): + gev_param_name_to_coef: Dict[str, AbstractCoef], transformed_starting_point: Union[None, int] = None): # Starting point for the trend is the same for all the parameters - self.starting_point = starting_point + self.transformed_starting_point = transformed_starting_point super().__init__(coordinates) self.gev_param_name_to_dims = gev_param_name_to_dims # type: Dict[str, List[int]] @@ -62,12 +62,12 @@ class ParametricMarginFunction(IndependentMarginFunction): raise NotImplementedError def get_gev_params(self, coordinate: np.ndarray) -> GevParams: - if self.starting_point is not None: + if self.transformed_starting_point is not None: # Shift temporal coordinate to enable to model temporal trend with starting point assert self.coordinates.has_temporal_coordinates assert 0 <= self.coordinates.idx_temporal_coordinates < len(coordinate) - if coordinate[self.coordinates.idx_temporal_coordinates] < self.starting_point: - coordinate[self.coordinates.idx_temporal_coordinates] = self.starting_point + if coordinate[self.coordinates.idx_temporal_coordinates] < self.transformed_starting_point: + coordinate[self.coordinates.idx_temporal_coordinates] = self.transformed_starting_point return super().get_gev_params(coordinate) @classmethod diff --git a/extreme_estimator/extreme_models/margin_model/parametric_margin_model.py b/extreme_estimator/extreme_models/margin_model/parametric_margin_model.py index f589f6ee697b501da11c713fb982d2df56bde4d0..7acacf8344c8933492417b43fe6263f89fce28d5 100644 --- a/extreme_estimator/extreme_models/margin_model/parametric_margin_model.py +++ b/extreme_estimator/extreme_models/margin_model/parametric_margin_model.py @@ -10,6 +10,10 @@ from extreme_estimator.extreme_models.margin_model.abstract_margin_model import from extreme_estimator.extreme_models.utils import safe_run_r_estimator, r, get_coord, \ get_margin_formula from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates +from spatio_temporal_dataset.coordinates.spatio_temporal_coordinates.abstract_spatio_temporal_coordinates import \ + AbstractSpatioTemporalCoordinates +from spatio_temporal_dataset.coordinates.temporal_coordinates.abstract_temporal_coordinates import \ + AbstractTemporalCoordinates class ParametricMarginModel(AbstractMarginModel, ABC): @@ -19,19 +23,28 @@ class ParametricMarginModel(AbstractMarginModel, ABC): """ :param starting_point: starting coordinate for the temporal trend """ - self.starting_point = starting_point # type: int + # Load transformed starting point + if starting_point is None: + self.transformed_starting_point = None + else: + assert isinstance(coordinates, (AbstractSpatioTemporalCoordinates, AbstractTemporalCoordinates)) + temporal_coordinate = np.array([starting_point]) + self.transformed_starting_point = coordinates.temporal_coordinates.transform(temporal_coordinate)[0] + self.margin_function_sample = None # type: ParametricMarginFunction self.margin_function_start_fit = None # type: ParametricMarginFunction super().__init__(coordinates, use_start_value, params_start_fit, params_sample) def add_starting_temporal_point(self, df_coordinates_temp: pd.DataFrame): # Enforce a starting point for the temporal trend - if self.starting_point is not None: - ind_to_modify = df_coordinates_temp.iloc[:, 0] <= self.starting_point # type: pd.Series + if self.transformed_starting_point is not None: + # Compute the indices to modify + print('transformed starting point', self.transformed_starting_point) + ind_to_modify = df_coordinates_temp.iloc[:, 0] <= self.transformed_starting_point # type: pd.Series # Assert that some coordinates are selected but not all (at least 20 data should be left for temporal trend) assert 0 < sum(ind_to_modify) < len(ind_to_modify) - 20 # Modify the temporal coordinates to enforce the stationarity - df_coordinates_temp.loc[ind_to_modify] = self.starting_point + df_coordinates_temp.loc[ind_to_modify] = self.transformed_starting_point return df_coordinates_temp def fitmargin_from_maxima_gev(self, data: np.ndarray, df_coordinates_spat: pd.DataFrame, @@ -50,5 +63,5 @@ class ParametricMarginModel(AbstractMarginModel, ABC): fit_params['start'] = r.list(**coef_dict) res = safe_run_r_estimator(function=r.fitspatgev, use_start=self.use_start_value, data=data, - covariables=covariables, **fit_params) + covariables=covariables, **fit_params) return ResultFromSpatialExtreme(res) diff --git a/extreme_estimator/margin_fits/gev/wrapper_ismev_gev_fit.R b/extreme_estimator/margin_fits/gev/wrapper_ismev_gev_fit.R index 3eed3a0f49e277774ad0bd8a185b68d22d8a5955..0f6dc17031b4b5d8076f5aeb7925823fcb65fcd1 100644 --- a/extreme_estimator/margin_fits/gev/wrapper_ismev_gev_fit.R +++ b/extreme_estimator/margin_fits/gev/wrapper_ismev_gev_fit.R @@ -78,7 +78,6 @@ gev_fit_copy <- function (xdat, ydat = NULL, mul = NULL, sigl = NULL, shl = NULL mu <- mulink(mumat %*% (a[1:npmu])) sc <- siglink(sigmat %*% (a[seq(npmu + 1, length = npsc)])) xi <- shlink(shmat %*% (a[seq(npmu + npsc + 1, length = npsh)])) - print('here') print(class(xdat)) print(class(mu)) y <- (xdat - mu)/sc diff --git a/spatio_temporal_dataset/coordinates/abstract_coordinates.py b/spatio_temporal_dataset/coordinates/abstract_coordinates.py index e81aea16c5297a129ab98aef69fd17ec158be94d..b269d60232718d3da23dcb1e22087a293b052326 100644 --- a/spatio_temporal_dataset/coordinates/abstract_coordinates.py +++ b/spatio_temporal_dataset/coordinates/abstract_coordinates.py @@ -6,6 +6,8 @@ import numpy as np import pandas as pd from mpl_toolkits.mplot3d import Axes3D +from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation.abstract_transformation import \ + AbstractTransformation, IdentityTransformation from spatio_temporal_dataset.coordinates.utils import get_index_without_spatio_temporal_index_suffix from spatio_temporal_dataset.slicer.abstract_slicer import AbstractSlicer, df_sliced from spatio_temporal_dataset.slicer.spatial_slicer import SpatialSlicer @@ -35,7 +37,7 @@ class AbstractCoordinates(object): COORDINATES_NAMES = COORDINATE_SPATIAL_NAMES + [COORDINATE_T] def __init__(self, df: pd.DataFrame, slicer_class: type, s_split_spatial: pd.Series = None, - s_split_temporal: pd.Series = None): + s_split_temporal: pd.Series = None, transformation_class: type = None): # Extract df_all_coordinates from df coordinate_columns = [c for c in df.columns if c in self.COORDINATES_NAMES] assert len(coordinate_columns) > 0 @@ -52,6 +54,13 @@ class AbstractCoordinates(object): self.s_split_temporal = s_split_temporal # type: pd.Series self.slicer = None # type: Union[None, AbstractSlicer] + # Transformation attribute + if transformation_class is None: + transformation_class = IdentityTransformation + # Transformation class is instantiated with all coordinates + self.transformation = transformation_class(self.df_all_coordinates) + assert isinstance(self.transformation, AbstractTransformation) + # Load the slicer if slicer_class is TemporalSlicer: self.slicer = TemporalSlicer(self.ind_train_temporal) @@ -83,7 +92,8 @@ class AbstractCoordinates(object): return cls(df=df, slicer_class=slicer_class, s_split_spatial=s_split_spatial, s_split_temporal=s_split_temporal) @classmethod - def from_df_and_slicer(cls, df: pd.DataFrame, slicer_class: type, train_split_ratio: float = None): + def from_df_and_slicer(cls, df: pd.DataFrame, slicer_class: type, train_split_ratio: float = None, + transformation_class: type = None): # All the index should be unique assert len(set(df.index)) == len(df), 'df indices are not unique' @@ -92,7 +102,8 @@ class AbstractCoordinates(object): # Create a temporal split s_split_temporal = s_split_from_df(df, cls.COORDINATE_T, cls.TEMPORAL_SPLIT, train_split_ratio, False) - return cls(df=df, slicer_class=slicer_class, s_split_spatial=s_split_spatial, s_split_temporal=s_split_temporal) + return cls(df=df, slicer_class=slicer_class, s_split_spatial=s_split_spatial, s_split_temporal=s_split_temporal, + transformation_class=transformation_class) @classmethod def from_csv(cls, csv_path: str = None): @@ -114,10 +125,17 @@ class AbstractCoordinates(object): # Merged DataFrame of df_coord with s_split return self.df_all_coordinates.join(self.df_split) + # Normalize + + def transform(self, coordinate: np.ndarray) -> np.ndarray: + return self.transformation.transform_array(coordinate=coordinate) + # Split def df_coordinates(self, split: Split = Split.all) -> pd.DataFrame: - return df_sliced(df=self.df_all_coordinates, split=split, slicer=self.slicer) + print(type(self.transformation)) + df_transformed_coordinates = self.transformation.transform_df(df_coord=self.df_all_coordinates) + return df_sliced(df=df_transformed_coordinates, split=split, slicer=self.slicer) def coordinates_values(self, split: Split = Split.all) -> np.ndarray: return self.df_coordinates(split).values @@ -293,4 +311,4 @@ class AbstractCoordinates(object): return self.df_merged.equals(other.df_merged) def __str__(self): - return self.df_all_coordinates.__str__() + return self.df_coordinates().__str__() diff --git a/spatio_temporal_dataset/coordinates/spatial_coordinates/abstract_spatial_coordinates.py b/spatio_temporal_dataset/coordinates/spatial_coordinates/abstract_spatial_coordinates.py index f78456454fb9e747f4c22a10e6368aef08bfcc4e..ef7553bbc52aa32f35082bf12d1813ee81459bff 100644 --- a/spatio_temporal_dataset/coordinates/spatial_coordinates/abstract_spatial_coordinates.py +++ b/spatio_temporal_dataset/coordinates/spatial_coordinates/abstract_spatial_coordinates.py @@ -1,16 +1,18 @@ import pandas as pd from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates +from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation.abstract_transformation import \ + AbstractTransformation from spatio_temporal_dataset.slicer.spatial_slicer import SpatialSlicer class AbstractSpatialCoordinates(AbstractCoordinates): @classmethod - def from_df(cls, df: pd.DataFrame, train_split_ratio: float = None): + def from_df(cls, df: pd.DataFrame, train_split_ratio: float = None, transformation_class: type = None): assert cls.COORDINATE_X in df.columns assert cls.COORDINATE_T not in df.columns - return super().from_df_and_slicer(df, SpatialSlicer, train_split_ratio) + return super().from_df_and_slicer(df, SpatialSlicer, train_split_ratio, transformation_class) @classmethod def from_nb_points(cls, nb_points: int, train_split_ratio: float = None, **kwargs): diff --git a/spatio_temporal_dataset/coordinates/spatial_coordinates/alps_station_2D_coordinates.py b/spatio_temporal_dataset/coordinates/spatial_coordinates/alps_station_2D_coordinates.py index 7cd62ddd26135437f0f708f6cdd508f67ce89ee3..c342b6d1ff4f14f68773319869d7b554eb9259ef 100644 --- a/spatio_temporal_dataset/coordinates/spatial_coordinates/alps_station_2D_coordinates.py +++ b/spatio_temporal_dataset/coordinates/spatial_coordinates/alps_station_2D_coordinates.py @@ -1,6 +1,6 @@ from spatio_temporal_dataset.coordinates.spatial_coordinates.alps_station_3D_coordinates import AlpsStation3DCoordinates -from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation.transformation_2D import \ - BetweenZeroAndOne2DNormalization +from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation.uniform_normalization import \ + BetweenZeroAndOneNormalization from spatio_temporal_dataset.coordinates.transformed_coordinates.transformed_coordinates import TransformedCoordinates @@ -20,8 +20,7 @@ class AlpsStation2DCoordinatesBetweenZeroAndOne(AlpsStation2DCoordinates): def from_csv(cls, csv_file='coord-lambert2'): coord = super().from_csv(csv_file) return TransformedCoordinates.from_coordinates(coordinates=coord, - transformation_function=BetweenZeroAndOne2DNormalization()) - + transformation_class=BetweenZeroAndOneNormalization) class AlpsStationCoordinatesBetweenZeroAndTwo(AlpsStation2DCoordinatesBetweenZeroAndOne): diff --git a/spatio_temporal_dataset/coordinates/spatial_coordinates/alps_station_3D_coordinates.py b/spatio_temporal_dataset/coordinates/spatial_coordinates/alps_station_3D_coordinates.py index 92e6ed424a7133b0557f2578dcf9154260b2e38b..92e97f8561a65733e2824af11cf6dd7434361c68 100644 --- a/spatio_temporal_dataset/coordinates/spatial_coordinates/alps_station_3D_coordinates.py +++ b/spatio_temporal_dataset/coordinates/spatial_coordinates/alps_station_3D_coordinates.py @@ -45,4 +45,4 @@ class AlpsStation3DCoordinatesWithAnisotropy(AlpsStation3DCoordinates): def from_csv(cls, csv_file='coord-lambert2'): coord = super().from_csv(csv_file) return TransformedCoordinates.from_coordinates(coordinates=coord, - transformation_function=AnisotropyTransformation()) + transformation_class=AnisotropyTransformation) diff --git a/spatio_temporal_dataset/coordinates/spatio_temporal_coordinates/abstract_spatio_temporal_coordinates.py b/spatio_temporal_dataset/coordinates/spatio_temporal_coordinates/abstract_spatio_temporal_coordinates.py index 84b7feece54e3f123d2e07793bcb7626d70668c6..dc86c8c9f760af0757fc22f339558920db20ead5 100644 --- a/spatio_temporal_dataset/coordinates/spatio_temporal_coordinates/abstract_spatio_temporal_coordinates.py +++ b/spatio_temporal_dataset/coordinates/spatio_temporal_coordinates/abstract_spatio_temporal_coordinates.py @@ -1,18 +1,61 @@ +import numpy as np import pandas as pd from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates from spatio_temporal_dataset.coordinates.spatial_coordinates.abstract_spatial_coordinates import \ AbstractSpatialCoordinates +from spatio_temporal_dataset.coordinates.temporal_coordinates.abstract_temporal_coordinates import \ + AbstractTemporalCoordinates from spatio_temporal_dataset.coordinates.utils import get_index_with_spatio_temporal_index_suffix from spatio_temporal_dataset.slicer.spatio_temporal_slicer import SpatioTemporalSlicer class AbstractSpatioTemporalCoordinates(AbstractCoordinates): - def __init__(self, df: pd.DataFrame, slicer_class: type, s_split_spatial: pd.Series = None, - s_split_temporal: pd.Series = None): - super().__init__(df, slicer_class, s_split_spatial, s_split_temporal) - self.spatial_coordinates = AbstractSpatialCoordinates.from_df(df=self.df_spatial_coordinates()) + def __init__(self, df: pd.DataFrame, slicer_class: type, + s_split_spatial: pd.Series = None, s_split_temporal: pd.Series = None, + transformation_class: type = None, + spatial_coordinates: AbstractSpatialCoordinates = None, + temporal_coordinates: AbstractTemporalCoordinates = None): + super().__init__(df, slicer_class, s_split_spatial, s_split_temporal, transformation_class) + # Spatial coordinates' + if spatial_coordinates is None: + self.spatial_coordinates = AbstractSpatialCoordinates.from_df(df=self.df_spatial_coordinates()) + else: + self.spatial_coordinates = spatial_coordinates + # Temporal coordinates + if temporal_coordinates is None: + self.temporal_coordinates = AbstractTemporalCoordinates.from_df(df=self.df_temporal_coordinates()) + else: + self.temporal_coordinates = temporal_coordinates + + def transform(self, coordinate: np.ndarray) -> np.ndarray: + *coordinate_spatial, coordinate_temporal = coordinate + transformed_coordinate_spatial = self.spatial_coordinates.transform(np.array(coordinate_spatial)) + transformed_coordinate_temporal = self.temporal_coordinates.transform(np.array([coordinate_temporal])) + transformed_coordinate = np.concatenate([transformed_coordinate_spatial, transformed_coordinate_temporal]) + return transformed_coordinate + + @classmethod + def get_df_from_df_spatial_and_coordinate_t_values(cls, coordinate_t_values, df_spatial): + df_time_steps = [] + for t, coordinate_t_value in enumerate(coordinate_t_values): + df_time_step = df_spatial.copy() + df_time_step[cls.COORDINATE_T] = coordinate_t_value + df_time_step.index = get_index_with_spatio_temporal_index_suffix(df_spatial, t) + df_time_steps.append(df_time_step) + df_time_steps = pd.concat(df_time_steps) + return df_time_steps + + @classmethod + def from_spatial_coordinates_and_temporal_coordinates(cls, spatial_coordinates: AbstractSpatialCoordinates, + temporal_coordinates: AbstractTemporalCoordinates): + df_spatial = spatial_coordinates.df_spatial_coordinates() + coordinate_t_values = temporal_coordinates.df_temporal_coordinates().iloc[:, 0].values + df = cls.get_df_from_df_spatial_and_coordinate_t_values(df_spatial=df_spatial, + coordinate_t_values=coordinate_t_values) + return cls(df=df, slicer_class=SpatioTemporalSlicer, + spatial_coordinates=spatial_coordinates, temporal_coordinates=temporal_coordinates) @classmethod def from_df(cls, df: pd.DataFrame, train_split_ratio: float = None): @@ -25,14 +68,18 @@ class AbstractSpatioTemporalCoordinates(AbstractCoordinates): return super().from_df_and_slicer(df, SpatioTemporalSlicer, train_split_ratio) @classmethod - def from_df_spatial_and_nb_steps(cls, df_spatial, nb_steps, train_split_ratio: float = None, start=0): - df_time_steps = [] - for t in range(nb_steps): - df_time_step = df_spatial.copy() - df_time_step[cls.COORDINATE_T] = start + t - df_time_step.index = get_index_with_spatio_temporal_index_suffix(df_spatial, t) - df_time_steps.append(df_time_step) - df_time_steps = pd.concat(df_time_steps) + def from_df_spatial_and_coordinate_t_values(cls, df_spatial, coordinate_t_values, train_split_ratio: float = None): + df_time_steps = cls.get_df_from_df_spatial_and_coordinate_t_values(coordinate_t_values, df_spatial) return cls.from_df(df=df_time_steps, train_split_ratio=train_split_ratio) + @classmethod + def from_df_spatial_and_nb_steps(cls, df_spatial, nb_steps, train_split_ratio: float = None, start=0): + coordinate_t_values = [start + t for t in range(nb_steps)] + return cls.from_df_spatial_and_coordinate_t_values(df_spatial, coordinate_t_values, train_split_ratio) + + @classmethod + def from_df_spatial_and_df_temporal(cls, df_spatial, df_temporal, train_split_ratio: float = None): + nb_steps = len(df_temporal) + coordinate_t_values = [df_temporal.iloc[t].values[0] for t in range(nb_steps)] + return cls.from_df_spatial_and_coordinate_t_values(df_spatial, coordinate_t_values, train_split_ratio) diff --git a/spatio_temporal_dataset/coordinates/temporal_coordinates/abstract_temporal_coordinates.py b/spatio_temporal_dataset/coordinates/temporal_coordinates/abstract_temporal_coordinates.py index f73a9cc2b0be078701baf0384c6e529f5b88e982..8084820e3788c1404d94e0cbe14ab07fc73b4b9f 100644 --- a/spatio_temporal_dataset/coordinates/temporal_coordinates/abstract_temporal_coordinates.py +++ b/spatio_temporal_dataset/coordinates/temporal_coordinates/abstract_temporal_coordinates.py @@ -6,8 +6,12 @@ from spatio_temporal_dataset.slicer.temporal_slicer import TemporalSlicer class AbstractTemporalCoordinates(AbstractCoordinates): + @property + def temporal_coordinates(self): + return self + @classmethod - def from_df(cls, df: pd.DataFrame, train_split_ratio: float = None): + def from_df(cls, df: pd.DataFrame, train_split_ratio: float = None, transformation_class: type = None): assert cls.COORDINATE_T in df.columns assert not any([coordinate_name in df.columns for coordinate_name in cls.COORDINATE_SPATIAL_NAMES]) - return super().from_df_and_slicer(df, TemporalSlicer, train_split_ratio) \ No newline at end of file + return super().from_df_and_slicer(df, TemporalSlicer, train_split_ratio, transformation_class) diff --git a/spatio_temporal_dataset/coordinates/temporal_coordinates/generated_temporal_coordinates.py b/spatio_temporal_dataset/coordinates/temporal_coordinates/generated_temporal_coordinates.py index 518459725907c7a457d49bde000f787b8d7e9efd..766cd5e409c69c94b0533a87fa42f3c71601976e 100644 --- a/spatio_temporal_dataset/coordinates/temporal_coordinates/generated_temporal_coordinates.py +++ b/spatio_temporal_dataset/coordinates/temporal_coordinates/generated_temporal_coordinates.py @@ -8,11 +8,14 @@ class ConsecutiveTemporalCoordinates(AbstractTemporalCoordinates): pass @classmethod - def from_nb_temporal_steps(cls, nb_temporal_steps, train_split_ratio: float = None, start=0): + def from_nb_temporal_steps(cls, nb_temporal_steps, train_split_ratio: float = None, start=0, + transformation_class: type = None): df = cls.df_temporal(nb_temporal_steps, start) - return cls.from_df(df, train_split_ratio) + print(df.dtypes) + return cls.from_df(df, train_split_ratio, transformation_class=transformation_class) @classmethod def df_temporal(cls, nb_temporal_steps, start=0): df = pd.DataFrame.from_dict({cls.COORDINATE_T: list(range(start, start + nb_temporal_steps))}) + # df = df.astype return df diff --git a/spatio_temporal_dataset/coordinates/transformed_coordinates/transformation/abstract_transformation.py b/spatio_temporal_dataset/coordinates/transformed_coordinates/transformation/abstract_transformation.py index 8c822f4f0ebfdd5683cb1d21b7f6c2b0a07cab63..77bfcebda3dc9564d37cea72a04da08c92c0f6b1 100644 --- a/spatio_temporal_dataset/coordinates/transformed_coordinates/transformation/abstract_transformation.py +++ b/spatio_temporal_dataset/coordinates/transformed_coordinates/transformation/abstract_transformation.py @@ -1,12 +1,29 @@ import pandas as pd +import numpy as np class AbstractTransformation(object): - def __init__(self, nb_dimensions): - self.nb_dimensions = nb_dimensions + def __init__(self, df_coordinates): + self.df_coordinates = df_coordinates - def transform(self, df_coord: pd.DataFrame) -> pd.DataFrame: - assert len(df_coord.columns) == self.nb_dimensions, "columns={}, nb_dimensions={}".format(df_coord.columns, - self.nb_dimensions) - return df_coord + @property + def nb_dimensions(self): + return self.df_coordinates.shape[1] + + def transform_array(self, coordinate: np.ndarray): + assert len(coordinate) == self.nb_dimensions, "coordinate={}, nb_dimensions={}".format(coordinate, + self.nb_dimensions) + + def transform_serie(self, s_coord: pd.Series) -> pd.Series: + return pd.Series(self.transform_array(s_coord.values), index=s_coord.index) + + def transform_df(self, df_coord: pd.DataFrame) -> pd.DataFrame: + return df_coord.apply(self.transform_serie, axis=1) + + +class IdentityTransformation(AbstractTransformation): + + def transform_array(self, coordinate: np.ndarray): + super().transform_array(coordinate) + return coordinate diff --git a/spatio_temporal_dataset/coordinates/transformed_coordinates/transformation/tranformation_3D.py b/spatio_temporal_dataset/coordinates/transformed_coordinates/transformation/tranformation_3D.py index e0cd32fdf69c446fecb928f2865a29459e586ab6..c05f6436cb7414ac0dca1ba117f3c1c1b9f76c58 100644 --- a/spatio_temporal_dataset/coordinates/transformed_coordinates/transformation/tranformation_3D.py +++ b/spatio_temporal_dataset/coordinates/transformed_coordinates/transformation/tranformation_3D.py @@ -7,11 +7,8 @@ import math class Transformation3D(AbstractTransformation): - def __init__(self): - super().__init__(nb_dimensions=3) - - def transform(self, df_coord: pd.DataFrame) -> pd.DataFrame: - df_coord = super().transform(df_coord=df_coord) + def transform_df(self, df_coord: pd.DataFrame) -> pd.DataFrame: + df_coord = super().transform_df(df_coord=df_coord) normalized_values = self.transform_values(df_coord.values) return pd.DataFrame(data=normalized_values, index=df_coord.index, columns=df_coord.columns) @@ -21,14 +18,14 @@ class Transformation3D(AbstractTransformation): class AnisotropyTransformation(Transformation3D): - def __init__(self, phi: float = 0.0, w1: float = 1.0, w2: float = 1.0): + def __init__(self, df_coordinates, phi: float = 0.0, w1: float = 1.0, w2: float = 1.0): + super().__init__(df_coordinates) """ Anisotropy transformation :param phi: Between 0 and Pi, it corresponds to the angle of strongest dependence :param w1: > 0, it corresponds to the anisotropy ratio :param w2: it corresponds to the weight for the altitude """ - super().__init__() self.phi = phi self.w1 = w1 self.w2 = w2 @@ -46,6 +43,3 @@ class AnisotropyTransformation(Transformation3D): coord_arr = np.transpose(coord_arr) coord_arr = np.dot(V, coord_arr) return np.transpose(coord_arr) - - - diff --git a/spatio_temporal_dataset/coordinates/transformed_coordinates/transformation/transformation_2D.py b/spatio_temporal_dataset/coordinates/transformed_coordinates/transformation/transformation_2D.py deleted file mode 100644 index d92ec4ae13a304225eeb6d08ca0937a922bbdc60..0000000000000000000000000000000000000000 --- a/spatio_temporal_dataset/coordinates/transformed_coordinates/transformation/transformation_2D.py +++ /dev/null @@ -1,48 +0,0 @@ -from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation.abstract_transformation \ - import AbstractTransformation -import pandas as pd - - -class Transformation2D(AbstractTransformation): - - def __init__(self): - super().__init__(nb_dimensions=2) - - -class Uniform2DNormalization(Transformation2D): - """Normalize similarly the X and Y axis with a single function so as to conserve proportional distances""" - - def transform(self, df_coord: pd.DataFrame) -> pd.DataFrame: - df_coord = super().transform(df_coord) - for i in range(2): - df_coord.iloc[:, i] = self.uniform_normalization(df_coord.iloc[:, i]) - return df_coord - - def uniform_normalization(self, s_coord: pd.Series) -> pd.Series: - return s_coord - - -class BetweenZeroAndOne2DNormalization(Uniform2DNormalization): - """Normalize such that min(coord) >= (0,0) and max(coord) <= (1,1)""" - - def __init__(self) -> None: - super().__init__() - self.min_coord = None - self.max_coord = None - - def transform(self, df_coord: pd.DataFrame) -> pd.DataFrame: - # Compute the min and max globally - self.min_coord, self.max_coord = df_coord.min().min(), df_coord.max().max() - # Then, call the super method that will call the uniform_normalization method - return super().transform(df_coord) - - def uniform_normalization(self, s_coord: pd.Series) -> pd.Series: - s_coord_shifted = s_coord - self.min_coord - s_coord_scaled = s_coord_shifted / (self.max_coord - self.min_coord) - return s_coord_scaled - - -class BetweenMinusOneAndOne2DNormalization(BetweenZeroAndOne2DNormalization): - - def uniform_normalization(self, s_coord: pd.Series) -> pd.Series: - pass diff --git a/spatio_temporal_dataset/coordinates/transformed_coordinates/transformation/uniform_normalization.py b/spatio_temporal_dataset/coordinates/transformed_coordinates/transformation/uniform_normalization.py new file mode 100644 index 0000000000000000000000000000000000000000..950679bd927f721de7ad0b92a62e292e7bc8be98 --- /dev/null +++ b/spatio_temporal_dataset/coordinates/transformed_coordinates/transformation/uniform_normalization.py @@ -0,0 +1,41 @@ +import numpy as np + +from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation.abstract_transformation \ + import AbstractTransformation + + +class UniformNormalization(AbstractTransformation): + """Normalize similarly the X and Y axis with a single function so as to conserve proportional distances""" + + def transform_array(self, coordinate: np.ndarray): + super().transform_array(coordinate) + for i in range(self.nb_dimensions): + coordinate[i] = self.uniform_normalization(coordinate[i]) + return coordinate + + def uniform_normalization(self, coordinate_value: np.ndarray) -> np.ndarray: + return coordinate_value + + +class BetweenZeroAndOneNormalization(UniformNormalization): + """Normalize such that min(coord) >= (0,0) and max(coord) <= (1,1)""" + + def __init__(self, df_coordinates): + super().__init__(df_coordinates) + self.min_coord = self.df_coordinates.min().min() + self.max_coord = self.df_coordinates.max().max() + + def uniform_normalization(self, coordinate_value: np.ndarray) -> np.ndarray: + coord_shifted = coordinate_value - self.min_coord + coord_scaled = coord_shifted / (self.max_coord - self.min_coord) + return coord_scaled + + +class BetweenMinusOneAndOneNormalization(BetweenZeroAndOneNormalization): + """Normalize such that min(coord) >= (-1,-1) and max(coord) <= (1,1)""" + + def uniform_normalization(self, coordinate_value: np.ndarray) -> np.ndarray: + coord = super().uniform_normalization(coordinate_value) + coord *= 2 + coord -= 1 + return coord diff --git a/spatio_temporal_dataset/coordinates/transformed_coordinates/transformed_coordinates.py b/spatio_temporal_dataset/coordinates/transformed_coordinates/transformed_coordinates.py index 3c4e1264d1e112002ec58e8bcd703d954b73bf0e..01a6811c0fc1e5540709adc2d202f1ecf2e5ffe9 100644 --- a/spatio_temporal_dataset/coordinates/transformed_coordinates/transformed_coordinates.py +++ b/spatio_temporal_dataset/coordinates/transformed_coordinates/transformed_coordinates.py @@ -7,9 +7,10 @@ class TransformedCoordinates(AbstractCoordinates): @classmethod def from_coordinates(cls, coordinates: AbstractCoordinates, - transformation_function: AbstractTransformation): - df_coordinates_transformed = coordinates.df_all_coordinates.copy() - df_coordinates_transformed = transformation_function.transform(df_coord=df_coordinates_transformed) + transformation_class): + df_coordinates = coordinates.df_all_coordinates.copy() + transformation = transformation_class(df_coordinates) # type: AbstractTransformation + df_coordinates_transformed = transformation.transform_df(df_coordinates) return cls(df=df_coordinates_transformed, slicer_class=type(coordinates.slicer), s_split_spatial=coordinates.s_split_spatial, s_split_temporal=coordinates.s_split_temporal) diff --git a/test/test_extreme_estimator/test_extreme_models/test_margin_temporal.py b/test/test_extreme_estimator/test_extreme_models/test_margin_temporal.py index a533903e721490d7c3fb8f11461917df4385b93b..2388fcb35c781bf7cd1a1151f5fc2ee727604798 100644 --- a/test/test_extreme_estimator/test_extreme_models/test_margin_temporal.py +++ b/test/test_extreme_estimator/test_extreme_models/test_margin_temporal.py @@ -71,7 +71,7 @@ class TestMarginTemporal(unittest.TestCase): self.smooth_margin_model.margin_function_sample.mu1_temporal_trend, places=3) # Checks starting point parameter are well passed - self.assertEqual(2, estimator.margin_function_fitted.starting_point) + self.assertEqual(2, estimator.margin_function_fitted.transformed_starting_point) # Checks that parameters returned are indeed different coordinate1 = np.array([0.0, 0.0, 1]) mle_params_estimated_year1 = estimator.margin_function_fitted.get_gev_params(coordinate1).to_dict() diff --git a/test/test_extreme_estimator/test_extreme_models/test_max_stable_temporal.py b/test/test_extreme_estimator/test_extreme_models/test_max_stable_temporal.py index fa221e4b3d2d47d22a070ccbf50f53918ccdaecf..035c21c2d099f5bbb2f9b7059f5cc3697ced5863 100644 --- a/test/test_extreme_estimator/test_extreme_models/test_max_stable_temporal.py +++ b/test/test_extreme_estimator/test_extreme_models/test_max_stable_temporal.py @@ -77,7 +77,7 @@ class TestMaxStableTemporal(unittest.TestCase): self.smooth_margin_model.margin_function_sample.mu1_temporal_trend, places=2) # Checks starting point parameter are well passed - self.assertEqual(2, estimator.margin_function_fitted.starting_point) + self.assertEqual(2, estimator.margin_function_fitted.transformed_starting_point) # Checks that parameters returned are indeed different coordinate1 = np.array([0.0, 0.0, 1]) mle_params_estimated_year1 = estimator.margin_function_fitted.get_gev_params(coordinate1).to_dict() diff --git a/test/test_extreme_estimator/test_margin_fits/test_gev/test_gev_temporal.py b/test/test_extreme_estimator/test_margin_fits/test_gev/test_gev_temporal.py index 6977e111051e7797111f81f90aa0aeb810a32eca..249b5167c6a70b4838307f354998739495ae10e7 100644 --- a/test/test_extreme_estimator/test_margin_fits/test_gev/test_gev_temporal.py +++ b/test/test_extreme_estimator/test_margin_fits/test_gev/test_gev_temporal.py @@ -62,7 +62,7 @@ class TestGevTemporal(unittest.TestCase): estimator = self.fit_non_stationary_estimator(starting_point=3) self.assertNotEqual(estimator.margin_function_fitted.mu1_temporal_trend, 0.0) # Checks starting point parameter are well passed - self.assertEqual(3, estimator.margin_function_fitted.starting_point) + self.assertEqual(3, estimator.margin_function_fitted.transformed_starting_point) # Checks that parameters returned are indeed different mle_params_estimated_year1 = estimator.margin_function_fitted.get_gev_params(np.array([1])).to_dict() mle_params_estimated_year3 = estimator.margin_function_fitted.get_gev_params(np.array([3])).to_dict()