From 409ebd388e2228b924809507dacefb487e573e45 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Sun, 4 Mar 2018 22:10:23 -0800 Subject: [PATCH 1/4] Resolve more warnings in the xarray test suite Currently down from 255 to 104 warnings. --- xarray/tests/test_dataarray.py | 2 +- xarray/tests/test_dataset.py | 2 +- xarray/tests/test_duck_array_ops.py | 123 +++++++++++++++------------- 3 files changed, 70 insertions(+), 57 deletions(-) diff --git a/xarray/tests/test_dataarray.py b/xarray/tests/test_dataarray.py index 18fc27c96ab..f42df1cbabb 100644 --- a/xarray/tests/test_dataarray.py +++ b/xarray/tests/test_dataarray.py @@ -2030,7 +2030,7 @@ def test_groupby_math(self): actual = array.coords['x'] + grouped assert_identical(expected, actual) - ds = array.coords['x'].to_dataset('X') + ds = array.coords['x'].to_dataset(name='X') expected = array + ds actual = grouped + ds assert_identical(expected, actual) diff --git a/xarray/tests/test_dataset.py b/xarray/tests/test_dataset.py index 1b557479ec1..94ee7c51e34 100644 --- a/xarray/tests/test_dataset.py +++ b/xarray/tests/test_dataset.py @@ -4162,7 +4162,7 @@ def test_rolling_construct(center, window): # with fill_value ds_rolling_mean = ds_rolling.construct( 'window', stride=2, fill_value=0.0).mean('window') - assert ds_rolling_mean.isnull().sum() == 0 + assert (ds_rolling_mean.isnull().sum() == 0).to_array(dim='vars').all() assert (ds_rolling_mean['x'] == 0.0).sum() >= 0 diff --git a/xarray/tests/test_duck_array_ops.py b/xarray/tests/test_duck_array_ops.py index 99250796d8c..2983e1991f1 100644 --- a/xarray/tests/test_duck_array_ops.py +++ b/xarray/tests/test_duck_array_ops.py @@ -5,6 +5,7 @@ import numpy as np import pytest from numpy import array, nan +import warnings from xarray import DataArray, concat from xarray.core.duck_array_ops import ( @@ -208,50 +209,58 @@ def test_reduce(dim_num, dtype, dask, func, skipna, aggdim): da = construct_dataarray(dim_num, dtype, contains_nan=True, dask=dask) axis = None if aggdim is None else da.get_axis_num(aggdim) - if (LooseVersion(np.__version__) >= LooseVersion('1.13.0') and - da.dtype.kind == 'O' and skipna): - # Numpy < 1.13 does not handle object-type array. - try: - if skipna: - expected = getattr(np, 'nan{}'.format(func))(da.values, - axis=axis) - else: - expected = getattr(np, func)(da.values, axis=axis) - - actual = getattr(da, func)(skipna=skipna, dim=aggdim) - assert np.allclose(actual.values, np.array(expected), rtol=1.0e-4, - equal_nan=True) - except (TypeError, AttributeError, ZeroDivisionError): - # TODO currently, numpy does not support some methods such as - # nanmean for object dtype - pass - - # make sure the compatiblility with pandas' results. - actual = getattr(da, func)(skipna=skipna, dim=aggdim) - if func == 'var': - expected = series_reduce(da, func, skipna=skipna, dim=aggdim, ddof=0) - assert_allclose(actual, expected, rtol=rtol) - # also check ddof!=0 case - actual = getattr(da, func)(skipna=skipna, dim=aggdim, ddof=5) - expected = series_reduce(da, func, skipna=skipna, dim=aggdim, ddof=5) - assert_allclose(actual, expected, rtol=rtol) - else: - expected = series_reduce(da, func, skipna=skipna, dim=aggdim) - assert_allclose(actual, expected, rtol=rtol) - - # make sure the dtype argument - if func not in ['max', 'min']: - actual = getattr(da, func)(skipna=skipna, dim=aggdim, dtype=float) - assert actual.dtype == float - - # without nan - da = construct_dataarray(dim_num, dtype, contains_nan=False, dask=dask) - actual = getattr(da, func)(skipna=skipna) - expected = getattr(np, 'nan{}'.format(func))(da.values) - if actual.dtype == object: - assert actual.values == np.array(expected) - else: - assert np.allclose(actual.values, np.array(expected), rtol=rtol) + # TODO: remove these after resolving + # https://github.com/dask/dask/issues/3245 + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', 'All-NaN slice') + warnings.filterwarnings('ignore', 'invalid value encountered in') + + if (LooseVersion(np.__version__) >= LooseVersion('1.13.0') and + da.dtype.kind == 'O' and skipna): + # Numpy < 1.13 does not handle object-type array. + try: + if skipna: + expected = getattr(np, 'nan{}'.format(func))(da.values, + axis=axis) + else: + expected = getattr(np, func)(da.values, axis=axis) + + actual = getattr(da, func)(skipna=skipna, dim=aggdim) + assert np.allclose(actual.values, np.array(expected), + rtol=1.0e-4, equal_nan=True) + except (TypeError, AttributeError, ZeroDivisionError): + # TODO currently, numpy does not support some methods such as + # nanmean for object dtype + pass + + # make sure the compatiblility with pandas' results. + actual = getattr(da, func)(skipna=skipna, dim=aggdim) + if func == 'var': + expected = series_reduce(da, func, skipna=skipna, dim=aggdim, + ddof=0) + assert_allclose(actual, expected, rtol=rtol) + # also check ddof!=0 case + actual = getattr(da, func)(skipna=skipna, dim=aggdim, ddof=5) + expected = series_reduce(da, func, skipna=skipna, dim=aggdim, + ddof=5) + assert_allclose(actual, expected, rtol=rtol) + else: + expected = series_reduce(da, func, skipna=skipna, dim=aggdim) + assert_allclose(actual, expected, rtol=rtol) + + # make sure the dtype argument + if func not in ['max', 'min']: + actual = getattr(da, func)(skipna=skipna, dim=aggdim, dtype=float) + assert actual.dtype == float + + # without nan + da = construct_dataarray(dim_num, dtype, contains_nan=False, dask=dask) + actual = getattr(da, func)(skipna=skipna) + expected = getattr(np, 'nan{}'.format(func))(da.values) + if actual.dtype == object: + assert actual.values == np.array(expected) + else: + assert np.allclose(actual.values, np.array(expected), rtol=rtol) @pytest.mark.parametrize('dim_num', [1, 2]) @@ -280,17 +289,21 @@ def test_argmin_max(dim_num, dtype, contains_nan, dask, func, skipna, aggdim): da = construct_dataarray(dim_num, dtype, contains_nan=contains_nan, dask=dask) - if aggdim == 'y' and contains_nan and skipna: - with pytest.raises(ValueError): - actual = da.isel(**{ - aggdim: getattr(da, 'arg' + func)(dim=aggdim, - skipna=skipna).compute()}) - return - - actual = da.isel(**{aggdim: getattr(da, 'arg' + func) - (dim=aggdim, skipna=skipna).compute()}) - expected = getattr(da, func)(dim=aggdim, skipna=skipna) - assert_allclose(actual.drop(actual.coords), expected.drop(expected.coords)) + with warnings.catch_warnings(): + warnings.filterwarnings('ignore', 'All-NaN slice') + + if aggdim == 'y' and contains_nan and skipna: + with pytest.raises(ValueError): + actual = da.isel(**{ + aggdim: getattr(da, 'arg' + func)( + dim=aggdim, skipna=skipna).compute()}) + return + + actual = da.isel(**{aggdim: getattr(da, 'arg' + func) + (dim=aggdim, skipna=skipna).compute()}) + expected = getattr(da, func)(dim=aggdim, skipna=skipna) + assert_allclose(actual.drop(actual.coords), + expected.drop(expected.coords)) def test_argmin_max_error(): From bd02a58253467051e8bac24e1d7388fd97edfb54 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Sun, 4 Mar 2018 22:32:48 -0800 Subject: [PATCH 2/4] Silence irrelevant warning from RasterIO --- xarray/backends/rasterio_.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/xarray/backends/rasterio_.py b/xarray/backends/rasterio_.py index 8777f6e7053..9c3343601d4 100644 --- a/xarray/backends/rasterio_.py +++ b/xarray/backends/rasterio_.py @@ -2,6 +2,7 @@ import warnings from collections import OrderedDict from distutils.version import LooseVersion +import warnings import numpy as np @@ -225,10 +226,13 @@ def open_rasterio(filename, parse_coordinates=None, chunks=None, cache=None, # Is the TIF tiled? (bool) # We cast it to an int for netCDF compatibility attrs['is_tiled'] = np.uint8(riods.is_tiled) - if hasattr(riods, 'transform'): - # Affine transformation matrix (tuple of floats) - # Describes coefficients mapping pixel coordinates to CRS - attrs['transform'] = tuple(riods.transform) + with warnings.catch_warnings(): + # casting riods.transform to a tuple makes this future proof + warnings.simplefilter('ignore', FutureWarning) + if hasattr(riods, 'transform'): + # Affine transformation matrix (tuple of floats) + # Describes coefficients mapping pixel coordinates to CRS + attrs['transform'] = tuple(riods.transform) if hasattr(riods, 'nodatavals'): # The nodata values for the raster bands attrs['nodatavals'] = tuple([np.nan if nodataval is None else nodataval From 33208255bcc1775cdf72f18ad736a7c5b27a0d76 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Sun, 4 Mar 2018 22:34:00 -0800 Subject: [PATCH 3/4] add whats-new for rasterio warnings --- doc/whats-new.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/whats-new.rst b/doc/whats-new.rst index ab667ceba3f..05a8f38a31a 100644 --- a/doc/whats-new.rst +++ b/doc/whats-new.rst @@ -52,6 +52,8 @@ Bug fixes - Fix the precision drop after indexing datetime64 arrays (:issue:`1932`). By `Keisuke Fujii `_. +- Silenced irrelevant warnings issued by ``open_rasterio`` (:issue:`1964`). + By `Stephan Hoyer `_. .. _whats-new.0.10.1: From 4f52fb003f8629f870459d8e4af7948aedc8a411 Mon Sep 17 00:00:00 2001 From: Stephan Hoyer Date: Sun, 4 Mar 2018 22:37:05 -0800 Subject: [PATCH 4/4] remove redundant import --- xarray/backends/rasterio_.py | 1 - 1 file changed, 1 deletion(-) diff --git a/xarray/backends/rasterio_.py b/xarray/backends/rasterio_.py index 9c3343601d4..b86ac35a589 100644 --- a/xarray/backends/rasterio_.py +++ b/xarray/backends/rasterio_.py @@ -1,5 +1,4 @@ import os -import warnings from collections import OrderedDict from distutils.version import LooseVersion import warnings