28
28
29
29
30
30
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
31
45
32
46
def test_copy_index_name_checking (self ):
33
47
# don't want to be able to modify the index stored elsewhere after
@@ -76,11 +90,6 @@ def test_add_prefix_suffix(self):
76
90
expected = pd .Index (['{}%' .format (c ) for c in self .frame .columns ])
77
91
tm .assert_index_equal (with_pct_suffix .columns , expected )
78
92
79
-
80
- class TestDataFrameMisc (SharedWithSparse , TestData ):
81
-
82
- klass = DataFrame
83
-
84
93
def test_get_axis (self ):
85
94
f = self .frame
86
95
assert f ._get_axis_number (0 ) == 0
@@ -118,13 +127,13 @@ def test_column_contains_typeerror(self):
118
127
pass
119
128
120
129
def test_not_hashable (self ):
121
- df = pd . DataFrame ([1 ])
130
+ df = self . klass ([1 ])
122
131
pytest .raises (TypeError , hash , df )
123
132
pytest .raises (TypeError , hash , self .empty )
124
133
125
134
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 ))
128
137
df1 .index .name = 'foo'
129
138
assert df2 .index .name is None
130
139
@@ -135,7 +144,7 @@ def test_array_interface(self):
135
144
assert result .index is self .frame .index
136
145
assert result .columns is self .frame .columns
137
146
138
- assert_frame_equal (result , self .frame .apply (np .sqrt ))
147
+ self . _assert_frame_equal (result , self .frame .apply (np .sqrt ))
139
148
140
149
def test_get_agg_axis (self ):
141
150
cols = self .frame ._get_agg_axis (0 )
@@ -160,36 +169,36 @@ def test_nonzero(self):
160
169
assert not df .empty
161
170
162
171
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' ])
164
173
for k , v in compat .iteritems (df ):
165
- assert type (v ) == Series
174
+ assert type (v ) == self . klass . _constructor_sliced
166
175
167
176
def test_iter (self ):
168
177
assert tm .equalContents (list (self .frame ), self .frame .columns )
169
178
170
179
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 )
174
183
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 )
178
187
179
188
def test_itertuples (self ):
180
189
for i , tup in enumerate (self .frame .itertuples ()):
181
- s = Series (tup [1 :])
190
+ s = self . klass . _constructor_sliced (tup [1 :])
182
191
s .name = tup [0 ]
183
192
expected = self .frame .iloc [i , :].reset_index (drop = True )
184
- assert_series_equal (s , expected )
193
+ self . _assert_series_equal (s , expected )
185
194
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' ])
188
197
189
198
for tup in df .itertuples (index = False ):
190
199
assert isinstance (tup [1 ], np .integer )
191
200
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 ]})
193
202
dfaa = df [['a' , 'a' ]]
194
203
195
204
assert (list (dfaa .itertuples ()) ==
@@ -237,7 +246,7 @@ def test_as_matrix(self):
237
246
mat = self .mixed_frame .as_matrix (['foo' , 'A' ])
238
247
assert mat [0 , 0 ] == 'bar'
239
248
240
- df = DataFrame ({'real' : [1 , 2 , 3 ], 'complex' : [1j , 2j , 3j ]})
249
+ df = self . klass ({'real' : [1 , 2 , 3 ], 'complex' : [1j , 2j , 3j ]})
241
250
mat = df .as_matrix ()
242
251
assert mat [0 , 0 ] == 1j
243
252
@@ -246,20 +255,6 @@ def test_as_matrix(self):
246
255
expected = self .frame .reindex (columns = ['A' , 'B' ]).values
247
256
assert_almost_equal (mat , expected )
248
257
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
-
263
258
def test_transpose (self ):
264
259
frame = self .frame
265
260
dft = frame .T
@@ -272,23 +267,17 @@ def test_transpose(self):
272
267
273
268
# mixed type
274
269
index , data = tm .getMixedTypeDict ()
275
- mixed = DataFrame (data , index = index )
270
+ mixed = self . klass (data , index = index )
276
271
277
272
mixed_T = mixed .T
278
273
for col , s in compat .iteritems (mixed_T ):
279
274
assert s .dtype == np .object_
280
275
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
-
287
276
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 ))
292
281
pytest .raises (ValueError , df .swapaxes , 2 , 5 )
293
282
294
283
def test_axis_aliases (self ):
@@ -308,8 +297,8 @@ def test_more_asMatrix(self):
308
297
assert values .shape [1 ] == len (self .mixed_frame .columns )
309
298
310
299
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' ]])
313
302
res = repr (df )
314
303
exp = ' X\n NaT a 1\n 2013-01-01 b 2'
315
304
assert res == exp
@@ -324,31 +313,56 @@ def test_series_put_names(self):
324
313
assert v .name == k
325
314
326
315
def test_empty_nonzero (self ):
327
- df = DataFrame ([1 , 2 , 3 ])
316
+ df = self . klass ([1 , 2 , 3 ])
328
317
assert not df .empty
329
- df = pd . DataFrame (index = [1 ], columns = [1 ])
318
+ df = self . klass (index = [1 ], columns = [1 ])
330
319
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 ()
332
321
assert df .empty
333
322
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 : []})]
338
327
for df in empty_frames :
339
328
assert df .empty
340
329
assert df .T .empty
341
330
342
331
def test_with_datetimelikes (self ):
343
332
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 )})
346
335
t = df .T
347
336
348
337
result = t .get_dtype_counts ()
349
338
expected = Series ({'object' : 10 })
350
339
tm .assert_series_equal (result , expected )
351
340
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
+
352
366
def test_inplace_return_self (self ):
353
367
# re #1893
354
368
0 commit comments