代码之家  ›  专栏  ›  技术社区  ›  user2398046

与熊猫数据帧重叠50%的滑动窗口

  •  2
  • user2398046  · 技术社区  · 7 年前

    假设我有这样一个数据框:

                  x   y   z
    timestamp
    some_date_1   5   2   4
    some_date_2   1   2   6
    some_date_3   7   3   5
     ...
    some_date_50  4   3   6
    

    我想应用一个大小为10的滑动窗口(称之为变量 window_size )重叠50%(将其作为变量 step_size )在 x , y z 柱。因此,我将打印0-9的前10行。之后,我将打印5-14、10-19、15-24等。

    如果我有一个函数,我会怎么做:

    def sliding_window(df, window_size, step_size):
    

    假定 timestamp 是日期时间。

    我希望每个窗口都有单独的结构。例如,我想为前十行创建一个单独的数据帧,然后为下十行创建另一个数据帧,等等。

    为了简单起见,我将展示一个窗口大小为4、步长为2的示例。

                      x   y   z
    timestamp
    some_date_1   5   2   4
    some_date_2   1   2   6
    some_date_3   2   3   1
    some_date_4   5   4   4
    
                     x   y   z
    timestamp
    some_date_3   2   3   1
    some_date_4   5   4   4
    some_date_5   6   7   9
    some_date_6   2   1   8
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   piRSquared    7 年前

    考虑数据帧 df

    df = pd.DataFrame(np.arange(1, 73).reshape(-1, 3), columns=list('xyz'))
    df
    

    def windows(d, w, t):
        r = np.arange(len(d))
        s = r[::t]
        z = list(zip(s, s + w))
        f = '{0[0]}:{0[1]}'.format
        g = lambda t: d.iloc[t[0]:t[1]]
        return pd.concat(map(g, z), keys=map(f, z))
    

    这将返回一个带有 pd.MultiIndex 我们可以用 loc

    wdf = windows(df, 10, 5)
    
    wdf.loc['0:10']
    
        x   y   z
    0   1   2   3
    1   4   5   6
    2   7   8   9
    3  10  11  12
    4  13  14  15
    5  16  17  18
    6  19  20  21
    7  22  23  24
    8  25  26  27
    9  28  29  30
    

    wdf.loc['15:25']
    
         x   y   z
    15  46  47  48
    16  49  50  51
    17  52  53  54
    18  55  56  57
    19  58  59  60
    20  61  62  63
    21  64  65  66
    22  67  68  69
    23  70  71  72