使用日期范围在熊猫中滚动加权平均值

时间:2019-08-19 15:27:56

标签: python pandas

我想计算时间序列的滚动加权平均值和在特定时间间隔内要计算的平均值。例如,此操作使用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:无效的窗口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”时参考;这是不是说std​​是60D?

2 个答案:

答案 0 :(得分:1)

Okey,我发现它尚未在熊猫中实现。

看这里: 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行检查window对象的validate方法,它仅允许整数或类似列表的窗口

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

您可以实现自己的加权功能并使用apply,但其性能不会太好。

答案 1 :(得分:0)

我不清楚您希望加权平均值中的权重是多少,但是权重是否可以衡量观察有效的时间?

如果是这样,我相信您可以为数据框重新编制索引,使其具有规则间隔的观察值。然后适当填写NA-请参见https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.reindex.html中的method 这将使rolling能够正常工作,并且还可以帮助您明确考虑如何处理丢失的观测值,例如,丢失的样本应该从上一个有效样本还是最近的样本中获取其值。