2828
2929
3030class 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\n NaT a 1\n 2013-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
0 commit comments