2017-08-28 2 views
0

Ich frage mich, ob jemand weiß, wie man eine rollende/bewegende Fenster PCA auf einem Pandas Datenrahmen implementieren. Ich habe mich umgesehen und Implementierungen in R und MATLAB gefunden, aber nicht in Python. Jede Hilfe wäre willkommen!Rolling PCA auf Pandas Datenrahmen

Dies ist kein Duplikat - bewegtes Fenster PCA ist nicht dasselbe wie PCA auf dem gesamten Datenrahmen. Bitte sehen pandas.DataFrame.rolling(), wenn Sie nicht verstehen den Unterschied

+3

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

+1

Warum möchten Sie eine rollende PCA? Aus statistischer Sicht macht das keinen Sinn. – Stergios

+0

Derselbe Grund, warum Sie eine rollende Mittelwertbildung oder eine rollende Standardabweichung wünschen. Die zugrunde liegenden Daten sind eine Zeitreihe – Michael

Antwort

0

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.