Skip to content

Commit ed96567

Browse files
almaleksiajreback
authored andcommitted
TST: series/indexing tests parametrization + moving test methods (#20059)
1 parent 7c14e4f commit ed96567

File tree

8 files changed

+378
-416
lines changed

8 files changed

+378
-416
lines changed

pandas/tests/series/indexing/test_alter_index.py

+119-82
Original file line numberDiff line numberDiff line change
@@ -21,88 +21,72 @@
2121
JOIN_TYPES = ['inner', 'outer', 'left', 'right']
2222

2323

24-
def test_align(test_data):
25-
def _check_align(a, b, how='left', fill=None):
26-
aa, ab = a.align(b, join=how, fill_value=fill)
27-
28-
join_index = a.index.join(b.index, how=how)
29-
if fill is not None:
30-
diff_a = aa.index.difference(join_index)
31-
diff_b = ab.index.difference(join_index)
32-
if len(diff_a) > 0:
33-
assert (aa.reindex(diff_a) == fill).all()
34-
if len(diff_b) > 0:
35-
assert (ab.reindex(diff_b) == fill).all()
36-
37-
ea = a.reindex(join_index)
38-
eb = b.reindex(join_index)
39-
40-
if fill is not None:
41-
ea = ea.fillna(fill)
42-
eb = eb.fillna(fill)
43-
44-
assert_series_equal(aa, ea)
45-
assert_series_equal(ab, eb)
46-
assert aa.name == 'ts'
47-
assert ea.name == 'ts'
48-
assert ab.name == 'ts'
49-
assert eb.name == 'ts'
50-
51-
for kind in JOIN_TYPES:
52-
_check_align(test_data.ts[2:], test_data.ts[:-5], how=kind)
53-
_check_align(test_data.ts[2:], test_data.ts[:-5], how=kind, fill=-1)
54-
55-
# empty left
56-
_check_align(test_data.ts[:0], test_data.ts[:-5], how=kind)
57-
_check_align(test_data.ts[:0], test_data.ts[:-5], how=kind, fill=-1)
58-
59-
# empty right
60-
_check_align(test_data.ts[:-5], test_data.ts[:0], how=kind)
61-
_check_align(test_data.ts[:-5], test_data.ts[:0], how=kind, fill=-1)
62-
63-
# both empty
64-
_check_align(test_data.ts[:0], test_data.ts[:0], how=kind)
65-
_check_align(test_data.ts[:0], test_data.ts[:0], how=kind, fill=-1)
66-
67-
68-
def test_align_fill_method(test_data):
69-
def _check_align(a, b, how='left', method='pad', limit=None):
70-
aa, ab = a.align(b, join=how, method=method, limit=limit)
71-
72-
join_index = a.index.join(b.index, how=how)
73-
ea = a.reindex(join_index)
74-
eb = b.reindex(join_index)
75-
76-
ea = ea.fillna(method=method, limit=limit)
77-
eb = eb.fillna(method=method, limit=limit)
78-
79-
assert_series_equal(aa, ea)
80-
assert_series_equal(ab, eb)
81-
82-
for kind in JOIN_TYPES:
83-
for meth in ['pad', 'bfill']:
84-
_check_align(test_data.ts[2:], test_data.ts[:-5],
85-
how=kind, method=meth)
86-
_check_align(test_data.ts[2:], test_data.ts[:-5],
87-
how=kind, method=meth, limit=1)
88-
89-
# empty left
90-
_check_align(test_data.ts[:0], test_data.ts[:-5],
91-
how=kind, method=meth)
92-
_check_align(test_data.ts[:0], test_data.ts[:-5],
93-
how=kind, method=meth, limit=1)
94-
95-
# empty right
96-
_check_align(test_data.ts[:-5], test_data.ts[:0],
97-
how=kind, method=meth)
98-
_check_align(test_data.ts[:-5], test_data.ts[:0],
99-
how=kind, method=meth, limit=1)
100-
101-
# both empty
102-
_check_align(test_data.ts[:0], test_data.ts[:0],
103-
how=kind, method=meth)
104-
_check_align(test_data.ts[:0], test_data.ts[:0],
105-
how=kind, method=meth, limit=1)
24+
@pytest.mark.parametrize(
25+
'first_slice,second_slice', [
26+
[[2, None], [None, -5]],
27+
[[None, 0], [None, -5]],
28+
[[None, -5], [None, 0]],
29+
[[None, 0], [None, 0]]
30+
])
31+
@pytest.mark.parametrize('join_type', JOIN_TYPES)
32+
@pytest.mark.parametrize('fill', [None, -1])
33+
def test_align(test_data, first_slice, second_slice, join_type, fill):
34+
a = test_data.ts[slice(*first_slice)]
35+
b = test_data.ts[slice(*second_slice)]
36+
37+
aa, ab = a.align(b, join=join_type, fill_value=fill)
38+
39+
join_index = a.index.join(b.index, how=join_type)
40+
if fill is not None:
41+
diff_a = aa.index.difference(join_index)
42+
diff_b = ab.index.difference(join_index)
43+
if len(diff_a) > 0:
44+
assert (aa.reindex(diff_a) == fill).all()
45+
if len(diff_b) > 0:
46+
assert (ab.reindex(diff_b) == fill).all()
47+
48+
ea = a.reindex(join_index)
49+
eb = b.reindex(join_index)
50+
51+
if fill is not None:
52+
ea = ea.fillna(fill)
53+
eb = eb.fillna(fill)
54+
55+
assert_series_equal(aa, ea)
56+
assert_series_equal(ab, eb)
57+
assert aa.name == 'ts'
58+
assert ea.name == 'ts'
59+
assert ab.name == 'ts'
60+
assert eb.name == 'ts'
61+
62+
63+
@pytest.mark.parametrize(
64+
'first_slice,second_slice', [
65+
[[2, None], [None, -5]],
66+
[[None, 0], [None, -5]],
67+
[[None, -5], [None, 0]],
68+
[[None, 0], [None, 0]]
69+
])
70+
@pytest.mark.parametrize('join_type', JOIN_TYPES)
71+
@pytest.mark.parametrize('method', ['pad', 'bfill'])
72+
@pytest.mark.parametrize('limit', [None, 1])
73+
def test_align_fill_method(test_data,
74+
first_slice, second_slice,
75+
join_type, method, limit):
76+
a = test_data.ts[slice(*first_slice)]
77+
b = test_data.ts[slice(*second_slice)]
78+
79+
aa, ab = a.align(b, join=join_type, method=method, limit=limit)
80+
81+
join_index = a.index.join(b.index, how=join_type)
82+
ea = a.reindex(join_index)
83+
eb = b.reindex(join_index)
84+
85+
ea = ea.fillna(method=method, limit=limit)
86+
eb = eb.fillna(method=method, limit=limit)
87+
88+
assert_series_equal(aa, ea)
89+
assert_series_equal(ab, eb)
10690

10791

10892
def test_align_nocopy(test_data):
@@ -481,3 +465,56 @@ def test_rename():
481465
assert_series_equal(result, expected)
482466

483467
assert result.name == expected.name
468+
469+
470+
def test_drop():
471+
# unique
472+
s = Series([1, 2], index=['one', 'two'])
473+
expected = Series([1], index=['one'])
474+
result = s.drop(['two'])
475+
assert_series_equal(result, expected)
476+
result = s.drop('two', axis='rows')
477+
assert_series_equal(result, expected)
478+
479+
# non-unique
480+
# GH 5248
481+
s = Series([1, 1, 2], index=['one', 'two', 'one'])
482+
expected = Series([1, 2], index=['one', 'one'])
483+
result = s.drop(['two'], axis=0)
484+
assert_series_equal(result, expected)
485+
result = s.drop('two')
486+
assert_series_equal(result, expected)
487+
488+
expected = Series([1], index=['two'])
489+
result = s.drop(['one'])
490+
assert_series_equal(result, expected)
491+
result = s.drop('one')
492+
assert_series_equal(result, expected)
493+
494+
# single string/tuple-like
495+
s = Series(range(3), index=list('abc'))
496+
pytest.raises(KeyError, s.drop, 'bc')
497+
pytest.raises(KeyError, s.drop, ('a',))
498+
499+
# errors='ignore'
500+
s = Series(range(3), index=list('abc'))
501+
result = s.drop('bc', errors='ignore')
502+
assert_series_equal(result, s)
503+
result = s.drop(['a', 'd'], errors='ignore')
504+
expected = s.iloc[1:]
505+
assert_series_equal(result, expected)
506+
507+
# bad axis
508+
pytest.raises(ValueError, s.drop, 'one', axis='columns')
509+
510+
# GH 8522
511+
s = Series([2, 3], index=[True, False])
512+
assert s.index.is_object()
513+
result = s.drop(True)
514+
expected = Series([3], index=[False])
515+
assert_series_equal(result, expected)
516+
517+
# GH 16877
518+
s = Series([2, 3], index=[0, 1])
519+
with tm.assert_raises_regex(KeyError, 'not contained in axis'):
520+
s.drop([False, True])

pandas/tests/series/indexing/test_boolean.py

+50-71
Original file line numberDiff line numberDiff line change
@@ -283,34 +283,30 @@ def test_where_error():
283283
[])
284284

