我的数据是:
>>> 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
转换的字符串。
情节很像这样(这些不是我的实际情节):
我怎样才能让它像这样平滑:
我知道this article中提及的scipy.interpolate
(这是我从中获取图片的地方),但我如何将其应用于Pandas时间序列?
我找到了一个名为Vincent的优秀图书馆来处理Pandas,但它并不支持Python 2.6。
答案 0 :(得分:5)
知道了。在this question的帮助下,这就是我所做的:
将我的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
使用.interpolate(method='cubic')
插入数据。这会将数据传递给scipy.interpolate.interp1d
并使用cubic
类型,因此您需要安装scipy(pip install scipy
) 1 。
\>>> 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
使用tsint.plot()
绘制它。这是原始tsgroup
和tsint
之间的比较:
1 如果您从.interpolate(method='cubic')
收到错误,告诉您即使安装了Scipy也未安装,请打开{{1}或者您的文件可能位于何处,并将第二行从/usr/lib64/python2.6/site-packages/scipy/interpolate/polyint.py
更改为from scipy import factorial
。
答案 1 :(得分:0)
答案 2 :(得分:0)
您还可以使用移动平均值平滑数据,从而对数据有效地应用低通滤波器。熊猫通过rolling()
方法支持这一点。