Commit 63532a88 authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[STATIONS] add metric display in comparisons_visualization graphs

parent c0c3ddce
No related merge requests found
Showing with 64 additions and 9 deletions
+64 -9
...@@ -359,7 +359,7 @@ class AbstractStudy(object): ...@@ -359,7 +359,7 @@ class AbstractStudy(object):
if a > b: if a > b:
zs_all_list.append(zs_list) zs_all_list.append(zs_list)
zs_list = [] zs_list = []
return dict(zip(self.all_massif_names, zs_all_list)) return OrderedDict(zip(self.all_massif_names, zs_all_list))
@cached_property @cached_property
def altitude_to_massif_names(self) -> Dict[int, List[str]]: def altitude_to_massif_names(self) -> Dict[int, List[str]]:
......
...@@ -117,6 +117,17 @@ def all_normal_vizu(): ...@@ -117,6 +117,17 @@ def all_normal_vizu():
study_visualizer = StudyVisualizer(study, save_to_file=True, temporal_non_stationarity=True) study_visualizer = StudyVisualizer(study, save_to_file=True, temporal_non_stationarity=True)
study_visualizer.visualize_all_mean_and_max_graphs() study_visualizer.visualize_all_mean_and_max_graphs()
def case_study():
for study in study_iterator(study_class=SafranSnowfall, only_first_one=False, altitudes=[2100], nb_consecutive_days=3):
study_visualizer = StudyVisualizer(study, save_to_file=False, temporal_non_stationarity=False)
study_visualizer.visualize_all_mean_and_max_graphs()
massif_id = study.study_massif_names.index('Chablais')
print(massif_id)
x, y = study_visualizer.smooth_maxima_x_y(massif_id)
print(x)
print(y)
def scores_vizu(): def scores_vizu():
save_to_file = False save_to_file = False
only_first_one = True only_first_one = True
...@@ -192,7 +203,8 @@ def maxima_analysis(): ...@@ -192,7 +203,8 @@ def maxima_analysis():
def main_run(): def main_run():
# normal_visualization(temporal_non_stationarity=True) # normal_visualization(temporal_non_stationarity=True)
trend_analysis() # trend_analysis()
case_study()
# all_scores_vizu() # all_scores_vizu()
# maxima_analysis() # maxima_analysis()
# all_normal_vizu() # all_normal_vizu()
......
...@@ -27,9 +27,25 @@ def example(): ...@@ -27,9 +27,25 @@ def example():
# vizu._visualize_ax_main(vizu.plot_gev, vizu.comparisons[0], 'Beaufortain', show=True) # vizu._visualize_ax_main(vizu.plot_gev, vizu.comparisons[0], 'Beaufortain', show=True)
vizu._visualize_ax_main(vizu.plot_maxima, vizu.comparisons[0], 'Beaufortain', show=True) vizu._visualize_ax_main(vizu.plot_maxima, vizu.comparisons[0], 'Beaufortain', show=True)
def wrong_example():
vizu = ComparisonsVisualization(altitudes=[1200], normalize_observations=False)
# vizu._visualize_ax_main(vizu.plot_gev, vizu.comparisons[0], 'Beaufortain', show=True)
vizu._visualize_ax_main(vizu.plot_maxima, vizu.comparisons[0], 'Chablais', show=True)
def wrong_example2():
vizu = ComparisonsVisualization(altitudes=[1200], normalize_observations=False)
vizu._visualize_ax_main(vizu.plot_maxima, vizu.comparisons[0], 'Vanoise', show=True)
vizu = ComparisonsVisualization(altitudes=[1800], normalize_observations=False)
vizu._visualize_ax_main(vizu.plot_maxima, vizu.comparisons[0], 'Haute-Maurienne', show=True)
vizu = ComparisonsVisualization(altitudes=[600], normalize_observations=False)
vizu._visualize_ax_main(vizu.plot_maxima, vizu.comparisons[0], 'Mercantour', show=True)
if __name__ == '__main__': if __name__ == '__main__':
# visualize_fast_comparison() # visualize_fast_comparison()
visualize_all_stations() # visualize_all_stations()
wrong_example2()
# visualize_non_nan_station() # visualize_non_nan_station()
# example() # example()
...@@ -60,10 +60,15 @@ class ComparisonsVisualization(VisualizationParameters): ...@@ -60,10 +60,15 @@ class ComparisonsVisualization(VisualizationParameters):
axes = axes.flatten() axes = axes.flatten()
ax_idx = 0 ax_idx = 0
massif_and_altitude_and_metric = []
for massif in self.massifs: for massif in self.massifs:
for c in [c for c in self.comparisons if massif in c.intersection_massif_names]: for c in [c for c in self.comparisons if massif in c.intersection_massif_names]:
self._visualize_ax_main(plot_function, c, massif, axes[ax_idx]) metric = self._visualize_ax_main(plot_function, c, massif, axes[ax_idx])
massif_and_altitude_and_metric.append((massif, c.altitude, metric))
ax_idx += 1 ax_idx += 1
metrics = [t[-1] for t in massif_and_altitude_and_metric]
print('max', [t for t in massif_and_altitude_and_metric if t[-1] == max(metrics)])
print('min', [t for t in massif_and_altitude_and_metric if t[-1] == min(metrics)])
plt.suptitle(title) plt.suptitle(title)
plt.show() plt.show()
...@@ -79,23 +84,35 @@ class ComparisonsVisualization(VisualizationParameters): ...@@ -79,23 +84,35 @@ class ComparisonsVisualization(VisualizationParameters):
df = df.loc[ind] # type: pd.DataFrame df = df.loc[ind] # type: pd.DataFrame
colors_station = ['r', 'tab:orange', 'tab:purple', 'm', 'k'] colors_station = ['r', 'tab:orange', 'tab:purple', 'm', 'k']
# Compute a distance column # Compute a distance column
ind_location = df.index.str.contains(REANALYSE_STR) ind_reanalysis_data = df.index.str.contains(REANALYSE_STR)
df[DISTANCE_COLUMN_NAME] = 0 df[DISTANCE_COLUMN_NAME] = 0
for coordinate_name in [AbstractCoordinates.COORDINATE_X, AbstractCoordinates.COORDINATE_Y]: for coordinate_name in [AbstractCoordinates.COORDINATE_X, AbstractCoordinates.COORDINATE_Y]:
center = df.loc[ind_location, coordinate_name].values[0] center = df.loc[ind_reanalysis_data, coordinate_name].values[0]
df[DISTANCE_COLUMN_NAME] += (center - df[coordinate_name]).pow(2) df[DISTANCE_COLUMN_NAME] += (center - df[coordinate_name]).pow(2)
df[DISTANCE_COLUMN_NAME] = df[DISTANCE_COLUMN_NAME].pow(0.5) df[DISTANCE_COLUMN_NAME] = df[DISTANCE_COLUMN_NAME].pow(0.5)
df[DISTANCE_COLUMN_NAME] = (df[DISTANCE_COLUMN_NAME] / 1000).round(1) df[DISTANCE_COLUMN_NAME] = (df[DISTANCE_COLUMN_NAME] / 1000).round(1)
# Compute
maxima_center, _ = self.get_maxima_and_year(df.loc[ind_reanalysis_data].iloc[0])
metrics = []
for color, (i, s) in zip(colors_station, df.iterrows()): for color, (i, s) in zip(colors_station, df.iterrows()):
label = i label = i
label += ' ({}m)'.format(s[ALTITUDE_COLUMN_NAME]) label += ' ({}m)'.format(s[ALTITUDE_COLUMN_NAME])
label += ' ({}km)'.format(s[DISTANCE_COLUMN_NAME]) label += ' ({}km)'.format(s[DISTANCE_COLUMN_NAME])
s_values = s.iloc[3:-1].to_dict() maxima, years = self.get_maxima_and_year(s)
years, maxima = list(s_values.keys()), list(s_values.values()) # Compute the distance between maxima and maxima_center
# In percent the number of times the observations is stricty higher than the reanalysis
mask = ~np.isnan(maxima_center) & ~np.isnan(maxima)
metric = np.round(np.mean(np.abs(maxima[mask] - maxima_center[mask])), 0)
label += 'Mean absolute diff {}mm'.format(metric)
plot_color = color if REANALYSE_STR not in label else 'g'
# metric = np.mean(np.sign(maxima[mask] - maxima_center[mask]) == 1)
# metric = np.round(metric * 100, 0)
# label += '{}% strictly above'.format(metric)
metrics.append(metric)
plot_color = color if REANALYSE_STR not in label else 'g'
plot_function(ax, ax2, years, maxima, label, plot_color) plot_function(ax, ax2, years, maxima, label, plot_color)
ax.set_title('{} at {}m'.format(massif, comparison.altitude)) ax.set_title('{} at {}m'.format(massif, comparison.altitude))
ax.legend(prop={'size': 5}) ax.legend(prop={'size': 5})
...@@ -103,6 +120,14 @@ class ComparisonsVisualization(VisualizationParameters): ...@@ -103,6 +120,14 @@ class ComparisonsVisualization(VisualizationParameters):
if show: if show:
plt.show() plt.show()
return max(metrics)
def get_maxima_and_year(self, s):
assert isinstance(s, pd.Series)
s_values = s.iloc[3:-1].to_dict()
years, maxima = np.array(list(s_values.keys())), np.array(list(s_values.values()))
return maxima, years
def visualize_maximum(self): def visualize_maximum(self):
return self._visualize_main(self.plot_maxima, 'Recent trend of Annual maxima of snowfall') return self._visualize_main(self.plot_maxima, 'Recent trend of Annual maxima of snowfall')
...@@ -124,6 +149,8 @@ class ComparisonsVisualization(VisualizationParameters): ...@@ -124,6 +149,8 @@ class ComparisonsVisualization(VisualizationParameters):
ax2.plot(starting_years[::step], [t[3] for t in trend_test_res][::step], color=plot_color, marker='o') ax2.plot(starting_years[::step], [t[3] for t in trend_test_res][::step], color=plot_color, marker='o')
ax2.plot(starting_years[::step], [t[4] for t in trend_test_res][::step], color=plot_color, marker='x') ax2.plot(starting_years[::step], [t[4] for t in trend_test_res][::step], color=plot_color, marker='x')
# Plot maxima # Plot maxima
ax.grid()
# print("here")
ax.plot(years, maxima, label=label, color=plot_color) ax.plot(years, maxima, label=label, color=plot_color)
def visualize_gev(self): def visualize_gev(self):
......
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