Skip to content

Commit d75eb5b

Browse files
authored
TST/REF: share tests across Series/DataFrame (#37616)
1 parent e0d1c7e commit d75eb5b

12 files changed

+111
-259
lines changed

pandas/tests/frame/methods/test_asof.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,16 @@ def test_missing(self, date_range_frame):
9696
result = df.asof("1989-12-31")
9797
assert isinstance(result.name, Period)
9898

99+
def test_asof_all_nans(self, frame_or_series):
100+
# GH 15713
101+
# DataFrame/Series is all nans
102+
result = frame_or_series([np.nan]).asof([0])
103+
expected = frame_or_series([np.nan])
104+
tm.assert_equal(result, expected)
105+
99106
def test_all_nans(self, date_range_frame):
100107
# GH 15713
101108
# DataFrame is all nans
102-
result = DataFrame([np.nan]).asof([0])
103-
expected = DataFrame([np.nan])
104-
tm.assert_frame_equal(result, expected)
105109

106110
# testing non-default indexes, multiple inputs
107111
N = 150
+19-10
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,32 @@
1+
import pytest
2+
13
from pandas import DataFrame, Index, MultiIndex
24
import pandas._testing as tm
35

46

57
class TestDropLevel:
6-
def test_droplevel(self):
8+
def test_droplevel(self, frame_or_series):
79
# GH#20342
8-
df = DataFrame([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
9-
df = df.set_index([0, 1]).rename_axis(["a", "b"])
10-
df.columns = MultiIndex.from_tuples(
10+
cols = MultiIndex.from_tuples(
1111
[("c", "e"), ("d", "f")], names=["level_1", "level_2"]
1212
)
13+
mi = MultiIndex.from_tuples([(1, 2), (5, 6), (9, 10)], names=["a", "b"])
14+
df = DataFrame([[3, 4], [7, 8], [11, 12]], index=mi, columns=cols)
15+
if frame_or_series is not DataFrame:
16+
df = df.iloc[:, 0]
1317

1418
# test that dropping of a level in index works
1519
expected = df.reset_index("a", drop=True)
1620
result = df.droplevel("a", axis="index")
17-
tm.assert_frame_equal(result, expected)
21+
tm.assert_equal(result, expected)
1822

19-
# test that dropping of a level in columns works
20-
expected = df.copy()
21-
expected.columns = Index(["c", "d"], name="level_1")
22-
result = df.droplevel("level_2", axis="columns")
23-
tm.assert_frame_equal(result, expected)
23+
if frame_or_series is DataFrame:
24+
# test that dropping of a level in columns works
25+
expected = df.copy()
26+
expected.columns = Index(["c", "d"], name="level_1")
27+
result = df.droplevel("level_2", axis="columns")
28+
tm.assert_equal(result, expected)
29+
else:
30+
# test that droplevel raises ValueError on axis != 0
31+
with pytest.raises(ValueError, match="No axis named columns"):
32+
df.droplevel(1, axis="columns")

pandas/tests/frame/methods/test_first_and_last.py

+26-18
Original file line numberDiff line numberDiff line change
@@ -8,56 +8,64 @@
88

99

1010
class TestFirst:
11-
def test_first_subset(self):
11+
def test_first_subset(self, frame_or_series):
1212
ts = tm.makeTimeDataFrame(freq="12h")
13+
if frame_or_series is not DataFrame:
14+
ts = ts["A"]
1315
result = ts.first("10d")
1416
assert len(result) == 20
1517

1618
ts = tm.makeTimeDataFrame(freq="D")
19+
if frame_or_series is not DataFrame:
20+
ts = ts["A"]
1721
result = ts.first("10d")
1822
assert len(result) == 10
1923

2024
result = ts.first("3M")
2125
expected = ts[:"3/31/2000"]
22-
tm.assert_frame_equal(result, expected)
26+
tm.assert_equal(result, expected)
2327

2428
result = ts.first("21D")
2529
expected = ts[:21]
26-
tm.assert_frame_equal(result, expected)
30+
tm.assert_equal(result, expected)
2731

2832
result = ts[:0].first("3M")
29-
tm.assert_frame_equal(result, ts[:0])
33+
tm.assert_equal(result, ts[:0])
3034

31-
def test_first_raises(self):
35+
def test_first_last_raises(self, frame_or_series):
3236
# GH#20725
33-
df = DataFrame([[1, 2, 3], [4, 5, 6]])
37+
obj = DataFrame([[1, 2, 3], [4, 5, 6]])
38+
if frame_or_series is not DataFrame:
39+
obj = obj[0]
40+
3441
msg = "'first' only supports a DatetimeIndex index"
3542
with pytest.raises(TypeError, match=msg): # index is not a DatetimeIndex
36-
df.first("1D")
43+
obj.first("1D")
44+
45+
msg = "'last' only supports a DatetimeIndex index"
46+
with pytest.raises(TypeError, match=msg): # index is not a DatetimeIndex
47+
obj.last("1D")
3748

38-
def test_last_subset(self):
49+
def test_last_subset(self, frame_or_series):
3950
ts = tm.makeTimeDataFrame(freq="12h")
51+
if frame_or_series is not DataFrame:
52+
ts = ts["A"]
4053
result = ts.last("10d")
4154
assert len(result) == 20
4255

4356
ts = tm.makeTimeDataFrame(nper=30, freq="D")
57+
if frame_or_series is not DataFrame:
58+
ts = ts["A"]
4459
result = ts.last("10d")
4560
assert len(result) == 10
4661

4762
result = ts.last("21D")
4863
expected = ts["2000-01-10":]
49-
tm.assert_frame_equal(result, expected)
64+
tm.assert_equal(result, expected)
5065

5166
result = ts.last("21D")
5267
expected = ts[-21:]
53-
tm.assert_frame_equal(result, expected)
68+
tm.assert_equal(result, expected)
5469

5570
result = ts[:0].last("3M")
56-
tm.assert_frame_equal(result, ts[:0])
57-
58-
def test_last_raises(self):
59-
# GH20725
60-
df = DataFrame([[1, 2, 3], [4, 5, 6]])
61-
msg = "'last' only supports a DatetimeIndex index"
62-
with pytest.raises(TypeError, match=msg): # index is not a DatetimeIndex
63-
df.last("1D")
71+
tm.assert_equal(result, ts[:0])

pandas/tests/frame/methods/test_head_tail.py

+3
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ def test_head_tail(float_frame):
4848
tm.assert_frame_equal(df.tail(0), df[0:0])
4949
tm.assert_frame_equal(df.head(-1), df.iloc[:-1])
5050
tm.assert_frame_equal(df.tail(-1), df.iloc[1:])
51+
52+
53+
def test_head_tail_empty():
5154
# test empty dataframe
5255
empty_df = DataFrame()
5356
tm.assert_frame_equal(empty_df.tail(), empty_df)

pandas/tests/frame/methods/test_truncate.py

+48-21
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22
import pytest
33

44
import pandas as pd
5+
from pandas import DataFrame, Series, date_range
56
import pandas._testing as tm
67

78

89
class TestDataFrameTruncate:
9-
def test_truncate(self, datetime_frame):
10+
def test_truncate(self, datetime_frame, frame_or_series):
1011
ts = datetime_frame[::3]
12+
if frame_or_series is Series:
13+
ts = ts.iloc[:, 0]
1114

1215
start, end = datetime_frame.index[3], datetime_frame.index[6]
1316

@@ -16,34 +19,41 @@ def test_truncate(self, datetime_frame):
1619

1720
# neither specified
1821
truncated = ts.truncate()
19-
tm.assert_frame_equal(truncated, ts)
22+
tm.assert_equal(truncated, ts)
2023

2124
# both specified
2225
expected = ts[1:3]
2326

2427
truncated = ts.truncate(start, end)
25-
tm.assert_frame_equal(truncated, expected)
28+
tm.assert_equal(truncated, expected)
2629

2730
truncated = ts.truncate(start_missing, end_missing)
28-
tm.assert_frame_equal(truncated, expected)
31+
tm.assert_equal(truncated, expected)
2932

3033
# start specified
3134
expected = ts[1:]
3235

3336
truncated = ts.truncate(before=start)
34-
tm.assert_frame_equal(truncated, expected)
37+
tm.assert_equal(truncated, expected)
3538

3639
truncated = ts.truncate(before=start_missing)
37-
tm.assert_frame_equal(truncated, expected)
40+
tm.assert_equal(truncated, expected)
3841

3942
# end specified
4043
expected = ts[:3]
4144

4245
truncated = ts.truncate(after=end)
43-
tm.assert_frame_equal(truncated, expected)
46+
tm.assert_equal(truncated, expected)
4447

4548
truncated = ts.truncate(after=end_missing)
46-
tm.assert_frame_equal(truncated, expected)
49+
tm.assert_equal(truncated, expected)
50+
51+
# corner case, empty series/frame returned
52+
truncated = ts.truncate(after=ts.index[0] - ts.index.freq)
53+
assert len(truncated) == 0
54+
55+
truncated = ts.truncate(before=ts.index[-1] + ts.index.freq)
56+
assert len(truncated) == 0
4757

4858
msg = "Truncate: 2000-01-06 00:00:00 must be after 2000-02-04 00:00:00"
4959
with pytest.raises(ValueError, match=msg):
@@ -57,25 +67,35 @@ def test_truncate_copy(self, datetime_frame):
5767
truncated.values[:] = 5.0
5868
assert not (datetime_frame.values[5:11] == 5).any()
5969

60-
def test_truncate_nonsortedindex(self):
70+
def test_truncate_nonsortedindex(self, frame_or_series):
6171
# GH#17935
6272

63-
df = pd.DataFrame({"A": ["a", "b", "c", "d", "e"]}, index=[5, 3, 2, 9, 0])
73+
obj = DataFrame({"A": ["a", "b", "c", "d", "e"]}, index=[5, 3, 2, 9, 0])
74+
if frame_or_series is Series:
75+
obj = obj["A"]
76+
6477
msg = "truncate requires a sorted index"
6578
with pytest.raises(ValueError, match=msg):
66-
df.truncate(before=3, after=9)
79+
obj.truncate(before=3, after=9)
80+
81+
def test_sort_values_nonsortedindex(self):
82+
# TODO: belongs elsewhere?
6783

68-
rng = pd.date_range("2011-01-01", "2012-01-01", freq="W")
69-
ts = pd.DataFrame(
84+
rng = date_range("2011-01-01", "2012-01-01", freq="W")
85+
ts = DataFrame(
7086
{"A": np.random.randn(len(rng)), "B": np.random.randn(len(rng))}, index=rng
7187
)
88+
7289
msg = "truncate requires a sorted index"
7390
with pytest.raises(ValueError, match=msg):
7491
ts.sort_values("A", ascending=False).truncate(
7592
before="2011-11", after="2011-12"
7693
)
7794

78-
df = pd.DataFrame(
95+
def test_truncate_nonsortedindex_axis1(self):
96+
# GH#17935
97+
98+
df = DataFrame(
7999
{
80100
3: np.random.randn(5),
81101
20: np.random.randn(5),
@@ -93,27 +113,34 @@ def test_truncate_nonsortedindex(self):
93113
[(1, 2, [2, 1]), (None, 2, [2, 1, 0]), (1, None, [3, 2, 1])],
94114
)
95115
@pytest.mark.parametrize("klass", [pd.Int64Index, pd.DatetimeIndex])
96-
def test_truncate_decreasing_index(self, before, after, indices, klass):
116+
def test_truncate_decreasing_index(
117+
self, before, after, indices, klass, frame_or_series
118+
):
97119
# https://github.com/pandas-dev/pandas/issues/33756
98120
idx = klass([3, 2, 1, 0])
99121
if klass is pd.DatetimeIndex:
100122
before = pd.Timestamp(before) if before is not None else None
101123
after = pd.Timestamp(after) if after is not None else None
102124
indices = [pd.Timestamp(i) for i in indices]
103-
values = pd.DataFrame(range(len(idx)), index=idx)
125+
values = frame_or_series(range(len(idx)), index=idx)
104126
result = values.truncate(before=before, after=after)
105127
expected = values.loc[indices]
106-
tm.assert_frame_equal(result, expected)
128+
tm.assert_equal(result, expected)
107129

108-
def test_truncate_multiindex(self):
130+
def test_truncate_multiindex(self, frame_or_series):
109131
# GH 34564
110132
mi = pd.MultiIndex.from_product([[1, 2, 3, 4], ["A", "B"]], names=["L1", "L2"])
111-
s1 = pd.DataFrame(range(mi.shape[0]), index=mi, columns=["col"])
133+
s1 = DataFrame(range(mi.shape[0]), index=mi, columns=["col"])
134+
if frame_or_series is Series:
135+
s1 = s1["col"]
136+
112137
result = s1.truncate(before=2, after=3)
113138

114-
df = pd.DataFrame.from_dict(
139+
df = DataFrame.from_dict(
115140
{"L1": [2, 2, 3, 3], "L2": ["A", "B", "A", "B"], "col": [2, 3, 4, 5]}
116141
)
117142
expected = df.set_index(["L1", "L2"])
143+
if frame_or_series is Series:
144+
expected = expected["col"]
118145

119-
tm.assert_frame_equal(result, expected)
146+
tm.assert_equal(result, expected)

pandas/tests/frame/methods/test_tz_convert.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import numpy as np
22
import pytest
33

4-
from pandas import DataFrame, Index, MultiIndex, Series, date_range
4+
from pandas import DataFrame, Index, MultiIndex, date_range
55
import pandas._testing as tm
66

77

@@ -89,17 +89,16 @@ def test_tz_convert_and_localize(self, fn):
8989
df = DataFrame(index=l0)
9090
df = getattr(df, fn)("US/Pacific", level=1)
9191

92-
@pytest.mark.parametrize("klass", [Series, DataFrame])
9392
@pytest.mark.parametrize("copy", [True, False])
94-
def test_tz_convert_copy_inplace_mutate(self, copy, klass):
93+
def test_tz_convert_copy_inplace_mutate(self, copy, frame_or_series):
9594
# GH#6326
96-
obj = klass(
95+
obj = frame_or_series(
9796
np.arange(0, 5),
9897
index=date_range("20131027", periods=5, freq="1H", tz="Europe/Berlin"),
9998
)
10099
orig = obj.copy()
101100
result = obj.tz_convert("UTC", copy=copy)
102-
expected = klass(np.arange(0, 5), index=obj.index.tz_convert("UTC"))
101+
expected = frame_or_series(np.arange(0, 5), index=obj.index.tz_convert("UTC"))
103102
tm.assert_equal(result, expected)
104103
tm.assert_equal(obj, orig)
105104
assert result.index is not obj.index

pandas/tests/frame/methods/test_tz_localize.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import numpy as np
22
import pytest
33

4-
from pandas import DataFrame, Series, date_range
4+
from pandas import DataFrame, date_range
55
import pandas._testing as tm
66

77

@@ -23,16 +23,15 @@ def test_frame_tz_localize(self):
2323
assert result.columns.tz.zone == "UTC"
2424
tm.assert_frame_equal(result, expected.T)
2525

26-
@pytest.mark.parametrize("klass", [Series, DataFrame])
2726
@pytest.mark.parametrize("copy", [True, False])
28-
def test_tz_localize_copy_inplace_mutate(self, copy, klass):
27+
def test_tz_localize_copy_inplace_mutate(self, copy, frame_or_series):
2928
# GH#6326
30-
obj = klass(
29+
obj = frame_or_series(
3130
np.arange(0, 5), index=date_range("20131027", periods=5, freq="1H", tz=None)
3231
)
3332
orig = obj.copy()
3433
result = obj.tz_localize("UTC", copy=copy)
35-
expected = klass(
34+
expected = frame_or_series(
3635
np.arange(0, 5),
3736
index=date_range("20131027", periods=5, freq="1H", tz="UTC"),
3837
)

pandas/tests/series/methods/test_asof.py

-3
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,6 @@ def test_errors(self):
161161
def test_all_nans(self):
162162
# GH 15713
163163
# series is all nans
164-
result = Series([np.nan]).asof([0])
165-
expected = Series([np.nan])
166-
tm.assert_series_equal(result, expected)
167164

168165
# testing non-default indexes
169166
N = 50

pandas/tests/series/methods/test_droplevel.py

-19
This file was deleted.

0 commit comments

Comments
 (0)