【问题标题】:Compare current dataframe values to aggregate values from previous timesteps in pandas将当前数据帧值与 pandas 中先前时间步长的聚合值进行比较
【发布时间】:2019-06-12 19:54:54
【问题描述】:

我有一个以 15 分钟为间隔索引的 pandas 时间序列,它们是时间戳。在每个间隔,我都有多个列abc

| index   | a | b | c |
| 9:00 am | 2 | 2 | 4 |
| 9:15 am | 2 | 2 | 4 |
...

我需要将 1、2、3 和 4 周同时 a 的平均值与当前时间步长进行比较。因此,如果我当前时间是上午 9:15,我需要找到前一周、2 周、3 周和 4 周前的上午 9:15 a 的平均值。

显然这无法在数据集的前 4 周计算,因为没有足够的历史记录。我被困在如何考虑将数据框转移到过去以汇总这些值,然后与未来进行比较。

this question有一些相似之处,但索引不是时间序列,比较简单一些。

【问题讨论】:

  • 索引的dtype是什么?
  • @CharlesLandau 时间戳,pandas._libs.tslibs.timestamps.Timestamp
  • 历史记录用完后输出为 NaN 可以吗? (因为这几乎就是我认为必须发生的事情)
  • @CharlesLandau 是的

标签: python pandas


【解决方案1】:

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

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 天收到一个关键错误,因此有一个使用 np.NaN 的尝试除外。注意Timedelta(unit=) kwarg。您可以更改它以获得其他单位的这种效果 - 我认为这比调整对 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)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-24
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    相关资源
    最近更新 更多