test_coordinate_sensitivity.py 3.11 KiB
import unittest

from experiment.meteo_france_SCM_study.crocus.crocus import CrocusSwe
from experiment.meteo_france_SCM_study.visualization.study_visualization.main_study_visualizer import \
    study_iterator_global
from experiment.meteo_france_SCM_study.visualization.study_visualization.non_stationary_trends import \
    ConditionalIndedendenceLocationTrendTest
from experiment.meteo_france_SCM_study.visualization.study_visualization.study_visualizer import StudyVisualizer
from spatio_temporal_dataset.coordinates.transformed_coordinates.transformation.uniform_normalization import \
    BetweenZeroAndOneNormalization, BetweenMinusOneAndOneNormalization, BetweenZeroAndTenNormalization, \
    BetweenZeroAndOneNormalizationMinEpsilon, BetweenZeroAndOneNormalizationMaxEpsilon
from utils import get_display_name_from_object_type


class TestCoordinateSensitivity(unittest.TestCase):
    DISPLAY = False

    def test_coordinate_normalization_sensitivity(self):
        altitudes = [300, 600, 900, 1200, 2100, 3000][-1:]
        transformation_classes = [None, BetweenZeroAndOneNormalization, BetweenZeroAndOneNormalizationMinEpsilon,
                                  BetweenZeroAndOneNormalizationMaxEpsilon][1:2]

        study_classes = [CrocusSwe]
        for study in study_iterator_global(study_classes, altitudes=altitudes, verbose=False):
            if self.DISPLAY:
                print(study.altitude)
            for transformation_class in transformation_classes:
                study_visualizer = StudyVisualizer(study, transformation_class=transformation_class)
                study_visualizer.temporal_non_stationarity = True
                trend_test = ConditionalIndedendenceLocationTrendTest(study_visualizer.dataset)
                years = [1960, 1990]
                mu1s = [trend_test.get_mu_coefs(year)['mu_temporal'] for year in years]
                if self.DISPLAY:
                    print('Stationary')
                    stationary_est = trend_test.load_estimator(trend_test.stationary_margin_model_class,
                                                               starting_point=None)
                    print(stationary_est.result_from_fit.convergence)
                    print(stationary_est.margin_function_fitted.coef_dict)
                    print('Non Stationary')
                    non_stationary_est = trend_test.load_estimator(trend_test.non_stationary_margin_model_class,
                                                                   starting_point=1960)
                    print(non_stationary_est.result_from_fit.convergence)
                    non_stationary_est = trend_test.load_estimator(trend_test.non_stationary_margin_model_class,
                                                                   starting_point=1990)
                    print(non_stationary_est.result_from_fit.convergence)
                    print(non_stationary_est.margin_function_fitted.coef_dict)
                    print(get_display_name_from_object_type(transformation_class), 'mu1s: ', mu1s)
                    print('\n')
                self.assertTrue(0.0 not in mu1s)


if __name__ == '__main__':
    unittest.main()