【发布时间】:2018-11-06 21:21:10
【问题描述】:
我想将数组的每个值x 与前 n 个值的滚动窗口进行比较。更准确地说,我想看看如果我们将这个新值x 添加到前一个窗口,它会在哪个百分位:
import numpy as np
A = np.array([1, 4, 9, 28, 28.5, 2, 283, 3.2, 7, 15])
print A
n = 4 # window width
for i in range(len(A)-n):
W = A[i:i+n]
x = A[i+n]
q = sum(W <= x) * 1.0 / n
print 'Value:', x, ' Window before this value:', W, ' Quantile:', q
[ 1. 4. 9. 28. 28.5 2. 283. 3.2 7. 15. ]
值:28.5 此值之前的窗口:[ 1. 4. 9. 28.] 分位数:1.0
值:2.0 此值之前的窗口:[ 4. 9. 28. 28.5] 分位数:0.0
值:283.0 此值之前的窗口:[ 9. 28. 28.5 2. ] 分位数:1.0
值:3.2 此值之前的窗口:[ 28. 28.5 2. 283. ] 分位数:0.25
值:7.0 此值之前的窗口:[ 28.5 2. 283. 3.2] 分位数:0.5
值:15.0 此值之前的窗口:[ 2. 283. 3.2 7. ] 分位数:0.75
问题:这个计算的名称是什么?有没有一种聪明的 numpy 方法可以更有效地计算数百万个项目的数组(n 可以是 ~5000)?
注意:这里是对 100 万件物品和 n=5000 的模拟,但需要大约 2 小时:
import numpy as np
A = np.random.random(1000*1000) # the following is not very interesting with a [0,1]
n = 5000 # uniform random variable, but anyway...
Q = np.zeros(len(A)-n)
for i in range(len(Q)):
Q[i] = sum(A[i:i+n] <= A[i+n]) * 1.0 / n
if i % 100 == 0:
print "%.2f %% already done. " % (i * 100.0 / len(A))
print Q
注意:这与How to compute moving (or rolling, if you will) percentile/quantile for a 1d array in numpy?不同
【问题讨论】:
标签: python arrays numpy data-analysis moving-average