Commit 13f506a3 authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[quantile regression project] add quantile regression on daily values

parent 08c20607
No related merge requests found
Showing with 81 additions and 19 deletions
+81 -19
from extreme_fit.model.quantile_model.quantile_regression_model import ConstantQuantileRegressionModel, \
TemporalCoordinatesQuantileRegressionModel
class AbstractModelOnDailyData(object):
pass
class ConstantQuantileRegressionModelOnDailyData(ConstantQuantileRegressionModel, AbstractModelOnDailyData):
pass
class TemporalCoordinatesQuantileRegressionModelOnDailyData(TemporalCoordinatesQuantileRegressionModel,
AbstractModelOnDailyData):
pass
from extreme_fit.distribution.exp_params import ExpParams from extreme_fit.distribution.exp_params import ExpParams
from extreme_fit.model.daily_data_model import AbstractModelOnDailyData
from extreme_fit.model.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \ from extreme_fit.model.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \
AbstractTemporalLinearMarginModel AbstractTemporalLinearMarginModel
class NonStationaryRateTemporalModel(AbstractTemporalLinearMarginModel): class NonStationaryRateTemporalModel(AbstractTemporalLinearMarginModel, AbstractModelOnDailyData):
def __init__(self, *arg, **kwargs): def __init__(self, *arg, **kwargs):
kwargs['params_class'] = ExpParams kwargs['params_class'] = ExpParams
......
...@@ -54,3 +54,5 @@ class TemporalCoordinatesQuantileRegressionModel(AbstractQuantileRegressionModel ...@@ -54,3 +54,5 @@ class TemporalCoordinatesQuantileRegressionModel(AbstractQuantileRegressionModel
assert self.dataset.coordinates.has_temporal_coordinates \ assert self.dataset.coordinates.has_temporal_coordinates \
and not self.dataset.coordinates.has_spatial_coordinates and not self.dataset.coordinates.has_spatial_coordinates
return AbstractCoordinates.COORDINATE_T return AbstractCoordinates.COORDINATE_T
...@@ -2,13 +2,14 @@ from abc import ABC ...@@ -2,13 +2,14 @@ from abc import ABC
from extreme_fit.distribution.abstract_params import AbstractParams from extreme_fit.distribution.abstract_params import AbstractParams
from extreme_fit.distribution.exp_params import ExpParams from extreme_fit.distribution.exp_params import ExpParams
from extreme_fit.model.daily_data_model import AbstractModelOnDailyData
from extreme_fit.model.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \ from extreme_fit.model.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \
TemporalMarginFitMethod TemporalMarginFitMethod
from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_exp_models import \ from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_exp_models import \
NonStationaryRateTemporalModel NonStationaryRateTemporalModel
from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel
from projects.quantile_regression_vs_evt.annual_maxima_simulation.abstract_annual_maxima_simulation import \ from projects.quantile_regression_vs_evt.annual_maxima_simulation.abstract_annual_maxima_simulation import \
AnnualMaximaSimulation AnnualMaximaSimulation
from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation.abstract_transformation import \ from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation.abstract_transformation import \
CenteredScaledNormalization CenteredScaledNormalization
from spatio_temporal_dataset.spatio_temporal_observations.annual_maxima_observations import DailyExpAnnualMaxima from spatio_temporal_dataset.spatio_temporal_observations.annual_maxima_observations import DailyExpAnnualMaxima
...@@ -29,11 +30,11 @@ class AbstractDailyExpSimulation(AnnualMaximaSimulation, ABC): ...@@ -29,11 +30,11 @@ class AbstractDailyExpSimulation(AnnualMaximaSimulation, ABC):
def observations_class(self): def observations_class(self):
return DailyExpAnnualMaxima return DailyExpAnnualMaxima
def get_fitted_quantile_estimator(self, model_class, observations, coordinates, quantile_estimator): def get_fitted_quantile_estimator(self, model_class, observations: DailyExpAnnualMaxima, coordinates,
if model_class in [NonStationaryRateTemporalModel]: quantile_estimator):
if issubclass(model_class, AbstractModelOnDailyData):
quantile_estimator = self.quantile_data quantile_estimator = self.quantile_data
# todo: i should give other observatations, not the annual maxima observations, coordinates = observations.daily_observations.transform_to_standard_shape(coordinates)
raise NotImplementedError
return super().get_fitted_quantile_estimator(model_class, observations, coordinates, quantile_estimator) return super().get_fitted_quantile_estimator(model_class, observations, coordinates, quantile_estimator)
...@@ -41,7 +42,7 @@ class StationaryExpSimulation(AbstractDailyExpSimulation): ...@@ -41,7 +42,7 @@ class StationaryExpSimulation(AbstractDailyExpSimulation):
def create_model(self, coordinates): def create_model(self, coordinates):
gev_param_name_to_coef_list = { gev_param_name_to_coef_list = {
AbstractParams.RATE: [1], AbstractParams.RATE: [10],
} }
return StationaryTemporalModel.from_coef_list(coordinates, gev_param_name_to_coef_list, return StationaryTemporalModel.from_coef_list(coordinates, gev_param_name_to_coef_list,
fit_method=TemporalMarginFitMethod.extremes_fevd_mle, fit_method=TemporalMarginFitMethod.extremes_fevd_mle,
......
from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import \ from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import \
NonStationaryLocationTemporalModel, NonStationaryLocationGumbelModel NonStationaryLocationTemporalModel, NonStationaryLocationGumbelModel
from extreme_fit.model.quantile_model.quantile_regression_model import TemporalCoordinatesQuantileRegressionModel from extreme_fit.model.quantile_model.quantile_regression_model import TemporalCoordinatesQuantileRegressionModel
from projects.quantile_regression_vs_evt.annual_maxima_simulation.daily_exp_simulation import \
NonStationaryExpSimulation, StationaryExpSimulation
from projects.quantile_regression_vs_evt.annual_maxima_simulation.gev_simulation import \ from projects.quantile_regression_vs_evt.annual_maxima_simulation.gev_simulation import \
NonStationaryLocationGumbelSimulation, NonStationaryLocationGevSimulation NonStationaryLocationGumbelSimulation, NonStationaryLocationGevSimulation
from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation.abstract_transformation import \ from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation.abstract_transformation import \
CenteredScaledNormalization, IdentityTransformation CenteredScaledNormalization, IdentityTransformation
nb_time_series = 10 nb_time_series = 20
quantile = 0.98 quantile = 0.98
time_series_lengths = [50, 100, 200] time_series_lengths = [50, 100, 200]
transformation_class = [IdentityTransformation, CenteredScaledNormalization][0] transformation_class = [IdentityTransformation, CenteredScaledNormalization][1]
model_classes = [NonStationaryLocationTemporalModel, TemporalCoordinatesQuantileRegressionModel, NonStationaryLocationGumbelModel] model_classes = [NonStationaryLocationTemporalModel,
simulation_class = [NonStationaryLocationGumbelSimulation, NonStationaryLocationGevSimulation][0] TemporalCoordinatesQuantileRegressionModel,
NonStationaryLocationGumbelModel]
simulation_class = [NonStationaryLocationGumbelSimulation,
NonStationaryLocationGevSimulation,
NonStationaryExpSimulation][-2]
simulation = NonStationaryLocationGumbelSimulation(nb_time_series=nb_time_series, simulation = simulation_class(nb_time_series=nb_time_series,
quantile=quantile, quantile=quantile,
time_series_lengths=time_series_lengths, time_series_lengths=time_series_lengths,
model_classes=model_classes, model_classes=model_classes,
transformation_class=transformation_class) transformation_class=transformation_class)
simulation.plot_error_for_last_year_quantile() simulation.plot_error_for_last_year_quantile()
...@@ -21,6 +21,7 @@ class AbstractSpatioTemporalObservations(object): ...@@ -21,6 +21,7 @@ class AbstractSpatioTemporalObservations(object):
Columns are independent observations from the same coordinates index Columns are independent observations from the same coordinates index
""" """
assert df_maxima_gev is not None or df_maxima_frech is not None assert df_maxima_gev is not None or df_maxima_frech is not None
assert isinstance(df_maxima_gev, pd.DataFrame) or isinstance(df_maxima_frech, pd.DataFrame)
if df_maxima_gev is not None and df_maxima_frech is not None: if df_maxima_gev is not None and df_maxima_frech is not None:
assert pd.Index.equals(df_maxima_gev.index, df_maxima_frech.index) assert pd.Index.equals(df_maxima_gev.index, df_maxima_frech.index)
self.df_maxima_gev = df_maxima_gev # type: pd.DataFrame self.df_maxima_gev = df_maxima_gev # type: pd.DataFrame
......
from typing import Union
import pandas as pd import pandas as pd
from extreme_fit.model.margin_model.abstract_margin_model import AbstractMarginModel from extreme_fit.model.margin_model.abstract_margin_model import AbstractMarginModel
...@@ -9,7 +11,7 @@ from spatio_temporal_dataset.coordinates.spatio_temporal_coordinates.abstract_sp ...@@ -9,7 +11,7 @@ from spatio_temporal_dataset.coordinates.spatio_temporal_coordinates.abstract_sp
AbstractSpatioTemporalCoordinates AbstractSpatioTemporalCoordinates
from spatio_temporal_dataset.spatio_temporal_observations.abstract_spatio_temporal_observations \ from spatio_temporal_dataset.spatio_temporal_observations.abstract_spatio_temporal_observations \
import AbstractSpatioTemporalObservations import AbstractSpatioTemporalObservations
from spatio_temporal_dataset.spatio_temporal_observations.daily_observations import DailyExp from spatio_temporal_dataset.spatio_temporal_observations.daily_observations import DailyExp, DailyObservations
class AnnualMaxima(AbstractSpatioTemporalObservations): class AnnualMaxima(AbstractSpatioTemporalObservations):
...@@ -34,15 +36,19 @@ class MarginAnnualMaxima(AnnualMaxima): ...@@ -34,15 +36,19 @@ class MarginAnnualMaxima(AnnualMaxima):
class DailyExpAnnualMaxima(AnnualMaxima): class DailyExpAnnualMaxima(AnnualMaxima):
def __init__(self, df_maxima_gev: pd.DataFrame = None, df_maxima_frech: pd.DataFrame = None,
daily_observations: Union[None, DailyObservations] = None):
super().__init__(df_maxima_gev, df_maxima_frech)
self.daily_observations = daily_observations
@classmethod @classmethod
def from_sampling(cls, nb_obs: int, coordinates: AbstractCoordinates, def from_sampling(cls, nb_obs: int, coordinates: AbstractCoordinates,
margin_model: AbstractMarginModel): margin_model: AbstractMarginModel):
# todo: to take nb_obs into accoutn i could generate nb_obs * 365 observations # todo: to take nb_obs into accoutn i could generate nb_obs * 365 observations
observations = DailyExp.from_sampling(nb_obs=365, coordinates=coordinates, margin_model=margin_model) daily_observations = DailyExp.from_sampling(nb_obs=365, coordinates=coordinates, margin_model=margin_model)
df_daily_values = observations.df_maxima_gev df_daily_values = daily_observations.df_maxima_gev
df_maxima_gev = pd.DataFrame({'0': df_daily_values.max(axis=1)}, index=df_daily_values.index) df_maxima_gev = pd.DataFrame({'0': df_daily_values.max(axis=1)}, index=df_daily_values.index)
return cls(df_maxima_gev=df_maxima_gev) return cls(df_maxima_gev=df_maxima_gev, daily_observations=daily_observations)
class MaxStableAnnualMaxima(AnnualMaxima): class MaxStableAnnualMaxima(AnnualMaxima):
......
import pandas as pd import pandas as pd
from extreme_fit.distribution.abstract_params import AbstractParams
from extreme_fit.distribution.gev.gev_params import GevParams
from extreme_fit.model.margin_model.abstract_margin_model import AbstractMarginModel from extreme_fit.model.margin_model.abstract_margin_model import AbstractMarginModel
from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel
from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates
from spatio_temporal_dataset.coordinates.temporal_coordinates.generated_temporal_coordinates import \
ConsecutiveTemporalCoordinates
from spatio_temporal_dataset.spatio_temporal_observations.abstract_spatio_temporal_observations import \ from spatio_temporal_dataset.spatio_temporal_observations.abstract_spatio_temporal_observations import \
AbstractSpatioTemporalObservations AbstractSpatioTemporalObservations
class DailyObservations(AbstractSpatioTemporalObservations): class DailyObservations(AbstractSpatioTemporalObservations):
pass
def transform_to_standard_shape(self, coordinates: AbstractCoordinates):
coordinates.df_all_coordinates = pd.concat([coordinates.df_all_coordinates for _ in range(self.nb_obs)])
df = pd.DataFrame(pd.concat([self.df_maxima_gev[c] for c in self.columns]), index=coordinates.index)
observation = AbstractSpatioTemporalObservations(df_maxima_gev=df)
return observation, coordinates
class DailyExp(AbstractSpatioTemporalObservations):
class DailyExp(DailyObservations):
@classmethod @classmethod
def from_sampling(cls, nb_obs: int, coordinates: AbstractCoordinates, def from_sampling(cls, nb_obs: int, coordinates: AbstractCoordinates,
......
import unittest import unittest
from extreme_fit.model.daily_data_model import ConstantQuantileRegressionModelOnDailyData
from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_exp_models import \ from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_exp_models import \
NonStationaryRateTemporalModel NonStationaryRateTemporalModel
from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel, \ from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel, \
...@@ -41,6 +42,12 @@ class TestExpSimulations(unittest.TestCase): ...@@ -41,6 +42,12 @@ class TestExpSimulations(unittest.TestCase):
TemporalCoordinatesQuantileRegressionModel]) TemporalCoordinatesQuantileRegressionModel])
simulation.plot_error_for_last_year_quantile(self.DISPLAY) simulation.plot_error_for_last_year_quantile(self.DISPLAY)
# Fit is way too long.... Probability the regression quantile estimator does not scale well at all...
# def test_stationary_run_daily_data_model(self):
# simulation = StationaryExpSimulation(nb_time_series=1, quantile=0.5, time_series_lengths=[1, 2],
# model_classes=[ConstantQuantileRegressionModelOnDailyData])
# simulation.plot_error_for_last_year_quantile(self.DISPLAY)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment