我想知道有没有人知道如何在pandas dataframe上实现滚动/移动窗口PCA。我查找了R和MATLAB的实现,但没有Python的实现。任何帮助都将不胜感激!
这不是重复问题 - 滚动窗口PCA与整个数据框的PCA不同。如果您不理解差异,请参阅pandas.DataFrame.rolling()。
这不是重复问题 - 滚动窗口PCA与整个数据框的PCA不同。如果您不理解差异,请参阅pandas.DataFrame.rolling()。
不幸的是,pandas.DataFrame.rolling()
似乎会在滚动之前将 df
展平,因此不能像人们期望的那样滚动 df
的行并将行窗口传递给 PCA。
以下是一种基于索引滚动而不是行滚动的解决方法。它可能不太优雅,但却有效:
# Generate some data (1000 time points, 10 features)
data = np.random.random(size=(1000,10))
df = pd.DataFrame(data)
# Set the window size
window = 100
# Initialize an empty df of appropriate size for the output
df_pca = pd.DataFrame( np.zeros((data.shape[0] - window + 1, data.shape[1])) )
# Define PCA fit-transform function
# Note: Instead of attempting to return the result,
# it is written into the previously created output array.
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
# Create a df containing row indices for the workaround
df_idx = pd.DataFrame(np.arange(df.shape[0]))
# Use `rolling` to apply the PCA function
_ = df_idx.rolling(window).apply(rolling_pca)
# The results are now contained here:
print df_pca
快速检查发现,通过这种方法产生的值与手动切割适当窗口并对其进行PCA计算得出的控制值相同。