Skip to content

Commit dc16ff8

Browse files
committed
Calculate variance one window at a time
1 parent d22266a commit dc16ff8

File tree

1 file changed

+11
-22
lines changed

1 file changed

+11
-22
lines changed

pandas/_libs/window/aggregations.pyx

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1604,6 +1604,7 @@ cdef void add_weighted_var(float64_t val,
16041604
if nobs[0] == 1:
16051605
sum_w[0] = w
16061606
mean[0] = val
1607+
t[0] = 0
16071608

16081609
else:
16091610
q = val - mean[0]
@@ -1642,38 +1643,26 @@ def roll_weighted_var(const float64_t[:] values, const float64_t[:] weights,
16421643
"""
16431644

16441645
cdef:
1646+
float64_t t, sum_w, mean, nobs
16451647
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
16481650

16491651
n = len(values)
16501652
win_n = len(weights)
16511653

16521654
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)
16571655

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):
16601659
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]
16661661

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)
16721664

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)
16771666

16781667
return output
16791668

0 commit comments

Comments
 (0)