Skip to content

Commit 9c7da9c

Browse files
committed
Revert pieces broken off into 30006 and 30007
1 parent 19fae1a commit 9c7da9c

File tree

3 files changed

+111
-61
lines changed

3 files changed

+111
-61
lines changed

doc/source/whatsnew/v1.0.0.rst

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -506,9 +506,6 @@ or ``matplotlib.Axes.plot``. See :ref:`plotting.formatters` for more.
506506
- Removed the previously deprecated :meth:`Series.get_value`, :meth:`Series.set_value`, :meth:`DataFrame.get_value`, :meth:`DataFrame.set_value` (:issue:`17739`)
507507
- Changed the the default value of `inplace` in :meth:`DataFrame.set_index` and :meth:`Series.set_axis`. It now defaults to ``False`` (:issue:`27600`)
508508
- Removed the previously deprecated :attr:`Series.cat.categorical`, :attr:`Series.cat.index`, :attr:`Series.cat.name` (:issue:`24751`)
509-
- Removed the previously deprecated ``time_rule`` keyword from (non-public) :func:`offsets.generate_range`, which has been moved to :func:`core.arrays._ranges.generate_range` (:issue:`24157`)
510-
- :meth:`DataFrame.loc` or :meth:`Series.loc` with listlike indexers and missing labels will no longer reindex (:issue:`17295`)
511-
- :meth:`DataFrame.to_excel` and :meth:`Series.to_excel` with non-existent columns will no longer reindex (:issue:`17295`)
512509
- Removed the previously deprecated "by" keyword from :meth:`DataFrame.sort_index`, use :meth:`DataFrame.sort_values` instead (:issue:`10726`)
513510
- Removed support for nested renaming in :meth:`DataFrame.aggregate`, :meth:`Series.aggregate`, :meth:`DataFrameGroupBy.aggregate`, :meth:`SeriesGroupBy.aggregate`, :meth:`Rolling.aggregate` (:issue:`18529`)
514511
- Passing ``datetime64`` data to :class:`TimedeltaIndex` or ``timedelta64`` data to ``DatetimeIndex`` now raises ``TypeError`` (:issue:`23539`, :issue:`23937`)

pandas/tests/frame/test_api.py

Lines changed: 69 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,35 @@
66
import pytest
77

88
import pandas as pd
9-
from pandas import Categorical, DataFrame, Series, compat, date_range, timedelta_range
9+
from pandas import (
10+
Categorical,
11+
DataFrame,
12+
Series,
13+
SparseDtype,
14+
compat,
15+
date_range,
16+
timedelta_range,
17+
)
1018
import pandas.util.testing as tm
1119

1220

13-
class TestDataFrameMisc:
21+
class SharedWithSparse:
22+
"""
23+
A collection of tests DataFrame and SparseDataFrame can share.
24+
25+
In generic tests on this class, use ``self._assert_frame_equal()`` and
26+
``self._assert_series_equal()`` which are implemented in sub-classes
27+
and dispatch correctly.
28+
"""
29+
30+
def _assert_frame_equal(self, left, right):
31+
"""Dispatch to frame class dependent assertion"""
32+
raise NotImplementedError
33+
34+
def _assert_series_equal(self, left, right):
35+
"""Dispatch to series class dependent assertion"""
36+
raise NotImplementedError
37+
1438
def test_copy_index_name_checking(self, float_frame):
1539
# don't want to be able to modify the index stored elsewhere after
1640
# making a copy
@@ -117,16 +141,16 @@ def test_tab_completion(self):
117141
def test_not_hashable(self):
118142
empty_frame = DataFrame()
119143

120-
df = DataFrame([1])
121-
msg = "'DataFrame' objects are mutable, thus they cannot be hashed"
144+
df = self.klass([1])
145+
msg = "'(Sparse)?DataFrame' objects are mutable, thus they cannot be hashed"
122146
with pytest.raises(TypeError, match=msg):
123147
hash(df)
124148
with pytest.raises(TypeError, match=msg):
125149
hash(empty_frame)
126150

127151
def test_new_empty_index(self):
128-
df1 = DataFrame(np.random.randn(0, 3))
129-
df2 = DataFrame(np.random.randn(0, 3))
152+
df1 = self.klass(np.random.randn(0, 3))
153+
df2 = self.klass(np.random.randn(0, 3))
130154
df1.index.name = "foo"
131155
assert df2.index.name is None
132156

@@ -137,7 +161,7 @@ def test_array_interface(self, float_frame):
137161
assert result.index is float_frame.index
138162
assert result.columns is float_frame.columns
139163

