返回 登录
0

IoT 数据预处理:线性重采样全过程解析

原文:Preprocessing IoT Data: Linear Resampling
作者:neocortex
译者:蒋春华
审校:屠敏

在这篇文章中,我们将描述在分析物联网的时间序列数据的一个最重要的预处理过程:线性重采样。具体而言,我们会描述对物联网传感器数据进行重采样时所面临的挑战,然后介绍一个解决该问题的方案。

不规则的 IoT 时间序列数据

在 IoT 中,数据通常会先通过传感器或其它相连的设备进行采集,然后被发送到云端,以做进一步的处理、分析,或者作为构建智能 APP 的原型。

由于 IoT 设备发送数据的时间间隔不是固定的,所以 IoT 时间序列数据相对它们的采样率来时是高度不规律的 —— 设备间或者跨设备。这可能会导致处理和分析数据变得非常麻烦,尤其是当多个传感器的数据结合在一起被分析的时候。

因此,将不规则、不均匀的时间序列数据重采样为一致的、规律的数据是物联网中数据预处理的一个重要步骤,处理好这个步骤能极大地促进对数据的连续处理过程。

WATTx 是柏林的一家合资企业,专注于包块 IoT 在内的深度技术。在我们的一个最新项目中,我们在一个安装了数百个传感器的建筑物中建立了一个能源优化的原型。这些传感器收集温度、湿度、光照和运动等信息。你可以在下图中看到其中一个楼层的设置地图:



智能办公室布局

分析这些来自办公室传感器的数据,我们可以发现一个有趣的现象:



日常温度平均值曲线图

该图描述了平均温度曲线构成的簇。该图显示表明,在大量的房间中,夜间和白天都存在过热现象,进一步表明通风系统没有达到最优化,从而造成了能源浪费。

使用 Pandas 重采样

在进行类似上面的那样分析数据前,还有一个非常关键的预处理步骤 —— 将不规律的事件序列数据转换为规律的、一致的数据。这样做能避免我们在随后处理各设备间不规律、不一致的时间戳时所会遇到的痛苦。

在 WATTx,我们使用得最多的是 Python 及其数据科学库,因此,完成重采样功能的最佳选择自然而然就是 Pandas。

我们先来看看一个简单的使用不均匀间隔数据点模拟出来的温度曲线的例子:



现在我们来函数 mean 和线性插值来对这个温度曲线进行频率为 50 分钟(任意选择的)的重采样。

pd.resample(tseries, '50min', 'mean').interpolate()



如上图所示,时间序列的重采样结果与原始数据的结果不完全匹配了,而是有了一定的漂移。这是由于 pandas 的重采样函数是基于时间操作完成的,这使得它很容易收到原始主句和预期目标频率的影响。

两步完成 IoT 重采样处理

为了克服这个矛盾,我们提出了一个解决方案,解决了我们所有需要线性插值的传感器所面临的这个的问题。

该方法由两步重采样过程组成,我们(1)首先使用 mean 作为聚合函数和线性插值将原始时间序列上采样为一个高频率(例如 1 分钟或者 1 秒,这主要依赖于初始数据的分辨率),(2)然后使用一个简单的 forward 填充聚合将该数据再下采样为所预期的目标频率。

将这个方案运行到例子中的曲线,其代码类似这样的:

tmp = pd.resample(tseries, '1min', 'mean').interpolate()
resampled = pd.resample(tmp, '50min', 'ffill')

再来看看执行结果:



显然,这两步重采样过程的结果曲线与底层数据匹配得更好,而且它在我们所有需要线性重采样的物联网传感器中都是一致的。

增加鲁棒性:处理缺失的数据

我们想解决的一个额外的情形是当时间序列中有非常大的空隙中缺失数据时进行重采样的情形。这种情形可能是 传感器在几个小时内处于离线状态。

下面是模拟传感器在夜间(大约晚上 10 点到凌晨 6 点)掉线时的一个温度曲线的例子:



如果我们对这些时间序列重采样,其数据点结果将会是:



很显然,重采样的数据与数据丢失期间的真实温度数据不匹配。为了涵盖这种情形,我们引进了一个参数,用来表示为了能够插值,数据缺失的间隔最大为多大。如果间隙大于这个指定的阈值(我们发现在我们所遇到的情形中,1 小时是最佳选择),数据点不会被插值,而是返回一个 NaN(Not a Number)值代替。

加上这个功能,我们就能得到我们想要的结果了;没有数据传输的期间返回的采样数据是空值:



总结

在这篇博客中,我们演示了对不规律 IoT 时间序列数据进行重采样时所遇到的挑战,以及我们针对该挑战想出的解决方案。IoT 传感器数据重采样的示例代码 GitHub 地址:https://gist.github.com/neocortex/5d962742ef16b072dee9a04d9015f85d

本文是我在 2017 柏林 PyData 会议中演讲的内容,PPT 下载地址:https://github.com/pydataberlin/conf2017slides/blob/master/smart_iot_applications/building_mart_IoT_applications_Rafael_Schultze-Kraft.pdf

评论