Commit f8fdcd0c authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[EXTREME PARAMETERS] create an attribute undefined_parameters in...

[EXTREME PARAMETERS] create an attribute undefined_parameters in ExtremeParameters object, to avoid crash when a shape is < 0 for point while we want to display
parent 4fa7fcf6
No related merge requests found
Showing with 36 additions and 11 deletions
+36 -11
...@@ -19,7 +19,7 @@ def study_iterator(study_class, only_first_one=False, both_altitude=False, verbo ...@@ -19,7 +19,7 @@ def study_iterator(study_class, only_first_one=False, both_altitude=False, verbo
if verbose: if verbose:
print('Loading studies....') print('Loading studies....')
for nb_day in nb_days: for nb_day in nb_days:
for alti in AbstractStudy.ALTITUDES[::1]: for alti in AbstractStudy.ALTITUDES[::-1]:
if verbose: if verbose:
print('alti: {}, nb_day: {}'.format(alti, nb_day)) print('alti: {}, nb_day: {}'.format(alti, nb_day))
study = study_class(alti, nb_day) if is_safran_study else study_class(alti) study = study_class(alti, nb_day) if is_safran_study else study_class(alti)
...@@ -36,11 +36,12 @@ def extended_visualization(): ...@@ -36,11 +36,12 @@ def extended_visualization():
for study_class in SCM_EXTENDED_STUDIES[1:2]: for study_class in SCM_EXTENDED_STUDIES[1:2]:
for study in study_iterator(study_class, only_first_one=True): for study in study_iterator(study_class, only_first_one=True):
study_visualizer = StudyVisualizer(study) study_visualizer = StudyVisualizer(study)
study_visualizer.visualize_all_kde_graphs() # study_visualizer.visualize_all_kde_graphs()
study_visualizer.visualize_experimental_law()
def normal_visualization(): def normal_visualization():
for study_class in SCM_STUDIES[:1]: for study_class in SCM_STUDIES[1:2]:
for study in study_iterator(study_class, only_first_one=True): for study in study_iterator(study_class, only_first_one=True):
study_visualizer = StudyVisualizer(study) study_visualizer = StudyVisualizer(study)
# study_visualizer.visualize_independent_margin_fits(threshold=[None, 20, 40, 60][0]) # study_visualizer.visualize_independent_margin_fits(threshold=[None, 20, 40, 60][0])
...@@ -62,6 +63,6 @@ def complete_analysis(only_first_one=False): ...@@ -62,6 +63,6 @@ def complete_analysis(only_first_one=False):
if __name__ == '__main__': if __name__ == '__main__':
# normal_visualization() normal_visualization()
extended_visualization() # extended_visualization()
# complete_analysis() # complete_analysis()
...@@ -43,6 +43,10 @@ class StudyVisualizer(object): ...@@ -43,6 +43,10 @@ class StudyVisualizer(object):
def dataset(self): def dataset(self):
return AbstractDataset(self.observations, self.coordinates) return AbstractDataset(self.observations, self.coordinates)
def visualize_experimental_law(self):
plot_name = ' experimental law'
self.show_or_save_to_file(plot_name)
def visualize_all_kde_graphs(self): def visualize_all_kde_graphs(self):
massif_names = self.study.safran_massif_names massif_names = self.study.safran_massif_names
nb_columns = 5 nb_columns = 5
......
...@@ -121,6 +121,7 @@ class AbstractMarginFunction(object): ...@@ -121,6 +121,7 @@ class AbstractMarginFunction(object):
grid = [] grid = []
for i, xi in enumerate(linspace): for i, xi in enumerate(linspace):
gev_param = self.get_gev_params(np.array([xi])) gev_param = self.get_gev_params(np.array([xi]))
assert not gev_param.has_undefined_parameters, 'This case needs to be handled during display'
grid.append(gev_param.summary_dict) grid.append(gev_param.summary_dict)
grid = {gev_param: [g[gev_param] for g in grid] for gev_param in GevParams.SUMMARY_NAMES} grid = {gev_param: [g[gev_param] for g in grid] for gev_param in GevParams.SUMMARY_NAMES}
return grid, linspace return grid, linspace
......
from abc import ABC from abc import ABC
import numpy as np
from extreme_estimator.margin_fits.abstract_params import AbstractParams from extreme_estimator.margin_fits.abstract_params import AbstractParams
...@@ -13,4 +14,8 @@ class ExtremeParams(AbstractParams, ABC): ...@@ -13,4 +14,8 @@ class ExtremeParams(AbstractParams, ABC):
self.location = loc self.location = loc
self.scale = scale self.scale = scale
self.shape = shape self.shape = shape
assert self.scale > 0 # Scale cannot be negative
# (sometimes it happens, when we want to find a quantile for every point of a 2D map
# then it can happen that a corner point that was not used for fitting correspond to a negative scale,
# in the case we set all the parameters as equal to np.nan, and we will not display those points)
self.has_undefined_parameters = self.scale <= 0
\ No newline at end of file
from extreme_estimator.extreme_models.utils import r from extreme_estimator.extreme_models.utils import r
from extreme_estimator.margin_fits.extreme_params import ExtremeParams from extreme_estimator.margin_fits.extreme_params import ExtremeParams
import numpy as np
class GevParams(ExtremeParams): class GevParams(ExtremeParams):
...@@ -14,8 +15,14 @@ class GevParams(ExtremeParams): ...@@ -14,8 +15,14 @@ class GevParams(ExtremeParams):
self.block_size = block_size self.block_size = block_size
def quantile(self, p) -> float: def quantile(self, p) -> float:
return r.qgev(p, self.location, self.scale, self.shape)[0] if self.has_undefined_parameters:
return np.nan
else:
return r.qgev(p, self.location, self.scale, self.shape)[0]
@property @property
def param_values(self): def param_values(self):
return [self.location, self.scale, self.shape] if self.has_undefined_parameters:
\ No newline at end of file return [np.nan for _ in range(3)]
else:
return [self.location, self.scale, self.shape]
\ No newline at end of file
...@@ -24,6 +24,8 @@ def plot_extreme_param(ax, gev_param_name, values): ...@@ -24,6 +24,8 @@ def plot_extreme_param(ax, gev_param_name, values):
midpoint = 1.0 midpoint = 1.0
elif vmin > 0 and vmax > 0: elif vmin > 0 and vmax > 0:
midpoint = 0.0 midpoint = 0.0
else:
raise ValueError('Unexpected values: vmin={}, vmax={}'.format(vmin, vmax))
cmap = [plt.cm.coolwarm, plt.cm.bwr, plt.cm.seismic][1] cmap = [plt.cm.coolwarm, plt.cm.bwr, plt.cm.seismic][1]
shifted_cmap = shiftedColorMap(cmap, midpoint=midpoint, name='shifted') shifted_cmap = shiftedColorMap(cmap, midpoint=midpoint, name='shifted')
norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax) norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax)
...@@ -47,10 +49,9 @@ def get_color_rbga_shifted(ax, gev_param_name, values): ...@@ -47,10 +49,9 @@ def get_color_rbga_shifted(ax, gev_param_name, values):
def imshow_shifted(ax, gev_param_name, values, x, y): def imshow_shifted(ax, gev_param_name, values, x, y):
norm, shifted_cmap = plot_extreme_param(ax, gev_param_name, values) masked_array = np.ma.masked_where(np.isnan(values), values)
norm, shifted_cmap = plot_extreme_param(ax, gev_param_name, masked_array)
shifted_cmap.set_bad(color='white') shifted_cmap.set_bad(color='white')
masked_array = values
if gev_param_name != ExtremeParams.SHAPE: if gev_param_name != ExtremeParams.SHAPE:
epsilon = 1e-2 * (np.max(values) - np.min(values)) epsilon = 1e-2 * (np.max(values) - np.min(values))
value = np.min(values) value = np.min(values)
......
...@@ -14,6 +14,12 @@ class TestGevParams(unittest.TestCase): ...@@ -14,6 +14,12 @@ class TestGevParams(unittest.TestCase):
for quantile_name, p in gev_params.quantile_name_to_p.items(): for quantile_name, p in gev_params.quantile_name_to_p.items():
self.assertAlmostEqual(- 1 / np.log(p), quantile_dict[quantile_name]) self.assertAlmostEqual(- 1 / np.log(p), quantile_dict[quantile_name])
def test_negative_scale(self):
gev_params = GevParams(loc=1.0, shape=1.0, scale=-1.0)
for p in [0.1, 0.5, 0.9]:
q = gev_params.quantile(p)
self.assertTrue(np.isnan(q))
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