285285

286-
def test_where_array_like():
286+
@pytest.mark.parametrize('klass', [list, tuple, np.array, Series])
287+
def test_where_array_like(klass):
287288
# see gh-15414
288289
s = Series([1, 2, 3])
289290
cond = [False, True, True]
290291
expected = Series([np.nan, 2, 3])
291-
klasses = [list, tuple, np.array, Series]
292292

293-
for klass in klasses:
294-
result = s.where(klass(cond))
295-
assert_series_equal(result, expected)
293+
result = s.where(klass(cond))
294+
assert_series_equal(result, expected)
296295

297296

298-
def test_where_invalid_input():
297+
@pytest.mark.parametrize('cond', [
298+
[1, 0, 1],
299+
Series([2, 5, 7]),
300+
["True", "False", "True"],
301+
[Timestamp("2017-01-01"), pd.NaT, Timestamp("2017-01-02")]
302+
])
303+
def test_where_invalid_input(cond):
299304
# see gh-15414: only boolean arrays accepted
300305
s = Series([1, 2, 3])
301306
msg = "Boolean array expected for the condition"
302307

303-
conds = [
304-
[1, 0, 1],
305-
Series([2, 5, 7]),
306-
["True", "False", "True"],
307-
[Timestamp("2017-01-01"),
308-
pd.NaT, Timestamp("2017-01-02")]
309-
]
310-
311-
for cond in conds:
312-
with tm.assert_raises_regex(ValueError, msg):
313-
s.where(cond)
308+
with tm.assert_raises_regex(ValueError, msg):
309+
s.where(cond)
314310

