Skip to content

Commit ae12850

Browse files
author
Benoit Bovy
committed
added tests for indexing and selection
1 parent 104b236 commit ae12850

File tree

3 files changed

+79
-10
lines changed

3 files changed

+79
-10
lines changed

xarray/test/test_dataarray.py

+23-8
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,8 @@ def test_loc_single_boolean(self):
486486
self.assertEqual(data.loc[False], 1)
487487

488488
def test_multiindex(self):
489-
idx = pd.MultiIndex.from_product([list('abc'), [0, 1]])
489+
idx = pd.MultiIndex.from_product([list('abc'), [0, 1]],
490+
names=('one', 'two'))
490491
data = DataArray(range(6), [('x', idx)])
491492

492493
self.assertDataArrayIdentical(data.sel(x=('a', 0)), data.isel(x=0))
@@ -495,6 +496,20 @@ def test_multiindex(self):
495496
self.assertDataArrayIdentical(data.sel(x=[('a', 0), ('c', 1)]),
496497
data.isel(x=[0, -1]))
497498
self.assertDataArrayIdentical(data.sel(x='a'), data.isel(x=slice(2)))
499+
self.assertVariableNotEqual(data.sel(x={'one': slice(None)}), data)
500+
self.assertDataArrayIdentical(data.isel(x=[0]),
501+
data.sel(x={'one': 'a', 'two': 0}))
502+
self.assertDataArrayIdentical(data.isel(x=[0, 1]), data.sel(x='a'))
503+
self.assertVariableIdentical(
504+
data.sel(x={'one': 'a'}),
505+
data.unstack('x').sel(one='a').dropna('two')
506+
)
507+
508+
self.assertDataArrayIdentical(data.loc['a'], data[:2])
509+
self.assertDataArrayIdentical(data.loc[{'one': 'a', 'two': 0}, ...],
510+
data[[0]])
511+
self.assertDataArrayIdentical(data.loc[{'one': 'a'}, ...],
512+
data.sel(x={'one': 'a'}))
498513

499514
def test_time_components(self):
500515
dates = pd.date_range('2000-01-01', periods=10)
@@ -1792,29 +1807,29 @@ def test_full_like(self):
17921807
actual = _full_like(DataArray([1, 2, 3]), fill_value=np.nan)
17931808
self.assertEqual(actual.dtype, np.float)
17941809
np.testing.assert_equal(actual.values, np.nan)
1795-
1810+
17961811
def test_dot(self):
17971812
x = np.linspace(-3, 3, 6)
17981813
y = np.linspace(-3, 3, 5)
1799-
z = range(4)
1814+
z = range(4)
18001815
da_vals = np.arange(6 * 5 * 4).reshape((6, 5, 4))
18011816
da = DataArray(da_vals, coords=[x, y, z], dims=['x', 'y', 'z'])
1802-
1817+
18031818
dm_vals = range(4)
18041819
dm = DataArray(dm_vals, coords=[z], dims=['z'])
1805-
1820+
18061821
# nd dot 1d
18071822
actual = da.dot(dm)
18081823
expected_vals = np.tensordot(da_vals, dm_vals, [2, 0])
18091824
expected = DataArray(expected_vals, coords=[x, y], dims=['x', 'y'])
18101825
self.assertDataArrayEqual(expected, actual)
1811-
1826+
18121827
# all shared dims
18131828
actual = da.dot(da)
18141829
expected_vals = np.tensordot(da_vals, da_vals, axes=([0, 1, 2], [0, 1, 2]))
18151830
expected = DataArray(expected_vals)
18161831
self.assertDataArrayEqual(expected, actual)
1817-
1832+
18181833
# multiple shared dims
18191834
dm_vals = np.arange(20 * 5 * 4).reshape((20, 5, 4))
18201835
j = np.linspace(-3, 3, 20)
@@ -1823,7 +1838,7 @@ def test_dot(self):
18231838
expected_vals = np.tensordot(da_vals, dm_vals, axes=([1, 2], [1, 2]))
18241839
expected = DataArray(expected_vals, coords=[x, j], dims=['x', 'j'])
18251840
self.assertDataArrayEqual(expected, actual)
1826-
1841+
18271842
with self.assertRaises(NotImplementedError):
18281843
da.dot(dm.to_dataset(name='dm'))
18291844
with self.assertRaises(TypeError):

xarray/test/test_dataset.py

+25
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,31 @@ def test_loc(self):
840840
with self.assertRaises(TypeError):
841841
data.loc[dict(dim3='a')] = 0
842842

