对数据的移动窗口进行主成分分析

问题描述

@WhoIsJack 部分回答了这个问题,但鉴于我遇到的错误,还没有完全解决。基本上,我正在尝试对滚动数据窗口执行主成分分析。例如,我会在 df 的最后 200 天运行 PCA,向前移动 1 天,然后在过去 200 天再次执行 PCA。因此,当您每天向前推进时,您将包括第二天的测量结果并排除最后一次测量结果。

你有一个随机的 df:

const final = moment.duration(currentTime - startTime).asSeconds();

这是窗口大小:

data = np.random.random(size=(1000,10))
df = pd.DataFrame(data)

输出初始化一个合适大小的空 df

window = 200

定义 PCA 拟合变换函数。不是尝试返回结果,而是将其写入先前创建的输出数组。

df_pca = pd.DataFrame( np.zeros((data.shape[0] - window + 1,data.shape[1])) )

解决方法创建一个包含行索引的 df

def rolling_pca(window_data):
    pca = PCA()
    transf = pca.fit_transform(df.iloc[window_data])
    df_pca.iloc[int(window_data[0])] = transf[0,:]
    return True

使用滚动应用PCA函数

df_idx = pd.DataFrame(np.arange(df.shape[0]))

结果应包含在此处:

_ = df_idx.rolling(window).apply(rolling_pca)

但是,当我生成结果时,只有第一行数据看起来包含 PCA,而其余行都为零。

我还尝试了以下功能

print(df_pca)

我认为这会生成一个带有滚动 PCA 的新 df:

def rolling_pca(x,window):
    r   = x.rolling(window=window)
    pca = PCA(3)
    y   = pca.fit(r)
    z   = pca.fit_transform(y)
    return z

window = 200

但我收到以下错误:使用序列设置数组元素。

我也试过用下面的方法手动计算。我得到:“不支持的操作数类型/:‘Rolling’和‘int’”

data = df.apply(rolling_pca,window=window)

并在下面尝试。获取错误:“LinAlgError:给出了 0 维数组。数组必须至少是二维的”

def rolling_pca(x,window):
    
    # create rolling dataframe
    r = x.rolling(window=window)    
    
    # demand data
    X    = np.matrix(r)
    X_dm = X - np.mean(X,axis = 0)

    #Eigenvalue decomposition (of covariance matrix)
    Cov_X         = np.cov(X_dm,rowvar = False)
    eigen         = np.linalg.eig(Cov_X)
    eig_values_X  = np.matrix(eigen[0])
    eig_vectors_X = np.matrix(eigen[1])

    #transformed data
    Y_dm          = X_dm * eig_vectors_X

    #assign transformed yields
    yields_trans = Y_dm.copy()

    # get PCs
    pc1_yields = x.copy()
    pcas       = yields_trans[:,0:3]
    
    return pcas  

#assign window length
window = 300

rolling_pca(data,window=window)

任何想法将不胜感激!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)