【发布时间】:2017-06-20 23:52:56
【问题描述】:
我目前正在尝试处理具有缺失值的实验时间序列数据集。我想计算这个数据集的滑动窗口平均值,同时处理 nan 值。我这样做的正确方法是在每个窗口内计算有限元素的总和并将其除以它们的数量。这种非线性迫使我使用非卷积方法来面对这个问题,因此我在这部分过程中遇到了严重的时间瓶颈。作为我正在尝试完成的代码示例,我提出以下内容:
import numpy as np
#Construct sample data
n = 50
n_miss = 20
win_size = 3
data= np.random.random(50)
data[np.random.randint(0,n-1, n_miss)] = None
#Compute mean
result = np.zeros(data.size)
for count in range(data.size):
part_data = data[max(count - (win_size - 1) / 2, 0): min(count + (win_size + 1) / 2, data.size)]
mask = np.isfinite(part_data)
if np.sum(mask) != 0:
result[count] = np.sum(part_data[mask]) / np.sum(mask)
else:
result[count] = None
print 'Input:\t',data
print 'Output:\t',result
带输出:
Input: [ 0.47431791 0.17620835 0.78495647 0.79894688 0.58334064 0.38068788
0.87829696 nan 0.71589171 nan 0.70359557 0.76113969
0.13694387 0.32126573 0.22730891 nan 0.35057169 nan
0.89251851 0.56226354 0.040117 nan 0.37249799 0.77625334
nan nan nan nan 0.63227417 0.92781944
0.99416471 0.81850753 0.35004997 nan 0.80743783 0.60828597
nan 0.01410721 nan nan 0.6976317 nan
0.03875394 0.60924066 0.22998065 nan 0.34476729 0.38090961
nan 0.2021964 ]
Output: [ 0.32526313 0.47849424 0.5867039 0.72241466 0.58765847 0.61410849
0.62949242 0.79709433 0.71589171 0.70974364 0.73236763 0.53389305
0.40644977 0.22850617 0.27428732 0.2889403 0.35057169 0.6215451
0.72739103 0.49829968 0.30119027 0.20630749 0.57437567 0.57437567
0.77625334 nan nan 0.63227417 0.7800468 0.85141944
0.91349722 0.7209074 0.58427875 0.5787439 0.7078619 0.7078619
0.31119659 0.01410721 0.01410721 0.6976317 0.6976317 0.36819282
0.3239973 0.29265842 0.41961066 0.28737397 0.36283845 0.36283845
0.29155301 0.2021964 ]
这个结果可以通过 numpy 操作产生,而不使用 for 循环吗?
【问题讨论】:
-
您是否考虑过重新索引和插值数据框以获得线性索引并稍后使用
rolling? -
如果我理解正确,这不会产生想要的结果。我不想忽略 nan 值的存在,它们的位置很重要。如果我一个接一个有3个nan,那么滑动窗口为3的中间元素的结果应该是nan。请解释一下,如果我理解错了。
-
对不起,我根本没看清楚你的问题! :S
-
numpy/lib/nanfunctions.py具有用于计算没有nan值的东西的主要和辅助函数。例如nanmean使用arr, mask = _replace_nan(a, 0)并计算mean=sum(arr)/sum(mask)。
标签: python numpy scipy time-series missing-data