Commit 1188c608 authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[projection swe] add sensitivity for return levels.

parent 3b257b00
No related merge requests found
Showing with 80 additions and 13 deletions
+80 -13
...@@ -69,7 +69,7 @@ def plot_nb_data(is_temperature_interval, is_shift_interval): ...@@ -69,7 +69,7 @@ def plot_nb_data(is_temperature_interval, is_shift_interval):
ax = plt.gca() ax = plt.gca()
for gcm in get_gcm_list(adamont_version=2)[:]: for gcm in get_gcm_list(adamont_version=2)[:]:
for i, scenario in enumerate(rcp_scenarios[2:]): for i, scenario in enumerate(rcp_scenarios[1:]):
first_scenario = i == 0 first_scenario = i == 0
plot_nb_data_one_line(ax, gcm, scenario, left_limit, right_limit, plot_nb_data_one_line(ax, gcm, scenario, left_limit, right_limit,
first_scenario, is_temperature_interval) first_scenario, is_temperature_interval)
...@@ -93,7 +93,7 @@ def plot_nb_data(is_temperature_interval, is_shift_interval): ...@@ -93,7 +93,7 @@ def plot_nb_data(is_temperature_interval, is_shift_interval):
def get_interval_limits(is_temperature_interval, is_shift_interval): def get_interval_limits(is_temperature_interval, is_shift_interval):
if is_temperature_interval: if is_temperature_interval:
temp_min = np.arange(0, 2, 0.5) temp_min = np.arange(0, 2, 0.5)
temp_max = temp_min + 1.5 temp_max = temp_min + 2
left_limit, right_limit = temp_min, temp_max left_limit, right_limit = temp_min, temp_max
else: else:
shift = 25 shift = 25
......
...@@ -59,6 +59,7 @@ class VisualizerForSensivity(object): ...@@ -59,6 +59,7 @@ class VisualizerForSensivity(object):
if year_min_and_year_max[0] is not None: if year_min_and_year_max[0] is not None:
gcm_to_year_min_and_year_max[gcm] = year_min_and_year_max gcm_to_year_min_and_year_max[gcm] = year_min_and_year_max
print(gcm_to_year_min_and_year_max)
visualizer = VisualizerForProjectionEnsemble( visualizer = VisualizerForProjectionEnsemble(
altitudes_list, gcm_rcm_couples, study_class, season, scenario, altitudes_list, gcm_rcm_couples, study_class, season, scenario,
model_classes=model_classes, model_classes=model_classes,
...@@ -84,9 +85,54 @@ class VisualizerForSensivity(object): ...@@ -84,9 +85,54 @@ class VisualizerForSensivity(object):
merge_visualizer_str_list.append(AbstractEnsembleFit.Together_merge) merge_visualizer_str_list.append(AbstractEnsembleFit.Together_merge)
for merge_visualizer_str in merge_visualizer_str_list: for merge_visualizer_str in merge_visualizer_str_list:
self.sensitivity_plot_percentages(merge_visualizer_str) self.sensitivity_plot_percentages(merge_visualizer_str)
self.sensitivity_plot_return_levels(merge_visualizer_str)
for relative in [True, False]: for relative in [True, False]:
self.sensitivity_plot_changes(merge_visualizer_str, relative) self.sensitivity_plot_changes(merge_visualizer_str, relative)
def sensitivity_plot_return_levels(self, merge_visualizer_str):
ax = plt.gca()
for altitudes in self.altitudes_list:
altitude_class = get_altitude_class_from_altitudes(altitudes)
self.interval_plot_return_levels(ax, altitude_class, merge_visualizer_str)
ticks_labels = get_ticks_labels_for_interval(self.is_temperature_interval, self.is_shift_interval)
name = 'Return levels at the end of the interval'
ax.set_ylabel(name)
ax.set_xlabel('Interval used to compute the trends ')
ax.set_xticks(self.right_limits)
ax.set_xticklabels(ticks_labels)
lim_left, lim_right = ax.get_xlim()
ax.hlines(0, xmin=lim_left, xmax=lim_right, linestyles='dashed')
ax.legend(prop={'size': 7}, loc='upper center', ncol=2)
# ax.set_ylim((0, 122))
# ax.set_yticks([i * 10 for i in range(11)])
self.save_plot(merge_visualizer_str, name)
def interval_plot_return_levels(self, ax, altitude_class, merge_visualizer_str):
linestyle = get_linestyle_for_altitude_class(altitude_class)
mean_return_levels = []
for v in self.right_limit_to_visualizer.values():
merge_visualizer = self.get_merge_visualizer(altitude_class, v, merge_visualizer_str)
mean_return_level = merge_visualizer.mean_return_level(self.massif_names)
mean_return_levels.append(mean_return_level)
label = altitude_class().formula
ax.plot(self.right_limits, mean_return_levels, linestyle=linestyle, label=label, color='orange')
def interval_plot_changes(self, ax, altitude_class, merge_visualizer_str, relative):
linestyle = get_linestyle_for_altitude_class(altitude_class)
mean_changes = []
for v in self.right_limit_to_visualizer.values():
merge_visualizer = self.get_merge_visualizer(altitude_class, v, merge_visualizer_str)
changes, non_stationary_changes = merge_visualizer.all_changes(self.massif_names, relative=relative,
with_significance=False)
mean_changes.append(np.mean(changes))
label = altitude_class().formula
ax.plot(self.right_limits, mean_changes, linestyle=linestyle, label=label, color='darkgreen')
def sensitivity_plot_changes(self, merge_visualizer_str, relative): def sensitivity_plot_changes(self, merge_visualizer_str, relative):
ax = plt.gca() ax = plt.gca()
for altitudes in self.altitudes_list: for altitudes in self.altitudes_list:
......
...@@ -266,7 +266,7 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): ...@@ -266,7 +266,7 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer):
moment = moment.replace('moment', moment = moment.replace('moment',
'{} in {}'.format(OneFoldFit.get_moment_str(order=order), OneFoldFit.last_year)) '{} in {}'.format(OneFoldFit.get_moment_str(order=order), OneFoldFit.last_year))
plot_name = 'Model {} annual maxima of {}'.format(moment, plot_name = 'Model {} annual maxima of {}'.format(moment,
SCM_STUDY_CLASS_TO_ABBREVIATION[self.studies.study_class]) SCM_STUDY_CLASS_TO_ABBREVIATION[self.studies.study_class])
ax.set_ylabel('{} ({})'.format(plot_name, self.study.variable_unit), fontsize=15) ax.set_ylabel('{} ({})'.format(plot_name, self.study.variable_unit), fontsize=15)
ax.set_xlabel('altitudes', fontsize=15) ax.set_xlabel('altitudes', fontsize=15)
ax.tick_params(axis='both', which='major', labelsize=13) ax.tick_params(axis='both', which='major', labelsize=13)
...@@ -323,9 +323,9 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): ...@@ -323,9 +323,9 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer):
raise NotImplementedError raise NotImplementedError
self.plot_map(massif_name_to_value=massif_name_to_best_coef, self.plot_map(massif_name_to_value=massif_name_to_best_coef,
label='Coef/{} plot for {} {}'.format(coef_name, label='Coef/{} plot for {} {}'.format(coef_name,
SCM_STUDY_CLASS_TO_ABBREVIATION[ SCM_STUDY_CLASS_TO_ABBREVIATION[
type(self.study)], type(self.study)],
self.study.variable_unit), self.study.variable_unit),
add_x_label=False, graduation=graduation, massif_name_to_text=self.massif_name_to_best_name, add_x_label=False, graduation=graduation, massif_name_to_text=self.massif_name_to_best_name,
negative_and_positive_values=negative_and_positive_values) negative_and_positive_values=negative_and_positive_values)
...@@ -388,7 +388,7 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): ...@@ -388,7 +388,7 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer):
massif_name.replace('_', ' '), self.study.variable_unit)) massif_name.replace('_', ' '), self.study.variable_unit))
peak_year_folder = 'Peak year ' + ylabel peak_year_folder = 'Peak year ' + ylabel
plot_name = '{}/Peak year for {}'.format(peak_year_folder, plot_name = '{}/Peak year for {}'.format(peak_year_folder,
massif_name.replace('_', '')) massif_name.replace('_', ''))
self.studies.show_or_save_to_file(plot_name=plot_name, show=self.show, no_title=True, tight_layout=True) self.studies.show_or_save_to_file(plot_name=plot_name, show=self.show, no_title=True, tight_layout=True)
plt.close() plt.close()
...@@ -462,6 +462,14 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer): ...@@ -462,6 +462,14 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer):
self.studies.show_or_save_to_file(plot_name=plot_name, show=self.show) self.studies.show_or_save_to_file(plot_name=plot_name, show=self.show)
plt.close() plt.close()
def mean_return_level(self, massif_names):
valid_massif_names = self.get_valid_names(massif_names)
return_levels = []
for one_fold in [one_fold for m, one_fold in self.massif_name_to_one_fold_fit.items()
if m in valid_massif_names]:
return_levels.append(one_fold.return_level_last_temporal_coordinate)
return np.mean(return_levels)
def all_trends(self, massif_names, with_significance=True, with_relative_change=False): def all_trends(self, massif_names, with_significance=True, with_relative_change=False):
"""return percents which contain decrease, significant decrease, increase, significant increase percentages""" """return percents which contain decrease, significant decrease, increase, significant increase percentages"""
valid_massif_names = self.get_valid_names(massif_names) valid_massif_names = self.get_valid_names(massif_names)
......
...@@ -29,6 +29,7 @@ from extreme_fit.model.result_from_model_fit.result_from_extremes.eurocode_retur ...@@ -29,6 +29,7 @@ from extreme_fit.model.result_from_model_fit.result_from_extremes.eurocode_retur
EurocodeConfidenceIntervalFromExtremes EurocodeConfidenceIntervalFromExtremes
from extreme_trend.one_fold_fit.altitude_group import DefaultAltitudeGroup, altitudes_for_groups from extreme_trend.one_fold_fit.altitude_group import DefaultAltitudeGroup, altitudes_for_groups
from root_utils import NB_CORES, batch from root_utils import NB_CORES, batch
from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates
from spatio_temporal_dataset.coordinates.temporal_coordinates.abstract_temporal_covariate_for_fit import TimeTemporalCovariate from spatio_temporal_dataset.coordinates.temporal_coordinates.abstract_temporal_covariate_for_fit import TimeTemporalCovariate
from spatio_temporal_dataset.coordinates.temporal_coordinates.temperature_covariate import \ from spatio_temporal_dataset.coordinates.temporal_coordinates.temperature_covariate import \
AnomalyTemperatureWithSplineTemporalCovariate AnomalyTemperatureWithSplineTemporalCovariate
...@@ -382,6 +383,16 @@ class OneFoldFit(object): ...@@ -382,6 +383,16 @@ class OneFoldFit(object):
return is_significant, altitude_and_year_to_return_level_mean_estimate, altitude_and_year_to_return_level_confidence_interval return is_significant, altitude_and_year_to_return_level_mean_estimate, altitude_and_year_to_return_level_confidence_interval
@property
def return_level_last_temporal_coordinate(self):
df_temporal_covariate = self.dataset.coordinates.df_temporal_coordinates_for_fit(temporal_covariate_for_fit=self.temporal_covariate_for_fit,
drop_duplicates=False)
last_temporal_coordinate = df_temporal_covariate.loc[:, AbstractCoordinates.COORDINATE_T].max()
print('last temporal coordinate', last_temporal_coordinate)
altitude = self.altitude_group.reference_altitude
coordinate = np.array([altitude, last_temporal_coordinate])
return self.get_return_level(self.best_function_from_fit, coordinate)
@property @property
def bootstrap_fitted_functions_from_fit(self): def bootstrap_fitted_functions_from_fit(self):
print('nb of bootstrap for confidence interval=', AbstractExtractEurocodeReturnLevel.NB_BOOTSTRAP) print('nb of bootstrap for confidence interval=', AbstractExtractEurocodeReturnLevel.NB_BOOTSTRAP)
......
...@@ -25,7 +25,7 @@ from extreme_fit.model.utils import set_seed_for_test ...@@ -25,7 +25,7 @@ from extreme_fit.model.utils import set_seed_for_test
from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall
from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario, get_gcm_rcm_couples, \ from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario, get_gcm_rcm_couples, \
rcp_scenarios rcp_scenarios, rcm_scenarios_extended
from spatio_temporal_dataset.coordinates.temporal_coordinates.abstract_temporal_covariate_for_fit import \ from spatio_temporal_dataset.coordinates.temporal_coordinates.abstract_temporal_covariate_for_fit import \
TimeTemporalCovariate TimeTemporalCovariate
...@@ -44,24 +44,26 @@ def main(): ...@@ -44,24 +44,26 @@ def main():
set_seed_for_test() set_seed_for_test()
AbstractExtractEurocodeReturnLevel.ALPHA_CONFIDENCE_INTERVAL_UNCERTAINTY = 0.2 AbstractExtractEurocodeReturnLevel.ALPHA_CONFIDENCE_INTERVAL_UNCERTAINTY = 0.2
fast = None fast = True
scenarios = [AdamontScenario.rcp85] scenarios = [AdamontScenario.rcp85]
scenarios = rcm_scenarios_extended[1:]
scenarios = rcp_scenarios[1:] scenarios = rcp_scenarios[1:]
if fast in [None, True]:
scenarios = scenarios[:1]
for scenario in scenarios: for scenario in scenarios:
gcm_rcm_couples = get_gcm_rcm_couples(scenario) gcm_rcm_couples = get_gcm_rcm_couples(scenario)
if fast is None: if fast is None:
scenarios = scenarios[:1]
massif_names = None massif_names = None
gcm_rcm_couples = gcm_rcm_couples[4:6] gcm_rcm_couples = gcm_rcm_couples[4:6]
AbstractExtractEurocodeReturnLevel.NB_BOOTSTRAP = 10 AbstractExtractEurocodeReturnLevel.NB_BOOTSTRAP = 10
altitudes_list = altitudes_for_groups[1:3] altitudes_list = altitudes_for_groups[1:3]
elif fast: elif fast:
scenarios = scenarios[:1]
massif_names = ['Vanoise', 'Haute-Maurienne'] massif_names = ['Vanoise', 'Haute-Maurienne']
gcm_rcm_couples = gcm_rcm_couples[4:6] gcm_rcm_couples = gcm_rcm_couples[4:6]
AbstractExtractEurocodeReturnLevel.NB_BOOTSTRAP = 10 AbstractExtractEurocodeReturnLevel.NB_BOOTSTRAP = 10
altitudes_list = altitudes_for_groups[1:3] altitudes_list = altitudes_for_groups[2:3]
else: else:
massif_names = None massif_names = None
altitudes_list = altitudes_for_groups[:] altitudes_list = altitudes_for_groups[:]
...@@ -73,7 +75,7 @@ def main(): ...@@ -73,7 +75,7 @@ def main():
print('Scenario is', scenario) print('Scenario is', scenario)
model_classes = ALTITUDINAL_GEV_MODELS_BASED_ON_POINTWISE_ANALYSIS model_classes = ALTITUDINAL_GEV_MODELS_BASED_ON_POINTWISE_ANALYSIS
assert scenario in rcp_scenarios assert scenario is not AdamontScenario.histo
remove_physically_implausible_models = True remove_physically_implausible_models = True
temp_cov = True temp_cov = True
temporal_covariate_for_fit = AnomalyTemperatureWithSplineTemporalCovariate if temp_cov else TimeTemporalCovariate temporal_covariate_for_fit = AnomalyTemperatureWithSplineTemporalCovariate if temp_cov else TimeTemporalCovariate
......
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