2017-06-19 6 views
4

Betrachten ich einen Datenrahmen von 10 Reihen haben, die zwei Spalten A und B, wie folgend:Pandas - exponentiell gewichteten gleitenden Durchschnitt - ähnlich wie Excel

A B 
0 21 6 
1 87 0 
2 87 0 
3 25 0 
4 25 0 
5 14 0 
6 79 0 
7 70 0 
8 54 0 
9 35 0 

in Excel ich die rollingmean wie dies ohne Berechnung kann der erste Reihe: enter image description hereenter image description here

Wie kann ich das in Pandas machen? Hier

ist, was ich versucht habe:

import pandas as pd 

df = pd.read_clipboard() #copying the dataframe given above and calling read_clipboard will get the df populated 
for i in range(1, len(df)): 
    df.loc[i, 'B'] = df[['A', 'B']].loc[i-1].mean() 

Das gibt mir das gewünschte Ergebnis passende Excel. Aber gibt es einen besseren Pandas Weg, es zu tun? Ich habe versucht, mit expanding und rolling nicht das gewünschte Ergebnis zu produzieren.

+0

Ich bin ein wenig verwirrt, was Sie hier anstreben. Ein "normaler" gleitender Durchschnitt der Reihe A mit beispielsweise einer Fensterlänge von 2 hätte die Formel = DURCHSCHNITT (A2: A1) in Zelle B2 und nicht = MITTELWERT (A1, B1), vorausgesetzt, Sie haben bereits akzeptiert eine Antwort, ich nehme an, du hast genau das bekommen, wonach du gesucht hast, aber es wäre cool, wenn du die Zeit finden würdest, einige Details zu liefern. – vestland

+1

Ich versuche Heiken-Ashi Kerzen zu erstellen. Aktueller Balkenöffnungswert ist der Durchschnitt des Öffnungs- und Schließwerts des vorherigen Balkens. Weitere Informationen finden Sie unter diesem Link https://www.quantiacs.com/Blog/Intro-to-Algorithmic-Trading-with-Heikin-Ashi.aspx – Abbas

Antwort

5

Sie haben einen exponentiell gewichteten gleitenden Durchschnitt anstelle eines einfachen gleitenden Durchschnitts. Deshalb hat pd.DataFrame.rolling nicht funktioniert. Möglicherweise suchen Sie stattdessen nach pd.DataFrame.ewm.

ab

df 

Out[399]: 
    A B 
0 21 6 
1 87 0 
2 87 0 
3 25 0 
4 25 0 
5 14 0 
6 79 0 
7 70 0 
8 54 0 
9 35 0 

df['B'] = df["A"].shift().fillna(df["B"]).ewm(com=1, adjust=False).mean() 
df 

Out[401]: 
    A   B 
0 21 6.000000 
1 87 13.500000 
2 87 50.250000 
3 25 68.625000 
4 25 46.812500 
5 14 35.906250 
6 79 24.953125 
7 70 51.976562 
8 54 60.988281 
9 35 57.494141 

Auch auf nur zehn Zeilen, es auf diese Weise den Code um etwa einen Faktor 10 mit %timeit (959 Mikrosekunden von 10.3ms) beschleunigt zu tun. Bei 100 Zeilen wird dies ein Faktor von 100 (1,1 ms gegenüber 110 ms).

+3

Sie könnten 'adjust = False' verwenden, denke ich, etwas wie' df ["A"]. shift(). fillna (df ["B"]). ewm (com = 1, einstellen = Falsch) .mean() '. – DSM

+0

@DSM absolut richtig. Mein Auge hüpfte immer wieder über diese Linie. Aktualisiert. – EFT

Verwandte Themen