【问题标题】:Using the pandas Rolling object to create a sliding window of lists使用 pandas Rolling 对象创建列表的滑动窗口
【发布时间】:2019-06-23 06:49:56
【问题描述】:

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

我在上面链接的文章向您展示了如何使用 pandas 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]]

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

【问题讨论】:

    标签: python pandas dataframe cumsum rolling-computation


    【解决方案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]]]
    

    详情:

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

    最后,让我们使用 d1 将我们的 list_of_indexes 替换为使用列表解析的原始数据帧中的适当列表。

    【讨论】:

    • 你用的是哪个版本的python?我得到以下信息:TypeError: apply() got an unexpected keyword argument 'raw'。
    • 我使用的是熊猫 0.24.0。
    【解决方案2】:

    由于 pandas 1.1 滚动对象是可迭代的,您可以这样做:

    [win.values.tolist() for win in df.rolling(3, axis=1) if win.shape[0] == 3]
    

    如果我们确保只获得完整个窗口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-04
      • 2020-06-16
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      • 2021-06-14
      • 2021-06-22
      相关资源
      最近更新 更多