Commit 67e36996 authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[quantile regression project] add annual maxima osbervation from daily...

[quantile regression project] add annual maxima osbervation from daily exponential. add sammple_r_function as argument to rmargin_from_nb_obs
parent 00deaf71
No related merge requests found
Showing with 68 additions and 14 deletions
+68 -14
......@@ -69,11 +69,12 @@ class AbstractMarginModel(AbstractModel, ABC):
maxima_gev = self.frech2gev(maxima_frech, coordinates_values, self.margin_function_sample)
return maxima_gev
def rmargin_from_nb_obs(self, nb_obs: int, coordinates_values: np.ndarray) -> np.ndarray:
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_gev_params(coordinate)
x_gev = r.rgev(nb_obs, **gev_params.to_dict())
x_gev = r(sample_r_function)(nb_obs, **gev_params.to_dict())
maxima_gev.append(x_gev)
return np.array(maxima_gev)
......
......@@ -9,6 +9,7 @@ from spatio_temporal_dataset.coordinates.spatio_temporal_coordinates.abstract_sp
AbstractSpatioTemporalCoordinates
from spatio_temporal_dataset.spatio_temporal_observations.abstract_spatio_temporal_observations \
import AbstractSpatioTemporalObservations
from spatio_temporal_dataset.spatio_temporal_observations.daily_observations import DailyExp
class AnnualMaxima(AbstractSpatioTemporalObservations):
......@@ -25,7 +26,8 @@ class MarginAnnualMaxima(AnnualMaxima):
def from_sampling(cls, nb_obs: int, coordinates: AbstractCoordinates,
margin_model: AbstractMarginModel):
maxima_gev = margin_model.rmargin_from_nb_obs(nb_obs=nb_obs,
coordinates_values=coordinates.coordinates_values())
coordinates_values=coordinates.coordinates_values(),
sample_r_function='rgev')
df_maxima_gev = pd.DataFrame(data=maxima_gev, index=coordinates.index)
return cls(df_maxima_gev=df_maxima_gev)
......@@ -35,15 +37,11 @@ class DailyExpAnnualMaxima(AnnualMaxima):
@classmethod
def from_sampling(cls, nb_obs: int, coordinates: AbstractCoordinates,
margin_model: AbstractMarginModel):
pass
class DailyExp(AbstractSpatioTemporalObservations):
@classmethod
def from_sampling(cls, nb_obs: int, coordinates: AbstractCoordinates,
margin_model: AbstractMarginModel):
pass
# 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)
df_daily_values = observations.df_maxima_gev
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)
class MaxStableAnnualMaxima(AnnualMaxima):
......
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.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel
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 \
AbstractSpatioTemporalObservations
class DailyObservations(AbstractSpatioTemporalObservations):
pass
class DailyExp(AbstractSpatioTemporalObservations):
@classmethod
def from_sampling(cls, nb_obs: int, coordinates: AbstractCoordinates,
margin_model: AbstractMarginModel):
exponential_values = margin_model.rmargin_from_nb_obs(nb_obs=nb_obs,
coordinates_values=coordinates.coordinates_values())
df_exponential_values = pd.DataFrame(data=exponential_values, index=coordinates.index)
return cls(df_maxima_gev=df_exponential_values)
import unittest
import numpy as np
import numpy as np
import pandas as pd
from spatio_temporal_dataset.spatio_temporal_observations.abstract_spatio_temporal_observations import AbstractSpatioTemporalObservations
from extreme_fit.distribution.abstract_params import AbstractParams
from extreme_fit.model.margin_model.linear_margin_model.temporal_linear_margin_models import StationaryTemporalModel
from extreme_fit.model.utils import set_seed_for_test
from spatio_temporal_dataset.coordinates.temporal_coordinates.generated_temporal_coordinates import \
ConsecutiveTemporalCoordinates
from spatio_temporal_dataset.spatio_temporal_observations.abstract_spatio_temporal_observations import \
AbstractSpatioTemporalObservations
from spatio_temporal_dataset.spatio_temporal_observations.annual_maxima_observations import DailyExpAnnualMaxima
from spatio_temporal_dataset.spatio_temporal_observations.daily_observations import DailyExp
class TestSpatioTemporalObservations(unittest.TestCase):
......@@ -18,5 +26,26 @@ class TestSpatioTemporalObservations(unittest.TestCase):
self.assertTrue(np.equal(example, maxima_frech).all(), msg="{} {}".format(example, maxima_frech))
class TestDailyObservations(unittest.TestCase):
def setUp(self) -> None:
super().setUp()
set_seed_for_test(seed=42)
self.coordinates = ConsecutiveTemporalCoordinates.from_nb_temporal_steps(nb_temporal_steps=10)
gev_param_name_to_coef_list = {
AbstractParams.SCALE: [1],
}
self.margin_model = StationaryTemporalModel.from_coef_list(self.coordinates, gev_param_name_to_coef_list)
def test_exponential_observations(self):
obs = DailyExp.from_sampling(nb_obs=1, coordinates=self.coordinates,
margin_model=self.margin_model)
self.assertAlmostEqual(obs.df_maxima_gev.mean()[0], 4.692385276235156)
def test_annual_maxima_observations_from_daily_observations(self):
obs = DailyExpAnnualMaxima.from_sampling(1, self.coordinates, self.margin_model)
self.assertAlmostEqual(obs.df_maxima_gev.mean()[0], 1183.8468374768636)
if __name__ == '__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