滑动平均值 Pandas

111

我想在我的交易时间序列数据中加入移动平均计算。

原始数据来自于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

# Calculating Moving Avarage
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

我希望在“Value”列的右侧使用相同的索引(“Date”)将计算出的移动平均值作为新列添加。最好还要将计算出的移动平均值重命名为“MA”。

4个回答

179
滚动均值返回一个 Series,您只需将其作为新列添加到您的 DataFrame (MA) 中,如下所述。
需要注意的是,在较新的 pandas 版本中,rolling_mean 函数已被弃用。在我的示例中,我使用了新方法,请参见以下摘自 pandas 文档 的引用。

警告 在版本 0.18.0 之前,pd.rolling_*pd.expanding_*pd.ewm* 是模块级函数,现已弃用。这些函数可以通过使用 RollingExpandingEWM. 对象及相应的方法调用来替换。

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

如果有多列,"rolling" 会选择哪一列? - dineshdileep
26
实际上,在这种情况下,“mean”将适用于所有列。如果您想明确选择一列,可以像这样执行:df.rolling(window=5)['MA'].mean() - Romain
点赞提到了 EWM。我之前并不知道这个东西,但它恰好就是我正在寻找的。谢谢! - S3DEV
1
如果你不想在开头得到NANs,可以使用min_periods=0(或一个小值)。 - lol

16

可以使用以下代码在线图中直接计算和可视化移动平均线:

以股票价格数据为例:

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


我认为seaborn或matplotlib能够计算移动平均值,但实际上我错了。 - Nuclear03020704

9

如果您正在计算多个移动平均线:

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)

8
为了在pandas中获取移动平均值,我们可以使用cum_sum然后除以count。
这是一个工作示例:
import pandas as pd
import numpy as np

df = pd.DataFrame({'id': range(5),
                   'value': range(100,600,100)})

# some other similar statistics
df['cum_sum'] = df['value'].cumsum()
df['count'] = range(1,len(df['value'])+1)
df['mov_avg'] = df['cum_sum'] / df['count']

# other statistics
df['rolling_mean2'] = df['value'].rolling(window=2).mean()

print(df)

输出

   id  value  cum_sum  count  mov_avg     rolling_mean2
0   0    100      100      1    100.0           NaN
1   1    200      300      2    150.0           150.0
2   2    300      600      3    200.0           250.0
3   3    400     1000      4    250.0           350.0
4   4    500     1500      5    300.0           450.0

2
你为什么要这样做,而不是使用简单的滚动平均? - Mathias Thorsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接