我有一个DataFrame
df1
,根据一个特定的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
的值的sum
和count
。
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))
抱歉,因为我是新来的,我没有留下评论的选项。但是,你可以尝试类似于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))