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