diff --git a/experiment/meteo_france_SCM_study/abstract_extended_study.py b/experiment/meteo_france_SCM_study/abstract_extended_study.py index e59c9a538661520c867a1ee3932518bc7ff63b88..a2d39a70a8b68e30d28f4bd25b92029bbefb9fab 100644 --- a/experiment/meteo_france_SCM_study/abstract_extended_study.py +++ b/experiment/meteo_france_SCM_study/abstract_extended_study.py @@ -44,7 +44,7 @@ class AbstractExtendedStudy(AbstractStudy): """ Properties """ - def massifs_coordinates(self) -> AbstractSpatialCoordinates: + def massifs_coordinates_for_display(self) -> AbstractSpatialCoordinates: raise ValueError('Coordinates are meaningless for an extended study') @property diff --git a/experiment/meteo_france_SCM_study/abstract_study.py b/experiment/meteo_france_SCM_study/abstract_study.py index 1f2aac2d93704661043adb3675339b71963f74e2..6da9988178d75e275ab0cf05a02e085b87b24816 100644 --- a/experiment/meteo_france_SCM_study/abstract_study.py +++ b/experiment/meteo_france_SCM_study/abstract_study.py @@ -159,18 +159,27 @@ class AbstractStudy(object): return {massif_id: massif_name for massif_id, massif_name in enumerate(self.all_massif_names)} @cached_property - def massifs_coordinates(self) -> AbstractSpatialCoordinates: - # Build coordinate object from df_centroid - return AbstractSpatialCoordinates.from_df(self.df_spatial()) - - def df_spatial(self): + def massifs_coordinates_for_display(self) -> AbstractSpatialCoordinates: # Coordinate object that represents the massif coordinates in Lambert extended - df_centroid = self.load_df_centroid() + # extracted for a csv file, and used only for display purposes + df = self.load_df_centroid() for coord_column in [AbstractCoordinates.COORDINATE_X, AbstractCoordinates.COORDINATE_Y]: - df_centroid.loc[:, coord_column] = df_centroid[coord_column].str.replace(',', '.').astype(float) + df.loc[:, coord_column] = df[coord_column].str.replace(',', '.').astype(float) # Filter, keep massifs present at the altitude of interest - df_centroid = df_centroid.loc[self.study_massif_names] - return df_centroid + df = df.loc[self.study_massif_names] + # Build coordinate object from df_centroid + return AbstractSpatialCoordinates.from_df(df) + + @property + def df_massifs_longitude_and_latitude(self) -> pd.DataFrame: + # DataFrame object that represents the massif coordinates in degrees extracted from the SCM data + any_ordered_dict = list(self.year_to_dataset_ordered_dict.values())[0] + longitude = np.array(any_ordered_dict.variables['longitude'])[self.altitude_mask] + latitude = np.array(any_ordered_dict.variables['latitude'])[self.altitude_mask] + index = self.altitude_to_massif_names[self.altitude] + columns = [AbstractSpatialCoordinates.COORDINATE_X, AbstractSpatialCoordinates.COORDINATE_Y] + data = dict(zip(columns, [longitude, latitude])) + return pd.DataFrame(data=data, index=index, columns=columns) def load_df_centroid(self) -> pd.DataFrame: # Load df_centroid containing all the massif names @@ -223,7 +232,7 @@ class AbstractStudy(object): # ax.scatter(x, y) # ax.text(x, y, massif_name) # Display the center of the massif - ax.scatter(self.massifs_coordinates.x_coordinates, self.massifs_coordinates.y_coordinates, s=1) + ax.scatter(self.massifs_coordinates_for_display.x_coordinates, self.massifs_coordinates_for_display.y_coordinates, s=1) # Improve some explanation on the X axis and on the Y axis ax.set_xlabel('Longitude (km)') ax.xaxis.set_major_formatter(get_km_formatter()) @@ -231,7 +240,7 @@ class AbstractStudy(object): ax.yaxis.set_major_formatter(get_km_formatter()) # Display the name or value of the massif if add_text: - for _, row in self.massifs_coordinates.df_all_coordinates.iterrows(): + for _, row in self.massifs_coordinates_for_display.df_all_coordinates.iterrows(): x, y = list(row) massif_name = row.name value = massif_name_to_value[massif_name] diff --git a/experiment/meteo_france_SCM_study/crocus/crocus.py b/experiment/meteo_france_SCM_study/crocus/crocus.py index 940d7c22af2f743d4915c4b3e11771b46dcf8789..56d755956aefa398e17a09836b0f45e87467d32f 100644 --- a/experiment/meteo_france_SCM_study/crocus/crocus.py +++ b/experiment/meteo_france_SCM_study/crocus/crocus.py @@ -15,11 +15,6 @@ class Crocus(AbstractStudy): super().__init__(variable_class, *args, **kwargs) self.model_name = 'Crocus' - @property - def variable_name(self): - suffix = '' if self.altitude == 2400 else ' sampled every 24 hours' - return super().variable_name + suffix - def annual_aggregation_function(self, *args, **kwargs): return np.mean(*args, **kwargs) @@ -67,11 +62,10 @@ class CrocusDaysWithSnowOnGround(Crocus): if __name__ == '__main__': - for variable_class in [CrocusSweVariable, CrocusDepthVariable]: + for variable_class in [CrocusSweVariable, CrocusDepthVariable][:1]: study = Crocus(variable_class=variable_class, altitude=2400) d = study.year_to_dataset_ordered_dict[1960] + print(study.df_massifs_longitude_and_latitude) time_arr = np.array(d.variables['time']) - print(time_arr) - # print(d) a = study.year_to_daily_time_serie_array[1960] print(a.shape) diff --git a/experiment/meteo_france_SCM_study/crocus/crocus_variables.py b/experiment/meteo_france_SCM_study/crocus/crocus_variables.py index 9e47d8f0fee2613a6c35ff41dc7bd7a361c9ea80..529cd72a103ad577fc602098d8970bb53a7f70c4 100644 --- a/experiment/meteo_france_SCM_study/crocus/crocus_variables.py +++ b/experiment/meteo_france_SCM_study/crocus/crocus_variables.py @@ -4,8 +4,6 @@ from experiment.meteo_france_SCM_study.abstract_variable import AbstractVariable class CrocusVariable(AbstractVariable): - """Crocus data is every 6 hours. To obtain daily data, we select one data out of 4 - (in order to have data that will still be comparable to an instantaneous variable""" def __init__(self, dataset, altitude, variable_name): super().__init__(dataset, altitude) diff --git a/experiment/meteo_france_SCM_study/visualization/study_visualization/non_stationary_trends.py b/experiment/meteo_france_SCM_study/visualization/study_visualization/non_stationary_trends.py index 077b6a3a884faa74369013a75192defdc7f821d9..89be0f2c2fdbbc6214fa7fd41613fd752b86276f 100644 --- a/experiment/meteo_france_SCM_study/visualization/study_visualization/non_stationary_trends.py +++ b/experiment/meteo_france_SCM_study/visualization/study_visualization/non_stationary_trends.py @@ -49,9 +49,9 @@ class AbstractNonStationaryTrendTest(object): if self.verbose: estimator_name = get_display_name_from_object_type(estimator) margin_model_name = get_display_name_from_object_type(margin_model) - text = 'Fittig {} with margin: {} for starting_point={}'.format(estimator_name, - margin_model_name, - starting_point) + text = 'Fittig {} with margin: {} for starting_point={}\n'.format(estimator_name, + margin_model_name, + starting_point) text += 'Fit took {}s and was {}'.format(round(duration, 1), estimator.result_from_fit.convergence) print(text) self._margin_model_class_and_starting_point_to_estimator[(margin_model_class, starting_point)] = estimator diff --git a/experiment/meteo_france_SCM_study/visualization/study_visualization/study_visualizer.py b/experiment/meteo_france_SCM_study/visualization/study_visualization/study_visualizer.py index 4b22cd9c678bfb175c475742205a07e045baa654..a72b1573af3c533acaee8ea94600a833e54f3251 100644 --- a/experiment/meteo_france_SCM_study/visualization/study_visualization/study_visualizer.py +++ b/experiment/meteo_france_SCM_study/visualization/study_visualization/study_visualizer.py @@ -97,7 +97,7 @@ class StudyVisualizer(object): @property def spatial_coordinates(self): - return AbstractSpatialCoordinates.from_df(df=self.study.df_spatial(), + return AbstractSpatialCoordinates.from_df(df=self.study.df_massifs_longitude_and_latitude, transformation_class=self.transformation_class) @property