@@ -4938,6 +4938,19 @@ def test_groupby_selection_with_methods(self):
4938
4938
assert_frame_equal (g .filter (lambda x : len (x ) == 3 ),
4939
4939
g_exp .filter (lambda x : len (x ) == 3 ))
4940
4940
4941
+ # The methods returned by these attributes don't have a __name__ attribute
4942
+ # that matches that attribute.
4943
+ # TODO: Fix these inconsistencies
4944
+ DF_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE = frozenset ([
4945
+ 'boxplot' ,
4946
+ 'bfill' ,
4947
+ 'ffill'
4948
+ ])
4949
+ S_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE = frozenset ([
4950
+ 'bfill' ,
4951
+ 'ffill'
4952
+ ])
4953
+
4941
4954
def test_groupby_whitelist (self ):
4942
4955
from string import ascii_lowercase
4943
4956
letters = np .array (list (ascii_lowercase ))
@@ -5030,44 +5043,37 @@ def test_groupby_whitelist(self):
5030
5043
# 'nlargest', 'nsmallest',
5031
5044
])
5032
5045
5033
- # TODO: Fix these inconsistencies between attribute and method names
5034
- inconsistently_named = frozenset ([
5035
- 'tshift' ,
5036
- 'any' ,
5037
- 'dtypes' ,
5038
- 'idxmax' ,
5039
- 'all' ,
5040
- 'fillna' ,
5041
- 'rank' ,
5042
- 'quantile' ,
5043
- 'cummax' ,
5044
- 'take' ,
5045
- 'corr' ,
5046
- 'cummin' ,
5047
- 'diff' ,
5048
- 'plot' ,
5049
- 'pct_change' ,
5050
- 'skew' ,
5051
- 'hist' ,
5052
- 'bfill' ,
5053
- 'cov' ,
5054
- 'boxplot' ,
5055
- 'describe' ,
5056
- 'corrwith' ,
5057
- 'idxmin' ,
5058
- 'ffill' ,
5059
- 'mad' ,
5060
- 'dtype' ,
5061
- 'unique'
5062
- ])
5063
-
5064
- for obj , whitelist in zip ((df , s ), (df_whitelist , s_whitelist )):
5046
+ names_dont_match_pair = (self .DF_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE ,
5047
+ self .S_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE )
5048
+ for obj , whitelist , names_dont_match in zip ((df , s ), (df_whitelist , s_whitelist ), names_dont_match_pair ):
5065
5049
gb = obj .groupby (df .letters )
5066
5050
self .assertEqual (whitelist , gb ._apply_whitelist )
5067
5051
for m in whitelist :
5068
5052
f = getattr (type (gb ), m )
5069
- if m not in inconsistently_named :
5070
- self .assertEqual (f .__name__ , m )
5053
+ try :
5054
+ n = f .__name__
5055
+ except AttributeError :
5056
+ continue
5057
+ if m not in names_dont_match :
5058
+ self .assertEqual (n , m )
5059
+
5060
+ def test_groupby_method_names_that_dont_match_attribute (self ):
5061
+ from string import ascii_lowercase
5062
+ letters = np .array (list (ascii_lowercase ))
5063
+ N = 10
5064
+ random_letters = letters .take (np .random .randint (0 , 26 , N ))
5065
+ df = DataFrame ({'floats' : N / 10 * Series (np .random .random (N )),
5066
+ 'letters' : Series (random_letters )})
5067
+ gb = df .groupby (df .letters )
5068
+ s = df .floats
5069
+
5070
+ names_dont_match_pair = (self .DF_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE ,
5071
+ self .S_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE )
5072
+ for obj , names_dont_match in zip ((df , s ), names_dont_match_pair ):
5073
+ gb = obj .groupby (df .letters )
5074
+ for m in names_dont_match :
5075
+ f = getattr (gb , m )
5076
+ self .assertNotEqual (f .__name__ , m )
5071
5077
5072
5078
AGG_FUNCTIONS = ['sum' , 'prod' , 'min' , 'max' , 'median' , 'mean' , 'skew' ,
5073
5079
'mad' , 'std' , 'var' , 'sem' ]
0 commit comments