簡體   English   中英

使用日期范圍在熊貓中滾動加權平均值

[英]Rolling weighted mean in pandas using date range

我想計算時間序列的滾動加權平均值和要在特定時間間隔內計算的平均值。 例如,這計算了具有 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. 如果我可以做一個帶偏移量的加權滾動均值,那么當我指定 window="90D" 和 win_type="gaussian" 時,std 指的是什么; 這是否意味着標准是 60D?

好吧,我發現它尚未在 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行檢查window對象的validate方法,它只允許整數或類似列表的窗口

我認為這是因為 Pandas 使用接收數組的 scipy.signal 庫,因此它無法考慮數據隨時間的分布。

您可以實現自己的加權函數並使用 apply 但其性能不會太好。

我不清楚您希望加權平均值中的權重是多少,但是權重是對觀察“有效”時間的度量嗎?

如果是這樣,我相信您可以重新索引數據框,使其具有規則間隔的觀察結果。 然后適當地填充 NAs - 請參閱https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.reindex.html 中的method這將允許rolling工作並幫助您明確思考缺失的程度觀察值被處理,例如,如果缺失的樣本從最后一個有效樣本或最近的樣本中獲取其值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM