我有一个像这样的长熊猫时间序列:
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
我想把它和它的导数一起绘制。根据定义,我以这种方式计算导数:
numer=myTimeSeries.diff()
denominat=myTimeSeries.index.to_series().diff().dt.total_seconds()/3600
derivative=numer/denominat
因为增量时间的某些值(即以面值表示)非常接近(或有时等于)零,所以我在导数中得到了一些 inf 值。实际上我得到了这个:[
时间序列蓝色(左刻度),导数绿色(右刻度)
现在我想平滑导数以使其更具可读性。我尝试了不同的操作,例如:
为数字和面额设置句点=5
- 使用移动平均线:
smotDeriv=derivative.rolling(window=10,min_periods=3,center=True,win_type='boxcar').mean()
获得:
我也使用了不同的窗口类型,没有任何有用的变化
- 我还想剪裁这些值,但我不知道将哪些有效值用作最小值和最大值。我尝试了 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)
得到这个:
实际上我找不到任何有用的改进。如果可能的话,你能建议我如何提高图表上导数图的可读性。显然,我会削减导数的一些峰值以获得接近真实值的平滑曲线。我尝试了关于窗口类型、周期等的不同组合。没有任何结果。关于卡尔曼滤波器,我不是专家,假设是新手,所以我只是在this之后使用默认值。我还找到了实现卡尔曼滤波器的 filterpy 库,但我还没有找到如何在不设置启动参数的情况下使用。