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

[SCM][HYPERCUBE] Add possibility to create altitude hypercube effortlessly...

[SCM][HYPERCUBE] Add possibility to create altitude hypercube effortlessly from quantity altitude hypercube (with an additional argument called add_detailed_plot)
parent 979c622d
No related merge requests found
Showing with 137 additions and 77 deletions
+137 -77
...@@ -59,9 +59,13 @@ class HypercubeVisualizer(object): ...@@ -59,9 +59,13 @@ class HypercubeVisualizer(object):
# Some properties # Some properties
@property
def study_title(self):
return self.study.title
def show_or_save_to_file(self, specific_title=''): def show_or_save_to_file(self, specific_title=''):
if self.save_to_file: if self.save_to_file:
main_title, _ = '_'.join(self.study.title.split()).split('/') main_title, *_ = '_'.join(self.study_title.split()).split('/')
filename = "{}/{}/".format(VERSION_TIME, main_title) filename = "{}/{}/".format(VERSION_TIME, main_title)
filename += specific_title filename += specific_title
filepath = op.join(self.study.result_full_path, filename + '.png') filepath = op.join(self.study.result_full_path, filename + '.png')
...@@ -119,11 +123,21 @@ class AltitudeHypercubeVisualizer(HypercubeVisualizer): ...@@ -119,11 +123,21 @@ class AltitudeHypercubeVisualizer(HypercubeVisualizer):
AbstractTrendTest.SIGNIFICATIVE_NEGATIVE_TREND] AbstractTrendTest.SIGNIFICATIVE_NEGATIVE_TREND]
return trend_type_to_s_percentages return trend_type_to_s_percentages
def visualize_trend_test_evolution(self, reduction_function, xlabel, xlabel_values, ax=None, marker='o'): def subtitle_to_reduction_function(self, reduction_function, level=None, add_detailed_plot=False):
def reduction_function_with_level(df_bool):
if level is None:
return reduction_function(df_bool)
else:
return reduction_function(df_bool, level)
return {'global': reduction_function_with_level}
def visualize_trend_test_evolution(self, reduction_function, xlabel, xlabel_values, ax=None, marker='o',
subtitle=''):
if ax is None: if ax is None:
fig, ax = plt.subplots(1, 1, figsize=self.study_visualizer.figsize) fig, ax = plt.subplots(1, 1, figsize=self.study_visualizer.figsize)
trend_type_to_percentages_values = {k: s.values for k, s in self.trend_type_to_s_percentages(reduction_function).items()} trend_type_to_percentages_values = {k: s.values for k, s in
self.trend_type_to_s_percentages(reduction_function).items()}
for trend_type in self.trend_types: for trend_type in self.trend_types:
style = self.trend_type_to_style[trend_type] style = self.trend_type_to_style[trend_type]
percentages_values = trend_type_to_percentages_values[trend_type] percentages_values = trend_type_to_percentages_values[trend_type]
...@@ -149,10 +163,11 @@ class AltitudeHypercubeVisualizer(HypercubeVisualizer): ...@@ -149,10 +163,11 @@ class AltitudeHypercubeVisualizer(HypercubeVisualizer):
name = get_display_name_from_object_type(self.trend_test_class) name = get_display_name_from_object_type(self.trend_test_class)
title = 'Evolution of {} trends (significative or not) wrt to the {} with {}'.format(variable_name, xlabel, title = 'Evolution of {} trends (significative or not) wrt to the {} with {}'.format(variable_name, xlabel,
name) name)
title += 'with {} data'.format(subtitle)
ax.set_title(title) ax.set_title(title)
self.show_or_save_to_file(specific_title=title) self.show_or_save_to_file(specific_title=title)
def visualize_trend_test_repartition(self, reduction_function, axes=None): def visualize_trend_test_repartition(self, reduction_function, axes=None, subtitle=''):
if axes is None: if axes is None:
nb_trend_type = len(self.trend_test_class.trend_type_to_style()) nb_trend_type = len(self.trend_test_class.trend_type_to_style())
fig, axes = plt.subplots(1, nb_trend_type, figsize=self.study_visualizer.figsize) fig, axes = plt.subplots(1, nb_trend_type, figsize=self.study_visualizer.figsize)
...@@ -170,48 +185,84 @@ class AltitudeHypercubeVisualizer(HypercubeVisualizer): ...@@ -170,48 +185,84 @@ class AltitudeHypercubeVisualizer(HypercubeVisualizer):
name = get_display_name_from_object_type(self.trend_test_class) name = get_display_name_from_object_type(self.trend_test_class)
title = 'Repartition of trends (significative or not) with {}'.format(name) title = 'Repartition of trends (significative or not) with {}'.format(name)
title += '\n(in % averaged on altitudes & averaged on starting years)' title += '\n(in % averaged on altitudes & averaged on starting years)'
title += 'with {} data'.format(subtitle)
StudyVisualizer.clean_axes_write_title_on_the_left(axes, title, left_border=None) StudyVisualizer.clean_axes_write_title_on_the_left(axes, title, left_border=None)
plt.suptitle(title) plt.suptitle(title)
self.show_or_save_to_file(specific_title=title) self.show_or_save_to_file(specific_title=title)
def visualize_year_trend_test(self, ax=None, marker='o'): @property
def altitude_index_level(self):
return 0
@property
def massif_index_level(self):
return 1
def visualize_year_trend_test(self, ax=None, marker='o', add_detailed_plots=False):
def year_reduction(df_bool): def year_reduction(df_bool):
# Take the mean with respect to all the first axis indices # Take the mean with respect to all the first axis indices
return df_bool.mean(axis=0) return df_bool.mean(axis=0)
self.visualize_trend_test_evolution(reduction_function=year_reduction, xlabel='starting years', for subtitle, reduction_function in self.subtitle_to_reduction_function(year_reduction,
xlabel_values=self.starting_years, ax=ax, marker=marker) add_detailed_plot=add_detailed_plots).items():
self.visualize_trend_test_evolution(reduction_function=reduction_function, xlabel='starting years',
xlabel_values=self.starting_years, ax=ax, marker=marker,
subtitle=subtitle)
@property def visualize_altitude_trend_test(self, ax=None, marker='o', add_detailed_plots=False):
def altitude_index_level(self): def altitude_reduction(df_bool, level):
return 0
def visualize_altitude_trend_test(self, ax=None, marker='o'):
def altitude_reduction(df_bool):
# Take the mean with respect to the years # Take the mean with respect to the years
df_bool = df_bool.mean(axis=1) df_bool = df_bool.mean(axis=1)
# Take the mean with respect the massifs # Take the mean with respect the massifs
return df_bool.mean(level=self.altitude_index_level) print(df_bool.head())
return df_bool.mean(level=level)
self.visualize_trend_test_evolution(reduction_function=altitude_reduction, xlabel='altitude',
xlabel_values=self.altitudes, ax=ax, marker=marker)
@property for subtitle, reduction_function in self.subtitle_to_reduction_function(altitude_reduction, level=self.altitude_index_level,
def massif_index_level(self): add_detailed_plot=add_detailed_plots).items():
return 1 self.visualize_trend_test_evolution(reduction_function=reduction_function, xlabel='altitude',
xlabel_values=self.altitudes, ax=ax, marker=marker,
subtitle=subtitle)
def visualize_massif_trend_test(self, axes=None): def visualize_massif_trend_test(self, axes=None, add_detailed_plots=False):
def massif_reduction(df_bool): def massif_reduction(df_bool, level):
# Take the mean with respect to the years # Take the mean with respect to the years
df_bool = df_bool.mean(axis=1) df_bool = df_bool.mean(axis=1)
# Take the mean with respect the altitude # Take the mean with respect the altitude
return df_bool.mean(level=self.massif_index_level) return df_bool.mean(level=level)
self.visualize_trend_test_repartition(massif_reduction, axes) for subtitle, reduction_function in self.subtitle_to_reduction_function(massif_reduction,level=self.massif_index_level,
add_detailed_plot=add_detailed_plots).items():
self.visualize_trend_test_repartition(reduction_function, axes, subtitle=subtitle)
class QuantityAltitudeHypercubeVisualizer(AltitudeHypercubeVisualizer): class QuantityAltitudeHypercubeVisualizer(AltitudeHypercubeVisualizer):
@property
def study_title(self):
return 'Quantity Altitude Study'
def subtitle_to_reduction_function(self, reduction_function, level=None, add_detailed_plot=False):
subtitle_to_reduction_function = super().subtitle_to_reduction_function(reduction_function, level, add_detailed_plot)
def get_function_from_tuple(tuple_for_axis_0):
def f(df_bool: pd.DataFrame):
# Loc with a tuple with respect the axis 0
df_bool = df_bool.loc[tuple_for_axis_0, :].copy()
# Apply the reduction function
if level is None:
return reduction_function(df_bool)
else:
return reduction_function(df_bool, level-1)
return f
# Add the detailed plot, taken by loc with respect to the first index
if add_detailed_plot:
tuples_axis_0 = self.tuple_values(idx=0)
for tuple_axis_0 in tuples_axis_0:
subtitle_to_reduction_function[tuple_axis_0] = get_function_from_tuple(tuple_axis_0)
return subtitle_to_reduction_function
@property @property
def quantities(self): def quantities(self):
return self.tuple_values(idx=0) return self.tuple_values(idx=0)
......
...@@ -13,22 +13,42 @@ from experiment.trend_analysis.univariate_trend_test.abstract_trend_test import ...@@ -13,22 +13,42 @@ from experiment.trend_analysis.univariate_trend_test.abstract_trend_test import
from utils import get_display_name_from_object_type from utils import get_display_name_from_object_type
def full_trends_with_altitude_hypercube(): # def full_trends_with_altitude_hypercube():
# save_to_file = True
# only_first_one = False
# fast = False
# altitudes = ALL_ALTITUDES[3:-6]
# for study_class in SCM_STUDIES[:]:
# for trend_test_class in [MannKendallTrendTest, GevLocationTrendTest, GevScaleTrendTest, GevShapeTrendTest][:]:
# visualizers = [StudyVisualizer(study, temporal_non_stationarity=True, verbose=False, multiprocessing=True)
# for study in study_iterator(study_class=study_class, only_first_one=only_first_one,
# altitudes=altitudes)]
# altitude_to_visualizer = OrderedDict(zip(altitudes, visualizers))
# visualizer = AltitudeHypercubeVisualizer(altitude_to_visualizer, save_to_file=save_to_file,
# trend_test_class=trend_test_class, fast=fast)
# visualizer.visualize_massif_trend_test()
# visualizer.visualize_year_trend_test()
# visualizer.visualize_altitude_trend_test()
def full_trends_with_quantity_altitude_hypercube():
save_to_file = True save_to_file = True
only_first_one = False only_first_one = False
fast = False fast = False
altitudes = ALL_ALTITUDES[3:-6] altitudes = ALL_ALTITUDES[3:-6]
for study_class in SCM_STUDIES[:]: study_classes = SCM_STUDIES
for trend_test_class in [MannKendallTrendTest, GevLocationTrendTest, GevScaleTrendTest, GevShapeTrendTest][:]: for trend_test_class in [MannKendallTrendTest, GevLocationTrendTest, GevScaleTrendTest, GevShapeTrendTest][:]:
visualizers = [StudyVisualizer(study, temporal_non_stationarity=True, verbose=False, multiprocessing=True) visualizers = [StudyVisualizer(study, temporal_non_stationarity=True, verbose=False, multiprocessing=True)
for study in study_iterator(study_class=study_class, only_first_one=only_first_one, for study in study_iterator_global(study_classes=study_classes, only_first_one=only_first_one,
altitudes=altitudes)] altitudes=altitudes)]
altitude_to_visualizer = OrderedDict(zip(altitudes, visualizers)) study_classes_str = [get_display_name_from_object_type(c) for c in study_classes]
visualizer = AltitudeHypercubeVisualizer(altitude_to_visualizer, save_to_file=save_to_file, quantity_altitude_tuples = list(product(study_classes_str, altitudes))
trend_test_class=trend_test_class, fast=fast) quantity_altitude_to_visualizer = OrderedDict(zip(quantity_altitude_tuples, visualizers))
visualizer.visualize_massif_trend_test() visualizer = QuantityAltitudeHypercubeVisualizer(quantity_altitude_to_visualizer, save_to_file=save_to_file,
visualizer.visualize_year_trend_test() trend_test_class=trend_test_class, fast=fast)
visualizer.visualize_altitude_trend_test() visualizer.visualize_year_trend_test(add_detailed_plots=True)
visualizer.visualize_massif_trend_test(add_detailed_plots=True)
visualizer.visualize_altitude_trend_test(add_detailed_plots=True)
def fast_trends_with_altitude_hypercube(): def fast_trends_with_altitude_hypercube():
...@@ -49,26 +69,6 @@ def fast_trends_with_altitude_hypercube(): ...@@ -49,26 +69,6 @@ def fast_trends_with_altitude_hypercube():
# visualizer.visualize_altitude_trend_test() # visualizer.visualize_altitude_trend_test()
def full_trends_with_quantity_altitude_hypercube():
save_to_file = True
only_first_one = False
fast = False
altitudes = ALL_ALTITUDES[3:-6]
study_classes = SCM_STUDIES
for trend_test_class in [MannKendallTrendTest, GevLocationTrendTest, GevScaleTrendTest, GevShapeTrendTest][:1]:
visualizers = [StudyVisualizer(study, temporal_non_stationarity=True, verbose=False, multiprocessing=True)
for study in study_iterator_global(study_classes=study_classes, only_first_one=only_first_one,
altitudes=altitudes)]
study_classes_str = [get_display_name_from_object_type(c) for c in study_classes]
quantity_altitude_tuples = list(product(study_classes_str, altitudes))
quantity_altitude_to_visualizer = OrderedDict(zip(quantity_altitude_tuples, visualizers))
visualizer = QuantityAltitudeHypercubeVisualizer(quantity_altitude_to_visualizer, save_to_file=save_to_file,
trend_test_class=trend_test_class, fast=fast)
visualizer.visualize_year_trend_test()
# visualizer.visualize_massif_trend_test()
# visualizer.visualize_altitude_trend_test()
def fast_trends_with_quantity_altitude_hypercube(): def fast_trends_with_quantity_altitude_hypercube():
save_to_file = False save_to_file = False
only_first_one = False only_first_one = False
...@@ -84,13 +84,13 @@ def fast_trends_with_quantity_altitude_hypercube(): ...@@ -84,13 +84,13 @@ def fast_trends_with_quantity_altitude_hypercube():
quantity_altitude_to_visualizer = OrderedDict(zip(quantity_altitude_tuples, visualizers)) quantity_altitude_to_visualizer = OrderedDict(zip(quantity_altitude_tuples, visualizers))
visualizer = QuantityAltitudeHypercubeVisualizer(quantity_altitude_to_visualizer, save_to_file=save_to_file, visualizer = QuantityAltitudeHypercubeVisualizer(quantity_altitude_to_visualizer, save_to_file=save_to_file,
trend_test_class=trend_test_class, fast=fast) trend_test_class=trend_test_class, fast=fast)
# visualizer.visualize_year_trend_test() visualizer.visualize_year_trend_test()
# visualizer.visualize_massif_trend_test() # visualizer.visualize_massif_trend_test()
visualizer.visualize_altitude_trend_test() # visualizer.visualize_altitude_trend_test()
def main_run(): def main_run():
# fast_trends_with_altitude_hypercube() # fast_trends_with_altitude_hypercube()
# full_trends_with_altitude_hypercube()
# fast_trends_with_quantity_altitude_hypercube() # fast_trends_with_quantity_altitude_hypercube()
full_trends_with_quantity_altitude_hypercube() full_trends_with_quantity_altitude_hypercube()
......
...@@ -21,8 +21,9 @@ from spatio_temporal_dataset.spatio_temporal_observations.abstract_spatio_tempor ...@@ -21,8 +21,9 @@ from spatio_temporal_dataset.spatio_temporal_observations.abstract_spatio_tempor
class AbstractGevTrendTest(AbstractTrendTest): class AbstractGevTrendTest(AbstractTrendTest):
RRunTimeError_TREND = 'R RunTimeError trend' RRunTimeError_TREND = 'R RunTimeError trend'
def __init__(self, years_after_change_point, maxima_after_change_point, non_stationary_model_class): def __init__(self, years_after_change_point, maxima_after_change_point, non_stationary_model_class, gev_param_name):
super().__init__(years_after_change_point, maxima_after_change_point) super().__init__(years_after_change_point, maxima_after_change_point)
self.gev_param_name = gev_param_name
df = pd.DataFrame({AbstractCoordinates.COORDINATE_T: years_after_change_point}) df = pd.DataFrame({AbstractCoordinates.COORDINATE_T: years_after_change_point})
df_maxima_gev = pd.DataFrame(maxima_after_change_point, index=df.index) df_maxima_gev = pd.DataFrame(maxima_after_change_point, index=df.index)
observations = AbstractSpatioTemporalObservations(df_maxima_gev=df_maxima_gev) observations = AbstractSpatioTemporalObservations(df_maxima_gev=df_maxima_gev)
...@@ -66,35 +67,42 @@ class AbstractGevTrendTest(AbstractTrendTest): ...@@ -66,35 +67,42 @@ class AbstractGevTrendTest(AbstractTrendTest):
else: else:
return super().test_trend_type return super().test_trend_type
def get_coef(self, estimator):
return estimator.margin_function_fitted.get_coef(self.gev_param_name, AbstractCoordinates.COORDINATE_T)
class GevLocationTrendTest(AbstractGevTrendTest): @property
def stationary_coef(self):
return self.get_coef(self.stationary_estimator)
def __init__(self, years_after_change_point, maxima_after_change_point): @property
super().__init__(years_after_change_point, maxima_after_change_point, NonStationaryLocationStationModel) def non_stationary_coef(self):
return self.get_coef(self.non_stationary_estimator)
@property
def ratio_non_stationary_coef(self):
pass
@property @property
def test_sign(self) -> int: def test_sign(self) -> int:
return np.sign(self.non_stationary_estimator.margin_function_fitted.get_coef(GevParams.LOC, return np.sign(self.non_stationary_coef)
AbstractCoordinates.COORDINATE_T))
class GevScaleTrendTest(AbstractGevTrendTest): class GevLocationTrendTest(AbstractGevTrendTest):
def __init__(self, years_after_change_point, maxima_after_change_point): def __init__(self, years_after_change_point, maxima_after_change_point):
super().__init__(years_after_change_point, maxima_after_change_point, NonStationaryScaleStationModel) super().__init__(years_after_change_point, maxima_after_change_point,
NonStationaryLocationStationModel, GevParams.LOC)
@property
def test_sign(self) -> int: class GevScaleTrendTest(AbstractGevTrendTest):
return np.sign(self.non_stationary_estimator.margin_function_fitted.get_coef(GevParams.SCALE,
AbstractCoordinates.COORDINATE_T)) def __init__(self, years_after_change_point, maxima_after_change_point):
super().__init__(years_after_change_point, maxima_after_change_point,
NonStationaryScaleStationModel, GevParams.SCALE)
class GevShapeTrendTest(AbstractGevTrendTest): class GevShapeTrendTest(AbstractGevTrendTest):
def __init__(self, years_after_change_point, maxima_after_change_point): def __init__(self, years_after_change_point, maxima_after_change_point):
super().__init__(years_after_change_point, maxima_after_change_point, NonStationaryShapeStationModel) super().__init__(years_after_change_point, maxima_after_change_point,
NonStationaryShapeStationModel, GevParams.SHAPE)
@property
def test_sign(self) -> int:
return np.sign(self.non_stationary_estimator.margin_function_fitted.get_coef(GevParams.SHAPE,
AbstractCoordinates.COORDINATE_T))
...@@ -85,6 +85,7 @@ class ExampleRandomTrendTest(AbstractTrendTest): ...@@ -85,6 +85,7 @@ class ExampleRandomTrendTest(AbstractTrendTest):
class WarningScoreValue(Warning): class WarningScoreValue(Warning):
pass pass
class MannKendallTrendTest(AbstractTrendTest): class MannKendallTrendTest(AbstractTrendTest):
def __init__(self, years_after_change_point, maxima_after_change_point): def __init__(self, years_after_change_point, maxima_after_change_point):
......
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