gpt4 book ai didi

pandas - 如何将滚动卡尔曼滤波器应用于数据帧中的列?

转载 作者:行者123 更新时间:2023-12-02 01:20:50 25 4
gpt4 key购买 nike

如何将滚动卡尔曼滤波器应用于 DataFrame 列(不使用外部数据)?

也就是说,假装每一行都是一个新的时间点,因此需要在每一行之后更新(以滚动方式)描述性统计信息。

例如,如何将卡尔曼滤波器应用于以下 DataFrame 中的任意列?

n = 2000
index = pd.date_range(start='2000-01-01', periods=n)
data = np.random.randn(n, 4)
df = pd.DataFrame(data, columns=list('ABCD'), index=index)

我已经看到了以前的响应( 12 ),但是他们没有将其应用于 DataFrame 列(并且它们没有矢量化)。

如何将滚动卡尔曼滤波器应用于 DataFrame 中的列?

最佳答案

利用 numpy 的一些优秀功能并使用 pykalman 库,并在 D 列上应用卡尔曼滤波器以获得 3 的滚动窗口,我们可以编写:

import pandas as pd
from pykalman import KalmanFilter
import numpy as np

def rolling_window(a, step):
shape = a.shape[:-1] + (a.shape[-1] - step + 1, step)
strides = a.strides + (a.strides[-1],)
return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)

def get_kf_value(y_values):
kf = KalmanFilter()
Kc, Ke = kf.em(y_values, n_iter=1).smooth(0)
return Kc

n = 2000
index = pd.date_range(start='2000-01-01', periods=n)
data = np.random.randn(n, 4)
df = pd.DataFrame(data, columns=list('ABCD'), index=index)

wsize = 3
arr = rolling_window(df.D.values, wsize)
zero_padding = np.zeros(shape=(wsize-1,wsize))
arrst = np.concatenate((zero_padding, arr))
arrkalman = np.zeros(shape=(len(arrst),1))

for i in range(len(arrst)):
arrkalman[i] = get_kf_value(arrst[i])

kalmandf = pd.DataFrame(arrkalman, columns=['D_kalman'], index=index)
df = pd.concat([df,kalmandf], axis=1)

df.head() 应该产生如下所示的结果:

                   A         B         C         D  D_kalman
2000-01-01 -0.003156 -1.487031 -1.755621 -0.101233 0.000000
2000-01-02 0.172688 -0.767011 -0.965404 -0.131504 0.000000
2000-01-03 -0.025983 -0.388501 -0.904286 1.062163 0.013633
2000-01-04 -0.846606 -0.576383 -1.066489 -0.041979 0.068792
2000-01-05 -1.505048 0.498062 0.619800 0.012850 0.252550

关于pandas - 如何将滚动卡尔曼滤波器应用于数据帧中的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48739169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com