From 062ffdd2dc290c580c2a4b6428257fd1989b09e6 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Tue, 26 May 2020 18:29:57 +0100 Subject: [PATCH 1/8] fix to preserve orig cube metadata --- esmvalcore/preprocessor/_time.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/esmvalcore/preprocessor/_time.py b/esmvalcore/preprocessor/_time.py index 3338f0b519..7eb3731063 100644 --- a/esmvalcore/preprocessor/_time.py +++ b/esmvalcore/preprocessor/_time.py @@ -460,7 +460,9 @@ def anomalies(cube, period, reference=None, standardize=False): reference_cube = extract_time(cube, **reference) reference = climate_statistics(reference_cube, period=period) if period in ['full']: - cube = cube - reference + orig_cube = cube.copy() + cube = orig_cube - reference + cube.metadata = orig_cube.metadata if standardize: cube_stddev = climate_statistics( cube, operator='std_dev', period=period) From b2047ee7b1e534564f18559f574603948d470940 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Tue, 26 May 2020 18:30:25 +0100 Subject: [PATCH 2/8] test to check for metadata preservation --- tests/unit/preprocessor/_time/test_time.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/unit/preprocessor/_time/test_time.py b/tests/unit/preprocessor/_time/test_time.py index 159eed1463..d676eddda6 100644 --- a/tests/unit/preprocessor/_time/test_time.py +++ b/tests/unit/preprocessor/_time/test_time.py @@ -1022,6 +1022,17 @@ def test_standardized_anomalies(period, standardize=True): ) + +@pytest.mark.parametrize('period, reference', PARAMETERS) +def test_anomalies_preserve_metadata(period, reference, standardize=False): + cube = make_map_data(number_years=2) + cube.var_name = "si" + cube.units = "m" + result = anomalies(cube, period, reference, standardize=standardize) + assert result.var_name == cube.var_name + assert result.units == cube.units + + @pytest.mark.parametrize('period, reference', PARAMETERS) def test_anomalies(period, reference, standardize=False): cube = make_map_data(number_years=2) From de9b03e5837f05d6ed6f99afb506a39d514edc52 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Tue, 26 May 2020 18:49:59 +0100 Subject: [PATCH 3/8] codacy faff --- tests/unit/preprocessor/_time/test_time.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/unit/preprocessor/_time/test_time.py b/tests/unit/preprocessor/_time/test_time.py index d676eddda6..4bad91989b 100644 --- a/tests/unit/preprocessor/_time/test_time.py +++ b/tests/unit/preprocessor/_time/test_time.py @@ -1022,12 +1022,11 @@ def test_standardized_anomalies(period, standardize=True): ) - @pytest.mark.parametrize('period, reference', PARAMETERS) def test_anomalies_preserve_metadata(period, reference, standardize=False): cube = make_map_data(number_years=2) cube.var_name = "si" - cube.units = "m" + cube.units = "m" result = anomalies(cube, period, reference, standardize=standardize) assert result.var_name == cube.var_name assert result.units == cube.units From 2285fd7f524e1518014568608110d94ed4c1a497 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Wed, 27 May 2020 12:58:26 +0100 Subject: [PATCH 4/8] more in depth check on cube metadata --- tests/unit/preprocessor/_time/test_time.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/unit/preprocessor/_time/test_time.py b/tests/unit/preprocessor/_time/test_time.py index 4bad91989b..2eb34ebb25 100644 --- a/tests/unit/preprocessor/_time/test_time.py +++ b/tests/unit/preprocessor/_time/test_time.py @@ -1028,8 +1028,11 @@ def test_anomalies_preserve_metadata(period, reference, standardize=False): cube.var_name = "si" cube.units = "m" result = anomalies(cube, period, reference, standardize=standardize) - assert result.var_name == cube.var_name - assert result.units == cube.units + assert result.metadata == cube.metadata + for coord_cube, coord_res in zip(cube.coords(), result.coords()): + if coord_cube.has_bounds() and coord_res.has_bounds(): + assert_array_equal(coord_cube.bounds, coord_res.bounds) + assert coord_cube == coord_res @pytest.mark.parametrize('period, reference', PARAMETERS) From 9c46e6c7d2bc63fe5c228a6ee7b1b7df00f09679 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Wed, 27 May 2020 17:06:52 +0100 Subject: [PATCH 5/8] Bouwe suggestion Co-authored-by: Bouwe Andela --- esmvalcore/preprocessor/_time.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/esmvalcore/preprocessor/_time.py b/esmvalcore/preprocessor/_time.py index 7eb3731063..c35dfc1dbc 100644 --- a/esmvalcore/preprocessor/_time.py +++ b/esmvalcore/preprocessor/_time.py @@ -460,9 +460,9 @@ def anomalies(cube, period, reference=None, standardize=False): reference_cube = extract_time(cube, **reference) reference = climate_statistics(reference_cube, period=period) if period in ['full']: - orig_cube = cube.copy() - cube = orig_cube - reference - cube.metadata = orig_cube.metadata + metadata = copy.deepcopy(cube.metadata) + cube = cube - reference + cube.metadata = metadata if standardize: cube_stddev = climate_statistics( cube, operator='std_dev', period=period) From 351056573dc2a93f5a3cc1d0a8c0d7f7f375579e Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Wed, 27 May 2020 17:15:04 +0100 Subject: [PATCH 6/8] import missing --- esmvalcore/preprocessor/_time.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/esmvalcore/preprocessor/_time.py b/esmvalcore/preprocessor/_time.py index c35dfc1dbc..217fdd443f 100644 --- a/esmvalcore/preprocessor/_time.py +++ b/esmvalcore/preprocessor/_time.py @@ -3,18 +3,19 @@ Allows for selecting data subsets using certain time bounds; constructing seasonal and area averages. """ +import copy import datetime import logging from warnings import filterwarnings import dask.array as da import iris -import iris.cube import iris.coord_categorisation +import iris.cube import iris.exceptions import iris.util -from iris.time import PartialDateTime import numpy as np +from iris.time import PartialDateTime from ._shared import get_iris_analysis_operation, operator_accept_weights From 80a371fb1c89c6f59f15ca7a385ce0cfa26f2b4e Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Thu, 28 May 2020 12:15:18 +0100 Subject: [PATCH 7/8] Bouwe suggestion Co-authored-by: Bouwe Andela --- tests/unit/preprocessor/_time/test_time.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/unit/preprocessor/_time/test_time.py b/tests/unit/preprocessor/_time/test_time.py index 2eb34ebb25..6625048fb2 100644 --- a/tests/unit/preprocessor/_time/test_time.py +++ b/tests/unit/preprocessor/_time/test_time.py @@ -1027,8 +1027,9 @@ def test_anomalies_preserve_metadata(period, reference, standardize=False): cube = make_map_data(number_years=2) cube.var_name = "si" cube.units = "m" + metadata = copy.deepcopy(cube.metadata) result = anomalies(cube, period, reference, standardize=standardize) - assert result.metadata == cube.metadata + assert result.metadata == metadata for coord_cube, coord_res in zip(cube.coords(), result.coords()): if coord_cube.has_bounds() and coord_res.has_bounds(): assert_array_equal(coord_cube.bounds, coord_res.bounds) From 15ff704ef689b11c91f7592970e56152d250b122 Mon Sep 17 00:00:00 2001 From: Valeriu Predoi Date: Thu, 28 May 2020 12:40:56 +0100 Subject: [PATCH 8/8] fixed imports --- tests/unit/preprocessor/_time/test_time.py | 27 +++++++++++----------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/tests/unit/preprocessor/_time/test_time.py b/tests/unit/preprocessor/_time/test_time.py index 6625048fb2..f9fd445bc8 100644 --- a/tests/unit/preprocessor/_time/test_time.py +++ b/tests/unit/preprocessor/_time/test_time.py @@ -1,25 +1,26 @@ """Unit tests for the :func:`esmvalcore.preprocessor._time` module.""" +import copy import unittest -import pytest -import tests -import numpy as np -from numpy.testing import assert_array_equal, assert_array_almost_equal - -from cf_units import Unit import iris import iris.coord_categorisation import iris.coords +import numpy as np +import pytest +from cf_units import Unit from iris.cube import Cube +from numpy.testing import assert_array_almost_equal, assert_array_equal -from esmvalcore.preprocessor._time import ( - extract_month, extract_season, extract_time, - regrid_time, - decadal_statistics, annual_statistics, seasonal_statistics, - monthly_statistics, daily_statistics, timeseries_filter, - climate_statistics, anomalies -) +import tests +from esmvalcore.preprocessor._time import (annual_statistics, anomalies, + climate_statistics, + daily_statistics, + decadal_statistics, extract_month, + extract_season, extract_time, + monthly_statistics, regrid_time, + seasonal_statistics, + timeseries_filter) def _create_sample_cube():