绘制Pandas Series数据的平滑曲线

9

我的数据是:

>>> ts = pd.TimeSeries(data,indexconv)
>>> tsgroup = ts.resample('t',how='sum')
>>> tsgroup
2014-11-08 10:30:00    3
2014-11-08 10:31:00    4
2014-11-08 10:32:00    7
  [snip]
2014-11-08 10:54:00    5
2014-11-08 10:55:00    2
Freq: T, dtype: int64
>>> tsgroup.plot()
>>> plt.show()

indexconv是使用datetime.strptime转换的字符串。

当前图形非常棱角分明(以下不是我的实际图形): enter image description here

我如何将它变得平滑,如下所示: enter image description here

我知道在这篇文章中提到了scipy.interpolate,但我该如何将其应用于Pandas时间序列?

我发现了这个很棒的库Vincent,可以处理Pandas,但它不支持Python 2.6。

3个回答

11

明白了。在这个问题的帮助下,我做了以下事情:

  1. 将我的tsgroup从分钟转换为秒。

    \>>> tsres = tsgroup.resample('S')
    \>>> tsres
    2014-11-08 10:30:00     3
    2014-11-08 10:30:01   NaN
    2014-11-08 10:30:02   NaN
    2014-11-08 10:30:03   NaN
    ...
    2014-11-08 10:54:58   NaN
    2014-11-08 10:54:59   NaN
    2014-11-08 10:55:00     2
    Freq: S, Length: 1501
  2. 使用.interpolate(method='cubic')对数据进行插值。这将数据传递给scipy.interpolate.interp1d并使用cubic种类,因此您需要安装scipy(pip install scipy1

    \>>> tsint = tsres.interpolate(method='cubic')
    \>>> tsint
    2014-11-08 10:30:00    3.000000
    2014-11-08 10:30:01    3.043445
    2014-11-08 10:30:02    3.085850
    2014-11-08 10:30:03    3.127220
    ...
    2014-11-08 10:54:58    2.461532
    2014-11-08 10:54:59    2.235186
    2014-11-08 10:55:00    2.000000
    Freq: S, Length: 1501
  3. 使用tsint.plot()绘制它。这是原始的tsgrouptsint之间的比较:

1如果您从.interpolate(method='cubic')中得到一个错误,告诉您Scipy未安装,即使您已经安装了它,请打开/usr/lib64/python2.6/site-packages/scipy/interpolate/polyint.py或者其他位置的文件,并将第二行从from scipy import factorial更改为from scipy.misc import factorial


3
根据您进行此操作的原因,您的解决方案可能存在严重问题,因为它严重歪曲了您的实际数据(例如,在10:40、10:43)。 - tnknepp
你为什么这么说?难道不是所有的值都来自实际数据(按分钟聚合),只有中间的值被插值以绘制图形。因此,所有的分钟数据都是相同的(例如10:4010:43),但是秒数(例如10:40:04)被添加到图形中。tsgroup['2014-11-08 10:43:00']tsint['2014-11-08 10:43:00']都返回3。注意:子图中的y轴起点不同。 - Alaa Ali
1
我不理解"interpolate"底层的运作方式,但是仅从您发布的两个图表中观察到,我感到有些不对劲。从蓝色的图表中,我没有看出为什么绿色的图表在10:40左右会上升至5(这是您绘制图表的关键指标),也没有任何理由认为在这两个时间点之间会出现下降。它看起来就不对劲。我完全没有理由认为这种插值是正确的。 - tnknepp
1
好的,所以这些驼峰并不是真实存在的。那么这个有什么应用呢? - tnknepp
2
我唯一的评论是,如果你想让数据在你自己或他人的眼中更美观,那么这是完全可以的。另一方面,你不应该把10:40左右的那个低谷或者类似10:44的低谷视为具有物理意义的数据,因为它只是样条拟合的产物。样条拟合会使任何数据看起来平滑,但也可能会引入像这里出现的伪影。根据我的经验,你可以微调样条拟合参数以消除这些问题,但你可能还需要在下一个数据集上进行调整。 - Charlie_M
显示剩余4条评论

5

您可以使用移动平均值来平滑数据,从而有效地将低通滤波器应用于您的数据。Pandas通过rolling()方法支持此操作。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接