diff --git a/experiment/meteo_france_data/scm_models_data/abstract_study.py b/experiment/meteo_france_data/scm_models_data/abstract_study.py index 96c348f2c10c40d765f908e907df8ffb4a3b279c..0a18ad1fe19d8aa86e6f76c62313076facffb8d8 100644 --- a/experiment/meteo_france_data/scm_models_data/abstract_study.py +++ b/experiment/meteo_france_data/scm_models_data/abstract_study.py @@ -359,7 +359,7 @@ class AbstractStudy(object): if a > b: zs_all_list.append(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 def altitude_to_massif_names(self) -> Dict[int, List[str]]: diff --git a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/main_study_visualizer.py b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/main_study_visualizer.py index e626ad6fcfbbc88f25e3274285f583bcd268c740..c709209ff37f8e3c8a8a14547727129d3af3e03a 100644 --- a/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/main_study_visualizer.py +++ b/experiment/meteo_france_data/scm_models_data/visualization/study_visualization/main_study_visualizer.py @@ -117,6 +117,17 @@ def all_normal_vizu(): study_visualizer = StudyVisualizer(study, save_to_file=True, temporal_non_stationarity=True) 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(): save_to_file = False only_first_one = True @@ -192,7 +203,8 @@ def maxima_analysis(): def main_run(): # normal_visualization(temporal_non_stationarity=True) - trend_analysis() + # trend_analysis() + case_study() # all_scores_vizu() # maxima_analysis() # all_normal_vizu() diff --git a/experiment/meteo_france_data/stations_data/main_station_comparison.py b/experiment/meteo_france_data/stations_data/main_station_comparison.py index d64a21bd29e5ff1db7b14e7c2b303b81b11ce8bf..7fd8950cbfa394be695ff6feb7d66a2e7a47d2ef 100644 --- a/experiment/meteo_france_data/stations_data/main_station_comparison.py +++ b/experiment/meteo_france_data/stations_data/main_station_comparison.py @@ -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_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__': # visualize_fast_comparison() - visualize_all_stations() + # visualize_all_stations() + wrong_example2() # visualize_non_nan_station() # example() diff --git a/experiment/meteo_france_data/stations_data/visualization/comparisons_visualization/comparisons_visualization.py b/experiment/meteo_france_data/stations_data/visualization/comparisons_visualization/comparisons_visualization.py index dc0239be14d8e2eea0412302b01286bd7bad4c92..9d62fe0f12ea93992ae0d235fa3ff4ccb1b04742 100644 --- a/experiment/meteo_france_data/stations_data/visualization/comparisons_visualization/comparisons_visualization.py +++ b/experiment/meteo_france_data/stations_data/visualization/comparisons_visualization/comparisons_visualization.py @@ -60,10 +60,15 @@ class ComparisonsVisualization(VisualizationParameters): axes = axes.flatten() ax_idx = 0 + massif_and_altitude_and_metric = [] for massif in self.massifs: 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 + 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.show() @@ -79,23 +84,35 @@ class ComparisonsVisualization(VisualizationParameters): df = df.loc[ind] # type: pd.DataFrame colors_station = ['r', 'tab:orange', 'tab:purple', 'm', 'k'] # 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 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] = df[DISTANCE_COLUMN_NAME].pow(0.5) 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()): label = i label += ' ({}m)'.format(s[ALTITUDE_COLUMN_NAME]) label += ' ({}km)'.format(s[DISTANCE_COLUMN_NAME]) - s_values = s.iloc[3:-1].to_dict() - years, maxima = list(s_values.keys()), list(s_values.values()) + maxima, years = self.get_maxima_and_year(s) + # 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) ax.set_title('{} at {}m'.format(massif, comparison.altitude)) ax.legend(prop={'size': 5}) @@ -103,6 +120,14 @@ class ComparisonsVisualization(VisualizationParameters): if 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): return self._visualize_main(self.plot_maxima, 'Recent trend of Annual maxima of snowfall') @@ -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[4] for t in trend_test_res][::step], color=plot_color, marker='x') # Plot maxima + ax.grid() + # print("here") ax.plot(years, maxima, label=label, color=plot_color) def visualize_gev(self):