|
9 | 9 | #
|
10 | 10 | # -
|
11 | 11 |
|
| 12 | +def _check_minp(win, minp, N): |
| 13 | + if minp > win: |
| 14 | + raise ValueError('min_periods %d must be <= window %d' |
| 15 | + % (minp, win)) |
| 16 | + elif minp > N: |
| 17 | + minp = N + 1 |
| 18 | + elif minp == 0: |
| 19 | + minp = 1 |
| 20 | + elif minp < 0: |
| 21 | + raise ValueError('min_periods must be >= 0') |
| 22 | + return minp |
| 23 | + |
12 | 24 | # original C implementation by N. Devillard.
|
13 | 25 | # This code in public domain.
|
14 | 26 | # Function : kth_smallest()
|
|
24 | 36 | # Physical description: 366 p.
|
25 | 37 | # Series: Prentice-Hall Series in Automatic Computation
|
26 | 38 |
|
27 |
| - |
28 | 39 | def kth_smallest(ndarray[double_t] a, Py_ssize_t k):
|
29 | 40 | cdef:
|
30 | 41 | Py_ssize_t i,j,l,m,n
|
@@ -149,7 +160,7 @@ def roll_sum(ndarray[double_t] input, int win, int minp):
|
149 | 160 |
|
150 | 161 | cdef ndarray[double_t] output = np.empty(N, dtype=float)
|
151 | 162 |
|
152 |
| - minp = _check_minp(minp, N) |
| 163 | + minp = _check_minp(win, minp, N) |
153 | 164 |
|
154 | 165 | for i from 0 <= i < minp - 1:
|
155 | 166 | val = input[i]
|
@@ -192,7 +203,7 @@ def roll_mean(ndarray[double_t] input,
|
192 | 203 |
|
193 | 204 | cdef ndarray[double_t] output = np.empty(N, dtype=float)
|
194 | 205 |
|
195 |
| - minp = _check_minp(minp, N) |
| 206 | + minp = _check_minp(win, minp, N) |
196 | 207 |
|
197 | 208 | for i from 0 <= i < minp - 1:
|
198 | 209 | val = input[i]
|
@@ -335,23 +346,14 @@ def nancorr(ndarray[float64_t, ndim=2] mat, cov=False):
|
335 | 346 | #----------------------------------------------------------------------
|
336 | 347 | # Rolling variance
|
337 | 348 |
|
338 |
| -def _check_minp(minp, N): |
339 |
| - if minp > N: |
340 |
| - minp = N + 1 |
341 |
| - elif minp == 0: |
342 |
| - minp = 1 |
343 |
| - elif minp < 0: |
344 |
| - raise ValueError('min_periods must be >= 0') |
345 |
| - return minp |
346 |
| - |
347 | 349 | def roll_var(ndarray[double_t] input, int win, int minp, int ddof=1):
|
348 | 350 | cdef double val, prev, sum_x = 0, sum_xx = 0, nobs = 0
|
349 | 351 | cdef Py_ssize_t i
|
350 | 352 | cdef Py_ssize_t N = len(input)
|
351 | 353 |
|
352 | 354 | cdef ndarray[double_t] output = np.empty(N, dtype=float)
|
353 | 355 |
|
354 |
| - minp = _check_minp(minp, N) |
| 356 | + minp = _check_minp(win, minp, N) |
355 | 357 |
|
356 | 358 | for i from 0 <= i < minp - 1:
|
357 | 359 | val = input[i]
|
@@ -400,7 +402,7 @@ def roll_skew(ndarray[double_t] input, int win, int minp):
|
400 | 402 | # 3 components of the skewness equation
|
401 | 403 | cdef double A, B, C, R
|
402 | 404 |
|
403 |
| - minp = _check_minp(minp, N) |
| 405 | + minp = _check_minp(win, minp, N) |
404 | 406 |
|
405 | 407 | for i from 0 <= i < minp - 1:
|
406 | 408 | val = input[i]
|
@@ -462,7 +464,7 @@ def roll_kurt(ndarray[double_t] input,
|
462 | 464 | # 5 components of the kurtosis equation
|
463 | 465 | cdef double A, B, C, D, R, K
|
464 | 466 |
|
465 |
| - minp = _check_minp(minp, N) |
| 467 | + minp = _check_minp(win, minp, N) |
466 | 468 |
|
467 | 469 | for i from 0 <= i < minp - 1:
|
468 | 470 | val = input[i]
|
@@ -533,7 +535,7 @@ cdef _roll_skiplist_op(ndarray arg, int win, int minp, skiplist_f op):
|
533 | 535 |
|
534 | 536 | skiplist = IndexableSkiplist(win)
|
535 | 537 |
|
536 |
| - minp = _check_minp(minp, N) |
| 538 | + minp = _check_minp(win, minp, N) |
537 | 539 |
|
538 | 540 | for i from 0 <= i < minp - 1:
|
539 | 541 | val = input[i]
|
@@ -578,7 +580,7 @@ def roll_median_c(ndarray[float64_t] arg, int win, int minp):
|
578 | 580 |
|
579 | 581 | sl = skiplist_init(win)
|
580 | 582 |
|
581 |
| - minp = _check_minp(minp, N) |
| 583 | + minp = _check_minp(win, minp, N) |
582 | 584 |
|
583 | 585 | for i from 0 <= i < minp - 1:
|
584 | 586 | val = arg[i]
|
@@ -672,11 +674,17 @@ def roll_max2(ndarray[float64_t] a, int window, int minp):
|
672 | 674 | cdef np.ndarray[np.float64_t, ndim=1] y = PyArray_EMPTY(1, dims,
|
673 | 675 | NPY_float64, 0)
|
674 | 676 |
|
675 |
| - minp = _check_minp(minp, n0) |
| 677 | + if window < 1: |
| 678 | + raise ValueError('Invalid window size %d' |
| 679 | + % (window)) |
676 | 680 |
|
677 |
| - if (window < 1) or (window > n0): |
678 |
| - raise ValueError('Invalid window size %d for len %d array' |
679 |
| - % (window, n0)) |
| 681 | + if minp > window: |
| 682 | + raise ValueError('Invalid min_periods size %d greater than window %d' |
| 683 | + % (minp, window)) |
| 684 | + |
| 685 | + minp = _check_minp(window, minp, n0) |
| 686 | + |
| 687 | + window = min(window, n0) |
680 | 688 |
|
681 | 689 | ring = <pairs*>stdlib.malloc(window * sizeof(pairs))
|
682 | 690 | end = ring + window
|
@@ -766,11 +774,18 @@ def roll_min2(np.ndarray[np.float64_t, ndim=1] a, int window, int minp):
|
766 | 774 | cdef np.npy_intp *dims = [n0]
|
767 | 775 | cdef np.ndarray[np.float64_t, ndim=1] y = PyArray_EMPTY(1, dims,
|
768 | 776 | NPY_float64, 0)
|
769 |
| - if (window < 1) or (window > n0): |
770 |
| - raise ValueError('Invalid window size %d for len %d array' |
771 |
| - % (window, n0)) |
772 | 777 |
|
773 |
| - minp = _check_minp(minp, n0) |
| 778 | + if window < 1: |
| 779 | + raise ValueError('Invalid window size %d' |
| 780 | + % (window)) |
| 781 | + |
| 782 | + if minp > window: |
| 783 | + raise ValueError('Invalid min_periods size %d greater than window %d' |
| 784 | + % (minp, window)) |
| 785 | + |
| 786 | + window = min(window, n0) |
| 787 | + |
| 788 | + minp = _check_minp(window, minp, n0) |
774 | 789 |
|
775 | 790 | ring = <pairs*>stdlib.malloc(window * sizeof(pairs))
|
776 | 791 | end = ring + window
|
@@ -843,7 +858,7 @@ def roll_quantile(ndarray[float64_t, cast=True] input, int win,
|
843 | 858 |
|
844 | 859 | skiplist = IndexableSkiplist(win)
|
845 | 860 |
|
846 |
| - minp = _check_minp(minp, N) |
| 861 | + minp = _check_minp(win, minp, N) |
847 | 862 |
|
848 | 863 | for i from 0 <= i < minp - 1:
|
849 | 864 | val = input[i]
|
@@ -892,7 +907,7 @@ def roll_generic(ndarray[float64_t, cast=True] input, int win,
|
892 | 907 | if n == 0:
|
893 | 908 | return input
|
894 | 909 |
|
895 |
| - minp = _check_minp(minp, n) |
| 910 | + minp = _check_minp(win, minp, n) |
896 | 911 | output = np.empty(n, dtype=float)
|
897 | 912 | counts = roll_sum(np.isfinite(input).astype(float), win, minp)
|
898 | 913 |
|
|
0 commit comments