python - 将当前数据帧值与 pandas 中先前时间步长的聚合值进行比较
问题描述
我有一个以 15 分钟间隔索引的熊猫时间序列,它们是时间戳。在每个时间间隔,我有多个列a
和。b
c
| index | a | b | c |
| 9:00 am | 2 | 2 | 4 |
| 9:15 am | 2 | 2 | 4 |
...
a
我需要将1、2、3 和 4 周同时的平均值与当前时间步长进行比较。因此,如果我当前的时间是上午 9:15,我需要找到a
前一周、2 周、3 和 4 周前 9:15 的平均值。
显然这不能在数据集的前 4 周计算,因为没有足够的历史记录。我被困在如何考虑将数据框转移到过去以汇总这些值,然后与未来进行比较。
这个问题有一些相似之处,但索引不是时间序列,比较简单一些。
解决方案
在这里,我用几天而不是几周来做。我首先根据您的示例制作虚拟数据:
import pandas as pd
import random
d = [
{"ts":pd.Timestamp(year=2017, month=1, day=1, hour=12,
minute=0, second=0) + pd.Timedelta(x*15, unit="s"),
"a": random.randint(2, 5),
"b": random.randint(2, 5),
"c": random.randint(2, 5),} for x in range(0, 30000)
]
dft = pd.DataFrame(d).set_index("ts")
我定义了一个处理函数,它试图从行中获取恰好 0、1、2 和 3 天的值。由于前 4 天我会收到一个关键错误,因此有一个 try-except with np.NaN
. 注意Timedelta(unit=)
夸格。您可以更改它以获得其他单位的这种效果 - 我认为这比调整对range
.
def handler(row):
try:
m = np.mean([dft.loc[row.name-pd.Timedelta(x, unit="d")][0] for x in range(4)])
except KeyError as e:
return np.NaN
return m
最后,使用apply
.
dft.apply(handler, axis=1)
它相当慢,所以我会尝试想一个更快的方法,但现在我认为就是这样。
推荐阅读
- typescript - 在 tsconfig.json 中设置“include”属性后,出现错误
- nginx - Nginx:基于 LUA Redis 的块内容 URL(.MP4 或 .PNG)
- javascript - 添加总数;预算应用程序,原生 JavaScript
- cloud-foundry - Geode/GemFire 无法创建 gemfireCache bean 错误:Spring Boot v2.1.3 - GemFire starter 1.1.0.RELEASE
- python - 澄清类型错误:“str”对象不可调用
- javascript - 有没有办法从一个名为 admin.htm 的页面创建元素来创建 index.html 的输入文本两者都在同一个文件夹中
- java - 如何使用错误响应休息模板处理 200 状态码?
- javascript - WebGL 中纹理、缓冲区和其他对象的组织
- java - Vertx 中的期货
- javascript - 如何将 2 个函数放在一起并使其在 javascript 和 html5 中按我的意愿工作