2016-08-05 14 views
1

Ich möchte die jährliche Performance (als Marktwertänderung) dieser beiden Firmen, deren Daten im folgenden Datenrahmen gespeichert sind, berechnen.Berechnen Sie Aktienrenditen in Pandas DataFrame

df = pd.DataFrame({'tic'  : ['AAPL', 'AAPL', 'AAPL', 'GOOGL','GOOGL','GOOGL'], 
        'mktvalue' : [20,25,30,50,55,60], 
        'fyear' : [2014,2015,2016,2014,2015,2016]}) 

Ich habe eine ähnliche mit Lösung, die eine Lambda-Funktion gesehen, aber bis jetzt konnte ich passen sie nicht auf meine Daten. Ich hatte eine Lösung wie diese in Anbetracht der Leistung zu berechnen auf das Jahr:

df['performance'] = df.fyear.apply(lambda x: (df.mktvalue[(df['fyear'] == 2014)])/
        (df.mktvalue[(df['fyear'] == 2013)]) if x == 2014 
        else (df.mktvalue[(df['fyear'] == 2013)])/    
        (df.mktvalue[(df['fyear'] == 2013)]) 

Eines meiner größten Probleme war, dass bei der Umsetzung beim Aufruf

(df.mktvalue[(df['fyear'] == 2013)]) 

ich alle Marktwerte erhalten von 2013 anstelle von nur dem entsprechenden zu dieser Firma.

Ich würde jede Hilfe zu schätzen wissen!

+0

Unabhängig von Ihrem Problem, in dem 'else' Zweig,' (df.mktvalue [(df [ 'GJAHR'] == 2013)])/(df.mktvalue [(df [ 'GJAHR'] == 2013)]) 'wird immer zurückkehren 1. Ist das was du willst? – IanS

Antwort

0

ist das was du willst?

In [129]: df['performance'] = df.groupby('tic').mktvalue.pct_change().fillna(0) 

In [130]: df 
Out[130]: 
    fyear mktvalue tic performance 
0 2014  20 AAPL  0.000000 
1 2015  25 AAPL  0.250000 
2 2016  30 AAPL  0.200000 
3 2014  50 GOOGL  0.000000 
4 2015  55 GOOGL  0.100000 
5 2016  60 GOOGL  0.090909 
+0

nicht genau, wie ich die prozentuale Veränderung nur für AAPL über die drei Jahre und auch die prozentuale Veränderung nur für GOOGL für die drei Jahre wünschen würde. Für AAPL würde ich also 0 (20/20-1), 0,25 (25/20-1), 0,2 (30/25-1) und für GOOGL 0 (50/50-1), 0,1 (55/50- 1), 0.09 (60/55-1) – DaveL

+0

@DaveL, überprüfen Sie bitte aktualisierte Antwort – MaxU

+0

das ist genau das, was ich gesucht habe, vielen Dank! – DaveL