假设我有一个10行的数据框,其中有两列A和B,如下所示:

    A  B
0  21  6
1  87  0
2  87  0
3  25  0
4  25  0
5  14  0
6  79  0
7  70  0
8  54  0
9  35  0

在Excel中,我可以这样计算rolling mean,不包括第一行:
python -  Pandas -指数加权移动平均线-类似于Excel-LMLPHPpython -  Pandas -指数加权移动平均线-类似于Excel-LMLPHP
我怎样才能在熊猫身上做到这一点?
以下是我尝试过的:
import pandas as pd

df = pd.read_clipboard() #copying the dataframe given above and calling read_clipboard will get the df populated
for i in range(1, len(df)):
    df.loc[i, 'B'] = df[['A', 'B']].loc[i-1].mean()

这给了我与Excel匹配的期望结果。但是熊猫有更好的方法吗?我试过使用expandingrolling并没有产生理想的结果。

最佳答案

你有一个指数加权的移动平均数,而不是一个简单的移动平均数。这就是为什么pd.DataFrame.rolling不起作用的原因。你可能要找的是pd.DataFrame.ewm

df

Out[399]:
    A  B
0  21  6
1  87  0
2  87  0
3  25  0
4  25  0
5  14  0
6  79  0
7  70  0
8  54  0
9  35  0

df['B'] = df["A"].shift().fillna(df["B"]).ewm(com=1, adjust=False).mean()
df

Out[401]:
    A          B
0  21   6.000000
1  87  13.500000
2  87  50.250000
3  25  68.625000
4  25  46.812500
5  14  35.906250
6  79  24.953125
7  70  51.976562
8  54  60.988281
9  35  57.494141

即使在只有10行的情况下,这样做也会使代码的速度提高约10倍,%timeit(从10.3ms到959微秒)。在100行上,这将成为100的因子(1.1毫秒对110毫秒)。

08-20 01:27