Commit 431b97f2 authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[SCM][NON STATIONARY TRENDS] use latitude & longitude from SCM data for fitting

parent 0bfb3355
No related merge requests found
Showing with 27 additions and 26 deletions
+27 -26
......@@ -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
......
......@@ -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]
......
......@@ -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)
......@@ -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)
......
......@@ -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
......
......@@ -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
......
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