Python 基于数据帧的滚动PCA

Python 基于数据帧的滚动PCA,python,pandas,pca,Python,Pandas,Pca,我想知道是否有人知道如何在熊猫数据帧上实现滚动/移动窗口PCA。我环顾四周,发现了R和MATLAB中的实现,但不是Python。任何帮助都将不胜感激 这不是重复-移动窗口PCA与整个数据帧上的PCA不同。如果您不了解差异,请参阅pandas.DataFrame.rolling不幸的是,pandas.DataFrame.rolling似乎在滚动之前将df展平,因此不能使用它,因为您可能希望滚动df的行并将行窗口传递给PCA 下面是一个基于滚动索引而不是行的解决方法。它可能不是很优雅,但它可以工作:

我想知道是否有人知道如何在熊猫数据帧上实现滚动/移动窗口PCA。我环顾四周,发现了R和MATLAB中的实现,但不是Python。任何帮助都将不胜感激

这不是重复-移动窗口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计算的控制值相同。

这太宽了。描述一下您到底想要什么,以及数据帧上的简单for循环有什么问题,每个都使用sklearn的pca?你提到了其他语言中的类似工具,但没有链接或任何正式的描述。你为什么想要滚动PCA?从统计学的角度来看,这是没有意义的。这和你想要滚动平均值或滚动标准差的原因是一样的。底层数据是一个时间序列,这相当于在运行时手动切片并在每个切片上执行独立的PCA?或者,是否有什么东西可以让您在每次打开窗口时重用现有的PCA,从而节省时间?它相当于独立的PCA。尝试并找到一种保持现有PCA的方法会很有趣。也许scikit learn的IncrementalPCA可以作为灵感。我一直在研究这个问题,但IPCA无法删除记录,所以它只是解决方案的一半