在Python中用平滑的外观绘制时间序列的导数

2024-10-01 02:22:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个像这样的长熊猫时间序列:

2017-11-27 16:19:00     120.0
2017-11-30 02:40:35     373.4
2017-11-30 02:40:42     624.5
2017-12-01 14:15:31     871.8
2017-12-01 14:15:33    1120.0
2017-12-07 21:07:04    1372.2
2017-12-08 06:11:50    1660.0
2017-12-08 06:11:53    1946.7
2017-12-08 06:11:57    2235.3
2017-12-08 06:12:00    2521.3
....
dtype: float64

我想把它和它的导数一起画出来。根据定义,我用这种方式计算导数:

^{pr2}$

因为delta时间的一些值(以分母表示)非常接近(有时等于零),所以我在导数中得到了一些inf值。实际上,我得到了这个:[]. [1]

时间序列蓝色(左刻度),导数绿色(右刻度)

现在我想平滑导数,使其更具可读性。我试过不同的手术,比如:

  • 计算较高期间的差异: enter image description here

为numer和denum设置时段=5

  • 使用移动平均值:smotDeriv=derivative.rolling(window=10,min_periods=3,center=True,win_type='boxcar').mean()获得:

enter image description here

我还使用了不同的窗口类型,没有任何有用的更改

  • 我还想剪去这些值,但我不知道用哪一个有效值作为最小值和最大值。我尝试了25%和75%分位数,但没有任何优势
  • 我还打算使用pykalman滤波器:

    derivative.fillna(0,inplace=True) kf = KalmanFilter(initial_state_mean=0) state_means,_ = kf.filter(derivative.values) state_means = state_means.flatten() indexDate=derivative.index derivativeKalman=pd.Series(state_means,index=indexDate)

要得到这个:

enter image description here

实际上我找不到任何有用的改进。如果可能的话,你能建议我改进图表上导数图的可读性吗。很明显,我已经去掉了导数的一些峰值,得到了一个平滑的曲线,它近似于真实值。我尝试了不同的组合窗口类型,时段等。。没有任何结果。关于Kalman滤波器,我不是专家,比如说一个新手,所以我只使用了this后面的默认值。我还发现了filterpy库,它实现了Kalman滤波器,但我还没有找到如何在不设置启动参数的情况下使用它。在


Tags: true类型index时间序列meanmeansstate
2条回答

我们知道函数的导数定义如下:

f'(x) = lim_(h -> 0) (f(x + h) - f(x - h)) / 2h

假设函数的导数是在任何地方定义的。当h很小时,你会得到更好的导数近似值,当h很大时,你会得到一个很差的导数近似值。在

在数据集的情况下应用这种方法有一个问题。有时h会变得很小,从而给出荒谬的高梯度值。有时h太大,梯度估计很差。为了克服这个问题,让我们定义时间t1和t2的两个阈值。如果连续时间差在t1和t2之间,那么我们用这个点,通过上面的公式f'(x)来确定梯度。如果超过这个阈值,我们就忽略这一点。在

How do we compute the gradient for rest of the points?

我们可以根据上一步找到的点来拟合多项式。在

如果您的目标是去除导数序列中的“离群值”峰值,我会首先尝试“滚动中值”而不是“滚动平均值”,因为中值通常对异常值更不敏感。在

例如:

smotDeriv = derivative.rolling(window=10, min_periods=3, center=True).median()

然后,如果您想进一步消除它,一个可能的选择是应用rolling_mean()。在

注意:由于我手头没有您的数据,所以我不确定window和{}的最佳值。这取决于你想在多大程度上消除它。另外,在我看来,平滑导数变得更像是平滑原始时间序列,所以如果有已知的方法可以平滑原始时间序列,那可能会更直接。在

希望这有帮助。在

相关问题 更多 >