@@ -636,3 +636,90 @@ def test_transform_numeric_ret(self, cols, exp, comp_func, agg_func):
636
636
exp = exp .astype ('float' )
637
637
638
638
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