@@ -5129,6 +5129,19 @@ def test_groupby_selection_with_methods(self):
5129
5129
assert_frame_equal (g .filter (lambda x : len (x ) == 3 ),
5130
5130
g_exp .filter (lambda x : len (x ) == 3 ))
5131
5131
5132
+ # The methods returned by these attributes don't have a __name__ attribute
5133
+ # that matches that attribute.
5134
+ # TODO: Fix these inconsistencies
5135
+ DF_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE = frozenset ([
5136
+ 'boxplot' ,
5137
+ 'bfill' ,
5138
+ 'ffill'
5139
+ ])
5140
+ S_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE = frozenset ([
5141
+ 'bfill' ,
5142
+ 'ffill'
5143
+ ])
5144
+
5132
5145
def test_groupby_whitelist (self ):
5133
5146
from string import ascii_lowercase
5134
5147
letters = np .array (list (ascii_lowercase ))
@@ -5213,44 +5226,37 @@ def test_groupby_whitelist(self):
5213
5226
# 'nlargest', 'nsmallest',
5214
5227
])
5215
5228
5216
- # TODO: Fix these inconsistencies between attribute and method names
5217
- inconsistently_named = frozenset ([
5218
- 'tshift' ,
5219
- 'any' ,
5220
- 'dtypes' ,
5221
- 'idxmax' ,
5222
- 'all' ,
5223
- 'fillna' ,
5224
- 'rank' ,
5225
- 'quantile' ,
5226
- 'cummax' ,
5227
- 'take' ,
5228
- 'corr' ,
5229
- 'cummin' ,
5230
- 'diff' ,
5231
- 'plot' ,
5232
- 'pct_change' ,
5233
- 'skew' ,
5234
- 'hist' ,
5235
- 'bfill' ,
5236
- 'cov' ,
5237
- 'boxplot' ,
5238
- 'describe' ,
5239
- 'corrwith' ,
5240
- 'idxmin' ,
5241
- 'ffill' ,
5242
- 'mad' ,
5243
- 'dtype' ,
5244
- 'unique'
5245
- ])
5246
-
5247
- for obj , whitelist in zip ((df , s ), (df_whitelist , s_whitelist )):
5229
+ names_dont_match_pair = (self .DF_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE ,
5230
+ self .S_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE )
5231
+ for obj , whitelist , names_dont_match in zip ((df , s ), (df_whitelist , s_whitelist ), names_dont_match_pair ):
5248
5232
gb = obj .groupby (df .letters )
5249
5233
self .assertEqual (whitelist , gb ._apply_whitelist )
5250
5234
for m in whitelist :
5251
5235
f = getattr (type (gb ), m )
5252
- if m not in inconsistently_named :
5253
- self .assertEqual (f .__name__ , m )
5236
+ try :
5237
+ n = f .__name__
5238
+ except AttributeError :
5239
+ continue
5240
+ if m not in names_dont_match :
5241
+ self .assertEqual (n , m )
5242
+
5243
+ def test_groupby_method_names_that_dont_match_attribute (self ):
5244
+ from string import ascii_lowercase
5245
+ letters = np .array (list (ascii_lowercase ))
5246
+ N = 10
5247
+ random_letters = letters .take (np .random .randint (0 , 26 , N ))
5248
+ df = DataFrame ({'floats' : N / 10 * Series (np .random .random (N )),
5249
+ 'letters' : Series (random_letters )})
5250
+ gb = df .groupby (df .letters )
5251
+ s = df .floats
5252
+
5253
+ names_dont_match_pair = (self .DF_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE ,
5254
+ self .S_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE )
5255
+ for obj , names_dont_match in zip ((df , s ), names_dont_match_pair ):
5256
+ gb = obj .groupby (df .letters )
5257
+ for m in names_dont_match :
5258
+ f = getattr (gb , m )
5259
+ self .assertNotEqual (f .__name__ , m )
5254
5260
5255
5261
AGG_FUNCTIONS = ['sum' , 'prod' , 'min' , 'max' , 'median' , 'mean' , 'skew' ,
5256
5262
'mad' , 'std' , 'var' , 'sem' ]
0 commit comments