167
167
elements, only complete pairwise observations will be used.
168
168
"""
169
169
170
+ _ddof_kw = """ddof : int, default 1
171
+ Delta Degrees of Freedom. The divisor used in calculations
172
+ is ``N - ddof``, where ``N`` represents the number of elements.
173
+ """
174
+
170
175
_bias_kw = r"""bias : boolean, default False
171
176
Use a standard estimation bias correction
172
177
"""
@@ -216,10 +221,10 @@ def rolling_count(arg, window, freq=None, center=False, how=None):
216
221
217
222
218
223
@Substitution ("Unbiased moving covariance." , _binary_arg_flex ,
219
- _roll_kw % 'None' + _pairwise_kw , _flex_retval , _roll_notes )
224
+ _roll_kw % 'None' + _pairwise_kw + _ddof_kw , _flex_retval , _roll_notes )
220
225
@Appender (_doc_template )
221
226
def rolling_cov (arg1 , arg2 = None , window = None , min_periods = None , freq = None ,
222
- center = False , pairwise = None , how = None ):
227
+ center = False , pairwise = None , how = None , ddof = 1 ):
223
228
if window is None and isinstance (arg2 , (int , float )):
224
229
window = arg2
225
230
arg2 = arg1
@@ -233,7 +238,7 @@ def rolling_cov(arg1, arg2=None, window=None, min_periods=None, freq=None,
233
238
def _get_cov (X , Y ):
234
239
mean = lambda x : rolling_mean (x , window , min_periods , center = center )
235
240
count = rolling_count (X + Y , window , center = center )
236
- bias_adj = count / (count - 1 )
241
+ bias_adj = count / (count - ddof )
237
242
return (mean (X * Y ) - mean (X ) * mean (Y )) * bias_adj
238
243
rs = _flex_binary_moment (arg1 , arg2 , _get_cov , pairwise = bool (pairwise ))
239
244
return rs
@@ -620,14 +625,14 @@ def _use_window(minp, window):
620
625
return minp
621
626
622
627
623
- def _rolling_func (func , desc , check_minp = _use_window , how = None ):
628
+ def _rolling_func (func , desc , check_minp = _use_window , how = None , additional_kw = '' ):
624
629
if how is None :
625
630
how_arg_str = 'None'
626
631
else :
627
632
how_arg_str = "'%s" % how
628
633
629
- @Substitution (desc , _unary_arg , _roll_kw % how_arg_str , _type_of_input_retval ,
630
- _roll_notes )
634
+ @Substitution (desc , _unary_arg , _roll_kw % how_arg_str + additional_kw ,
635
+ _type_of_input_retval , _roll_notes )
631
636
@Appender (_doc_template )
632
637
@wraps (func )
633
638
def f (arg , window , min_periods = None , freq = None , center = False , how = how ,
@@ -648,10 +653,12 @@ def call_cython(arg, window, minp, args=(), kwargs={}, **kwds):
648
653
how = 'median' )
649
654
650
655
_ts_std = lambda * a , ** kw : _zsqrt (algos .roll_var (* a , ** kw ))
651
- rolling_std = _rolling_func (_ts_std , 'Unbiased moving standard deviation.' ,
652
- check_minp = _require_min_periods (1 ))
653
- rolling_var = _rolling_func (algos .roll_var , 'Unbiased moving variance.' ,
654
- check_minp = _require_min_periods (1 ))
656
+ rolling_std = _rolling_func (_ts_std , 'Moving standard deviation.' ,
657
+ check_minp = _require_min_periods (1 ),
658
+ additional_kw = _ddof_kw )
659
+ rolling_var = _rolling_func (algos .roll_var , 'Moving variance.' ,
660
+ check_minp = _require_min_periods (1 ),
661
+ additional_kw = _ddof_kw )
655
662
rolling_skew = _rolling_func (algos .roll_skew , 'Unbiased moving skewness.' ,
656
663
check_minp = _require_min_periods (3 ))
657
664
rolling_kurt = _rolling_func (algos .roll_kurt , 'Unbiased moving kurtosis.' ,
@@ -864,8 +871,9 @@ def _pop_args(win_type, arg_names, kwargs):
864
871
return all_args
865
872
866
873
867
- def _expanding_func (func , desc , check_minp = _use_window ):
868
- @Substitution (desc , _unary_arg , _expanding_kw , _type_of_input_retval , "" )
874
+ def _expanding_func (func , desc , check_minp = _use_window , additional_kw = '' ):
875
+ @Substitution (desc , _unary_arg , _expanding_kw + additional_kw ,
876
+ _type_of_input_retval , "" )
869
877
@Appender (_doc_template )
870
878
@wraps (func )
871
879
def f (arg , min_periods = 1 , freq = None , ** kwargs ):
@@ -883,20 +891,18 @@ def call_cython(arg, window, minp, args=(), kwargs={}, **kwds):
883
891
expanding_min = _expanding_func (algos .roll_min2 , 'Expanding minimum.' )
884
892
expanding_sum = _expanding_func (algos .roll_sum , 'Expanding sum.' )
885
893
expanding_mean = _expanding_func (algos .roll_mean , 'Expanding mean.' )
886
- expanding_median = _expanding_func (
887
- algos .roll_median_cython , 'Expanding median.' )
888
-
889
- expanding_std = _expanding_func (_ts_std ,
890
- 'Unbiased expanding standard deviation.' ,
891
- check_minp = _require_min_periods (1 ))
892
- expanding_var = _expanding_func (algos .roll_var , 'Unbiased expanding variance.' ,
893
- check_minp = _require_min_periods (1 ))
894
- expanding_skew = _expanding_func (
895
- algos .roll_skew , 'Unbiased expanding skewness.' ,
896
- check_minp = _require_min_periods (3 ))
897
- expanding_kurt = _expanding_func (
898
- algos .roll_kurt , 'Unbiased expanding kurtosis.' ,
899
- check_minp = _require_min_periods (4 ))
894
+ expanding_median = _expanding_func (algos .roll_median_cython , 'Expanding median.' )
895
+
896
+ expanding_std = _expanding_func (_ts_std , 'Expanding standard deviation.' ,
897
+ check_minp = _require_min_periods (1 ),
898
+ additional_kw = _ddof_kw )
899
+ expanding_var = _expanding_func (algos .roll_var , 'Expanding variance.' ,
900
+ check_minp = _require_min_periods (1 ),
901
+ additional_kw = _ddof_kw )
902
+ expanding_skew = _expanding_func (algos .roll_skew , 'Unbiased expanding skewness.' ,
903
+ check_minp = _require_min_periods (3 ))
904
+ expanding_kurt = _expanding_func (algos .roll_kurt , 'Unbiased expanding kurtosis.' ,
905
+ check_minp = _require_min_periods (4 ))
900
906
901
907
902
908
def expanding_count (arg , freq = None ):
@@ -953,9 +959,9 @@ def expanding_quantile(arg, quantile, min_periods=1, freq=None):
953
959
954
960
955
961
@Substitution ("Unbiased expanding covariance." , _binary_arg_flex ,
956
- _expanding_kw + _pairwise_kw , _flex_retval , "" )
962
+ _expanding_kw + _pairwise_kw + _ddof_kw , _flex_retval , "" )
957
963
@Appender (_doc_template )
958
- def expanding_cov (arg1 , arg2 = None , min_periods = 1 , freq = None , pairwise = None ):
964
+ def expanding_cov (arg1 , arg2 = None , min_periods = 1 , freq = None , pairwise = None , ddof = 1 ):
959
965
if arg2 is None :
960
966
arg2 = arg1
961
967
pairwise = True if pairwise is None else pairwise
@@ -966,7 +972,7 @@ def expanding_cov(arg1, arg2=None, min_periods=1, freq=None, pairwise=None):
966
972
window = max ((len (arg1 ) + len (arg2 )), min_periods ) if min_periods else (len (arg1 ) + len (arg2 ))
967
973
return rolling_cov (arg1 , arg2 , window ,
968
974
min_periods = min_periods , freq = freq ,
969
- pairwise = pairwise )
975
+ pairwise = pairwise , ddof = ddof )
970
976
971
977
972
978
@Substitution ("Expanding sample correlation." , _binary_arg_flex ,
0 commit comments