@@ -1604,6 +1604,7 @@ cdef void add_weighted_var(float64_t val,
1604
1604
if nobs[0 ] == 1 :
1605
1605
sum_w[0 ] = w
1606
1606
mean[0 ] = val
1607
+ t[0 ] = 0
1607
1608
1608
1609
else :
1609
1610
q = val - mean[0 ]
@@ -1642,38 +1643,26 @@ def roll_weighted_var(const float64_t[:] values, const float64_t[:] weights,
1642
1643
"""
1643
1644
1644
1645
cdef:
1646
+ float64_t t, sum_w, mean, nobs
1645
1647
float64_t val, w
1646
- Py_ssize_t in_i, win_i, add_i, n, win_n
1647
- float64_t[:] output, t, mean, sum_w, nobs
1648
+ Py_ssize_t in_i, win_i, n, win_n
1649
+ float64_t[:] output
1648
1650
1649
1651
n = len (values)
1650
1652
win_n = len (weights)
1651
1653
1652
1654
output = np.empty(n, dtype = np.float64)
1653
- t = np.zeros(n, dtype = np.float64)
1654
- mean = np.zeros(n, dtype = np.float64)
1655
- sum_w = np.zeros(n, dtype = np.float64)
1656
- nobs = np.zeros(n, dtype = np.float64)
1657
1655
1658
- with nogil:
1659
- for win_i in range (win_n):
1656
+ for in_i in range (n):
1657
+ nobs = 0
1658
+ for win_i in range (max (0 , win_n - in_i - 1 ), win_n):
1660
1659
w = weights[win_i]
1661
- if w != w:
1662
- continue
1663
-
1664
- for in_i in range (n - (win_n - win_i) + 1 ):
1665
- val = values[in_i]
1660
+ val = values[win_i - win_n + in_i + 1 ]
1666
1661
1667
- if val == val:
1668
- add_i = in_i + (win_n - win_i) - 1
1669
- add_weighted_var(
1670
- val, w, & t[add_i], & sum_w[add_i], & mean[add_i], & nobs[add_i]
1671
- )
1662
+ if val == val and w == w:
1663
+ add_weighted_var(val, w, & t, & sum_w, & mean, & nobs)
1672
1664
1673
- for in_i in range (n):
1674
- output[in_i] = calc_weighted_var(
1675
- t[in_i], sum_w[in_i], win_n, ddof, nobs[in_i], minp
1676
- )
1665
+ output[in_i] = calc_weighted_var(t, sum_w, win_n, ddof, nobs, minp)
1677
1666
1678
1667
return output
1679
1668
0 commit comments