Skip to content

Commit c20528e

Browse files
authored
REF: test_first_valid_index (pandas-dev#32317)
1 parent 24827e5 commit c20528e

File tree

4 files changed

+94
-94
lines changed

4 files changed

+94
-94
lines changed

pandas/tests/frame/test_timeseries.py

+1-61
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import numpy as np
2-
import pytest
32

43
import pandas as pd
5-
from pandas import DataFrame, Series, date_range, to_datetime
4+
from pandas import DataFrame, date_range, to_datetime
65
import pandas._testing as tm
76

87

@@ -60,65 +59,6 @@ def test_frame_append_datetime64_col_other_units(self):
6059

6160
assert (tmp["dates"].values == ex_vals).all()
6261

63-
@pytest.mark.parametrize(
64-
"data,idx,expected_first,expected_last",
65-
[
66-
({"A": [1, 2, 3]}, [1, 1, 2], 1, 2),
67-
({"A": [1, 2, 3]}, [1, 2, 2], 1, 2),
68-
({"A": [1, 2, 3, 4]}, ["d", "d", "d", "d"], "d", "d"),
69-
({"A": [1, np.nan, 3]}, [1, 1, 2], 1, 2),
70-
({"A": [np.nan, np.nan, 3]}, [1, 1, 2], 2, 2),
71-
({"A": [1, np.nan, 3]}, [1, 2, 2], 1, 2),
72-
],
73-
)
74-
def test_first_last_valid(
75-
self, float_frame, data, idx, expected_first, expected_last
76-
):
77-
N = len(float_frame.index)
78-
mat = np.random.randn(N)
79-
mat[:5] = np.nan
80-
mat[-5:] = np.nan
81-
82-
frame = DataFrame({"foo": mat}, index=float_frame.index)
83-
index = frame.first_valid_index()
84-
85-
assert index == frame.index[5]
86-
87-
index = frame.last_valid_index()
88-
assert index == frame.index[-6]
89-
90-
# GH12800
91-
empty = DataFrame()
92-
assert empty.last_valid_index() is None
93-
assert empty.first_valid_index() is None
94-
95-
# GH17400: no valid entries
96-
frame[:] = np.nan
97-
assert frame.last_valid_index() is None
98-
assert frame.first_valid_index() is None
99-
100-
# GH20499: its preserves freq with holes
101-
frame.index = date_range("20110101", periods=N, freq="B")
102-
frame.iloc[1] = 1
103-
frame.iloc[-2] = 1
104-
assert frame.first_valid_index() == frame.index[1]
105-
assert frame.last_valid_index() == frame.index[-2]
106-
assert frame.first_valid_index().freq == frame.index.freq
107-
assert frame.last_valid_index().freq == frame.index.freq
108-
109-
# GH 21441
110-
df = DataFrame(data, index=idx)
111-
assert expected_first == df.first_valid_index()
112-
assert expected_last == df.last_valid_index()
113-
114-
@pytest.mark.parametrize("klass", [Series, DataFrame])
115-
def test_first_valid_index_all_nan(self, klass):
116-
# GH#9752 Series/DataFrame should both return None, not raise
117-
obj = klass([np.nan])
118-
119-
assert obj.first_valid_index() is None
120-
assert obj.iloc[:0].first_valid_index() is None
121-
12262
def test_operation_on_NaT(self):
12363
# Both NaT and Timestamp are in DataFrame.
12464
df = pd.DataFrame({"foo": [pd.NaT, pd.NaT, pd.Timestamp("2012-05-01")]})
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
"""
2+
Tests for methods shared by DataFrame and Series.
3+
"""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
"""
2+
Includes test for last_valid_index.
3+
"""
4+
import numpy as np
5+
import pytest
6+
7+
from pandas import DataFrame, Series, date_range
8+
import pandas._testing as tm
9+
10+
11+
class TestFirstValidIndex:
12+
@pytest.mark.parametrize("klass", [Series, DataFrame])
13+
def test_first_valid_index_single_nan(self, klass):
14+
# GH#9752 Series/DataFrame should both return None, not raise
15+
obj = klass([np.nan])
16+
17+
assert obj.first_valid_index() is None
18+
assert obj.iloc[:0].first_valid_index() is None
19+
20+
@pytest.mark.parametrize(
21+
"empty", [DataFrame(), Series(dtype=object), Series([], index=[], dtype=object)]
22+
)
23+
def test_first_valid_index_empty(self, empty):
24+
# GH#12800
25+
assert empty.last_valid_index() is None
26+
assert empty.first_valid_index() is None
27+
28+
@pytest.mark.parametrize(
29+
"data,idx,expected_first,expected_last",
30+
[
31+
({"A": [1, 2, 3]}, [1, 1, 2], 1, 2),
32+
({"A": [1, 2, 3]}, [1, 2, 2], 1, 2),
33+
({"A": [1, 2, 3, 4]}, ["d", "d", "d", "d"], "d", "d"),
34+
({"A": [1, np.nan, 3]}, [1, 1, 2], 1, 2),
35+
({"A": [np.nan, np.nan, 3]}, [1, 1, 2], 2, 2),
36+
({"A": [1, np.nan, 3]}, [1, 2, 2], 1, 2),
37+
],
38+
)
39+
def test_first_last_valid_frame(self, data, idx, expected_first, expected_last):
40+
# GH#21441
41+
df = DataFrame(data, index=idx)
42+
assert expected_first == df.first_valid_index()
43+
assert expected_last == df.last_valid_index()
44+
45+
@pytest.mark.parametrize("index_func", [tm.makeStringIndex, tm.makeDateIndex])
46+
def test_first_last_valid(self, index_func):
47+
N = 30
48+
index = index_func(N)
49+
mat = np.random.randn(N)
50+
mat[:5] = np.nan
51+
mat[-5:] = np.nan
52+
53+
frame = DataFrame({"foo": mat}, index=index)
54+
assert frame.first_valid_index() == frame.index[5]
55+
assert frame.last_valid_index() == frame.index[-6]
56+
57+
ser = frame["foo"]
58+
assert ser.first_valid_index() == frame.index[5]
59+
assert ser.last_valid_index() == frame.index[-6]
60+
61+
@pytest.mark.parametrize("index_func", [tm.makeStringIndex, tm.makeDateIndex])
62+
def test_first_last_valid_all_nan(self, index_func):
63+
# GH#17400: no valid entries
64+
index = index_func(30)
65+
frame = DataFrame(np.nan, columns=["foo"], index=index)
66+
67+
assert frame.last_valid_index() is None
68+
assert frame.first_valid_index() is None
69+
70+
ser = frame["foo"]
71+
assert ser.first_valid_index() is None
72+
assert ser.last_valid_index() is None
73+
74+
def test_first_last_valid_preserves_freq(self):
75+
# GH#20499: its preserves freq with holes
76+
index = date_range("20110101", periods=30, freq="B")
77+
frame = DataFrame(np.nan, columns=["foo"], index=index)
78+
79+
frame.iloc[1] = 1
80+
frame.iloc[-2] = 1
81+
assert frame.first_valid_index() == frame.index[1]
82+
assert frame.last_valid_index() == frame.index[-2]
83+
assert frame.first_valid_index().freq == frame.index.freq
84+
assert frame.last_valid_index().freq == frame.index.freq
85+
86+
ts = frame["foo"]
87+
assert ts.first_valid_index() == ts.index[1]
88+
assert ts.last_valid_index() == ts.index[-2]
89+
assert ts.first_valid_index().freq == ts.index.freq
90+
assert ts.last_valid_index().freq == ts.index.freq

pandas/tests/series/test_timeseries.py

-33
Original file line numberDiff line numberDiff line change
@@ -48,39 +48,6 @@ def test_autocorr(self, datetime_series):
4848
else:
4949
assert corr1 == corr2
5050

51-
def test_first_last_valid(self, datetime_series):
52-
ts = datetime_series.copy()
53-
ts[:5] = np.NaN
54-
55-
index = ts.first_valid_index()
56-
assert index == ts.index[5]
57-
58-
ts[-5:] = np.NaN
59-
index = ts.last_valid_index()
60-
assert index == ts.index[-6]
61-
62-
ts[:] = np.nan
63-
assert ts.last_valid_index() is None
64-
assert ts.first_valid_index() is None
65-
66-
ser = Series([], index=[], dtype=object)
67-
assert ser.last_valid_index() is None
68-
assert ser.first_valid_index() is None
69-
70-
# GH12800
71-
empty = Series(dtype=object)
72-
assert empty.last_valid_index() is None
73-
assert empty.first_valid_index() is None
74-
75-
# GH20499: its preserves freq with holes
76-
ts.index = date_range("20110101", periods=len(ts), freq="B")
77-
ts.iloc[1] = 1
78-
ts.iloc[-2] = 1
79-
assert ts.first_valid_index() == ts.index[1]
80-
assert ts.last_valid_index() == ts.index[-2]
81-
assert ts.first_valid_index().freq == ts.index.freq
82-
assert ts.last_valid_index().freq == ts.index.freq
83-
8451
def test_mpl_compat_hack(self, datetime_series):
8552

8653
# This is currently failing because the test was relying on

0 commit comments

Comments
 (0)