绘制熊猫系列数据的平滑曲线

Ala*_*Ali 5 python plot interpolation pandas

我的数据是:

>>> 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()
Run Code Online (Sandbox Code Playgroud)

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

这样的情节非常前卫(这些不是我的实际情节): 在此处输入图片说明

我如何像这样平滑它: 在此处输入图片说明

我知道本文中scipy.interpolate提到的内容(这是我从中获取图像的地方),但是如何将其应用于熊猫时间序列?

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

Ala*_*Ali 5

得到它了。在这个问题的帮助下,我做了以下工作:

  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
    频率:S,长度: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
    频率:S,长度:1501
  3. 使用绘制它tsint.plot()。这是原始版本tsgroup和的比较tsint

1如果由于.interpolate(method='cubic')告诉您即使已安装Scipy也未安装而出现错误,请打开/usr/lib64/python2.6/site-packages/scipy/interpolate/polyint.py文件或将文件放在任何位置,然后将第二行从更改from scipy import factorialfrom scipy.misc import factorial

  • 根据您执行此操作的原因,您的解决方案可能会存在很大问题,因为它严重歪曲​​了您的实际数据(例如,在10:40、10:43)。 (2认同)
  • 我唯一的评论是,如果您要做的是使数据看起来更美观,请您自己或其他人看是完全可以的。另一方面,您不希望在10:40或其他类似的时间〜10:44使用该倾角在物理上有意义,因为它只是样条拟合的假象。样条拟合将使任何数据看起来平滑,但也可能会引入此处所发生的瑕疵。以我的经验,您可以微调样条曲线拟合参数,以使这类事情消失,但您可能会在下一个数据集上再次对其进行调整。 (2认同)

小智 5

您还可以使用移动平均值平滑数据,从而有效地对数据应用低通滤波器。Pandas 通过该方法支持这一点rolling()