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

[contrasting] add plot mean, and plot relative change in the mean

parent 2c42bae4
No related merge requests found
Showing with 73 additions and 2 deletions
+73 -2
......@@ -11,7 +11,10 @@ from projects.altitude_spatial_model.altitudes_fit.one_fold_analysis.altitudes_s
def plot_altitudinal_fit(studies):
visualizer = AltitudesStudiesVisualizerForNonStationaryModels(studies=studies,
model_classes=ALTITUDINAL_MODELS,
massif_names=['Belledonne'])
massif_names=['Belledonne'],
show=True)
visualizer.plot_mean()
visualizer.plot_relative_change()
def plot_time_series(studies):
......
from typing import List
import matplotlib.pyplot as plt
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.visualization.main_study_visualizer import \
SCM_STUDY_CLASS_TO_ABBREVIATION
from extreme_data.meteo_france_data.scm_models_data.visualization.plot_utils import plot_against_altitude
from extreme_data.meteo_france_data.scm_models_data.visualization.study_visualizer import StudyVisualizer
from extreme_fit.model.margin_model.polynomial_margin_model.spatio_temporal_polynomial_model import \
AbstractSpatioTemporalPolynomialModel
......@@ -24,4 +30,31 @@ class AltitudesStudiesVisualizerForNonStationaryModels(StudyVisualizer):
for massif_name in self.massif_names:
dataset = studies.spatio_temporal_dataset(massif_name=massif_name)
old_fold_fit = OneFoldFit(dataset, model_classes)
self.massif_name_to_one_fold_fit[massif_name] = old_fold_fit
\ No newline at end of file
self.massif_name_to_one_fold_fit[massif_name] = old_fold_fit
def plot_mean(self):
self.plot_general('mean')
def plot_relative_change(self):
self.plot_general('relative_changes_in_the_mean')
def plot_general(self, method_name):
ax = plt.gca()
min_altitude, *_, max_altitude = self.studies.altitudes
altitudes = np.linspace(min_altitude, max_altitude, num=50)
for massif_id, massif_name in enumerate(self.massif_names):
old_fold_fit = self.massif_name_to_one_fold_fit[massif_name]
values = old_fold_fit.__getattribute__(method_name)(altitudes)
plot_against_altitude(altitudes, ax, massif_id, massif_name, values)
# Plot settings
ax.legend(prop={'size': 7}, ncol=3)
moment = ' '.join(method_name.split('_'))
plot_name = '{} annual maxima of {}'.format(moment, SCM_STUDY_CLASS_TO_ABBREVIATION[self.studies.study_class])
ax.set_ylabel('{} ({})'.format(plot_name, self.study.variable_unit), fontsize=15)
ax.set_xlabel('altitudes', fontsize=15)
# lim_down, lim_up = ax.get_ylim()
# lim_up += (lim_up - lim_down) / 3
# ax.set_ylim([lim_down, lim_up])
ax.tick_params(axis='both', which='major', labelsize=13)
self.studies.show_or_save_to_file(plot_name=plot_name, show=self.show)
ax.clear()
import numpy as np
from cached_property import cached_property
from extreme_fit.estimator.margin_estimator.utils import fitted_linear_margin_estimator_short
from extreme_fit.model.margin_model.utils import MarginFitMethod
......@@ -18,3 +21,35 @@ class OneFoldFit(object):
# Some display
for estimator in self.model_class_to_estimator.values():
print(estimator.result_from_model_fit.aic)
@cached_property
def best_estimator(self):
sorted_estimators = sorted([estimator for estimator in self.model_class_to_estimator.values()],
key=lambda e: e.result_from_model_fit.aic)
estimator_that_minimizes_aic = sorted_estimators[0]
return estimator_that_minimizes_aic
@property
def best_function_from_fit(self):
return self.best_estimator.function_from_fit
def mean(self, altitudes, year=2019):
return [self.get_mean(altitude, year) for altitude in altitudes]
def get_mean(self, altitude, year):
coordinate = np.array([altitude, year])
gev_params = self.best_function_from_fit.get_params(coordinate, is_transformed=False)
return gev_params.mean
def relative_changes_in_the_mean(self, altitudes, year=2019, nb_years=50):
relative_changes = []
for altitude in altitudes:
mean_after = self.get_mean(altitude, year)
mean_before = self.get_mean(altitude, year - nb_years)
relative_change = 100 * (mean_after - mean_before) / mean_before
relative_changes.append(relative_change)
return relative_changes
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