| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| '''Unit test for the metrics.py module.''' |
| |
| import unittest |
| import datetime as dt |
| |
| from ocw.dataset import Dataset |
| import ocw.metrics as metrics |
| |
| import numpy as np |
| import numpy.ma as ma |
| import numpy.testing as npt |
| |
| |
| class TestBias(unittest.TestCase): |
| '''Test the metrics.Bias metric.''' |
| |
| def setUp(self): |
| self.bias = metrics.Bias() |
| # Initialize reference dataset |
| self.reference_lat = np.array([10, 12, 14, 16, 18]) |
| self.reference_lon = np.array([100, 102, 104, 106, 108]) |
| self.reference_time = np.array( |
| [dt.datetime(2000, x, 1) for x in range(1, 13)]) |
| flat_array = np.array(range(300)) |
| self.reference_value = flat_array.reshape(12, 5, 5) |
| self.reference_variable = 'prec' |
| self.reference_dataset = Dataset(self.reference_lat, |
| self.reference_lon, |
| self.reference_time, |
| self.reference_value, |
| self.reference_variable) |
| # Initialize target dataset |
| self.target_lat = np.array([1, 2, 4, 6, 8]) |
| self.target_lon = np.array([10, 12, 14, 16, 18]) |
| self.target_time = np.array( |
| [dt.datetime(2001, x, 1) for x in range(1, 13)]) |
| flat_array = np.array(range(300, 600)) |
| self.target_value = flat_array.reshape(12, 5, 5) |
| self.target_variable = 'tasmax' |
| self.target_dataset = Dataset(self.target_lat, |
| self.target_lon, |
| self.target_time, |
| self.target_value, |
| self.target_variable) |
| |
| def test_function_run(self): |
| '''Test bias function between reference dataset and target dataset.''' |
| expected_result = np.zeros((12, 5, 5), dtype=np.int) |
| expected_result.fill(-300) |
| np.testing.assert_array_equal(self.bias.run( |
| self.target_dataset, self.reference_dataset), expected_result) |
| |
| |
| class TestSpatialPatternTaylorDiagram(unittest.TestCase): |
| '''Test the metrics.SpatialPatternTaylorDiagram''' |
| |
| def setUp(self): |
| self.taylor_diagram = metrics.SpatialPatternTaylorDiagram() |
| self.ref_dataset = Dataset( |
| np.array([1., 1., 1., 1., 1.]), |
| np.array([1., 1., 1., 1., 1.]), |
| np.array([dt.datetime(2000, x, 1) for x in range(1, 13)]), |
| # Reshapped array with 300 values incremented by 5 |
| np.arange(0, 1500, 5).reshape(12, 5, 5), |
| 'ds1' |
| ) |
| |
| self.tar_dataset = Dataset( |
| np.array([1., 1., 1., 1., 1.]), |
| np.array([1., 1., 1., 1., 1.]), |
| np.array([dt.datetime(2000, x, 1) for x in range(1, 13)]), |
| # Reshapped array with 300 values incremented by 2 |
| np.arange(0, 600, 2).reshape(12, 5, 5), |
| 'ds2' |
| ) |
| |
| def test_function_run(self): |
| np.testing.assert_array_equal(self.taylor_diagram.run( |
| self.ref_dataset, self.tar_dataset), ma.array([0.4, 1.0])) |
| |
| |
| class TestTemporalStdDev(unittest.TestCase): |
| '''Test the metrics.TemporalStdDev metric.''' |
| |
| def setUp(self): |
| self.temporal_std_dev = metrics.TemporalStdDev() |
| # Initialize target dataset |
| self.target_lat = np.array([10, 12, 14, 16, 18]) |
| self.target_lon = np.array([100, 102, 104, 106, 108]) |
| self.target_time = np.array( |
| [dt.datetime(2000, x, 1) for x in range(1, 13)]) |
| flat_array = np.array(range(300)) |
| self.target_value = flat_array.reshape(12, 5, 5) |
| self.target_variable = 'prec' |
| self.target_dataset = Dataset(self.target_lat, |
| self.target_lon, |
| self.target_time, |
| self.target_value, |
| self.target_variable) |
| |
| def test_function_run(self): |
| '''Test TemporalStdDev function for target dataset.''' |
| expected_result = np.zeros((5, 5),) |
| expected_result.fill(90.13878189) |
| npt.assert_almost_equal(self.temporal_std_dev.run( |
| self.target_dataset), expected_result) |
| |
| |
| class TestStdDevRatio(unittest.TestCase): |
| '''Test the metrics.StdDevRatio metric''' |
| |
| def setUp(self): |
| self.std_dev_ratio = metrics.StdDevRatio() |
| self.ref_dataset = Dataset( |
| np.array([1., 1., 1., 1., 1.]), |
| np.array([1., 1., 1., 1., 1.]), |
| np.array([dt.datetime(2000, x, 1) for x in range(1, 13)]), |
| # Reshapped array with 300 values incremented by 5 |
| np.arange(0, 1500, 5).reshape(12, 5, 5), |
| 'ds1' |
| ) |
| |
| self.tar_dataset = Dataset( |
| np.array([1., 1., 1., 1., 1.]), |
| np.array([1., 1., 1., 1., 1.]), |
| np.array([dt.datetime(2000, x, 1) for x in range(1, 13)]), |
| # Reshapped array with 300 values incremented by 2 |
| np.arange(0, 600, 2).reshape(12, 5, 5), |
| 'ds2' |
| ) |
| |
| def test_function_run(self): |
| self.assertTrue(self.std_dev_ratio.run( |
| self.ref_dataset, self.tar_dataset), 0.4) |
| |
| |
| class TestPatternCorrelation(unittest.TestCase): |
| '''Test the metrics.PatternCorrelation metric''' |
| |
| def setUp(self): |
| self.pattern_correlation = metrics.PatternCorrelation() |
| self.ref_dataset = Dataset( |
| np.array([1., 1., 1., 1., 1.]), |
| np.array([1., 1., 1., 1., 1.]), |
| np.array([dt.datetime(2000, x, 1) for x in range(1, 13)]), |
| # Reshapped array with 300 values incremented by 5 |
| np.arange(0, 1500, 5).reshape(12, 5, 5), |
| 'ds1' |
| ) |
| |
| self.tar_dataset = Dataset( |
| np.array([1., 1., 1., 1., 1.]), |
| np.array([1., 1., 1., 1., 1.]), |
| np.array([dt.datetime(2000, x, 1) for x in range(1, 13)]), |
| # Reshapped array with 300 values incremented by 2 |
| np.arange(0, 600, 2).reshape(12, 5, 5), |
| 'ds2' |
| ) |
| |
| def test_function_run(self): |
| pattern = self.pattern_correlation.run( |
| self.tar_dataset, self.ref_dataset) |
| self.assertEqual(pattern, 1.0) |
| |
| |
| class TestTemporalCorrelation(unittest.TestCase): |
| '''Test the metrics.TemporalCorrelation metric.''' |
| |
| def setUp(self): |
| # Set metric. |
| self.metric = metrics.TemporalCorrelation() |
| # Initialize reference dataset. |
| self.ref_lats = np.array([10, 20, 30, 40, 50]) |
| self.ref_lons = np.array([5, 15, 25, 35, 45]) |
| self.ref_times = np.array([dt.datetime(2000, x, 1) |
| for x in range(1, 13)]) |
| self.ref_values = np.array(range(300)).reshape(12, 5, 5) |
| self.ref_variable = "ref" |
| self.ref_dataset = Dataset(self.ref_lats, |
| self.ref_lons, |
| self.ref_times, |
| self.ref_values, |
| self.ref_variable) |
| # Initialize target datasets. |
| self.tgt_lats = np.array([10, 20, 30, 40, 50]) |
| self.tgt_lons = np.array([5, 15, 25, 35, 45]) |
| self.tgt_times = np.array([dt.datetime(2000, x, 1) |
| for x in range(1, 13)]) |
| self.tgt_variable = "tgt" |
| self.tgt_values_inc = np.array(range(300, 600)).reshape(12, 5, 5) |
| self.tgt_values_dec = np.array(range(299, -1, -1)).reshape(12, 5, 5) |
| self.tgt_dataset_inc = Dataset(self.tgt_lats, |
| self.tgt_lons, |
| self.tgt_times, |
| self.tgt_values_inc, |
| self.tgt_variable) |
| self.tgt_dataset_dec = Dataset(self.tgt_lats, |
| self.tgt_lons, |
| self.tgt_times, |
| self.tgt_values_dec, |
| self.tgt_variable) |
| |
| def test_identical_inputs(self): |
| expected = np.ones(25).reshape(5, 5) |
| tc = self.metric.run(self.ref_dataset, self.ref_dataset) |
| np.testing.assert_array_equal(tc, expected) |
| |
| def test_positive_correlation(self): |
| expected = np.ones(25).reshape(5, 5) |
| tc = self.metric.run(self.ref_dataset, self.tgt_dataset_inc) |
| np.testing.assert_array_equal(tc, expected) |
| |
| def test_negative_correlation(self): |
| expected_tc = np.array([-1] * 25).reshape(5, 5) |
| tc = self.metric.run(self.ref_dataset, self.tgt_dataset_dec) |
| np.testing.assert_array_equal(tc, expected_tc) |
| |
| |
| class TestTemporalMeanBias(unittest.TestCase): |
| '''Test the metrics.TemporalMeanBias metric.''' |
| |
| def setUp(self): |
| self.mean_bias = metrics.TemporalMeanBias() |
| # Initialize reference dataset |
| self.reference_lat = np.array([10, 12, 14, 16, 18]) |
| self.reference_lon = np.array([100, 102, 104, 106, 108]) |
| self.reference_time = np.array( |
| [dt.datetime(2000, x, 1) for x in range(1, 13)]) |
| flat_array = np.array(range(300)) |
| self.reference_value = flat_array.reshape(12, 5, 5) |
| self.reference_variable = 'prec' |
| self.reference_dataset = Dataset(self.reference_lat, |
| self.reference_lon, |
| self.reference_time, |
| self.reference_value, |
| self.reference_variable) |
| # Initialize target dataset |
| self.target_lat = np.array([1, 2, 4, 6, 8]) |
| self.target_lon = np.array([10, 12, 14, 16, 18]) |
| self.target_time = np.array( |
| [dt.datetime(2001, x, 1) for x in range(1, 13)]) |
| flat_array = np.array(range(300, 600)) |
| self.target_value = flat_array.reshape(12, 5, 5) |
| self.target_variable = 'tasmax' |
| self.target_dataset = Dataset(self.target_lat, |
| self.target_lon, |
| self.target_time, |
| self.target_value, |
| self.target_variable) |
| |
| def test_function_run(self): |
| ''' |
| Test mean bias function between reference dataset and target dataset. |
| ''' |
| expected_result = np.zeros((5, 5), dtype=np.int) |
| expected_result.fill(-300) |
| np.testing.assert_array_equal(self.mean_bias.run( |
| self.target_dataset, self.reference_dataset), expected_result) |
| |
| |
| class TestRMSError(unittest.TestCase): |
| '''Test the metrics.RMSError metric.''' |
| |
| def setUp(self): |
| # Set metric. |
| self.metric = metrics.RMSError() |
| # Initialize reference dataset. |
| self.ref_lats = np.array([10, 20, 30, 40, 50]) |
| self.ref_lons = np.array([5, 15, 25, 35, 45]) |
| self.ref_times = np.array([dt.datetime(2000, x, 1) |
| for x in range(1, 13)]) |
| self.ref_values = np.array([4] * 300).reshape(12, 5, 5) |
| self.ref_variable = "ref" |
| self.ref_dataset = Dataset(self.ref_lats, |
| self.ref_lons, |
| self.ref_times, |
| self.ref_values, |
| self.ref_variable) |
| # Initialize target dataset. |
| self.tgt_lats = np.array([10, 20, 30, 40, 50]) |
| self.tgt_lons = np.array([5, 15, 25, 35, 45]) |
| self.tgt_times = np.array([dt.datetime(2000, x, 1) |
| for x in range(1, 13)]) |
| self.tgt_values = np.array([2] * 300).reshape(12, 5, 5) |
| self.tgt_variable = "tgt" |
| self.tgt_dataset = Dataset(self.tgt_lats, |
| self.tgt_lons, |
| self.tgt_times, |
| self.tgt_values, |
| self.tgt_variable) |
| |
| def test_function_run(self): |
| result = self.metric.run(self.ref_dataset, self.tgt_dataset) |
| self.assertEqual(result, 2.0) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |