web-dev-qa-db-fra.com

Moyenne mobile- Pandas

J'aimerais ajouter un calcul de moyenne mobile à ma série chronologique d'échanges.

Données originales de Quandl

Exchange = Quandl.get ("BUNDESBANK/BBEX3_D_SEK_USD_CA_AC_000", authtoken = "xxxxxxx")

    Value
Date               
1989-01-02  6.10500
1989-01-03  6.07500
1989-01-04  6.10750
1989-01-05  6.15250
1989-01-09  6.25500
1989-01-10  6.24250
1989-01-11  6.26250
1989-01-12  6.23250
1989-01-13  6.27750
1989-01-16  6.31250

Calcul de la moyenne mobile

MovingAverage = pd.rolling_mean (Exchange, 5)

              Value
Date          
1989-01-02      NaN
1989-01-03      NaN
1989-01-04      NaN
1989-01-05      NaN
1989-01-09  6.13900
1989-01-10  6.16650
1989-01-11  6.20400
1989-01-12  6.22900
1989-01-13  6.25400
1989-01-16  6.26550

Je voudrais ajouter la moyenne mobile calculée en tant que nouvelle colonne à droite après "Valeur" en utilisant le même index (Date). De préférence, j'aimerais également renommer la moyenne mobile calculée en "MA".

26
Martin598

La moyenne glissante renvoie un Series, il vous suffit de l'ajouter comme nouvelle colonne de votre DataFrame (MA) comme décrit ci-dessous.

Pour information, le rolling_mean La fonction est obsolète dans pandas versions plus récentes. J'ai utilisé la nouvelle méthode dans mon exemple, voir ci-dessous une citation de pandas documentation

Avertissement Avant la version 0.18.0, pd.rolling_*, pd.expanding_*, et pd.ewm* étaient des fonctions de niveau module et sont maintenant obsolètes. Ceux-ci sont remplacés en utilisant Rolling, Expanding et EWM. objets et un appel de méthode correspondant.

df['MA'] = df.rolling(window=5).mean()

print(df)
#             Value    MA
# Date                   
# 1989-01-02   6.11   NaN
# 1989-01-03   6.08   NaN
# 1989-01-04   6.11   NaN
# 1989-01-05   6.15   NaN
# 1989-01-09   6.25  6.14
# 1989-01-10   6.24  6.17
# 1989-01-11   6.26  6.20
# 1989-01-12   6.23  6.23
# 1989-01-13   6.28  6.25
# 1989-01-16   6.31  6.27
44
Romain

Si vous calculez plus d'une moyenne mobile:

for i in range(2,10):
   df['MA{}'.format(i)] = df.rolling(window=i).mean()

Ensuite, vous pouvez faire une moyenne globale de tous les MA

df[[f for f in list(df) if "MA" in f]].mean(axis=1)
5
chrisckwong821

Une moyenne mobile peut également être calculée et visualisée directement dans un graphique à courbes à l'aide du code suivant:

Exemple utilisant des données de cours boursier:

import pandas_datareader.data as web
import matplotlib.pyplot as plt
import datetime
plt.style.use('ggplot')

# Input variables
start = datetime.datetime(2016, 1, 01)
end = datetime.datetime(2018, 3, 29)
stock = 'WFC'

# Extrating data
df = web.DataReader(stock,'morningstar', start, end)
df = df['Close']

print df 

plt.plot(df['WFC'],label= 'Close')
plt.plot(df['WFC'].rolling(9).mean(),label= 'MA 9 days')
plt.plot(df['WFC'].rolling(21).mean(),label= 'MA 21 days')
plt.legend(loc='best')
plt.title('Wells Fargo\nClose and Moving Averages')
plt.show()

Tutoriel sur la façon de procéder: https://youtu.be/XWAPpyF62Vg

4
Martin598