From 40fe30989402051923036bff531607de8bae5746 Mon Sep 17 00:00:00 2001 From: Joseph Hamman Date: Sun, 25 Feb 2018 08:25:42 -0800 Subject: [PATCH 1/5] fix isnull for dask arrays and add test to test_duck_array_ops.py --- xarray/core/ops.py | 2 +- xarray/tests/test_duck_array_ops.py | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/xarray/core/ops.py b/xarray/core/ops.py index d02b8fa3108..f644bc243cb 100644 --- a/xarray/core/ops.py +++ b/xarray/core/ops.py @@ -320,7 +320,7 @@ def inject_all_ops_and_reduce_methods(cls, priority=50, array_only=True): setattr(cls, name, cls._unary_op(_method_wrapper(name))) for name in PANDAS_UNARY_FUNCTIONS: - f = _func_slash_method_wrapper(getattr(pd, name), name=name) + f = _func_slash_method_wrapper(getattr(duck_array_ops, name), name=name) setattr(cls, name, cls._unary_op(f)) f = _func_slash_method_wrapper(duck_array_ops.around, name='round') diff --git a/xarray/tests/test_duck_array_ops.py b/xarray/tests/test_duck_array_ops.py index e7dc137e72a..f86ea9c06fa 100644 --- a/xarray/tests/test_duck_array_ops.py +++ b/xarray/tests/test_duck_array_ops.py @@ -9,11 +9,12 @@ from xarray.core.duck_array_ops import ( first, last, count, mean, array_notnull_equiv, where, stack, concatenate ) +from xarray.core.pycompat import dask_array_type from xarray import DataArray -from xarray.testing import assert_allclose +from xarray.testing import assert_allclose, assert_equal from xarray import concat -from . import TestCase, raises_regex, has_dask +from . import TestCase, raises_regex, has_dask, requires_dask class TestOps(TestCase): @@ -302,3 +303,10 @@ def test_argmin_max_error(): da = construct_dataarray(2, np.bool_, contains_nan=True, dask=False) with pytest.raises(ValueError): da.argmin(dim='y') + + +@requires_dask +def test_isnull_with_dask(): + da = construct_dataarray(2, np.float32, contains_nan=True, dask=True) + assert isinstance(da.isnull().data, dask_array_type) + assert_equal(da.isnull().load(), da.load().isnull()) From ff0ed2fdb16330733876304669454475e952eb44 Mon Sep 17 00:00:00 2001 From: Joseph Hamman Date: Sun, 25 Feb 2018 08:26:14 -0800 Subject: [PATCH 2/5] minor cleanup / proper test skipping in test_duck_array_ops.py --- xarray/tests/test_duck_array_ops.py | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/xarray/tests/test_duck_array_ops.py b/xarray/tests/test_duck_array_ops.py index f86ea9c06fa..5bb7e09d918 100644 --- a/xarray/tests/test_duck_array_ops.py +++ b/xarray/tests/test_duck_array_ops.py @@ -195,23 +195,19 @@ def series_reduce(da, func, dim, **kwargs): def test_reduce(dim_num, dtype, dask, func, skipna, aggdim): if aggdim == 'y' and dim_num < 2: - return + pytest.skip('dim not in this test') if dtype == np.bool_ and func == 'mean': - return # numpy does not support this + pytest.skip('numpy does not support this') if dask and not has_dask: - return + pytest.skip('requires dask') rtol = 1e-04 if dtype == np.float32 else 1e-05 da = construct_dataarray(dim_num, dtype, contains_nan=True, dask=dask) axis = None if aggdim is None else da.get_axis_num(aggdim) - if dask and not skipna and func in ['var', 'std'] and dtype == np.bool_: - # TODO this might be dask's bug - return - if (LooseVersion(np.__version__) >= LooseVersion('1.13.0') and da.dtype.kind == 'O' and skipna): # Numpy < 1.13 does not handle object-type array. @@ -270,19 +266,17 @@ def test_argmin_max(dim_num, dtype, contains_nan, dask, func, skipna, aggdim): # just make sure da[da.argmin()] == da.min() if aggdim == 'y' and dim_num < 2: - return + pytest.skip('dim not in this test') if dask and not has_dask: - return + pytest.skip('requires dask') if contains_nan: if not skipna: - # numpy's argmin (not nanargmin) does not handle object-dtype - return + pytest.skip("numpy's argmin (not nanargmin) does not handle " + "object-dtype") if skipna and np.dtype(dtype).kind in 'iufc': - # numpy's nanargmin raises ValueError for all nan axis - return - + pytest.skip("numpy's nanargmin raises ValueError for all nan axis") da = construct_dataarray(dim_num, dtype, contains_nan=contains_nan, dask=dask) From 48bd6fcbc468e821251a3cd353c560b59702cef9 Mon Sep 17 00:00:00 2001 From: Joseph Hamman Date: Sun, 25 Feb 2018 08:29:40 -0800 Subject: [PATCH 3/5] whatsnew --- doc/whats-new.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/whats-new.rst b/doc/whats-new.rst index c54c67d1c4a..fa4bfb7d4e8 100644 --- a/doc/whats-new.rst +++ b/doc/whats-new.rst @@ -167,6 +167,9 @@ Bug fixes match pandas (:issue:`1847`). A combination of strings/numbers or unicode/bytes now promote to object dtype, instead of strings or unicode. By `Stephan Hoyer `_. + - Fixed bug where :py:meth:`~xarray.DataArray.isnull` was loading data + stored as dask arrays (:issue:`1937`). + By `Joe Hamman `_. .. _whats-new.0.10.0: From 6bfb86a29752843ea142713677210afdb9f297f0 Mon Sep 17 00:00:00 2001 From: stickler-ci Date: Sun, 25 Feb 2018 16:32:58 +0000 Subject: [PATCH 4/5] Fixing style errors. --- xarray/core/ops.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xarray/core/ops.py b/xarray/core/ops.py index f644bc243cb..e9b1b34b06d 100644 --- a/xarray/core/ops.py +++ b/xarray/core/ops.py @@ -320,7 +320,8 @@ def inject_all_ops_and_reduce_methods(cls, priority=50, array_only=True): setattr(cls, name, cls._unary_op(_method_wrapper(name))) for name in PANDAS_UNARY_FUNCTIONS: - f = _func_slash_method_wrapper(getattr(duck_array_ops, name), name=name) + f = _func_slash_method_wrapper( + getattr(duck_array_ops, name), name=name) setattr(cls, name, cls._unary_op(f)) f = _func_slash_method_wrapper(duck_array_ops.around, name='round') From 0f81e45d5feb9b1d9d9675f10e270326c8c17337 Mon Sep 17 00:00:00 2001 From: Joseph Hamman Date: Sun, 25 Feb 2018 08:53:39 -0800 Subject: [PATCH 5/5] flake8 --- xarray/core/ops.py | 1 - 1 file changed, 1 deletion(-) diff --git a/xarray/core/ops.py b/xarray/core/ops.py index f644bc243cb..37865e99598 100644 --- a/xarray/core/ops.py +++ b/xarray/core/ops.py @@ -12,7 +12,6 @@ import operator import numpy as np -import pandas as pd from . import dtypes from . import duck_array_ops