【问题标题】:Rolling weighted mean in pandas using date range使用日期范围在熊猫中滚动加权平均值
【发布时间】:2019-08-21 00:33:42
【问题描述】:

我想计算时间序列的滚动加权平均值以及在特定时间间隔内计算的平均值。例如,这计算了 90 天窗口(未加权)的滚动平均值:

import numpy as np
import pandas as pd

data = np.random.randint(0, 1000, (1000, 10))
index = pd.date_range("20190101", periods=1000, freq="18H")

df = pd.DataFrame(index=index, data=data)

df = df.rolling("90D").mean()

但是,当我应用加权函数(下一行)时,我收到一个错误:“ValueError: Invalid window 90D”

df = df.rolling("90D", win_type="gaussian").mean(std=60)

另一方面,如果我将窗口设为整数而不是偏移量,则加权平均值会起作用:

df = df.rolling(90, win_type="gaussian").mean(std=60)

使用整数不适用于我的应用程序,因为观察的时间间隔不均匀。

两个问题:

  1. 我可以做一个带偏移量的加权滚动平均值吗(例如“90D”或“3M”?

  2. 如果我可以用偏移量做加权滚动平均值,那么 std 参考我指定window="90D"和win_type="gaussian"的时候;这是否意味着标准是60D?

【问题讨论】:

  • 您确定您的 pandas 版本已更新吗?... 您需要 pandas >= 0.19.0。你的代码对我有用
  • @DanielFonnegraGarcía 是的,Pandas 版本是 0.23.4。当 window="90D" 和 win_type="gaussian" 时它对你有用吗?

标签: python pandas


【解决方案1】:

好吧,我发现它还没有在 pandas 中实现。

看这里: https://github.com/pandas-dev/pandas/blob/v0.25.0/pandas/core/window.py

如果您遵循第 2844 行,您会看到当 win_type 不是 None 时,会返回一个 Window 对象:

if win_type is not None:
    return Window(obj, win_type=win_type, **kwds)

然后在第630行检查窗口对象的验证方法,它只允许整数或类似列表的窗口

我认为这是因为 pandas 使用接收数组的 scipy.signal 库,因此它无法考虑数据随时间的分布情况。

您可以实现自己的加权函数并使用 apply 但它的性能不会太好。

【讨论】:

    【解决方案2】:

    我不清楚您希望加权平均值中的权重是什么,但权重是否衡量观察“有效”的时间?

    如果是这样,我相信您可以重新索引数据框,使其具有规则间隔的观察结果。然后适当地填写 NA - 请参阅 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.reindex.html 中的 method 这将允许rolling 工作,并帮助您明确考虑如何处理缺失的观察结果,例如,缺失的样本是否应从最后一个有效样本或最近的样本中获取其值。

    【讨论】:

    • 权重由win_type指定。将其视为卷积。
    猜你喜欢
    • 2018-04-26
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2019-07-27
    • 2015-01-12
    • 2023-01-31
    • 1970-01-01
    相关资源
    最近更新 更多