使用pandas Rolling对象创建列表的滑动窗口

时间:2019-01-30 03:32:21

标签: python pandas dataframe cumsum rolling-computation

This outstanding post非常清楚地说明了如何使用pandas cumsum() DataFrame方法来构建3D张量,该张量包含具有列表列表的列,这些列表的维数使其适合用作LSTM的时间序列输入。我想做一些非常相似的事情,但使用滚动列表列表,而不是列表的累积汇总。

例如。假设您有一个具有3个时间序列的DataFrame:

 A   B   C
 1   2   3
 4   5   6
 7   8   9
10  11  12

我在上面链接的文章,向您展示了如何使用熊猫cumsum()构建嵌套列表的DataFrame列,如下所示:

[[1, 2, 3]]
[[1, 2, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

完成此操作的python代码的关键行如下:

input_cols =  list(df.columns)
df['single_list'] = df[input_cols].apply(
                       tuple, axis=1).apply(list)
df['double_encapsulated'] = df.single_list.apply(
                                      lambda x: [list(x)])

但是我想要列表的滚动窗口,而不是列表的累积总和。它应该看起来像这样:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[4, 5, 6], [7, 8, 9], [10, 11, 12]]
[[7, 8, 9], [10, 11, 12], [13, 14, 15]]

这可以通过滚动对象来完成吗?

2 个答案:

答案 0 :(得分:1)

这里有一些技巧可以达到您想要的结果:

import pandas as pd
dd = {'A': {0: 1, 1: 4, 2: 7, 3: 10, 4: 13},
 'B': {0: 2, 1: 5, 2: 8, 3: 11, 4: 14},
 'C': {0: 3, 1: 6, 2: 9, 3: 12, 4: 15}}
df = pd.DataFrame(dd)

list_of_indexes=[]
df.index.to_series().rolling(3).apply((lambda x: list_of_indexes.append(x.tolist()) or 0), raw=False)
list_of_indexes

d1 = df.apply(tuple,axis=1).apply(list)
[[d1[ix] for ix in x] for x in list_of_indexes]

输出:

[[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
 [[4, 5, 6], [7, 8, 9], [10, 11, 12]],
 [[7, 8, 9], [10, 11, 12], [13, 14, 15]]]

详细信息:

创建一个空列表。使用滚动并应用一个函数的技巧,该函数将返回None并使用零的“或”运算符使滚动应用返回0(一个数字)。但是,我们真正追求的是在这种情况下“追加”功能的结果。我们将数据帧索引用作滚动功能的输入,因此“ list_of_indexes”是原始数据帧df的索引滚动列表。现在,让我们修改数据框,使用“应用元组”和“应用列表”将行转换为d1列表。

最后,让我们使用d1通过列表理解,用原始数据框中的适当列表替换list_of_indexes。

答案 1 :(得分:0)

由于熊猫scanf()可以滚动,因此您可以:

1.1

使用,如果我们确保仅获得完整窗口。