Commit 0d9a9405 authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[contrasting project] improve StudyVisualizerForReturnLevelChange.

parent 86fe53c8
No related merge requests found
Showing with 36 additions and 11 deletions
+36 -11
import warnings
import pandas as pd import pandas as pd
from extreme_fit.distribution.gev.gev_params import GevParams from extreme_fit.distribution.gev.gev_params import GevParams
...@@ -32,4 +34,6 @@ def fitted_stationary_gev(x_gev, fit_method=TemporalMarginFitMethod.is_mev_gev_f ...@@ -32,4 +34,6 @@ def fitted_stationary_gev(x_gev, fit_method=TemporalMarginFitMethod.is_mev_gev_f
estimator = fitted_linear_margin_estimator(model_class, coordinates, dataset, starting_year, fit_method) estimator = fitted_linear_margin_estimator(model_class, coordinates, dataset, starting_year, fit_method)
first_coordinate = coordinates.coordinates_values()[0] first_coordinate = coordinates.coordinates_values()[0]
gev_param = estimator.function_from_fit.get_gev_params(first_coordinate) gev_param = estimator.function_from_fit.get_gev_params(first_coordinate)
if not -0.5 < gev_param.shape < 0.5:
warnings.warn('fitted shape parameter is outside physical bounds {}'.format(gev_param.shape))
return gev_param return gev_param
...@@ -24,6 +24,10 @@ class TemporalMarginFitMethod(Enum): ...@@ -24,6 +24,10 @@ class TemporalMarginFitMethod(Enum):
extremes_fevd_l_moments = 4 extremes_fevd_l_moments = 4
def fitmethod_to_str(fit_method):
return str(fit_method).split('.')[-1]
class AbstractTemporalLinearMarginModel(LinearMarginModel): class AbstractTemporalLinearMarginModel(LinearMarginModel):
"""Linearity only with respect to the temporal coordinates""" """Linearity only with respect to the temporal coordinates"""
...@@ -46,7 +50,8 @@ class AbstractTemporalLinearMarginModel(LinearMarginModel): ...@@ -46,7 +50,8 @@ class AbstractTemporalLinearMarginModel(LinearMarginModel):
df_coordinates_temp: pd.DataFrame) -> AbstractResultFromModelFit: df_coordinates_temp: pd.DataFrame) -> AbstractResultFromModelFit:
data = data[0] data = data[0]
assert len(data) == len(df_coordinates_temp.values), 'len(data)={} != len(temp)={}'.format(len(data), assert len(data) == len(df_coordinates_temp.values), 'len(data)={} != len(temp)={}'.format(len(data),
len(df_coordinates_temp.values)) len(
df_coordinates_temp.values))
x = ro.FloatVector(data) x = ro.FloatVector(data)
if self.params_class is GevParams: if self.params_class is GevParams:
if self.fit_method == TemporalMarginFitMethod.is_mev_gev_fit: if self.fit_method == TemporalMarginFitMethod.is_mev_gev_fit:
...@@ -148,3 +153,7 @@ class AbstractTemporalLinearMarginModel(LinearMarginModel): ...@@ -148,3 +153,7 @@ class AbstractTemporalLinearMarginModel(LinearMarginModel):
@property @property
def siglink(self): def siglink(self):
return r('identity') return r('identity')
if __name__ == '__main__':
print(fitmethod_to_str(TemporalMarginFitMethod.extremes_fevd_l_moments))
...@@ -3,13 +3,16 @@ from collections import OrderedDict ...@@ -3,13 +3,16 @@ from collections import OrderedDict
import numpy as np import numpy as np
from extreme_data.meteo_france_data.scm_models_data.abstract_study import AbstractStudy from extreme_data.meteo_france_data.scm_models_data.abstract_study import AbstractStudy
from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day from extreme_data.meteo_france_data.scm_models_data.crocus.crocus import CrocusSnowLoad1Day, CrocusSnowLoad3Days, \
CrocusSnowLoadTotal
from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day, SafranSnowfall3Days
from extreme_data.meteo_france_data.scm_models_data.visualization.create_shifted_cmap import get_shifted_map, \ from extreme_data.meteo_france_data.scm_models_data.visualization.create_shifted_cmap import get_shifted_map, \
get_colors, shiftedColorMap, ticks_values_and_labels_for_percentages get_colors, shiftedColorMap, ticks_values_and_labels_for_percentages
from extreme_data.meteo_france_data.scm_models_data.visualization.main_study_visualizer import ALL_ALTITUDES_WITHOUT_NAN
from extreme_data.meteo_france_data.scm_models_data.visualization.study_visualizer import StudyVisualizer from extreme_data.meteo_france_data.scm_models_data.visualization.study_visualizer import StudyVisualizer
from extreme_fit.estimator.margin_estimator.utils import fitted_stationary_gev from extreme_fit.estimator.margin_estimator.utils import fitted_stationary_gev
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, fitmethod_to_str
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
...@@ -54,11 +57,15 @@ class StudyVisualizerForReturnLevelChange(StudyVisualizer): ...@@ -54,11 +57,15 @@ class StudyVisualizerForReturnLevelChange(StudyVisualizer):
massif_name_to_return_levels[massif_name] = return_level massif_name_to_return_levels[massif_name] = return_level
return massif_name_to_return_levels return massif_name_to_return_levels
def plot_return_level_percentage(self): def plot_return_level_evolution(self):
massif_name_to_return_level_past = self.massif_name_to_return_level(self.study_before) massif_name_to_return_level_past = self.massif_name_to_return_level(self.study_before)
massif_name_to_return_level_recent = self.massif_name_to_return_level(self.study_after) massif_name_to_return_level_recent = self.massif_name_to_return_level(self.study_after)
# massif_name_to_percentage = {
# m: 100 * (v - massif_name_to_return_level_past[m]) / massif_name_to_return_level_past[m]
# for m, v in
# massif_name_to_return_level_recent.items()}
massif_name_to_percentage = { massif_name_to_percentage = {
m: 100 * (v - massif_name_to_return_level_past[m]) / massif_name_to_return_level_past[m] m: (v - massif_name_to_return_level_past[m])
for m, v in for m, v in
massif_name_to_return_level_recent.items()} massif_name_to_return_level_recent.items()}
...@@ -95,6 +102,7 @@ class StudyVisualizerForReturnLevelChange(StudyVisualizer): ...@@ -95,6 +102,7 @@ class StudyVisualizerForReturnLevelChange(StudyVisualizer):
ax.get_xaxis().set_visible(True) ax.get_xaxis().set_visible(True)
ax.set_xticks([]) ax.set_xticks([])
ax.set_xlabel('Altitude = {}m'.format(self.study.altitude), fontsize=15) ax.set_xlabel('Altitude = {}m'.format(self.study.altitude), fontsize=15)
ax.set_title('Fit method is {}'.format(fitmethod_to_str(self.fit_method)))
self.plot_name = 'change in return levels' self.plot_name = 'change in return levels'
self.show_or_save_to_file(add_classic_title=False, tight_layout=True, no_title=True, self.show_or_save_to_file(add_classic_title=False, tight_layout=True, no_title=True,
dpi=500) dpi=500)
...@@ -102,10 +110,14 @@ class StudyVisualizerForReturnLevelChange(StudyVisualizer): ...@@ -102,10 +110,14 @@ class StudyVisualizerForReturnLevelChange(StudyVisualizer):
if __name__ == '__main__': if __name__ == '__main__':
for altitude in [900, 1200, 1500, 1800, 2100, 2400, 2700, 3000][:]: # for altitude in [900, 1200, 1500, 1800, 2100, 2400, 2700, 3000][:]:
study_visualizer = StudyVisualizerForReturnLevelChange(study_class=SafranSnowfall1Day, altitude=altitude, for altitude in ALL_ALTITUDES_WITHOUT_NAN:
return_period=30, for study_class in [SafranSnowfall1Day, SafranSnowfall3Days, CrocusSnowLoadTotal, CrocusSnowLoad3Days, CrocusSnowLoad1Day][:1]:
save_to_file=True, return_period = 50
fit_method=TemporalMarginFitMethod.extremes_fevd_l_moments) study_visualizer = StudyVisualizerForReturnLevelChange(study_class=study_class,
study_visualizer.plot_return_level_percentage() altitude=altitude,
return_period=return_period,
save_to_file=True,
fit_method=TemporalMarginFitMethod.extremes_fevd_l_moments)
study_visualizer.plot_return_level_evolution()
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