web-dev-qa-db-ja.com

移動平均-Pandas

交換時系列に移動平均計算を追加したいと思います。

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

移動平均の計算

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

同じインデックス(日付)を使用して、計算された移動平均を「値」の直後に新しい列として追加したいと思います。計算された移動平均の名前を「MA」に変更することもできます

26
Martin598

ローリング平均はSeriesを返します。以下で説明するように、DataFrameMA)の新しい列として追加するだけです。

詳細については、pandas新しいバージョンでrolling_mean関数が非推奨になりました。私の例では新しいメソッドを使用しました。以下のpandasからの引用を参照してください documentation

警告バージョン0.18.0より前では、pd.rolling_*pd.expanding_*、およびpd.ewm*はモジュールレベルの関数であり、廃止されました。これらは、RollingExpanding、およびEWM.オブジェクトと、対応するメソッド呼び出しを使用して置き換えられます。

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

複数の移動平均を計算する場合:

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

次に、すべてのMAの集計平均を行うことができます

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

次のコードを使用して、移動平均を計算し、折れ線グラフで直接視覚化することもできます。

株価データを使用した例:

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()

これを行う方法に関するチュートリアル: https://youtu.be/XWAPpyF62Vg

4
Martin598