Python 添加一个列(EMA),该列是pandas中上一个新列值的结果

Python 添加一个列(EMA),该列是pandas中上一个新列值的结果,python,pandas,Python,Pandas,我的原始数据帧如下所示: Date C 0 a 1 b 2 c 3 d 这是一个股票数据。 0,1,2,3是次,C:关闭是浮动 我需要能够向原始数据帧中添加一列,该数据帧是通过计算当前列C得到的,它是EMA(指数移动平均值) 以及上一个新列(“EMA”) Cr: 所以结果应该是这样的 C EMA 0 a start value as ema0 1 b (ema0*alpha) + (b * (1-alph

我的原始数据帧如下所示:

Date   C
0      a
1      b
2      c 
3      d
这是一个股票数据。 0,1,2,3是次,C:关闭是浮动

我需要能够向原始数据帧中添加一列,该数据帧是通过计算当前列C得到的,它是EMA(指数移动平均值) 以及上一个新列(“EMA”)

Cr:

所以结果应该是这样的

       C   EMA
0      a  start value as ema0
1      b  (ema0*alpha) + (b * (1-alpha)) as ema1
2      c  (ema1*alpha) + (c * (1-alpha)) as ema2
3      d  (ema2*alpha) + (d * (1-alpha)) as ema3 
4      e  (ema3*alpha) + (e * (1-alpha)) as ema4
...    ... ....
起始值将是一个简单的平均值,因此我尝试了以下方法。 第一个条件是创造起始值 但在计算EMA值时,它不适用于第二个条件

ema_period = 30
myalpha = 2/(ema_period+1)

data['EMA'] = np.where(data['index'] < ema_period,data['C'].rolling(window=ema_period, min_periods=ema_period).mean(), data['C']*myalpha +data['EMA'].shift(1)*(1-myalpha) )
ema\u周期=30
myalpha=2/(均线周期+1)
数据['EMA']=np.其中(数据['index']
由于您处理的是时间序列,因此建议您采用信号处理方法。使用所示的
scipy.signal.lfilter

按以下步骤进行:

df = # Your dataframe
start_value, alpha, weight = # initialize your parameters

# Use a filtering method to generate values
df['EMA'] = lfilter([1-alpha], [1.0, -alpha], df['C'].astype(float))
所附图像中所需的EWMA:

代码:

获得的EWMA:


DF
构造:


在EMA值的定义中不使用C。这正常吗?非常感谢。您是正确的,我已经更正了结果表。但是,这里的起始值是列
C
的第一个值。您可以对此进行调整,将列
C
的第一个值更改为“start\u value=ema\u 0”,并应用过滤器感谢您的帮助。这可以像excel一样精确地计算值。
ema_period = 12             # change it to ema_period = 30 for your case
myalpha = 2/(ema_period+1)

# concise form : df.expanding(min_periods=12).mean()
df['Expand_Mean'] = df.rolling(window=len(df), min_periods=ema_period).mean()
# obtain the very first index after nulls
idx = df['Expand_Mean'].first_valid_index()
# Make all the subsequent values after this index equal to NaN
df.loc[idx:, 'Expand_Mean'].iloc[1:] = np.NaN
# Let these rows now take the corresponding values in the Close column
df.loc[idx:, 'Expand_Mean'] = df['Expand_Mean'].combine_first(df['Close'])
# Perform EMA by turning off adjustment
df['12 Day EMA'] = df['Expand_Mean'].ewm(alpha=myalpha, adjust=False).mean()
df
index = ['1/2/2013','1/3/2013','1/4/2013','1/7/2013','1/8/2013','1/9/2013', '1/10/2013','1/11/2013',
         '1/14/2013','1/15/2013','1/16/2013','1/17/2013','1/18/2013','1/22/2013','1/23/2013',
         '1/24/2013','1/25/2013','1/28/2013','1/29/2013','1/30/2013']
data = [42.42, 43.27, 43.66, 43.4, 43.4, 44.27, 45.01, 44.48, 44.34, 
        44.44, 44.08, 44.16, 44.04, 43.74, 44.27, 44.11, 43.93, 44.35,
        45.21,44.92]

df = pd.DataFrame(dict(Close=data), index)
df.index = pd.to_datetime(df.index)