diff --git a/experiment/safran_study/__init__.py b/experiment/meteo_france_SCM_study/__init__.py similarity index 100% rename from experiment/safran_study/__init__.py rename to experiment/meteo_france_SCM_study/__init__.py diff --git a/experiment/safran_study/safran.py b/experiment/meteo_france_SCM_study/abstract_study.py similarity index 79% rename from experiment/safran_study/safran.py rename to experiment/meteo_france_SCM_study/abstract_study.py index 374ebb460281eee0e9c87193a3487bef05ca0d59..60b885496682eda338f7f74e633332da58260d19 100644 --- a/experiment/safran_study/safran.py +++ b/experiment/meteo_france_SCM_study/abstract_study.py @@ -1,15 +1,14 @@ import os -from typing import List - import os.path as op from collections import OrderedDict +from typing import List import matplotlib.pyplot as plt import pandas as pd from netCDF4 import Dataset -from experiment.safran_study.massif import safran_massif_names_from_datasets -from experiment.safran_study.snowfall_annual_maxima import SafranSnowfall +from experiment.meteo_france_SCM_study.abstract_variable import AbstractVariable +from experiment.meteo_france_SCM_study.massif import safran_massif_names_from_datasets from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates from spatio_temporal_dataset.coordinates.spatial_coordinates.abstract_spatial_coordinates import \ AbstractSpatialCoordinates @@ -17,12 +16,13 @@ from spatio_temporal_dataset.spatio_temporal_observations.annual_maxima_observat from utils import get_full_path, cached_property -class Safran(object): +class AbstractStudy(object): - def __init__(self, safran_altitude=1800, nb_days_of_snowfall=1): + def __init__(self, safran_altitude=1800): assert safran_altitude in [1800, 2400] self.safran_altitude = safran_altitude - self.nb_days_of_snowfall = nb_days_of_snowfall + self.model_name = None + self.variable_class = None def write_to_file(self, df): if not op.exists(self.result_full_path): @@ -33,17 +33,14 @@ class Safran(object): @property def df_all_snowfall_concatenated(self): - df_list = [pd.DataFrame(snowfall, columns=self.safran_massif_names) for snowfall in self.year_to_snowfall.values()] + df_list = [pd.DataFrame(snowfall, columns=self.safran_massif_names) for snowfall in + self.year_to_daily_time_serie.values()] df_concatenated = pd.concat(df_list) return df_concatenated - @property - def df_annual_maxima(self): - return pd.DataFrame(self.year_to_annual_maxima, index=self.safran_massif_names).T - @property def observations_annual_maxima(self): - return AnnualMaxima(df_maxima_gev=self.df_annual_maxima.T) + return AnnualMaxima(df_maxima_gev=pd.DataFrame(self.year_to_annual_maxima, index=self.safran_massif_names)) """ Load some attributes only once """ @@ -51,19 +48,33 @@ class Safran(object): def year_to_annual_maxima(self) -> OrderedDict: # Map each year to an array of size nb_massif year_to_annual_maxima = OrderedDict() - for year, snowfall in self.year_to_snowfall.items(): - year_to_annual_maxima[year] = snowfall.max(axis=0) + for year, time_serie in self.year_to_daily_time_serie.items(): + year_to_annual_maxima[year] = time_serie.max(axis=0) return year_to_annual_maxima @cached_property - def year_to_snowfall(self) -> OrderedDict: + def year_to_dataset_ordered_dict(self) -> OrderedDict: + # Map each year to the correspond netCDF4 Dataset + year_to_dataset = OrderedDict() + nc_files = [(int(f.split('_')[1][:4]), f) for f in os.listdir(self.safran_full_path) if f.endswith('.nc')] + for year, nc_file in sorted(nc_files, key=lambda t: t[0]): + year_to_dataset[year] = Dataset(op.join(self.safran_full_path, nc_file)) + return year_to_dataset + + @cached_property + def year_to_daily_time_serie(self) -> OrderedDict: # Map each year to a matrix of size 365-nb_days_consecutive+1 x nb_massifs - year_to_safran_snowfall = {year: SafranSnowfall(dataset) for year, dataset in - self.year_to_dataset_ordered_dict.items()} - year_to_snowfall = OrderedDict() + year_to_variable = {year: self.instantiate_variable_object(dataset) for year, dataset in + self.year_to_dataset_ordered_dict.items()} + year_to_daily_time_serie = OrderedDict() for year in self.year_to_dataset_ordered_dict.keys(): - year_to_snowfall[year] = year_to_safran_snowfall[year].annual_snowfall(self.nb_days_of_snowfall) - return year_to_snowfall + year_to_daily_time_serie[year] = year_to_variable[year].daily_time_serie + return year_to_daily_time_serie + + def instantiate_variable_object(self, dataset) -> AbstractVariable: + return self.variable_class(dataset) + + ########## @property def safran_massif_names(self) -> List[str]: @@ -74,15 +85,6 @@ class Safran(object): def safran_massif_id_to_massif_name(self): return dict(enumerate(self.safran_massif_names)) - @cached_property - def year_to_dataset_ordered_dict(self) -> OrderedDict: - # Map each year to the correspond netCDF4 Dataset - year_to_dataset = OrderedDict() - nc_files = [(int(f.split('_')[1][:4]), f) for f in os.listdir(self.safran_full_path) if f.endswith('.nc')] - for year, nc_file in sorted(nc_files, key=lambda t: t[0]): - year_to_dataset[year] = Dataset(op.join(self.safran_full_path, nc_file)) - return year_to_dataset - @cached_property def massifs_coordinates(self) -> AbstractSpatialCoordinates: # Coordinate object that represents the massif coordinates in Lambert extended @@ -105,7 +107,6 @@ class Safran(object): df_centroid = self.load_df_centroid() return dict(zip(df_centroid['id'], df_centroid.index)) - """ Visualization methods """ def visualize(self, ax=None, massif_name_to_fill_kwargs=None, show=True, fill=True): @@ -142,7 +143,8 @@ class Safran(object): @property def safran_full_path(self) -> str: - return op.join(self.full_path, 'safran-crocus_{}'.format(self.safran_altitude), 'Safran') + assert self.model_name in ['Safran', 'Crocus'] + return op.join(self.full_path, 'safran-crocus_{}'.format(self.safran_altitude), self.model_name) @property def map_full_path(self) -> str: @@ -150,4 +152,4 @@ class Safran(object): @property def result_full_path(self) -> str: - return op.join(self.full_path, 'results') \ No newline at end of file + return op.join(self.full_path, 'results') diff --git a/experiment/meteo_france_SCM_study/abstract_variable.py b/experiment/meteo_france_SCM_study/abstract_variable.py new file mode 100644 index 0000000000000000000000000000000000000000..acc653c78c5916291296296cd6af89d0018c03a7 --- /dev/null +++ b/experiment/meteo_france_SCM_study/abstract_variable.py @@ -0,0 +1,11 @@ + + +class AbstractVariable(object): + + def __init__(self, dataset): + self.dataset = dataset + + @property + def daily_time_serie(self): + # Return an array of size length of time series x nb_massif + raise NotImplementedError \ No newline at end of file diff --git a/experiment/meteo_france_SCM_study/crocus/__init__.py b/experiment/meteo_france_SCM_study/crocus/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/experiment/meteo_france_SCM_study/crocus/crocus.py b/experiment/meteo_france_SCM_study/crocus/crocus.py new file mode 100644 index 0000000000000000000000000000000000000000..5a9c21775dddb87481ecdcc2d7352619d57d38ad --- /dev/null +++ b/experiment/meteo_france_SCM_study/crocus/crocus.py @@ -0,0 +1,19 @@ +from experiment.meteo_france_SCM_study.abstract_study import AbstractStudy +from experiment.meteo_france_SCM_study.crocus.crocus_variables import CrocusSweVariable, CrocusDepthVariable + + +class Crocus(AbstractStudy): + + def __init__(self, safran_altitude=1800, crocus_variable_class=CrocusSweVariable): + super().__init__(safran_altitude) + self.model_name = 'Crocus' + assert crocus_variable_class in [CrocusSweVariable, CrocusDepthVariable] + self.variable_class = crocus_variable_class + +if __name__ == '__main__': + for variable_class in [CrocusSweVariable, CrocusDepthVariable]: + study = Crocus(crocus_variable_class=variable_class) + # d = study.year_to_dataset_ordered_dict[1960] + # print(d) + a = study.year_to_daily_time_serie[1960] + print(a.shape) \ No newline at end of file diff --git a/experiment/meteo_france_SCM_study/crocus/crocus_variables.py b/experiment/meteo_france_SCM_study/crocus/crocus_variables.py new file mode 100644 index 0000000000000000000000000000000000000000..1825a43791648c6049cd6e711d0901b238dd4a11 --- /dev/null +++ b/experiment/meteo_france_SCM_study/crocus/crocus_variables.py @@ -0,0 +1,27 @@ +import numpy as np + +from experiment.meteo_france_SCM_study.abstract_variable import AbstractVariable + + +class CrocusVariable(AbstractVariable): + + def __init__(self, dataset, variable_name): + super().__init__(dataset) + self.variable_name = variable_name + + @property + def daily_time_serie(self): + # So far the dimension of the time serie is 1460 x 23 + return np.array(self.dataset.variables[self.variable_name])[:, 0, :] + + +class CrocusSweVariable(CrocusVariable): + + def __init__(self, dataset): + super().__init__(dataset, 'SNOWSWE') + + +class CrocusDepthVariable(CrocusVariable): + + def __init__(self, dataset): + super().__init__(dataset, "SNOWDEPTH") diff --git a/experiment/safran_study/main_visualize_safran.py b/experiment/meteo_france_SCM_study/main_visualize.py similarity index 81% rename from experiment/safran_study/main_visualize_safran.py rename to experiment/meteo_france_SCM_study/main_visualize.py index 2f5bc83b52b50eb267947fb27cef0751639e6edd..f20d24f0e7d4ff4ae1e438176527b527f472efe4 100644 --- a/experiment/safran_study/main_visualize_safran.py +++ b/experiment/meteo_france_SCM_study/main_visualize.py @@ -1,7 +1,7 @@ -from experiment.safran_study.safran import Safran +from experiment.meteo_france_SCM_study.safran.safran import Safran from itertools import product -from experiment.safran_study.safran_visualizer import SafranVisualizer +from experiment.meteo_france_SCM_study.safran.safran_visualizer import SafranVisualizer def load_all_safran(only_first_one=False): diff --git a/experiment/safran_study/massif.py b/experiment/meteo_france_SCM_study/massif.py similarity index 100% rename from experiment/safran_study/massif.py rename to experiment/meteo_france_SCM_study/massif.py diff --git a/experiment/meteo_france_SCM_study/safran/__init__.py b/experiment/meteo_france_SCM_study/safran/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/experiment/safran_study/fit_safran.py b/experiment/meteo_france_SCM_study/safran/fit_safran.py similarity index 91% rename from experiment/safran_study/fit_safran.py rename to experiment/meteo_france_SCM_study/safran/fit_safran.py index 843150240e3c069adaa62c86100a5933be9724ac..0e93a16446b3f0fb73e47ac26e7bd2901c686f12 100644 --- a/experiment/safran_study/fit_safran.py +++ b/experiment/meteo_france_SCM_study/safran/fit_safran.py @@ -1,6 +1,6 @@ import pandas as pd -from experiment.safran_study.safran_extended import ExtendedSafran +from experiment.meteo_france_SCM_study.safran.safran_extended import ExtendedSafran from utils import VERSION diff --git a/experiment/meteo_france_SCM_study/safran/safran.py b/experiment/meteo_france_SCM_study/safran/safran.py new file mode 100644 index 0000000000000000000000000000000000000000..a647d239c950af780ba5b5314059e2995592f3da --- /dev/null +++ b/experiment/meteo_france_SCM_study/safran/safran.py @@ -0,0 +1,32 @@ +from typing import List + +import os.path as op +from collections import OrderedDict + +import matplotlib.pyplot as plt +import pandas as pd + +from experiment.meteo_france_SCM_study.abstract_study import AbstractStudy +from experiment.meteo_france_SCM_study.abstract_variable import AbstractVariable +from experiment.meteo_france_SCM_study.massif import safran_massif_names_from_datasets +from experiment.meteo_france_SCM_study.safran.safran_snowfall_variable import SafranSnowfallVariable +from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates +from spatio_temporal_dataset.coordinates.spatial_coordinates.abstract_spatial_coordinates import \ + AbstractSpatialCoordinates +from spatio_temporal_dataset.spatio_temporal_observations.annual_maxima_observations import AnnualMaxima +from utils import cached_property + + +class Safran(AbstractStudy): + + def __init__(self, safran_altitude=1800, nb_days_of_snowfall=1): + super().__init__(safran_altitude) + self.nb_days_of_snowfall = nb_days_of_snowfall + self.model_name = 'Safran' + self.variable_class = SafranSnowfallVariable + + + def instantiate_variable_object(self, dataset) -> AbstractVariable: + return self.variable_class(dataset, self.nb_days_of_snowfall) + + diff --git a/experiment/safran_study/safran_extended.py b/experiment/meteo_france_SCM_study/safran/safran_extended.py similarity index 95% rename from experiment/safran_study/safran_extended.py rename to experiment/meteo_france_SCM_study/safran/safran_extended.py index 775a47d9d909a5c12f20f2fc8f01886e4f5ef505..691d719265136e6f91210869c43e88ea78e521ed 100644 --- a/experiment/safran_study/safran_extended.py +++ b/experiment/meteo_france_SCM_study/safran/safran_extended.py @@ -2,7 +2,7 @@ from collections import OrderedDict import pandas as pd -from experiment.safran_study.safran import Safran +from experiment.meteo_france_SCM_study.safran.safran import Safran from utils import cached_property diff --git a/experiment/safran_study/snowfall_annual_maxima.py b/experiment/meteo_france_SCM_study/safran/safran_snowfall_variable.py similarity index 77% rename from experiment/safran_study/snowfall_annual_maxima.py rename to experiment/meteo_france_SCM_study/safran/safran_snowfall_variable.py index f2bce13bc83a236b831bd873222a1025e4475675..04b25737727e049d82fd0900b056260af4a2f47f 100644 --- a/experiment/safran_study/snowfall_annual_maxima.py +++ b/experiment/meteo_france_SCM_study/safran/safran_snowfall_variable.py @@ -1,7 +1,9 @@ import numpy as np +from experiment.meteo_france_SCM_study.abstract_variable import AbstractVariable -class SafranSnowfall(object): + +class SafranSnowfallVariable(AbstractVariable): """" Hypothesis: @@ -17,12 +19,9 @@ class SafranSnowfall(object): (but here the problem might be that the x_i are not idnependent, they are highly dependent one from another) """ - def __init__(self, dataset): - self.dataset = dataset - # Corresponding starting times - # start_datetime = datetime(year=year, month=8, day=1, hour=6) - # start_times = np.array(dataset.variables['time'])[:-1] - + def __init__(self, dataset, nb_consecutive_days_of_snowfall=1): + super().__init__(dataset) + self.nb_consecutive_days_of_snowfall = nb_consecutive_days_of_snowfall # Compute the daily snowfall in kg/m2 snowfall_rates = np.array(dataset.variables['Snowf']) mean_snowfall_rates = 0.5 * (snowfall_rates[:-1] + snowfall_rates[1:]) @@ -31,13 +30,13 @@ class SafranSnowfall(object): nb_days = len(hourly_snowfall) // 24 self.daily_snowfall = [sum(hourly_snowfall[24 * i:24 * (i+1)]) for i in range(nb_days)] - def annual_snowfall(self, nb_days_of_snowfall=1): + @property + def daily_time_serie(self): # Aggregate the daily snowfall by the number of consecutive days - shifted_list = [self.daily_snowfall[i:] for i in range(nb_days_of_snowfall)] + shifted_list = [self.daily_snowfall[i:] for i in range(self.nb_consecutive_days_of_snowfall)] # First element of shifted_list is of length n, Second element of length n-1, Third element n-2.... # The zip is done with respect to the shortest list snowfall_in_consecutive_days = [sum(e) for e in zip(*shifted_list)] - # Return the maximum of the aggregated list # The returned array is of size n-nb_days+1 x nb_massif return np.array(snowfall_in_consecutive_days) diff --git a/experiment/safran_study/safran_visualizer.py b/experiment/meteo_france_SCM_study/safran/safran_visualizer.py similarity index 91% rename from experiment/safran_study/safran_visualizer.py rename to experiment/meteo_france_SCM_study/safran/safran_visualizer.py index 567e14a10563948df6961aa4a1658574e235c432..8a8c79db81c39be6270ca9cfcfd8abccb6498239 100644 --- a/experiment/safran_study/safran_visualizer.py +++ b/experiment/meteo_france_SCM_study/safran/safran_visualizer.py @@ -1,22 +1,17 @@ -import matplotlib as mpl -import matplotlib.colorbar as cbar import matplotlib.pyplot as plt import pandas as pd -from matplotlib import cm -from mpl_toolkits.axes_grid1 import make_axes_locatable from extreme_estimator.estimator.full_estimator.abstract_full_estimator import \ FullEstimatorInASingleStepWithSmoothMargin from extreme_estimator.estimator.margin_estimator.abstract_margin_estimator import SmoothMarginEstimator from extreme_estimator.extreme_models.margin_model.smooth_margin_model import LinearAllParametersAllDimsMarginModel from extreme_estimator.extreme_models.max_stable_model.max_stable_models import Smith -from extreme_estimator.margin_fits.extreme_params import ExtremeParams from extreme_estimator.margin_fits.gev.gev_params import GevParams from extreme_estimator.margin_fits.gev.gevmle_fit import GevMleFit from extreme_estimator.margin_fits.gpd.gpd_params import GpdParams from extreme_estimator.margin_fits.gpd.gpdmle_fit import GpdMleFit -from experiment.safran_study.safran import Safran -from extreme_estimator.margin_fits.plot.create_shifted_cmap import plot_extreme_param, get_color_rbga +from experiment.meteo_france_SCM_study.safran.safran import Safran +from extreme_estimator.margin_fits.plot.create_shifted_cmap import get_color_rbga_shifted from spatio_temporal_dataset.dataset.abstract_dataset import AbstractDataset @@ -76,7 +71,7 @@ class SafranVisualizer(object): massif_name_to_value = df.loc[gev_param_name, :].to_dict() # Compute the middle point of the values for the color map values = list(massif_name_to_value.values()) - colors = get_color_rbga(ax, gev_param_name, values) + colors = get_color_rbga_shifted(ax, gev_param_name, values) massif_name_to_fill_kwargs = {massif_name: {'color': color} for massif_name, color in zip(self.safran.safran_massif_names, colors)} self.safran.visualize(ax=ax, massif_name_to_fill_kwargs=massif_name_to_fill_kwargs, show=False) @@ -98,7 +93,7 @@ class SafranVisualizer(object): @property def df_gev_mle_each_massif(self): # Fit a margin_fits on each massif - massif_to_gev_mle = {massif_name: GevMleFit(self.safran.df_annual_maxima[massif_name]).gev_params.summary_serie + massif_to_gev_mle = {massif_name: GevMleFit(self.safran.observations_annual_maxima.loc[massif_name]).gev_params.summary_serie for massif_name in self.safran.safran_massif_names} return pd.DataFrame(massif_to_gev_mle, columns=self.safran.safran_massif_names) diff --git a/extreme_estimator/extreme_models/margin_model/margin_function/abstract_margin_function.py b/extreme_estimator/extreme_models/margin_model/margin_function/abstract_margin_function.py index 14e0ca22037eae84145d42e02d8c93cbbc245029..9fec7d591fb2548c320a9e588d49c9aeae2180a1 100644 --- a/extreme_estimator/extreme_models/margin_model/margin_function/abstract_margin_function.py +++ b/extreme_estimator/extreme_models/margin_model/margin_function/abstract_margin_function.py @@ -6,7 +6,7 @@ import numpy as np import pandas as pd from extreme_estimator.margin_fits.gev.gev_params import GevParams -from extreme_estimator.margin_fits.plot.create_shifted_cmap import plot_extreme_param +from extreme_estimator.margin_fits.plot.create_shifted_cmap import plot_extreme_param, imshow_shifted from spatio_temporal_dataset.coordinates.abstract_coordinates import AbstractCoordinates from spatio_temporal_dataset.slicer.split import Split @@ -47,7 +47,8 @@ class AbstractMarginFunction(object): # Visualization function - def set_datapoint_display_parameters(self, spatio_temporal_split=Split.all, datapoint_marker=None, filter=None, color=None, + def set_datapoint_display_parameters(self, spatio_temporal_split=Split.all, datapoint_marker=None, filter=None, + color=None, linewidth=1, datapoint_display=False): self.datapoint_display = datapoint_display self.spatio_temporal_split = spatio_temporal_split @@ -132,13 +133,10 @@ class AbstractMarginFunction(object): grid = self.grid_2D(x, y) if ax is None: ax = plt.gca() - imshow_method = ax.imshow - values = grid[gev_param_name] - norm, shifted_cmap = plot_extreme_param(ax, gev_param_name, values) + # Special display + imshow_shifted(ax, gev_param_name, grid[gev_param_name], x, y) - imshow_method(values, extent=(x.min(), x.max(), y.min(), y.max()), - interpolation='nearest', cmap=shifted_cmap) # X axis ax.set_xlabel('coordinate X') plt.setp(ax.get_xticklabels(), visible=True) @@ -151,7 +149,6 @@ class AbstractMarginFunction(object): if show: plt.show() - def grid_2D(self, x, y): resolution = 100 grid = [] diff --git a/extreme_estimator/margin_fits/plot/create_shifted_cmap.py b/extreme_estimator/margin_fits/plot/create_shifted_cmap.py index dc72f36e4c2300a9d3272503e8179139f4e5e53e..9e83b2789679c18307a3e923cd4d2ae281eb9222 100644 --- a/extreme_estimator/margin_fits/plot/create_shifted_cmap.py +++ b/extreme_estimator/margin_fits/plot/create_shifted_cmap.py @@ -32,7 +32,7 @@ def plot_extreme_param(ax, gev_param_name, values): return norm, shifted_cmap -def get_color_rbga(ax, gev_param_name, values): +def get_color_rbga_shifted(ax, gev_param_name, values): """ For some display it was necessary to transform dark blue values into white values """ @@ -40,5 +40,20 @@ def get_color_rbga(ax, gev_param_name, values): m = cm.ScalarMappable(norm=norm, cmap=shifted_cmap) colors = [m.to_rgba(value) for value in values] if gev_param_name != ExtremeParams.SHAPE: - colors = [color if color != (0, 0, 1, 1) else (1, 1, 1, 1) for color in colors] + colors = [color if color[2] == 1 else (1, 1, 1, 1) for color in colors] return colors + + +def imshow_shifted(ax, gev_param_name, values, x, y): + norm, shifted_cmap = plot_extreme_param(ax, gev_param_name, values) + shifted_cmap.set_bad(color='white') + + masked_array = values + if gev_param_name != ExtremeParams.SHAPE: + epsilon = 1.0 + value = np.min(values) + # The right blue corner will be blue (but most of the time, another display will be on top) + masked_array[-1, -1] = value - epsilon + + ax.imshow(masked_array, extent=(x.min(), x.max(), y.min(), y.max()), cmap=shifted_cmap) + diff --git a/test/test_experiment/test_safran/test_safran_visualizer.py b/test/test_experiment/test_safran/test_safran_visualizer.py index d63d2e97b6164a67b86ebaec193d0f9b01470e49..6f94d5c4b4b365993a3a577f55121f7fb6568bb8 100644 --- a/test/test_experiment/test_safran/test_safran_visualizer.py +++ b/test/test_experiment/test_safran/test_safran_visualizer.py @@ -1,7 +1,7 @@ # import unittest # -# from experiment.safran_study.safran import Safran -# from experiment.safran_study.safran_visualizer import SafranVisualizer +# from experiment.meteo_france_SCM_study.safran import Safran +# from experiment.meteo_france_SCM_study.safran_visualizer import SafranVisualizer # # # class TestSafranVisualizer(unittest.TestCase): diff --git a/test/test_utils.py b/test/test_utils.py index 3f2c854e0038123855c00a02b2ac3d2251a63d59..2bb92efefa07f84a633241d0ac9c4624381170d4 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -7,7 +7,7 @@ from extreme_estimator.extreme_models.max_stable_model.abstract_max_stable_model AbstractMaxStableModelWithCovarianceFunction, CovarianceFunction from extreme_estimator.extreme_models.max_stable_model.max_stable_models import Smith, BrownResnick, Schlather, \ Geometric, ExtremalT, ISchlather -from experiment.safran_study.safran import Safran +from experiment.meteo_france_SCM_study.safran.safran import Safran from spatio_temporal_dataset.coordinates.spatial_coordinates.alps_station_3D_coordinates import \ AlpsStation3DCoordinatesWithAnisotropy from spatio_temporal_dataset.coordinates.spatial_coordinates.generated_spatial_coordinates import \