2017-08-16 1 views
0

Ich habe eine Funktion monatliche Renditen zu berechnen:Berechnung jährliche Standardabweichung, Monatsrenditen in Pandas gegeben

def monthlyreturns(df): 
    first = df.resample('M').first().to_period('M') 
    last = df.resample('M').last().to_period('M') 
    return ((last-first)/first) * 100 

und eine daraus resultierende df aus monthlyreturns (Aktien): ist

  FOX  FOXA  MMM 
Date 
2012-01 5.4  3.2  -.08 
2012-02 .07  1.2  -.62 
... 
2017-08 -.2  -4.2  2.3 

Meine Frage - Wie kann ich die Standardabweichung für ein Jahr berechnen? Meine erwartete Leistung wäre, das df im gleichen Format zu halten (mit Aktien in Spalten und Datum als Index), aber die jährliche Standardabweichung bei monatlichen Renditen zu berechnen (es sollten also etwa 7 Werte für jeden Bestand sein)

Bisher habe ich versucht:

sd = pd.DataFrame() 
x = -13 
y = -1 
for date in reversed(periods):      #where periods is ea year 
    sd[date] = np.std(monthly_returns.iloc[x:y])  
x -= 12 
y -= 12 
if x < -72: 
    break 

Dies funktioniert - aber die Daten und Spalten vertauscht, und frage mich, ob es einen saubereren Code war dieses

+0

Wenn Sie eine Schleife auf ein Pandas-Objekt anwenden, tun Sie es in 99% der Fälle falsch. – DyZ

+0

Ich wusste, dass ein 1-Liner so, ich wusste nicht über den Index.Jahr Teil - vielen Dank dafür –

Antwort

1
monthly_returns.groupby(monthly_returns.index.year).std() 

Für Ihr Beispiel zu tun:

#   FOX  FOXA  MMM 
#2012 3.768879 1.414214 0.381838 
#2017  NaN  NaN  NaN 
Verwandte Themen