提问者:小点点

指数移动平均(EMA),每天的观测次数不同,但加权观测值相同


我有一个DataFramedf1,根据一个特定的ID进行观察。每个ID的观察次数随着时间的推移而变化。对于每个ID,我尝试计算3天内的指数移动平均线(EMA)。每个观察应该在3天的滚动窗口内平均加权,而不管特定日期的观察次数如何。

df1:
            ID   Value
Date        
2022-01-01  ID1  1
2022-01-01  ID2  0
2022-01-01  ID3  -1
2022-01-02  ID1  1
2022-01-02  ID3  0
2022-01-03  ID1  -1
2022-01-03  ID1  1
2022-01-04  ID1  0
2022-01-04  ID1  1
2022-01-04  ID2  1
2022-01-04  ID3  -1
2022-01-06  ID2  1
2022-01-06  ID2  1
2022-01-06  ID3  -1

到目前为止,我通过创建一个pivot表来构建一个简单的移动平均线(SMA),其中包含每个日期每个ID的值的sumcount

pivot:
            sum         count
ID          ID1 ID2 ID3 ID1 ID2 ID3
Date                        
2022-01-01  1   0   -1  1   1   1
2022-01-02  1   0   0   1   0   1
2022-01-03  0   0   0   2   0   0
2022-01-04  1   1   -1  2   1   1
2022-01-06  0   2   -1  0   2   1

然后我取了3天的值的滚动总和,除以观察次数并创建SMA:

SMA:

ID          ID1   ID2   ID3
Date            
2022-01-01  NaN   NaN   NaN
2022-01-02  NaN   NaN   NaN
2022-01-03  0.50  0.0   -0.5
2022-01-04  0.40  1.0   -0.5
2022-01-06  0.25  1.0   -1.0

对于均线,是否有类似的方法,以便我对期间的每个观测值进行指数加权,而不管当天的观测值有多少?

非常感谢和问候!

为了可复制性:

df1 = pd.DataFrame({
    'Date':['2022-01-01', '2022-01-01', '2022-01-01', '2022-01-02', '2022-01-02', '2022-01-03', '2022-01-03', '2022-01-04', '2022-01-04', '2022-01-04', '2022-01-04', '2022-01-06', '2022-01-06', '2022-01-06'],
    'ID':['ID1', 'ID2','ID3', 'ID1', 'ID3', 'ID1', 'ID1', 'ID1', 'ID1', 'ID2', 'ID3', 'ID2', 'ID2', 'ID3'], 
    'Value':[1, 0, -1, 1, 0, -1, 1, 0, 1, 1, -1, 1, 1, -1]}) 
df1 = df1.set_index('Date')

pivot = df1.explode('ID').pivot_table(
    index='Date', columns='ID', values='Value', fill_value=0, aggfunc=['sum', 'count'])

SMA = pivot.rolling(3).sum().xs('sum', axis=1, level=0).div(RollingSum.xs('count', axis=1, level=0))

共1个答案

匿名用户

抱歉,因为我是新来的,我没有留下评论的选项。但是,你可以尝试类似于SMA的熊猫. emw对吗?pivot.ewm(span=3,min_periods=3).means()

我不确定RollingSum在您的代码中做了什么;但试试这个:

EMA = pivot.ewm(span=3, min_periods=3).mean().div(RollingSum.xs('count', axis=1, level=0))