我有一个 pandas 数据框,想轻松计算平滑移动平均值。要计算简单移动平均线,您可以使用类似
df.iloc[:,1].rolling(window=3).mean()
的内容,而对于指数移动平均线,您可以使用类似 df_T.iloc[:,0].ewm(span=40,adjust=False).mean()
的内容。我可以做类似的事情来轻松计算平滑移动平均线吗?
如果我们假设平滑移动平均线 SMA(又名 MMA)的公式为:
SMA(x) = SMA(x)*1/n + SMA(x-1)*(n-1)/n
您可以直接对系列值进行公式运算:
import numpy as np
def smma(series_in,n):
size = len(series_in)
series_out = pd.Series(np.zeros(size))
series_out.index = series_in.index
series_out[0] = series_in[0]
for i in range(1,size):
series_out[i] = series_in[i]*1/n + series_out[i-1]*(n-1)/n
return series_out
window_size = 3
df['smma'] = smma(df[0], window_size)
我不相信这对于
pandas.DataFrame.rolling
是可能的,除非您进行自定义 pandas.DataFrame.rolling.apply
并自己添加扩展公式(作为 window_size
的函数)。
请注意,输出系列我分配与输入系列相同的索引,如果您将
numpy.ndarray
作为列连接到 pandas.DataFrame
并且您的行索引不是排序的整数,则可能会出现错误对齐数据。