问题描述
@WhoIsJack 部分回答了这个问题,但鉴于我遇到的错误,还没有完全解决。基本上,我正在尝试对滚动数据窗口执行主成分分析。例如,我会在 df 的最后 200 天运行 PCA,向前移动 1 天,然后在过去 200 天再次执行 PCA。因此,当您每天向前推进时,您将包括第二天的测量结果并排除最后一次测量结果。
const final = moment.duration(currentTime - startTime).asSeconds();
这是窗口大小:
data = np.random.random(size=(1000,10))
df = pd.DataFrame(data)
window = 200
定义 PCA 拟合变换函数。不是尝试返回结果,而是将其写入先前创建的输出数组。
df_pca = pd.DataFrame( np.zeros((data.shape[0] - window + 1,data.shape[1])) )
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)
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 (将#修改为@)