Python 3.x 对数据的移动窗口执行主成分分析

Python 3.x 对数据的移动窗口执行主成分分析,python-3.x,pca,rolling-computation,Python 3.x,Pca,Rolling Computation,考虑到我所犯的错误,这个问题得到了部分解决,但还没有完全解决。基本上,我尝试在滚动的数据窗口上执行主成分分析。例如,我在df的最后200天运行PCA,向前移动1天,然后在最后200天再次执行PCA。因此,当您每天向前移动时,您将包括第二天的测量值,并排除最后一次测量值 您有一个随机df: data = np.random.random(size=(1000,10)) df = pd.DataFrame(data) 以下是窗口大小: window = 200 为输出初始化适当大小的空df df

考虑到我所犯的错误,这个问题得到了部分解决,但还没有完全解决。基本上,我尝试在滚动的数据窗口上执行主成分分析。例如,我在df的最后200天运行PCA,向前移动1天,然后在最后200天再次执行PCA。因此,当您每天向前移动时,您将包括第二天的测量值,并排除最后一次测量值

您有一个随机df:

data = np.random.random(size=(1000,10))
df = pd.DataFrame(data)
以下是窗口大小:

window = 200
为输出初始化适当大小的空df

df_pca = pd.DataFrame( np.zeros((data.shape[0] - window + 1, data.shape[1])) )
定义PCA拟合变换函数。它不会尝试返回结果,而是写入先前创建的输出数组中

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
为解决方案创建包含行索引的df

df_idx = pd.DataFrame(np.arange(df.shape[0]))
使用滚动应用PCA函数

_ = df_idx.rolling(window).apply(rolling_pca)
结果应包含在此处:

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

我还尝试了以下功能:

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
我认为这会产生一个新的df,带有滚动PCA:

data = df.apply(rolling_pca, window=window)
但是我得到了以下错误:使用序列设置数组元素

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

然后在下面尝试。获取错误:“LinalError:给定了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)
def pca(x):
 
    # demand data
    X    = np.matrix(x.values)
    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 3 PCs
    pcas       = yields_trans[:,0:3]
    final_pcas = pd.DataFrame(pcas)
    
    return final_pcas

data.rolling(200).apply(pca)