首页 > 解决方案 > 将当前数据帧值与 pandas 中先前时间步长的聚合值进行比较

问题描述

我有一个以 15 分钟间隔索引的熊猫时间序列,它们是时间戳。在每个时间间隔,我有多个列a和。bc

| 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 周计算,因为没有足够的历史记录。我被困在如何考虑将数据框转移到过去以汇总这些值,然后与未来进行比较。

这个问题有一些相似之处,但索引不是时间序列,比较简单一些。

标签: pythonpandas

解决方案


在这里,我用几天而不是几周来做。我首先根据您的示例制作虚拟数据:

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)

它相当慢,所以我会尝试想一个更快的方法,但现在我认为就是这样。


推荐阅读