滑动窗口是针对 Pandas 数据帧的一种处理方式。

12

我有一个大型的时间序列数据的pandas数据框。

我目前通过操作该数据框来创建一个新的、较小的数据框,该数据框是每10行的滚动平均值。即滚动窗口技术。就像这样:

def create_new_df(df):
    features = []
    x = df['X'].astype(float)
    i = x.index.values
    time_sequence = [i] * 10
    idx = np.array(time_sequence).T.flatten()[:len(x)]
    x = x.groupby(idx).mean()
    x.name = 'X'
    features.append(x)
    new_df = pd.concat(features, axis=1)
    return new_df

用于测试的代码:

columns = ['X']
df_ = pd.DataFrame(columns=columns)
df_ = df_.fillna(0) # with 0s rather than NaNs
data = np.array([np.arange(20)]*1).T
df = pd.DataFrame(data, columns=columns)

test = create_new_df(df)
print test

输出:

      X
0   4.5
1  14.5

然而,我希望这个函数使用一个滑动窗口,重叠率为50%,来创建新的数据框。

因此输出结果应该如下所示:

      X
0   4.5
1   9.5
2  14.5

我该怎么做呢?

这是我尝试过的方法:

from itertools import tee, izip

def window(iterable, size):
    iters = tee(iterable, size)
    for i in xrange(1, size):
        for each in iters[i:]:
            next(each, None)
    return izip(*iters)

for each in window(df, 20):
    print list(each) # doesn't have the desired sliding window effect

有些人可能会建议使用pandas的rolling_mean()方法,但是如果这样做,我无法看到如何使用该函数进行窗口重叠。

如果有任何帮助,将不胜感激。

1个回答

18

我认为这里可以使用pandas的滚动技术。请注意,从pandas的0.18.0版本开始,您应该使用rolling().mean()而不是rolling_mean()

>>> df=pd.DataFrame({ 'x':range(30) })
>>> df = df.rolling(10).mean()           # version 0.18.0 syntax
>>> df[4::5]                             # take every 5th row

       x
4    NaN
9    4.5
14   9.5
19  14.5
24  19.5
29  24.5

8
df[4::5] - 太棒了! - MaxU - stand with Ukraine
2
这难道不是浪费计算能力吗?假设我有64个样本窗口,其中50%重叠,所以基本上我只使用了1/32的工作。当然,除非它是惰性评估的。 - Arturo Ribes
1
我不知道,你可以测试一下。在这里存在一个基本的权衡,即通过滚动进行向量化所获得的收益与仅使用其中一小部分结果之间的权衡。我无法确定截止点在哪里,你只需要进行测试。 - JohnE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接