843+
def test_multiindex(self):
844+
idx = pd.MultiIndex.from_product([list('abc'), [0, 1]],
845+
names=('one', 'two'))
846+
data = Dataset(data_vars={'var': ('x', range(6))}, coords={'x': idx})
847+
848+
self.assertDatasetIdentical(data.sel(x=('a', 0)), data.isel(x=0))
849+
self.assertDatasetIdentical(data.sel(x=('c', 1)), data.isel(x=-1))
850+
self.assertDatasetIdentical(data.sel(x=[('a', 0)]), data.isel(x=[0]))
851+
self.assertDatasetIdentical(data.sel(x=[('a', 0), ('c', 1)]),
852+
data.isel(x=[0, -1]))
853+
self.assertDatasetIdentical(data.sel(x='a'), data.isel(x=slice(2)))
854+
self.assertVariableNotEqual(data.sel(x={'one': slice(None)})['var'],
855+
data['var'])
856+
self.assertDatasetIdentical(data.isel(x=[0]),
857+
data.sel(x={'one': 'a', 'two': 0}))
858+
self.assertDatasetIdentical(data.isel(x=[0, 1]), data.sel(x='a'))
859+
self.assertVariableIdentical(
860+
data.sel(x={'one': 'a'})['var'],
861+
data.unstack('x').sel(one='a').dropna('two')['var']
862+
)
863+
864+
self.assertDatasetIdentical(data.loc[{'x': 'a'}], data.sel(x='a'))
865+
self.assertDatasetIdentical(data.loc[{'x': {'one': 'a', 'two': 0}}],
866+
data.sel(x={'one': 'a', 'two': 0}))
867+
843868
def test_reindex_like(self):
844869
data = create_test_data()
845870
data['letters'] = ('dim3', 10 * ['a'])

xarray/test/test_indexing.py

+31-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import numpy as np
22
import pandas as pd
33

4-
from xarray import Dataset, Variable
4+
from xarray import Dataset, DataArray, Variable
55
from xarray.core import indexing
66
from . import TestCase, ReturnItem
77

@@ -85,8 +85,18 @@ def test_convert_label_indexer(self):
8585
indexing.convert_label_indexer(index, [0])
8686
with self.assertRaises(KeyError):
8787
indexing.convert_label_indexer(index, 0)
88+
with self.assertRaisesRegexp(ValueError, 'does not have a MultiIndex'):
89+
indexing.convert_label_indexer(index, {'one': 0})
90+
91+
mindex = pd.MultiIndex(levels=[[1, 2, 3], [4, 5, 6]],
92+
labels=[[0, 1, 2], [0, 1, 2]],
93+
names=['one', 'two'])
94+
with self.assertRaises(KeyError):
95+
indexing.convert_label_indexer(mindex, [0])
96+
with self.assertRaises(KeyError):
97+
indexing.convert_label_indexer(mindex, 0)
8898
with self.assertRaises(ValueError):
89-
indexing.convert_label_indexer(index, {'somelevel': 0})
99+
indexing.convert_label_indexer(index, {'three': 0})
90100

91101
def test_convert_unsorted_datetime_index_raises(self):
92102
index = pd.to_datetime(['2001', '2000', '2002'])
@@ -105,6 +115,25 @@ def test_indexer(x):
105115
self.assertEqual({'x': 0}, test_indexer(1)[0])
106116
self.assertEqual({'x': 0}, test_indexer(np.int32(1))[0])
107117
self.assertEqual({'x': 0}, test_indexer(Variable([], 1))[0])
118+
with self.assertRaisesRegexp(ValueError, 'does not have a MultiIndex'):
119+
indexing.remap_label_indexers(data, {'x': {'level': 1}})
120+
121+
mindex = pd.MultiIndex(levels=[[1, 2, 3], [4, 5, 6]],
122+
labels=[[0, 1, 2], [0, 1, 2]],
123+
names=['one', 'two'])
124+
s = pd.Series([7, 8, 9], index=mindex)
125+
data = DataArray(s, dims='x')
126+
127+
pos, idx = indexing.remap_label_indexers(data, {'x': {'one': 1}})
128+
self.assertArrayEqual(pos['x'], [True, False, False])
129+
self.assertArrayEqual(idx['x'].values, [4])
130+
self.assertEqual(idx['x'].name, 'two')
131+
132+
pos, idx = indexing.remap_label_indexers(
133+
data, {'x': {'one': 1, 'two': 4}}
134+
)
135+
self.assertArrayEqual(pos['x'], [True, False, False])
136+
self.assertEqual(len(idx), 0)
108137

109138

110139
class TestLazyArray(TestCase):

0 commit comments

Comments
 (0)