@@ -3753,6 +3753,19 @@ def test_groupby_selection_with_methods(self):
3753
3753
assert_frame_equal (g .filter (lambda x : len (x ) == 3 ),
3754
3754
g_exp .filter (lambda x : len (x ) == 3 ))
3755
3755
3756
+ # The methods returned by these attributes don't have a __name__ attribute
3757
+ # that matches that attribute.
3758
+ # TODO: Fix these inconsistencies
3759
+ DF_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE = frozenset ([
3760
+ 'boxplot' ,
3761
+ 'bfill' ,
3762
+ 'ffill'
3763
+ ])
3764
+ S_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE = frozenset ([
3765
+ 'bfill' ,
3766
+ 'ffill'
3767
+ ])
3768
+
3756
3769
def test_groupby_whitelist (self ):
3757
3770
from string import ascii_lowercase
3758
3771
letters = np .array (list (ascii_lowercase ))
@@ -3836,44 +3849,37 @@ def test_groupby_whitelist(self):
3836
3849
'nsmallest' ,
3837
3850
])
3838
3851
3839
- # TODO: Fix these inconsistencies between attribute and method names
3840
- inconsistently_named = frozenset ([
3841
- 'tshift' ,
3842
- 'any' ,
3843
- 'dtypes' ,
3844
- 'idxmax' ,
3845
- 'all' ,
3846
- 'fillna' ,
3847
- 'rank' ,
3848
- 'quantile' ,
3849
- 'cummax' ,
3850
- 'take' ,
3851
- 'corr' ,
3852
- 'cummin' ,
3853
- 'diff' ,
3854
- 'plot' ,
3855
- 'pct_change' ,
3856
- 'skew' ,
3857
- 'hist' ,
3858
- 'bfill' ,
3859
- 'cov' ,
3860
- 'boxplot' ,
3861
- 'describe' ,
3862
- 'corrwith' ,
3863
- 'idxmin' ,
3864
- 'ffill' ,
3865
- 'mad' ,
3866
- 'dtype' ,
3867
- 'unique'
3868
- ])
3869
-
3870
- for obj , whitelist in zip ((df , s ), (df_whitelist , s_whitelist )):
3852
+ names_dont_match_pair = (self .DF_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE ,
3853
+ self .S_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE )
3854
+ for obj , whitelist , names_dont_match in zip ((df , s ), (df_whitelist , s_whitelist ), names_dont_match_pair ):
3871
3855
gb = obj .groupby (df .letters )
3872
3856
self .assertEqual (whitelist , gb ._apply_whitelist )
3873
3857
for m in whitelist :
3874
3858
f = getattr (type (gb ), m )
3875
- if m not in inconsistently_named :
3876
- self .assertEqual (f .__name__ , m )
3859
+ try :
3860
+ n = f .__name__
3861
+ except AttributeError :
3862
+ continue
3863
+ if m not in names_dont_match :
3864
+ self .assertEqual (n , m )
3865
+
3866
+ def test_groupby_method_names_that_dont_match_attribute (self ):
3867
+ from string import ascii_lowercase
3868
+ letters = np .array (list (ascii_lowercase ))
3869
+ N = 10
3870
+ random_letters = letters .take (np .random .randint (0 , 26 , N ))
3871
+ df = DataFrame ({'floats' : N / 10 * Series (np .random .random (N )),
3872
+ 'letters' : Series (random_letters )})
3873
+ gb = df .groupby (df .letters )
3874
+ s = df .floats
3875
+
3876
+ names_dont_match_pair = (self .DF_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE ,
3877
+ self .S_METHOD_NAMES_THAT_DONT_MATCH_ATTRIBUTE )
3878
+ for obj , names_dont_match in zip ((df , s ), names_dont_match_pair ):
3879
+ gb = obj .groupby (df .letters )
3880
+ for m in names_dont_match :
3881
+ f = getattr (gb , m )
3882
+ self .assertNotEqual (f .__name__ , m )
3877
3883
3878
3884
AGG_FUNCTIONS = ['sum' , 'prod' , 'min' , 'max' , 'median' , 'mean' , 'skew' ,
3879
3885
'mad' , 'std' , 'var' , 'sem' ]
0 commit comments