Leider pandas.DataFrame.rolling()
scheint die df
vor dem Walzen zu glätten, so kann es nicht verwendet werden, da man in den Reihen der df
und den Ball zu rollen könnte erwarten, Fenster von Zeilen zum PCA.
Das folgende ist eine Umgehung für diese basierend auf dem Rollieren über Indizes anstelle von Zeilen. Es ist vielleicht nicht sehr elegant sein, aber es funktioniert:
# 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
Eine schnelle Überprüfung zeigt, dass die durch diese erzeugt werden Werte identische Werte durch Schneiden entsprechende Fenster manuell berechnet zu steuern und läuft PCA auf sie.
Das ist zu breit. Beschreibe, was genau du willst und was falsch ist mit einer einfachen For-Schleife über deinen Datenrahmen, die jeweils sklearns pca verwendet? Sie erwähnen ähnliche Werkzeuge in anderen Sprachen, aber es gibt keine Verbindung oder irgendeine formale Beschreibung. – sascha
Warum möchten Sie eine rollende PCA? Aus statistischer Sicht macht das keinen Sinn. – Stergios
Derselbe Grund, warum Sie eine rollende Mittelwertbildung oder eine rollende Standardabweichung wünschen. Die zugrunde liegenden Daten sind eine Zeitreihe – Michael