Python pandas rolling_apply zwei-Spalte-input in die Funktion
Anschluss an diese Frage Python benutzerdefinierte Funktion mit rolling_apply für pandas, über die Verwendung rolling_apply
. Ich habe zwar voran, mit meiner Funktion, die ich bin kämpfen, um mit einer Funktion, die erfordert, dass zwei oder mehr Spalten als Eingänge:
Erstellen das gleiche setup wie vor
import pandas as pd
import numpy as np
import random
tmp = pd.DataFrame(np.random.randn(2000,2)/10000,
index=pd.date_range('2001-01-01',periods=2000),
columns=['A','B'])
Aber die änderung der Funktion leicht zu nehmen, zwei Spalten.
def gm(df,p):
df = pd.DataFrame(df)
v =((((df['A']+df['B'])+1).cumprod())-1)*p
return v.iloc[-1]
Produziert es die folgende Fehlermeldung:
pd.rolling_apply(tmp,50,lambda x: gm(x,5))
KeyError: u'no item named A'
Ich denke, es ist, weil der Eingang für die lambda-Funktion ist ein ndarray der Länge 50 und nur von der ersten Spalte, die nicht zwei Spalten als Eingabe. Gibt es eine Möglichkeit, um sowohl die Spalten als Eingänge und verwenden Sie es in einem rolling_apply
Funktion.
Wieder jegliche Hilfe würde sehr geschätzt werden...
InformationsquelleAutor h.l.m | 2014-01-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht aus wie rolling_apply werden versuchen, Sie zu konvertieren Eingabe von user-func in ndarray (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.stats.moments.rolling_apply.html?highlight=rolling_apply#pandas.stats.moments.rolling_apply).
Workaround basiert auf der Verwendung von aux-Spalte ii, welches verwendet wird, wählen Sie "Fenster" innerhalb der Bearbeiten-Funktion gm:
In diesem Sinne, wie würden Sie abziehen eine ähnliche Kerbe, wenn der index waren, die ein multi-index? Oder alle nicht-numerischen index, für diese Angelegenheit? Immer notwendig ist, zuerst konvertieren Sie den index, der schwebt?
ich veränderte meine Antwort, damit es nicht mehr verwendet Indizes. gm noch immer array von floats, so habe ich diese zuordnen zu ints verwendet werden, mit iloc
Die Idee funktioniert, aber nach dem Versuch dieser Ansatz scheint es komplizierter als es sein muss. Ich habe jetzt nur noch eine for-Schleife verwenden, um durch Rollen des dataframe und können sowohl auswerten und berechnen in mehreren Spalten.
mit for-Schleifen können Sie am Ende mit code, das ist VIEL langsamer - manchmal ist es ein großes problem.
InformationsquelleAutor lowtech
Alle rolling_* funktioniert auf 1d-array. Ich bin sicher, man kann erfinden einige workarounds für die übergabe von 2d-arrays, aber in Ihrem Fall, Sie können einfach vorausberechnen zeilenweise Werte für die rollierende Auswertung:
gm
war nur ein mock-Beispiel...also ich bin immer noch scharf, um herauszufinden, was die Arbeit ist, um zwei oder mehr Spalten...InformationsquelleAutor alko
Hier ist eine andere version dieser Frage: Mit rolling_apply auf einem DataFrame-Objekt. Verwenden Sie diese Einstellung, wenn die Funktion liefert eine Reihe.
Seit Ihrig gibt einen Skalar, dies zu tun.
Definieren Sie Ihre Funktion geben Sie ein Tupel mit dem index, den Sie verwenden möchten, und skalaren Wert, der berechnet wird. Beachten Sie, dass dies ist etwas anders als wir sind die Rückkehr der erste index, hier (und nicht die normalerweise zurückgegebenen letzten, youy tun konnte, entweder).
InformationsquelleAutor Jeff