pandas 带指数移动平均的前向-后向滤波

omvjsjqw  于 2023-04-28  发布在  其他
关注(0)|答案(1)|浏览(103)

我试图平滑信号使用指数加权移动平均使用过去和未来的价值。
我试过pandas ewm().mean()的内置版本,但是它是非对称的,也就是说,它只使用过去和当前值来生成当前点的平滑版本。这自然会引入滞后-我正在寻找一个对称的版本,因此没有滞后。对称平滑也应该在时间序列的开始引入更少的边界伪影。
展示问题的示例代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(1, 4, 1000)
y = pd.Series(t**2 + 0.5 *np.sin(100*t), index=t)

plt.plot(t, y, label='original')
plt.plot(t, y.ewm(halflife=40).mean(), label='ewma')
plt.grid(True)
plt.legend(loc='upper left')
plt.show()

输出:Plot showing the problem with the smoothed signal lagging behind

6xfqseft

6xfqseft1#

要使用指数加权移动平均执行对称平滑,您可以为每个数据点取向前和向后指数加权移动平均的平均值,如下所示:

Python:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def symmetric_ewma(data, halflife):
    forward_ewma = data.ewm(halflife=halflife).mean()
    backward_ewma = data.iloc[::-1].ewm(halflife=halflife).mean().iloc[::-1]
    return (forward_ewma + backward_ewma) / 2

t = np.linspace(1, 4, 1000)
y = pd.Series(t**2 + 0.5 *np.sin(100*t), index=t)

plt.plot(t, y, label='original')
plt.plot(t, symmetric_ewma(y, halflife=40), label='symmetric_ewma')
plt.grid(True)
plt.legend(loc='upper left')
plt.show()

在此示例中,“symmetric_ewma”函数接受数据序列和半衰期值,并返回对称指数加权移动平均值。
该函数通过使用iloc[::-1]索引方法反转数据序列来计算前向指数加权移动平均线和后向指数加权移动平均线。然后取两者的平均值以获得对称指数加权移动平均线。这应该是您要寻找的:)

相关问题