315311
msg = "Array conditional must be same shape as self"
316312
with tm.assert_raises_regex(ValueError, msg):
@@ -403,37 +399,43 @@ def f():
403399
assert_series_equal(s, expected)
404400

405401

406-
def test_where_broadcast():
407-
# Test a variety of differently sized series
408-
for size in range(2, 6):
409-
# Test a variety of boolean indices
410-
for selection in [
411-
# First element should be set
412-
np.resize([True, False, False, False, False], size),
413-
# Set alternating elements]
414-
np.resize([True, False], size),
415-
# No element should be set
416-
np.resize([False], size)
417-
]:
418-
419-
# Test a variety of different numbers as content
420-
for item in [2.0, np.nan, np.finfo(np.float).max,
421-
np.finfo(np.float).min]:
422-
# Test numpy arrays, lists and tuples as the input to be
423-
# broadcast
424-
for arr in [np.array([item]), [item], (item,)]:
425-
data = np.arange(size, dtype=float)
426-
s = Series(data)
427-
s[selection] = arr
428-
# Construct the expected series by taking the source
429-
# data or item based on the selection
430-
expected = Series([item if use_item else data[
431-
i] for i, use_item in enumerate(selection)])
432-
assert_series_equal(s, expected)
433-
434-
s = Series(data)
435-
result = s.where(~selection, arr)
436-
assert_series_equal(result, expected)
402+
@pytest.mark.parametrize('size', range(2, 6))
403+
@pytest.mark.parametrize('mask', [
404+
[True, False, False, False, False],
405+
[True, False],
406+
[False]
407+
])
408+
@pytest.mark.parametrize('item', [
409+
2.0, np.nan, np.finfo(np.float).max, np.finfo(np.float).min
410+
])
411+
# Test numpy arrays, lists and tuples as the input to be
412+
# broadcast
413+
@pytest.mark.parametrize('box', [
414+
lambda x: np.array([x]),
415+
lambda x: [x],
416+
lambda x: (x,)
417+
])
418+
def test_broadcast(size, mask, item, box):
419+
selection = np.resize(mask, size)
420+
421+
data = np.arange(size, dtype=float)
422+
423+
# Construct the expected series by taking the source
424+
# data or item based on the selection
425+
expected = Series([item if use_item else data[
426+
i] for i, use_item in enumerate(selection)])
427+
428+
s = Series(data)
429+
s[selection] = box(item)
430+
assert_series_equal(s, expected)
431+
432+
s = Series(data)
433+
result = s.where(~selection, box(item))
434+
assert_series_equal(result, expected)
435+
436+
s = Series(data)
437+
result = s.mask(selection, box(item))
438+
assert_series_equal(result, expected)
437439

