原文:
www.kdnuggets.com/2022/09/handling-missing-values-timeseries-sql.html
今天早上我阅读了Madison Schott的文章,她在其中强调了这个鲜为人知的 SQL 函数LAST_VALUE
的实用性。
这激励我写了一篇关于处理时间序列数据时经常遇到的特定用例的后续文章。
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析能力
3. 谷歌 IT 支持专业证书 - 支持你的组织的 IT
让我们假设你正在使用传感器数据构建一个预测性维护模型。
经过一些整理,你最终得到的每小时数据如下所示:
一些预处理的传感器数据示例
到目前为止,我们已经进行了一些相当重要的数据工程,以在每小时创建这些均匀间隔的观测数据。如何做到这一点是另一个文章的主题。然而,请注意,温度测量中存在一些间隙。这时LAST_VALUE
就派上用场了。
缺失值的原因通常是传感器只在值发生变化时报告。这减少了机器需要传输的数据量,但这为我们创建了一个数据问题需要解决。
如果我们直接使用这些数据构建模型,当特定值缺失时,模型的准确性会受到影响,因为没有历史上下文写入到行本身。为了获得尽可能准确的模型,我们应该添加如下一些特征:
-
最后一次温度读取
-
过去 6 小时的平均温度
-
自上次温度读取以来的小时数(温度上升/下降)
-
过去 12 小时的温度变化率
将对预测模型有用的特征类型的说明
我们的第一步应该是用最后一个已知的值替换缺失值。我们选择首先这样做的原因是其他特征会变得更容易创建。
例如,如果我们将其留作缺失并尝试计算滚动平均值,那么平均值将被错误计算(它会忽略缺失值,仅计算非缺失值的平均值)。
过去 4 小时的平均温度(有缺失值)
(null + 85 + null + null) / 1 = 85
过去 4 小时的平均温度(替换后)
(84 + 85 + 85 + 85) / 4 = 84.75
在 Python 中,我们会从 前向填充 开始。然而,在 SQL 中这样做意味着我们可以利用我们数据仓库的强大功能。
在 SQL 中,我们使用 LAST_VALUE
。有关更多深入解释,请参阅 这篇文章。
这里是语法:
SELECT
MACHINE_ID,
OBSERVATION_DATETIME,
LAST_VALUE(
CASING_TEMPERATURE_F ignore NULLS
) OVER (
PARTITION BY MACHINE_ID
ORDER BY
OBSERVATION_DATETIME ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW
) AS LATEST_CASING_TEMPERATURE_F,
LAST_VALUE(
BEARING_TEMPERATURE_F ignore NULLS
) OVER (
PARTITION BY MACHINE_ID
ORDER BY
OBSERVATION_DATETIME ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW
) AS LATEST_BEARING_TEMPERATURE_F,
LAST_VALUE(FLYWHEEL_RPM ignore NULLS) OVER (
PARTITION BY MACHINE_ID
ORDER BY
OBSERVATION_DATETIME ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW
) AS LATEST_FLYWHEEL_RPM,
--8<-- snip --8<--
FROM
hourly_machine_data
用 LAST_VALUE 替换缺失值后的结果
就这样!
希望我能为 LAST_VALUE
及其表亲 FIRST_VALUE
提供一些启示,它们是较不为人知的 SQL 窗口函数。
Josh Berry (@Twitter) 领导了 Rasgo 的客户数据科学团队,并自 2008 年以来一直从事数据和分析行业。Josh 在 Comcast 工作了 10 年,期间他建立了数据科学团队,并且是内部开发的 Comcast 特征库的关键负责人——这是市场上第一个特征库之一。在 Comcast 之后,Josh 在 DataRobot 构建客户数据科学团队中发挥了关键作用。在业余时间,Josh 对棒球、F1 赛车、住房市场预测等有趣的主题进行复杂分析。
原文。已获许可转载。