140-
tm.assert_frame_equal(result, float_frame.apply(np.sqrt))
164+
self._assert_frame_equal(result, float_frame.apply(np.sqrt))
141165

142166
def test_get_agg_axis(self, float_frame):
143167
cols = float_frame._get_agg_axis(0)
@@ -163,9 +187,9 @@ def test_nonzero(self, float_frame, float_string_frame):
163187
assert not df.empty
164188

165189
def test_iteritems(self):
166-
df = DataFrame([[1, 2, 3], [4, 5, 6]], columns=["a", "a", "b"])
190+
df = self.klass([[1, 2, 3], [4, 5, 6]], columns=["a", "a", "b"])
167191
for k, v in df.items():
168-
assert isinstance(v, DataFrame._constructor_sliced)
192+
assert isinstance(v, self.klass._constructor_sliced)
169193

170194
def test_items(self):
171195
# GH 17213, GH 13918
@@ -182,23 +206,23 @@ def test_iter(self, float_frame):
182206
def test_iterrows(self, float_frame, float_string_frame):
183207
for k, v in float_frame.iterrows():
184208
exp = float_frame.loc[k]
185-
tm.assert_series_equal(v, exp)
209+
self._assert_series_equal(v, exp)
186210

187211
for k, v in float_string_frame.iterrows():
188212
exp = float_string_frame.loc[k]
189-
tm.assert_series_equal(v, exp)
213+
self._assert_series_equal(v, exp)
190214

