2016-07-09 9 views
1

Ich habe einen großen Datenrahmen, mit dem ich arbeite, der Grunddaten für Aktien enthält. Unten sind Bilder von Kopf und Schwanz des Datenrahmens (Daten). Es hat Daten für jedes Wertpapier und jedes Jahr von 2005 bis 2015. Beachten Sie die Spalte "Kalender".Iterieren durch DataFrame-Zeilen, um neue Spalte zu erstellen, während auf andere Zeilen verwiesen wird

Mein Ziel ist es, zu jeder Zeile zu gehen, den 'revenueusd' Datenpunkt zu nehmen und ihn durch den 'revenueusd' Datenpunkt für das Jahr vorher zu teilen, um die 1 Jahr Umsatzwachstumsänderung für jedes Wertpapier zu erhalten. Der zweite Datenpunkt wird mit dem Ticker und dem Kalender gefunden.

Ich habe versucht, die Anwendungsfunktion mit einem Lambda zu verwenden, aber es funktioniert nicht. Unten ist der Code, den ich probiert habe:

Ich bin seit Tagen darauf fest und suche die Foren gnadenlos. Jede Hilfe würde sehr geschätzt werden!

data.head(5)

data.tail(5)

,ticker,ticker.1,calendardate,revenueusd,gp,rnd 
0,A,A,2015-12-31,4038000000,2041000000,330000000 
1,AA,AA,2015-12-31,22534000000,4465000000,238000000 
2,AAL,AAL,2015-12-31,40990000000,23911000000,0 
3,AAP,AAP,2015-12-31,9737018000,4422772000,0 
4,AAPL,AAPL,2015-12-31,234988000000,94308000000,8576000000 
5,ABBV,ABBV,2015-12-31,22859000000,18359000000,4435000000 
509,A,A,2014-12-31,6981000000,3593000000,719000000 
510,AA,AA,2014-12-31,23906000000,4769000000,218000000 
511,AAPL,AAPL,2014-12-31,199800000000,78432000000,6606000000 
512,ABBV,ABBV,2014-12-31,19960000000,15534000000,3649000000 
+3

Anstatt eine Verknüpfung zu einem Bild herzustellen, fügen Sie bitte ein Beispiel Ihrer Daten in den Text Ihrer Frage ein. – BrenBarn

+0

Was ist der beste Weg, dies zu tun? Ich habe versucht, es in den Text aufzunehmen und es sieht sehr schlampig aus. Danke für die Hilfe! – JohnSmith

+0

Nicht sicher, was du meinst. Kopieren Sie einfach einen Abschnitt Ihres Dataframe, fügen Sie ihn ein und verwenden Sie die Formatierungstools im StackOverflow-Editor, um ihn wie Code zu formatieren. Es ist auch eine gute Idee, den Code, der die Daten generiert, oder einen Ausschnitt der Daten in ein CSV-ähnliches Format einzufügen, das für andere Benutzer einfach ausschneiden, einfügen und laden kann. – BrenBarn

Antwort

1

Es gibt eine nette Funktion Series.pct_change für Ihren Zweck genannt. Sie tun es könnte zum Beispiel wie folgt aus:

import pandas as pd 
data = pd.read_csv("data.csv", index_col=0) 
data.groupby("ticker").apply(lambda x : x.set_index("calendardate").sort_index()["revenueusd"].pct_change()) 

Für jeden Ticker Wert eine Reihe aufgebaut ist, dass durch das Kalenderdatum sortiert und dann die Funktion pct_change angewendet wird (standardmäßig berechnet diese Funktion das Verhältnis zwischen zwei aufeinanderfolgenden Einträge).

ticker calendardate 
A  2014-12-31   NaN 
     2015-12-31  -0.421573 
AA  2014-12-31   NaN 
     2015-12-31  -0.057391 
AAL  2015-12-31   NaN 
AAP  2015-12-31   NaN 
AAPL 2014-12-31   NaN 
     2015-12-31  0.176116 
ABBV 2014-12-31   NaN 
     2015-12-31  0.145240 
Name: revenueusd, dtype: float64 

Eine weitere Sache, werden Ihre Daten schön formatiert, so dass Sie leicht die Spalte umwandeln kann dies Typ Datetime wie:

data["calendardate"] = pd.to_datetime(data["calendardate"], infer_datetime_format=True) 
+0

Das hat Wunder gewirkt! Danke, ein Haufen Mann! – JohnSmith

0

mit diesem Start:

ticker ticker.1 calendardate revenueusd   gp  rnd 
0  A  A 2015-12-31 4038000000 2041000000 330000000 
1  AA  AA 2015-12-31 22534000000 4465000000 238000000 
2  A  A 2014-12-31 403800000 204100000 330000000 
3  AA  AA 2014-12-31 2253400000 446500000 238000000 
4  A  A 2013-12-31 403800000 20410000 330000000 
5  AA  AA 2013-12-31 225340000 44650000 238000000 
6  A  A 2012-12-31  403800  2041000 330000000 
7  AA  AA 2012-12-31  22534000  4465000 238000000 


df["pct"] = df.groupby("ticker")['revenueusd'].pct_change() 



ticker ticker.1 calendardate revenueusd   gp  rnd  pct 
0  A  A 2015-12-31 4038000000 2041000000 330000000 NaN 
1  AA  AA 2015-12-31 22534000000 4465000000 238000000 NaN 
2  A  A 2014-12-31 403800000 204100000 330000000 -0.900 
3  AA  AA 2014-12-31 2253400000 446500000 238000000 -0.900 
4  A  A 2013-12-31 403800000 20410000 330000000 0.000 
5  AA  AA 2013-12-31 225340000 44650000 238000000 -0.900 
6  A  A 2012-12-31  403800  2041000 330000000 -0.999 
7  AA  AA 2012-12-31  22534000  4465000 238000000 -0.900 

Sie benötigen zu sortieren DataFrame vor dem Anwenden von groupby.

+1

Vielleicht '.apply (Lambda x: x.pct_change())' das gleiche wie '.pct_change()'? –

Verwandte Themen