438440

439441
def test_where_inplace():
@@ -587,29 +589,6 @@ def test_mask():
587589
assert_series_equal(result, expected)
588590

589591

590-
def test_mask_broadcast():
591-
# GH 8801
592-
# copied from test_where_broadcast
593-
for size in range(2, 6):
594-
for selection in [
595-
# First element should be set
596-
np.resize([True, False, False, False, False], size),
597-
# Set alternating elements]
598-
np.resize([True, False], size),
599-
# No element should be set
600-
np.resize([False], size)
601-
]:
602-
for item in [2.0, np.nan, np.finfo(np.float).max,
603-
np.finfo(np.float).min]:
604-
for arr in [np.array([item]), [item], (item,)]:
605-
data = np.arange(size, dtype=float)
606-
s = Series(data)
607-
result = s.mask(selection, arr)
608-
expected = Series([item if use_item else data[
609-
i] for i, use_item in enumerate(selection)])
610-
assert_series_equal(result, expected)
611-
612-
613592
def test_mask_inplace():
614593
s = Series(np.random.randn(5))
615594
cond = s > 0
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import pandas as pd
2+
import pandas.util.testing as tm
3+
4+
5+
def test_getitem_callable():
6+
# GH 12533
7+
s = pd.Series(4, index=list('ABCD'))
8+
result = s[lambda x: 'A']
9+
assert result == s.loc['A']
10+
11+
result = s[lambda x: ['A', 'B']]
12+
tm.assert_series_equal(result, s.loc[['A', 'B']])
13+
14+
result = s[lambda x: [True, False, True, True]]
15+
tm.assert_series_equal(result, s.iloc[[0, 2, 3]])
16+
17+
18+
def test_setitem_callable():
19+
# GH 12533
20+
s = pd.Series([1, 2, 3, 4], index=list('ABCD'))
21+
s[lambda x: 'A'] = -1
22+
tm.assert_series_equal(s, pd.Series([-1, 2, 3, 4], index=list('ABCD')))
23+
24+
25+
def test_setitem_other_callable():
26+
# GH 13299
27+
inc = lambda x: x + 1
28+
29+
s = pd.Series([1, 2, -1, 4])
30+
s[s < 0] = inc
31+
32+
expected = pd.Series([1, 2, inc, 4])
33+
tm.assert_series_equal(s, expected)

0 commit comments

Comments
 (0)