如何用Pandas“解除”系列数据?

时间:2018-01-18 16:13:24

标签: python pandas

我有一些时间序列数据实际上是以相对于它改变的速率的截断精度记录的。当我绘制它时,这会产生类似阶梯的质量。我正在使用Pandas来操纵和存储数据。有没有办法可以使用Pandas来平滑阶梯,从时间序列数据中推断出额外的精度?

更详细地说,这是一个示例图:

sample graph showing stairstep data

绿线表示记录的温度。我的温度传感器精确到十分之一摄氏度,但每个记录间隔的温度变化率明显小于十分之一。

我认为应该可以根据值的变化速度推断出额外的精度,但我不确定最好的方法是什么。我使用pandas.rolling_mean获得了一个好看的结果,但是使用了固定窗口的平均值,即使图表的不同部分会受益于不同的窗口大小。由于相对较宽的窗口,它还缩短了较窄的峰值。

enter image description here

理想情况下,我希望得到一些连续的东西,以便我可以获取数据的衍生物而不会产生极其尖锐的结果。

那么,熊猫可以帮我找到我想要的结果吗?

1 个答案:

答案 0 :(得分:0)

嗯,这是我到目前为止所做的事情。我得到了很好的结果,尽管我仍然认为应该有一些感觉不像黑客。

如果我们假设温度传感器相当精确到百分之一度,但仅报告十分之一度,我们可以推断出当读数从0.1变为0.2时,那时的实际读数是0.15。因此,我浏览系列,找到值更改的所有位置,将值设置为两者的平均值,并将所有其他值设置为NaN。然后我使用Series.interpolate构建令人愉悦的曲线,这些曲线在大多数情况下至少与原始读数一样准确。

以下是代码:

def smooth_data(data, method='linear'):
    data = data.copy().astype(np.float64)
    for i0, i1 in zip(data.index[1:], data.index[2:]):
        if data[i0] == data[i2]:
            data[i0] = np.nan
        else:
            data[i0] = (data[i0] + data[i1]) / 2
    return data.interpolate(method)

这里有这种平滑(和三次插值)相同的数据:

graph with smoothed curves