python - 如何用pandas做滚动窗口计算,这样每1分钟计算一个新值
问题描述
我有DataFrame
超过 3000 行,如下所示:
rr_ms
time
2020-03-05 15:43:51.122000+01:00 961
2020-03-05 15:43:52.112000+01:00 946
2020-03-05 15:43:53.131000+01:00 907
2020-03-05 15:43:54.424000+01:00 952
2020-03-05 15:43:54.424000+01:00 968
2020-03-05 15:43:55.298000+01:00 1019
2020-03-05 15:43:56.133000+01:00 1011
2020-03-05 15:43:57.121000+01:00 0
2020-03-05 15:43:58.142000+01:00 1020
2020-03-05 15:43:59.099000+01:00 999
2020-03-05 15:44:00.120000+01:00 948
2020-03-05 15:44:01.441000+01:00 922
2020-03-05 15:44:02.312000+01:00 873
2020-03-05 15:44:02.312000+01:00 899
2020-03-05 15:44:03.184000+01:00 933
2020-03-05 15:44:04.143000+01:00 948
2020-03-05 15:44:05.132000+01:00 986
2020-03-05 15:44:06.124000+01:00 982
2020-03-05 15:44:07.112000+01:00 972
2020-03-05 15:44:08.402000+01:00 0
2020-03-05 15:44:09.363000+01:00 990
2020-03-05 15:44:09.363000+01:00 1069
2020-03-05 15:44:10.233000+01:00 988
2020-03-05 15:44:11.133000+01:00 940
2020-03-05 15:44:12.122000+01:00 870
2020-03-05 15:44:13.112000+01:00 859
2020-03-05 15:44:14.073000+01:00 885
...
我想使用"rr_ms"
如图(b)所示的值来计算一个值:
"rr_ms"
被分割为 5 分钟的窗口,增量为 1 分钟。- 这意味着与相邻的 5 分钟段有大约 4 分钟的重叠,导致每分钟计算一个新值。
- 这也意味着第一个值出现在 5 分钟标记处
我认为这可能pandas.rolling()
会给我想要的结果,但我认为它的行为不像我想象的那样?
IN: df.rolling('5T').sum()
OUT:
rr_ms
time
2020-03-05 15:43:51.122000+01:00 961.0
2020-03-05 15:43:52.112000+01:00 1907.0
2020-03-05 15:43:53.131000+01:00 2814.0
2020-03-05 15:43:54.424000+01:00 3766.0
2020-03-05 15:43:54.424000+01:00 4734.0
... ...
期望的结果是这样的。
- 请注意,在原始
df
版本中,第一个时间戳是 at15:43
。 - 这意味着第一个总和 (
249022
) 是根据从到的rr_ms
值计算的。15:43
15:47
- 第二个总和 (
300041
) 基于从到的rr_ms
值。15:44
15:48
等等。
rr_ms
time
2020-03-05 15:48:00+01:00 249022
2020-03-05 15:49:00+01:00 300041
2020-03-05 15:50:00+01:00 299396
...
我很想知道我应该使用什么样的功能。
解决方案
您应该首先以 1 分钟的频率重新采样。从那时起,您将能够使用一个简单的rolling
总和:
resul = df.resample('1T').sum().rolling('5T').sum()
样本数据将给出:
rr_ms
time
2020-03-05 14:43:00 8783.0
2020-03-05 14:44:00 23847.0
您可以看到总和在最后一分钟受到影响。如果你想影响到第一个,只需移动索引:
resul.index = resul.index = resul.index - pd.Timedelta('4min')
推荐阅读
- angular - 角。从 switchMap 内的订阅中获取价值
- protractor - 如何用量角器运行硒网格
- sql - Oracle 以 15 秒为间隔汇总数据
- sql - 迁移中的 KnexJS 原始查询
- ios - swift无法单击位于多个子视图内的uibutton
- angular - 类型 'undefined[]' 不能转换为类型 'OrderArray'。类型“未定义 []”中缺少属性“菜单名称”
- python - 如何选择范围内的数据
- python - Django ProgrammingError 必须出现在 GROUP BY 子句中或在聚合函数中使用
- junit - 使用 powermockito 操作私有字段并访问私有方法
- c++ - 创建 std::map 以结构作为其键和值