Pandas 重叠重采样
Pandas resample with overlap
我想对我的时间索引 DataFrame 进行一些重叠的重采样。
例如:
>>> df
data
date
2018-03-09 12:00:00 1
2018-03-09 12:00:01 1
2018-03-09 12:00:02 1
2018-03-09 12:00:03 1
2018-03-09 12:00:04 1
2018-03-09 12:00:05 1
2018-03-09 12:00:06 1
2018-03-09 12:00:07 1
2018-03-09 12:00:08 1
2018-03-09 12:00:09 1
2018-03-09 12:00:10 1
2018-03-09 12:00:11 2
2018-03-09 12:00:12 2
2018-03-09 12:00:13 2
2018-03-09 12:00:14 2
2018-03-09 12:00:15 2
2018-03-09 12:00:16 2
2018-03-09 12:00:17 2
2018-03-09 12:00:18 2
2018-03-09 12:00:19 2
2018-03-09 12:00:20 2
2018-03-09 12:00:21 3
2018-03-09 12:00:22 3
2018-03-09 12:00:23 3
2018-03-09 12:00:24 3
2018-03-09 12:00:25 3
2018-03-09 12:00:26 3
2018-03-09 12:00:27 3
2018-03-09 12:00:28 3
2018-03-09 12:00:29 3
2018-03-09 12:00:30 3
重采样 10 秒和 2 秒重叠后的结果应该如下所示:
>>> df
data
date
2018-03-09 12:00:10 14
2018-03-09 12:00:20 28
2018-03-09 12:00:30 34
我尝试过分组,但在大数据集上速度非常慢。
有没有快速有效的方法来实现?
假设您的数据是规则间隔的,您可以 concat
移位的系列,然后求和。
N = 10 # Every 10 seconds from first row
ov = 2 # 2s overlap on either side
pd.concat([df.shift(i).iloc[::N] for i in range(-ov, N+ov)], axis=1).sum(1)
date
2018-03-09 12:00:00 3.0
2018-03-09 12:00:10 15.0
2018-03-09 12:00:20 28.0
2018-03-09 12:00:30 34.0
dtype: float64
对于多列,将其转换为沿列轴的 groupby
:
df['data2'] = df['data']+1 # Another column
(pd.concat([df.shift(i).iloc[::N] for i in range(-ov, N+ov)], axis=1)
.groupby(level=0, axis=1).sum())
data data2
date
2018-03-09 12:00:00 3.0 6.0
2018-03-09 12:00:10 15.0 28.0
2018-03-09 12:00:20 28.0 42.0
2018-03-09 12:00:30 34.0 46.0
我想对我的时间索引 DataFrame 进行一些重叠的重采样。
例如:
>>> df
data
date
2018-03-09 12:00:00 1
2018-03-09 12:00:01 1
2018-03-09 12:00:02 1
2018-03-09 12:00:03 1
2018-03-09 12:00:04 1
2018-03-09 12:00:05 1
2018-03-09 12:00:06 1
2018-03-09 12:00:07 1
2018-03-09 12:00:08 1
2018-03-09 12:00:09 1
2018-03-09 12:00:10 1
2018-03-09 12:00:11 2
2018-03-09 12:00:12 2
2018-03-09 12:00:13 2
2018-03-09 12:00:14 2
2018-03-09 12:00:15 2
2018-03-09 12:00:16 2
2018-03-09 12:00:17 2
2018-03-09 12:00:18 2
2018-03-09 12:00:19 2
2018-03-09 12:00:20 2
2018-03-09 12:00:21 3
2018-03-09 12:00:22 3
2018-03-09 12:00:23 3
2018-03-09 12:00:24 3
2018-03-09 12:00:25 3
2018-03-09 12:00:26 3
2018-03-09 12:00:27 3
2018-03-09 12:00:28 3
2018-03-09 12:00:29 3
2018-03-09 12:00:30 3
重采样 10 秒和 2 秒重叠后的结果应该如下所示:
>>> df
data
date
2018-03-09 12:00:10 14
2018-03-09 12:00:20 28
2018-03-09 12:00:30 34
我尝试过分组,但在大数据集上速度非常慢。
有没有快速有效的方法来实现?
假设您的数据是规则间隔的,您可以 concat
移位的系列,然后求和。
N = 10 # Every 10 seconds from first row
ov = 2 # 2s overlap on either side
pd.concat([df.shift(i).iloc[::N] for i in range(-ov, N+ov)], axis=1).sum(1)
date
2018-03-09 12:00:00 3.0
2018-03-09 12:00:10 15.0
2018-03-09 12:00:20 28.0
2018-03-09 12:00:30 34.0
dtype: float64
对于多列,将其转换为沿列轴的 groupby
:
df['data2'] = df['data']+1 # Another column
(pd.concat([df.shift(i).iloc[::N] for i in range(-ov, N+ov)], axis=1)
.groupby(level=0, axis=1).sum())
data data2
date
2018-03-09 12:00:00 3.0 6.0
2018-03-09 12:00:10 15.0 28.0
2018-03-09 12:00:20 28.0 42.0
2018-03-09 12:00:30 34.0 46.0