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]]
这可以通过滚动对象来完成吗?
答案 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
使用,如果我们确保仅获得完整窗口。