滑动 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
) 在 x
、y
和 z
列上。因此,我会打印 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
假设我有这样一个数据框:
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
) 在 x
、y
和 z
列上。因此,我会打印 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