191215
def test_iterrows_iso8601(self):
192216
# GH 19671
193-
s = DataFrame(
217+
s = self.klass(
194218
{
195219
"non_iso8601": ["M1701", "M1802", "M1903", "M2004"],
196220
"iso8601": date_range("2000-01-01", periods=4, freq="M"),
197221
}
198222
)
199223
for k, v in s.iterrows():
200224
exp = s.loc[k]
201-
tm.assert_series_equal(v, exp)
225+
self._assert_series_equal(v, exp)
202226

203227
def test_iterrows_corner(self):
204228
# gh-12222
@@ -224,19 +248,19 @@ def test_iterrows_corner(self):
224248

225249
def test_itertuples(self, float_frame):
226250
for i, tup in enumerate(float_frame.itertuples()):
227-
s = DataFrame._constructor_sliced(tup[1:])
251+
s = self.klass._constructor_sliced(tup[1:])
228252
s.name = tup[0]
229253
expected = float_frame.iloc[i, :].reset_index(drop=True)
230-
tm.assert_series_equal(s, expected)
254+
self._assert_series_equal(s, expected)
231255

232-
df = DataFrame(
256+
df = self.klass(
233257
{"floats": np.random.randn(5), "ints": range(5)}, columns=["floats", "ints"]
234258
)
235259

236260
for tup in df.itertuples(index=False):
237261
assert isinstance(tup[1], int)
238262

239-
df = DataFrame(data={"a": [1, 2, 3], "b": [4, 5, 6]})
263+
df = self.klass(data={"a": [1, 2, 3], "b": [4, 5, 6]})
240264
dfaa = df[["a", "a"]]
241265

242266
assert list(dfaa.itertuples()) == [(0, 1, 1), (1, 2, 2), (2, 3, 3)]
@@ -291,7 +315,7 @@ def test_sequence_like_with_categorical(self):
291315
def test_len(self, float_frame):
292316
assert len(float_frame) == len(float_frame.index)
293317

294-
def test_values_mixed_dtypes(self, float_frame, float_string_frame):
318+
def test_values(self, float_frame, float_string_frame):
295319
frame = float_frame
296320
arr = frame.values
297321

@@ -308,7 +332,7 @@ def test_values_mixed_dtypes(self, float_frame, float_string_frame):
308332
arr = float_string_frame[["foo", "A"]].values
309333
assert arr[0, 0] == "bar"
310334

311-
df = DataFrame({"complex": [1j, 2j, 3j], "real": [1, 2, 3]})
335+
df = self.klass({"complex": [1j, 2j, 3j], "real": [1, 2, 3]})
312336
arr = df.values
313337
assert arr[0, 0] == 1j
314338

@@ -348,17 +372,17 @@ def test_transpose(self, float_frame):
348372

349373
# mixed type
350374
index, data = tm.getMixedTypeDict()
351-
mixed = DataFrame(data, index=index)
375+
mixed = self.klass(data, index=index)
352376

353377
mixed_T = mixed.T
354378
for col, s in mixed_T.items():
355379
assert s.dtype == np.object_
356380

357381
def test_swapaxes(self):
358-
df = DataFrame(np.random.randn(10, 5))
359-
tm.assert_frame_equal(df.T, df.swapaxes(0, 1))
360-
tm.assert_frame_equal(df.T, df.swapaxes(1, 0))
361-
tm.assert_frame_equal(df, df.swapaxes(0, 0))
382+
df = self.klass(np.random.randn(10, 5))
383+
self._assert_frame_equal(df.T, df.swapaxes(0, 1))
384+
self._assert_frame_equal(df.T, df.swapaxes(1, 0))
385+
self._assert_frame_equal(df, df.swapaxes(0, 0))
362386
msg = (
363387
"No axis named 2 for object type"
364388
r" <class 'pandas.core(.sparse)?.frame.(Sparse)?DataFrame'>"
@@ -389,7 +413,7 @@ def test_more_values(self, float_string_frame):
389413
assert values.shape[1] == len(float_string_frame.columns)
390414

391415
def test_repr_with_mi_nat(self, float_string_frame):
392-
df = DataFrame(
416+
df = self.klass(
393417
{"X": [1, 2]}, index=[[pd.NaT, pd.Timestamp("20130101")], ["a", "b"]]
394418
)
395419
result = repr(df)
@@ -406,26 +430,26 @@ def test_series_put_names(self, float_string_frame):
406430
assert v.name == k
407431

408432
def test_empty_nonzero(self):
409-
df = DataFrame([1, 2, 3])
433+
df = self.klass([1, 2, 3])
410434
assert not df.empty
411-
df = DataFrame(index=[1], columns=[1])
435+
df = self.klass(index=[1], columns=[1])
412436
assert not df.empty
413-
df = DataFrame(index=["a", "b"], columns=["c", "d"]).dropna()
437+
df = self.klass(index=["a", "b"], columns=["c", "d"]).dropna()
414438
assert df.empty
415439
assert df.T.empty
416440
empty_frames = [
417-
DataFrame(),
418-
DataFrame(index=[1]),
419-
DataFrame(columns=[1]),
420-
DataFrame({1: []}),
441+
self.klass(),
442+
self.klass(index=[1]),
443+
self.klass(columns=[1]),
444+
self.klass({1: []}),
421445
]
422446
for df in empty_frames:
423447
assert df.empty
424448
assert df.T.empty
425449

426450
def test_with_datetimelikes(self):
427451

428-
df = DataFrame(
452+
df = self.klass(
429453
{
430454
"A": date_range("20130101", periods=10),
431455
"B": timedelta_range("1 day", periods=10),
@@ -434,9 +458,20 @@ def test_with_datetimelikes(self):
434458
t = df.T
435459

436460
result = t.dtypes.value_counts()
437-
expected = Series({np.dtype("object"): 10})
461+
if self.klass is DataFrame:
462+
expected = Series({np.dtype("object"): 10})
463+
else:
464+
expected = Series({SparseDtype(dtype=object): 10})
438465
tm.assert_series_equal(result, expected)
439466

467+
468+
class TestDataFrameMisc(SharedWithSparse):
469+
470+
klass = DataFrame
471+
# SharedWithSparse tests use generic, klass-agnostic assertion
472+
_assert_frame_equal = staticmethod(tm.assert_frame_equal)
473+
_assert_series_equal = staticmethod(tm.assert_series_equal)
474+
440475
def test_values(self, float_frame):
441476
float_frame.values[:, 0] = 5.0
442477
assert (float_frame.values[:, 0] == 5).all()

pandas/tests/series/test_api.py

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,18 @@
2424
import pandas.io.formats.printing as printing
2525

2626

27-
class TestSeriesMisc:
27+
class SharedWithSparse:
28+
"""
29+
A collection of tests Series and SparseSeries can share.
30+
31+
In generic tests on this class, use ``self._assert_series_equal()``
32+
which is implemented in sub-classes.
33+
"""
34+
35+
def _assert_series_equal(self, left, right):
36+
"""Dispatch to series class dependent assertion"""
37+
raise NotImplementedError
38+
2839
def test_scalarop_preserve_name(self, datetime_series):
2940
result = datetime_series * 2
3041
assert result.name == datetime_series.name
@@ -121,78 +132,85 @@ def test_sort_index_name(self, datetime_series):
121132

122133
def test_constructor_dict(self):
123134
d = {"a": 0.0, "b": 1.0, "c": 2.0}
124-
result = Series(d)
125-
expected = Series(d, index=sorted(d.keys()))
126-
tm.assert_series_equal(result, expected)
135+
result = self.series_klass(d)
136+
expected = self.series_klass(d, index=sorted(d.keys()))
137+
self._assert_series_equal(result, expected)
127138

128-
result = Series(d, index=["b", "c", "d", "a"])
129-
expected = Series([1, 2, np.nan, 0], index=["b", "c", "d", "a"])
130-
tm.assert_series_equal(result, expected)
139+
result = self.series_klass(d, index=["b", "c", "d", "a"])
140+
expected = self.series_klass([1, 2, np.nan, 0], index=["b", "c", "d", "a"])
141+
self._assert_series_equal(result, expected)
131142

132143
def test_constructor_subclass_dict(self):
133144
data = tm.TestSubDict((x, 10.0 * x) for x in range(10))
134-
series = Series(data)
135-
expected = Series(dict(data.items()))
136-
tm.assert_series_equal(series, expected)
145+
series = self.series_klass(data)
146+
expected = self.series_klass(dict(data.items()))
147+
self._assert_series_equal(series, expected)
137148

138149
def test_constructor_ordereddict(self):
139150
# GH3283
140151
data = OrderedDict(
141152
("col{i}".format(i=i), np.random.random()) for i in range(12)
142153
)
143154

144-
series = Series(data)
145-
expected = Series(list(data.values()), list(data.keys()))
146-
tm.assert_series_equal(series, expected)
155+
series = self.series_klass(data)
156+
expected = self.series_klass(list(data.values()), list(data.keys()))
157+
self._assert_series_equal(series, expected)
147158

148159
# Test with subclass
149160
class A(OrderedDict):
150161
pass
151162

152-
series = Series(A(data))
153-
tm.assert_series_equal(series, expected)
163+
series = self.series_klass(A(data))
164+
self._assert_series_equal(series, expected)
154165

155166
def test_constructor_dict_multiindex(self):
156167
d = {("a", "a"): 0.0, ("b", "a"): 1.0, ("b", "c"): 2.0}
157168
_d = sorted(d.items())
158-
result = Series(d)
159-
expected = Series(
169+
result = self.series_klass(d)
170+
expected = self.series_klass(
160171
[x[1] for x in _d], index=pd.MultiIndex.from_tuples([x[0] for x in _d])
161172
)
162-
tm.assert_series_equal(result, expected)
173+
self._assert_series_equal(result, expected)
163174

164175
d["z"] = 111.0
165176
_d.insert(0, ("z", d["z"]))
166-
result = Series(d)
167-
expected = Series(
177+
result = self.series_klass(d)
178+
expected = self.series_klass(
168179
[x[1] for x in _d], index=pd.Index([x[0] for x in _d], tupleize_cols=False)
169180
)
170181
result = result.reindex(index=expected.index)
171-
tm.assert_series_equal(result, expected)
182+
self._assert_series_equal(result, expected)
172183

173184
def test_constructor_dict_timedelta_index(self):
174185
# GH #12169 : Resample category data with timedelta index
175186
# construct Series from dict as data and TimedeltaIndex as index
176187
# will result NaN in result Series data
177-
expected = Series(
188+
expected = self.series_klass(
178189
data=["A", "B", "C"], index=pd.to_timedelta([0, 10, 20], unit="s")
179190
)
180191

181-
result = Series(
192+
result = self.series_klass(
182193
data={
183194
pd.to_timedelta(0, unit="s"): "A",
184195
pd.to_timedelta(10, unit="s"): "B",
185196
pd.to_timedelta(20, unit="s"): "C",
186197
},
187198
index=pd.to_timedelta([0, 10, 20], unit="s"),
188199
)
189-
tm.assert_series_equal(result, expected)
200+
self._assert_series_equal(result, expected)
190201

191202
def test_sparse_accessor_updates_on_inplace(self):
192203
s = pd.Series([1, 1, 2, 3], dtype="Sparse[int]")
193204
s.drop([0, 1], inplace=True)
194205
assert s.sparse.density == 1.0
195206

207+
208+
class TestSeriesMisc(SharedWithSparse):
209+
210+
series_klass = Series
211+
# SharedWithSparse tests use generic, series_klass-agnostic assertion
212+
_assert_series_equal = staticmethod(tm.assert_series_equal)
213+
196214
def test_tab_completion(self):
197215
# GH 9910
198216
s = Series(list("abcd"))

0 commit comments

Comments
 (0)