@@ -636,3 +636,90 @@ def test_transform_numeric_ret(self, cols, exp, comp_func, agg_func):
636636 exp = exp .astype ('float' )
637637
638638 comp_func (result , exp )
639+
640+ @pytest .mark .parametrize ("mix_groupings" , [True , False ])
641+ @pytest .mark .parametrize ("as_series" , [True , False ])
642+ @pytest .mark .parametrize ("val1,val2" , [
643+ ('foo' , 'bar' ), (1 , 2 ), (1. , 2. )])
644+ @pytest .mark .parametrize ("fill_method,limit,exp_vals" , [
645+ ("ffill" , None ,
646+ [np .nan , np .nan , 'val1' , 'val1' , 'val1' , 'val2' , 'val2' , 'val2' ]),
647+ ("ffill" , 1 ,
648+ [np .nan , np .nan , 'val1' , 'val1' , np .nan , 'val2' , 'val2' , np .nan ]),
649+ ("bfill" , None ,
650+ ['val1' , 'val1' , 'val1' , 'val2' , 'val2' , 'val2' , np .nan , np .nan ]),
651+ ("bfill" , 1 ,
652+ [np .nan , 'val1' , 'val1' , np .nan , 'val2' , 'val2' , np .nan , np .nan ])
653+ ])
654+ def test_group_fill_methods (self , mix_groupings , as_series , val1 , val2 ,
655+ fill_method , limit , exp_vals ):
656+ vals = [np .nan , np .nan , val1 , np .nan , np .nan , val2 , np .nan , np .nan ]
657+ _exp_vals = list (exp_vals )
658+ # Overwrite placeholder values
659+ for index , exp_val in enumerate (_exp_vals ):
660+ if exp_val == 'val1' :
661+ _exp_vals [index ] = val1
662+ elif exp_val == 'val2' :
663+ _exp_vals [index ] = val2
664+
665+ # Need to modify values and expectations depending on the
666+ # Series / DataFrame that we ultimately want to generate
667+ if mix_groupings : # ['a', 'b', 'a, 'b', ...]
668+ keys = ['a' , 'b' ] * len (vals )
669+
670+ def interweave (list_obj ):
671+ temp = list ()
672+ for x in list_obj :
673+ temp .extend ([x , x ])
674+
675+ return temp
676+
677+ _exp_vals = interweave (_exp_vals )
678+ vals = interweave (vals )
679+ else : # ['a', 'a', 'a', ... 'b', 'b', 'b']
680+ keys = ['a' ] * len (vals ) + ['b' ] * len (vals )
681+ _exp_vals = _exp_vals * 2
682+ vals = vals * 2
683+
684+ df = DataFrame ({'key' : keys , 'val' : vals })
685+ if as_series :
686+ result = getattr (
687+ df .groupby ('key' )['val' ], fill_method )(limit = limit )
688+ exp = Series (_exp_vals , name = 'val' )
689+ assert_series_equal (result , exp )
690+ else :
691+ result = getattr (df .groupby ('key' ), fill_method )(limit = limit )
692+ exp = DataFrame ({'key' : keys , 'val' : _exp_vals })
693+ assert_frame_equal (result , exp )
694+
695+ @pytest .mark .parametrize ("test_series" , [True , False ])
696+ @pytest .mark .parametrize ("periods,fill_method,limit" , [
697+ (1 , 'ffill' , None ), (1 , 'ffill' , 1 ),
698+ (1 , 'bfill' , None ), (1 , 'bfill' , 1 ),
699+ (- 1 , 'ffill' , None ), (- 1 , 'ffill' , 1 ),
700+ (- 1 , 'bfill' , None ), (- 1 , 'bfill' , 1 )])
701+ def test_pct_change (self , test_series , periods , fill_method , limit ):
702+ vals = [np .nan , np .nan , 1 , 2 , 4 , 10 , np .nan , np .nan ]
703+ exp_vals = Series (vals ).pct_change (periods = periods ,
704+ fill_method = fill_method ,
705+ limit = limit ).tolist ()
706+
707+ df = DataFrame ({'key' : ['a' ] * len (vals ) + ['b' ] * len (vals ),
708+ 'vals' : vals * 2 })
709+ grp = df .groupby ('key' )
710+
711+ def get_result (grp_obj ):
712+ return grp_obj .pct_change (periods = periods ,
713+ fill_method = fill_method ,
714+ limit = limit )
715+
716+ if test_series :
717+ exp = pd .Series (exp_vals * 2 )
718+ exp .name = 'vals'
719+ grp = grp ['vals' ]
720+ result = get_result (grp )
721+ tm .assert_series_equal (result , exp )
722+ else :
723+ exp = DataFrame ({'vals' : exp_vals * 2 })
724+ result = get_result (grp )
725+ tm .assert_frame_equal (result , exp )
0 commit comments