滑动 window 与 Pandas DataFrame 重叠 50%

Sliding window of 50% overlap with a Pandas DataFrame

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

              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(称其为变量 window_size),并有 50% 的重叠(使其成为 step_size 的一半 window_size) 在 xyz 列上。因此,我会打印 0 - 9 的前 10 行。之后,我会打印 5 - 14、10 - 19、15 - 24 等。

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

def sliding_window(df, window_size, step_size):

假设 timestamp 是日期时间。

我希望每个 window 都有单独的结构。因此,例如,我想为前十行使用一个单独的 DataFrame,然后为接下来的十行使用另一个 DataFrame 等。

为简单起见,我将展示一个 window 大小为 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

考虑数据框 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))

这个 returns 一个带有 pd.MultiIndex 的数据框,我们可以很容易地访问每个 window 和 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