@@ -5894,6 +5894,19 @@ def test_groupby_selection_with_methods(self):
5894
5894
assert_frame_equal (g .filter (lambda x : len (x ) == 3 ),
5895
5895
g_exp .filter (lambda x : len (x ) == 3 ))
5896
5896
5897
+ # The methods returned by these attributes don't have a __name__ attribute
5898
+ # that matches that attribute.
5899
+ # TODO: Fix these inconsistencies
5900
+ DF_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE = frozenset ([
5901
+ 'boxplot' ,
5902
+ 'bfill' ,
5903
+ 'ffill'
5904
+ ])
5905
+ S_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE = frozenset ([
5906
+ 'bfill' ,
5907
+ 'ffill'
5908
+ ])
5909
+
5897
5910
def test_groupby_whitelist (self ):
5898
5911
from string import ascii_lowercase
5899
5912
letters = np .array (list (ascii_lowercase ))
@@ -5986,44 +5999,37 @@ def test_groupby_whitelist(self):
5986
5999
# 'nlargest', 'nsmallest',
5987
6000
])
5988
6001
5989
- # TODO: Fix these inconsistencies between attribute and method names
5990
- inconsistently_named = frozenset ([
5991
- 'tshift' ,
5992
- 'any' ,
5993
- 'dtypes' ,
5994
- 'idxmax' ,
5995
- 'all' ,
5996
- 'fillna' ,
5997
- 'rank' ,
5998
- 'quantile' ,
5999
- 'cummax' ,
6000
- 'take' ,
6001
- 'corr' ,
6002
- 'cummin' ,
6003
- 'diff' ,
6004
- 'plot' ,
6005
- 'pct_change' ,
6006
- 'skew' ,
6007
- 'hist' ,
6008
- 'bfill' ,
6009
- 'cov' ,
6010
- 'boxplot' ,
6011
- 'describe' ,
6012
- 'corrwith' ,
6013
- 'idxmin' ,
6014
- 'ffill' ,
6015
- 'mad' ,
6016
- 'dtype' ,
6017
- 'unique'
6018
- ])
6019
-
6020
- for obj , whitelist in zip ((df , s ), (df_whitelist , s_whitelist )):
6002
+ names_dont_match_pair = (self .DF_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE ,
6003
+ self .S_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE )
6004
+ for obj , whitelist , names_dont_match in zip ((df , s ), (df_whitelist , s_whitelist ), names_dont_match_pair ):
6021
6005
gb = obj .groupby (df .letters )
6022
6006
self .assertEqual (whitelist , gb ._apply_whitelist )
6023
6007
for m in whitelist :
6024
6008
f = getattr (type (gb ), m )
6025
- if m not in inconsistently_named :
6026
- self .assertEqual (f .__name__ , m )
6009
+ try :
6010
+ n = f .__name__
6011
+ except AttributeError :
6012
+ continue
6013
+ if m not in names_dont_match :
6014
+ self .assertEqual (n , m )
6015
+
6016
+ def test_groupby_method_names_that_dont_match_attribute (self ):
6017
+ from string import ascii_lowercase
6018
+ letters = np .array (list (ascii_lowercase ))
6019
+ N = 10
6020
+ random_letters = letters .take (np .random .randint (0 , 26 , N ))
6021
+ df = DataFrame ({'floats' : N / 10 * Series (np .random .random (N )),
6022
+ 'letters' : Series (random_letters )})
6023
+ gb = df .groupby (df .letters )
6024
+ s = df .floats
6025
+
6026
+ names_dont_match_pair = (self .DF_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE ,
6027
+ self .S_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE )
6028
+ for obj , names_dont_match in zip ((df , s ), names_dont_match_pair ):
6029
+ gb = obj .groupby (df .letters )
6030
+ for m in names_dont_match :
6031
+ f = getattr (gb , m )
6032
+ self .assertNotEqual (f .__name__ , m )
6027
6033
6028
6034
AGG_FUNCTIONS = ['sum' , 'prod' , 'min' , 'max' , 'median' , 'mean' , 'skew' ,
6029
6035
'mad' , 'std' , 'var' , 'sem' ]
0 commit comments