Skip to content

Commit 3ea2993

Browse files
kerncjreback
authored andcommitted
TST: Move more frame tests to SharedWithSparse (#17227)
1 parent a4a5665 commit 3ea2993

File tree

2 files changed

+79
-59
lines changed

2 files changed

+79
-59
lines changed

pandas/tests/frame/test_api.py

+73-59
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,20 @@
2828

2929

3030
class SharedWithSparse(object):
31+
"""
32+
A collection of tests DataFrame and SparseDataFrame can share.
33+
34+
In generic tests on this class, use ``self._assert_frame_equal()`` and
35+
``self._assert_series_equal()`` which are implemented in sub-classes
36+
and dispatch correctly.
37+
"""
38+
def _assert_frame_equal(self, left, right):
39+
"""Dispatch to frame class dependent assertion"""
40+
raise NotImplementedError
41+
42+
def _assert_series_equal(self, left, right):
43+
"""Dispatch to series class dependent assertion"""
44+
raise NotImplementedError
3145

3246
def test_copy_index_name_checking(self):
3347
# don't want to be able to modify the index stored elsewhere after
@@ -76,11 +90,6 @@ def test_add_prefix_suffix(self):
7690
expected = pd.Index(['{}%'.format(c) for c in self.frame.columns])
7791
tm.assert_index_equal(with_pct_suffix.columns, expected)
7892

79-
80-
class TestDataFrameMisc(SharedWithSparse, TestData):
81-
82-
klass = DataFrame
83-
8493
def test_get_axis(self):
8594
f = self.frame
8695
assert f._get_axis_number(0) == 0
@@ -118,13 +127,13 @@ def test_column_contains_typeerror(self):
118127
pass
119128

120129
def test_not_hashable(self):
121-
df = pd.DataFrame([1])
130+
df = self.klass([1])
122131
pytest.raises(TypeError, hash, df)
123132
pytest.raises(TypeError, hash, self.empty)
124133

125134
def test_new_empty_index(self):
126-
df1 = DataFrame(randn(0, 3))
127-
df2 = DataFrame(randn(0, 3))
135+
df1 = self.klass(randn(0, 3))
136+
df2 = self.klass(randn(0, 3))
128137
df1.index.name = 'foo'
129138
assert df2.index.name is None
130139

@@ -135,7 +144,7 @@ def test_array_interface(self):
135144
assert result.index is self.frame.index
136145
assert result.columns is self.frame.columns
137146

138-
assert_frame_equal(result, self.frame.apply(np.sqrt))
147+
self._assert_frame_equal(result, self.frame.apply(np.sqrt))
139148

140149
def test_get_agg_axis(self):
141150
cols = self.frame._get_agg_axis(0)
@@ -160,36 +169,36 @@ def test_nonzero(self):
160169
assert not df.empty
161170

162171
def test_iteritems(self):
163-
df = DataFrame([[1, 2, 3], [4, 5, 6]], columns=['a', 'a', 'b'])
172+
df = self.klass([[1, 2, 3], [4, 5, 6]], columns=['a', 'a', 'b'])
164173
for k, v in compat.iteritems(df):
165-
assert type(v) == Series
174+
assert type(v) == self.klass._constructor_sliced
166175

167176
def test_iter(self):
168177
assert tm.equalContents(list(self.frame), self.frame.columns)
169178

170179
def test_iterrows(self):
171-
for i, (k, v) in enumerate(self.frame.iterrows()):
172-
exp = self.frame.xs(self.frame.index[i])
173-
assert_series_equal(v, exp)
180+
for k, v in self.frame.iterrows():
181+
exp = self.frame.loc[k]
182+
self._assert_series_equal(v, exp)
174183

175-
for i, (k, v) in enumerate(self.mixed_frame.iterrows()):
176-
exp = self.mixed_frame.xs(self.mixed_frame.index[i])
177-
assert_series_equal(v, exp)
184+
for k, v in self.mixed_frame.iterrows():
185+
exp = self.mixed_frame.loc[k]
186+
self._assert_series_equal(v, exp)
178187

179188
def test_itertuples(self):
180189
for i, tup in enumerate(self.frame.itertuples()):
181-
s = Series(tup[1:])
190+
s = self.klass._constructor_sliced(tup[1:])
182191
s.name = tup[0]
183192
expected = self.frame.iloc[i, :].reset_index(drop=True)
184-
assert_series_equal(s, expected)
193+
self._assert_series_equal(s, expected)
185194

186-
df = DataFrame({'floats': np.random.randn(5),
187-
'ints': lrange(5)}, columns=['floats', 'ints'])
195+
df = self.klass({'floats': np.random.randn(5),
196+
'ints': lrange(5)}, columns=['floats', 'ints'])
188197

189198
for tup in df.itertuples(index=False):
190199
assert isinstance(tup[1], np.integer)
191200

192-
df = DataFrame(data={"a": [1, 2, 3], "b": [4, 5, 6]})
201+
df = self.klass(data={"a": [1, 2, 3], "b": [4, 5, 6]})
193202
dfaa = df[['a', 'a']]
194203

195204
assert (list(dfaa.itertuples()) ==
@@ -237,7 +246,7 @@ def test_as_matrix(self):
237246
mat = self.mixed_frame.as_matrix(['foo', 'A'])
238247
assert mat[0, 0] == 'bar'
239248

240-
df = DataFrame({'real': [1, 2, 3], 'complex': [1j, 2j, 3j]})
249+
df = self.klass({'real': [1, 2, 3], 'complex': [1j, 2j, 3j]})
241250
mat = df.as_matrix()
242251
assert mat[0, 0] == 1j
243252

@@ -246,20 +255,6 @@ def test_as_matrix(self):
246255
expected = self.frame.reindex(columns=['A', 'B']).values
247256
assert_almost_equal(mat, expected)
248257

249-
def test_values(self):
250-
self.frame.values[:, 0] = 5.
251-
assert (self.frame.values[:, 0] == 5).all()
252-
253-
def test_deepcopy(self):
254-
cp = deepcopy(self.frame)
255-
series = cp['A']
256-
series[:] = 10
257-
for idx, value in compat.iteritems(series):
258-
assert self.frame['A'][idx] != value
259-
260-
# ---------------------------------------------------------------------
261-
# Transposing
262-
263258
def test_transpose(self):
264259
frame = self.frame
265260
dft = frame.T
@@ -272,23 +267,17 @@ def test_transpose(self):
272267

273268
# mixed type
274269
index, data = tm.getMixedTypeDict()
275-
mixed = DataFrame(data, index=index)
270+
mixed = self.klass(data, index=index)
276271

277272
mixed_T = mixed.T
278273
for col, s in compat.iteritems(mixed_T):
279274
assert s.dtype == np.object_
280275

281-
def test_transpose_get_view(self):
282-
dft = self.frame.T
283-
dft.values[:, 5:10] = 5
284-
285-
assert (self.frame.values[5:10] == 5).all()
286-
287276
def test_swapaxes(self):
288-
df = DataFrame(np.random.randn(10, 5))
289-
assert_frame_equal(df.T, df.swapaxes(0, 1))
290-
assert_frame_equal(df.T, df.swapaxes(1, 0))
291-
assert_frame_equal(df, df.swapaxes(0, 0))
277+
df = self.klass(np.random.randn(10, 5))
278+
self._assert_frame_equal(df.T, df.swapaxes(0, 1))
279+
self._assert_frame_equal(df.T, df.swapaxes(1, 0))
280+
self._assert_frame_equal(df, df.swapaxes(0, 0))
292281
pytest.raises(ValueError, df.swapaxes, 2, 5)
293282

294283
def test_axis_aliases(self):
@@ -308,8 +297,8 @@ def test_more_asMatrix(self):
308297
assert values.shape[1] == len(self.mixed_frame.columns)
309298

310299
def test_repr_with_mi_nat(self):
311-
df = DataFrame({'X': [1, 2]},
312-
index=[[pd.NaT, pd.Timestamp('20130101')], ['a', 'b']])
300+
df = self.klass({'X': [1, 2]},
301+
index=[[pd.NaT, pd.Timestamp('20130101')], ['a', 'b']])
313302
res = repr(df)
314303
exp = ' X\nNaT a 1\n2013-01-01 b 2'
315304
assert res == exp
@@ -324,31 +313,56 @@ def test_series_put_names(self):
324313
assert v.name == k
325314

326315
def test_empty_nonzero(self):
327-
df = DataFrame([1, 2, 3])
316+
df = self.klass([1, 2, 3])
328317
assert not df.empty
329-
df = pd.DataFrame(index=[1], columns=[1])
318+
df = self.klass(index=[1], columns=[1])
330319
assert not df.empty
331-
df = DataFrame(index=['a', 'b'], columns=['c', 'd']).dropna()
320+
df = self.klass(index=['a', 'b'], columns=['c', 'd']).dropna()
332321
assert df.empty
333322
assert df.T.empty
334-
empty_frames = [pd.DataFrame(),
335-
pd.DataFrame(index=[1]),
336-
pd.DataFrame(columns=[1]),
337-
pd.DataFrame({1: []})]
323+
empty_frames = [self.klass(),
324+
self.klass(index=[1]),
325+
self.klass(columns=[1]),
326+
self.klass({1: []})]
338327
for df in empty_frames:
339328
assert df.empty
340329
assert df.T.empty
341330

342331
def test_with_datetimelikes(self):
343332

344-
df = DataFrame({'A': date_range('20130101', periods=10),
345-
'B': timedelta_range('1 day', periods=10)})
333+
df = self.klass({'A': date_range('20130101', periods=10),
334+
'B': timedelta_range('1 day', periods=10)})
346335
t = df.T
347336

348337
result = t.get_dtype_counts()
349338
expected = Series({'object': 10})
350339
tm.assert_series_equal(result, expected)
351340

341+
342+
class TestDataFrameMisc(SharedWithSparse, TestData):
343+
344+
klass = DataFrame
345+
# SharedWithSparse tests use generic, klass-agnostic assertion
346+
_assert_frame_equal = staticmethod(assert_frame_equal)
347+
_assert_series_equal = staticmethod(assert_series_equal)
348+
349+
def test_values(self):
350+
self.frame.values[:, 0] = 5.
351+
assert (self.frame.values[:, 0] == 5).all()
352+
353+
def test_deepcopy(self):
354+
cp = deepcopy(self.frame)
355+
series = cp['A']
356+
series[:] = 10
357+
for idx, value in compat.iteritems(series):
358+
assert self.frame['A'][idx] != value
359+
360+
def test_transpose_get_view(self):
361+
dft = self.frame.T
362+
dft.values[:, 5:10] = 5
363+
364+
assert (self.frame.values[5:10] == 5).all()
365+
352366
def test_inplace_return_self(self):
353367
# re #1893
354368

pandas/tests/sparse/test_frame.py

+6
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@
2929
class TestSparseDataFrame(SharedWithSparse):
3030
klass = SparseDataFrame
3131

32+
# SharedWithSparse tests use generic, klass-agnostic assertion
33+
_assert_frame_equal = staticmethod(tm.assert_sp_frame_equal)
34+
_assert_series_equal = staticmethod(tm.assert_sp_series_equal)
35+
3236
def setup_method(self, method):
3337
self.data = {'A': [nan, nan, nan, 0, 1, 2, 3, 4, 5, 6],
3438
'B': [0, 1, 2, nan, nan, nan, 3, 4, 5, 6],
@@ -43,6 +47,8 @@ def setup_method(self, method):
4347
self.frame = SparseDataFrame(self.data, index=self.dates)
4448
self.iframe = SparseDataFrame(self.data, index=self.dates,
4549
default_kind='integer')
50+
self.mixed_frame = self.frame.copy(False)
51+
self.mixed_frame['foo'] = pd.SparseArray(['bar'] * len(self.dates))
4652

4753
values = self.frame.values.copy()
4854
values[np.isnan(values)] = 0

0 commit comments

Comments
 (0)