加速数据分析:使用 RAPID cuDF 进行更快的时间序列分析

这篇文章最初发表在 NVIDIA 技术博客上。

这篇文章是 加速数据分析系列文章的一部分:

由于标准探索性数据分析( EDA )工作流程通常局限于单个核心,因此它得益于 RAPIDS cuDF 的加速计算,这是一个具有 pandas 类接口的加速数据分析库。众所周知,时间序列数据需要额外的数据处理,这会增加工作流程的时间和复杂性,使其成为利用 RAPIDS 的另一个很好的用例。

使用 RAPIDS cuDF ,您可以加快对不太大也不太小的"金发姑娘"数据集的时间序列处理。这些数据集在 pandas 上很繁重,但不需要像 Apache SparkDask 这样的完全分布式计算工具。

什么是时间序列数据?

本节介绍了依赖时间序列数据的 机器学习 ( ML )用例,以及何时考虑加速数据处理。

时间序列数据无处不在。时间戳在许多类型的数据源中都是一个变量,从天气测量和资产定价到产品购买信息等等。

时间戳具有所有级别的粒度,例如毫秒读数或月读数。当时间戳数据最终被用于复杂建模时,它就变成了时间序列数据,对其他变量进行索引,使模式变得可观察。

以下流行的 ML 用例在很大程度上依赖于时间序列数据,还有更多的依赖:

  • 金融服务业欺诈异常检测
  • 零售业的预测分析
  • 用于天气预报的传感器读数
  • 内容建议推荐系统

复杂的建模用例通常需要处理具有高分辨率历史数据的大型数据集,这些数据可能跨越数年至数十年,还需要处理实时流数据。时间序列数据需要经过转换,例如向上和向下重新采样数据,以使数据集之间的时间段一致,并被平滑到滚动窗口中,以消除模式噪声。

pandas 提供了简单、富有表现力的功能来管理这些操作,但您可能在自己的工作中观察到,单线程设计很快就会被所需的处理量所淹没。这尤其适用于需要快速数据处理周转的大型数据集或用例,而时间序列分析用例通常会这样做。 pandas 处理数据的后续等待时间可能会令人沮丧,并可能导致见解延迟。

因此,这些场景使 cuDF 非常适合时间序列数据分析。使用类似 pandas 的 API ,您可以以高达 40 倍的速度处理数十 GB 的数据,从而节省任何数据项目中最有价值的资产:您的时间。

RAPIDS cuDF 的时间序列

为了展示 RAPIDS cuDF 加速探索数据的好处,以及它是如何被轻易采用的,本文介绍了 Time Series Data Analysis 中的一个子集时间序列处理操作。这是一个强大的笔记本分析,对 RAPIDS GitHub 存储库中公开的真实天气读数数据集进行了分析。

在完整的分析中, RAPIDS cuDF 以 13 倍的加速执行(有关确切数字,请参阅本文后面的基准测试部分)。加速通常会随着整个工作流程变得更加复杂而增加。

从现实世界中推断,这种收益具有真正的影响。当一个小时的工作量可以在 5 分钟内完成时,你就可以有意义地为一天增加时间。

数据集

Meteonet 是一个现实的天气数据集,它汇集了 2016-2018 年巴黎各地气象站的读数,包括缺失和无效的数据。它的大小约为 12.5 GB 。

分析方法

对于这篇文章,假设你是一名数据科学家,第一次收到这些汇总数据,必须为气象用例做好准备。具体的用例是开放式的:它可以是气候模型中的预测、报告或输入。

当你回顾这篇文章时,大多数功能应该都很熟悉,因为它们的设计类似于 pandas 中的操作。此分析旨在执行以下任务:

  • 格式化数据帧。
  • 重新对时间序列进行采样。
  • 运行滚动窗口分析。

这篇文章忽略了笔记本 Time Series Data Analysis Using cuDF . 中演示的端到端工作流程中解决的几个数据不一致

步骤 1. 格式化数据帧

首先,使用以下命令导入此分析中使用的包:

python 复制代码
# Import the necessary packages
import cudf
import cupy as cp
import pandas as pd

接下来,读取 CSV 数据。

ini 复制代码
## Read in data
gdf = cudf.read_csv('./SE_data.csv')

首先关注感兴趣的气象参数:风速、温度和湿度。

css 复制代码
gdf = gdf.drop(columns=['dd','precip','td','psl'])

隔离感兴趣的参数后,执行一系列快速检查。通过将日期列转换为日期时间数据类型来启动第一次转换。然后,打印出前五行,以可视化您正在处理的内容,并评估表格数据集的大小。

bash 复制代码
# Change the date column to the datetime data type. Look at the DataFrame info
gdf['date'] = cudf.to_datetime(gdf['date'])
gdf.head()
Gdf.shape
number_sta lat lon height_sta date ff hu t
0 1027003 45.83 5.11 196.0 2016-01-01 98.0 279.05
1 1033002 46.09 5.81 350.0 2016-01-01 0.0 99.0 278.35
2 1034004 45.77 5.69 330.0 2016-01-01 0.0 100.0 279.15
3 1072001 46.20 5.29 260.0 2016-01-01 276.55
4 1089001 45.98 5.33 252.0 2016-01-01 0.0 95.0 279.55

表 1 。显示数据集前五行的输出结果

输出

DataFrame 形状( 127515796 , 8 )显示 12751579 六行乘八列。现在已经知道了数据集的大小和形状,您可以开始更深入地研究数据采样的频率。

python 复制代码
## Investigate the sampling frequency with the diff() function to calculate the time diff
## dt.seconds, which is used to find the seconds value in the datetime frame. Then apply the 
## max() function to calculate the maximum date value of the series.
delta_mins = gdf['date'].diff().dt.seconds.max()/60
print(f"The dataset collection covers from {gdf['date'].min()} to {gdf['date'].max()} with {delta_mins} minute sampling interval")

数据集涵盖了从2016-01-01T00:00:00.0000000002018-12-31T23:54:00.000000000的传感器读数,采样间隔为 6 分钟。确认数据集中表示了预期的日期和时间。

在完成对数据集的基本审查后,开始使用特定于时间序列的格式。首先将时间增量分隔成单独的列。

css 复制代码
gdf['year'] = gdf['date'].dt.year
gdf['month'] = gdf['date'].dt.month
gdf['day'] = gdf['date'].dt.day
gdf['hour'] = gdf['date'].dt.hour
gdf['mins'] = gdf['date'].dt.minute
gdf.tail

现在,数据在年末被分为年、月和日的列。这使得以不同的增量对数据进行切片要简单得多。

number_sta lat lon height_sta date ff hu t year month day hour mins
127515791 84086001 43.811 5.146 672.0 2018-12-31 23:54:00 3.7 85.0 276.95 2018 12 31 23 54
127515792 84087001 44.145 4.861 55.0 2018-12-31 23:54:00 11.4 80.0 281.05 2018 12 31 23 54
127515793 84094001 44.289 5.131 392.0 2018-12-31 23:54:00 3.6 68.0 280.05 2018 12 31 23 54
127515794 84107002 44.041 5.493 836.0 2018-12-31 23:54:00 0.6 91.0 270.85 2018 12 31 23 54
127515795 84150001 44.337 4.905 141.0 2018-12-31 23:54:00 6.7 84.0 280.45 2018 12 31 23 54

表 2 。以时间增量分隔为列的输出结果

通过选择要分析的特定时间范围和电台,对更新后的 DataFrame 进行实验。

ini 复制代码
# Use the cupy.logical_and(...) function to select the data from a specific time range.
import pandas as pd
start_time = pd.Timestamp('2017-02-01T00')
end_time = pd.Timestamp('2018-11-01T00')
station_id = 84086001
gdf_period = gdf.loc[cp.logical_and(cp.logical_and(gdf['date']>start_time,gdf['date']<end_time),gdf['number_sta']==station_id)]
gdf_period.shape
(146039, 13)

DataFrame 已成功准备,包含 13 个变量和 146039 行。

步骤 2. 对时间序列重新采样

现在已经设置了 DataFrame ,运行一个简单的重新采样操作。尽管数据每 6 分钟更新一次,但在这种情况下,必须对数据进行整形,使其进入日常节奏。

首先将日期设置为索引,以便其余变量随时间调整。每 6 分钟对样本中的数据进行一次下采样,每天一个记录,每天为每个变量生成一个记录。保留每天每个变量的最大值作为当天的记录。

ini 复制代码
## Set "date" as the index. See what that does?
gdf_period.set_index("date", inplace=True)
## Now, resample by daylong intervals and check the max data during the resampled period. 
## Use .reset_index() to reset the index instead of date.
gdf_day_max = gdf_period.resample('D').max().bfill().reset_index()
gdf_day_max.head()

数据现在以每日增量提供。请参阅该表以检查操作是否产生了所需的结果。

date number_sta lat lon height_sta ff hu t year month day hour mins
0 2017-02-01 84086001 43.81 5.15 672.0 8.1 98.0 283.05 2017 2 1 23 54
1 2017-02-02 84086001 43.81 5.15 672.0 14.1 98.0 283.85 2017 2 2 23 54
2 2017-02-03 84086001 43.81 5.15 672.0 10.1 99.0 281.45 2017 2 3 23 54
3 2017-02-04 84086001 43.81 5.15 672.0 12.5 99.0 284.35 2017 2 4 23 54
4 2017-02-05 84086001 43.81 5.15 672.0 7.3 99.0 280.75 2017 2 5 23 54

表 3 。下采样数据集的前五行的输出

步骤 3. 运行滚动窗口分析

在上一个重新采样示例中,点是基于时间进行采样的。但是,也可以使用滚动窗口根据频率平滑数据。

在下面的示例中,在数据上取一个长度为三的滚动窗口。再次,保留每个变量的最大值。

ini 复制代码
# Specify the rolling window.
gdf_3d_max = gdf_day_max.rolling('3d',min_periods=1).max()
gdf_3d_max.reset_index(inplace=True)
gdf_3d_max.head()

滚动窗口可用于对数据进行去噪,并评估数据随时间的稳定性。

date number_sta lat lon height_sta ff hu t year month day hour mins
0 2017-02-01 84086001 43.81 5.15 672.0 8.1 98.0 283.05 2017 2 1 23 54
1 2017-02-02 84086001 43.81 5.15 672.0 14.1 98.0 283.85 2017 2 2 23 54
2 2017-02-03 84086001 43.81 5.15 672.0 14.1 99.0 283.85 2017 2 3 23 54
3 2017-02-04 84086001 43.81 5.15 672.0 14.1 99.0 283.35 2017 2 4 23 54
4 2017-02-05 84086001 43.81 5.15 672.0 12.5 99.0 283.35 2017 2 5 23 54

体积x117

这篇文章向您介绍了时间序列数据处理的常见步骤。虽然以天气数据集为例,但这些步骤适用于所有形式的时间序列数据。该过程与您现在的时间序列分析代码类似。

性能加速

当使用 Meteonet 天气数据集运行完整的笔记本电脑时,我们使用 RAPIDS 23.02 在 NVIDIA RTX A6000 GPU 上实现了 13 倍的加速(图 1 )。

[体积x118]

Pandas on CPU (Intel Core i7-7800X CPU) User: 2 min 32 secSys: 27.3 secTotal: 3 min
RAPIDS cuDF on NVIDIA A6000 GPUs User: 5.33 secSys: 8.67 secTotal: 14 sec

表 5 。性能比较显示完整笔记本电脑的 12.8 倍加速效果

主要收获

时间序列分析是分析的核心部分,与其他变量相比,它需要额外的处理。使用 RAPIDS cuDF ,您可以更快地管理处理步骤,并使用您习惯的 pandas 功能缩短洞察时间。

要进一步研究时间序列分析中的 cuDF ,请参阅 GitHub 上的 rapidsai-community/notebooks-contrib 。要在 EDA 应用程序中重新访问 cuDF ,请参阅 Accelerated Data Analytics: Speed Up Data Exploration with RAPIDS cuDF

Register for NVIDIA GTC 2023 for free ,并于 3 月 20-23 日加入我们的相关 data science sessions

鸣谢

彭美然、 David Taubenheim 、 Sheng Luo 和 Jay Rodge 对此帖子做出了贡献。

阅读原文

相关推荐
放羊郎4 天前
配置Nvidia JETSON AGX Xavier
nvidia·虚拟机·jetson·刷机·重装系统·xavier
free-xx10 天前
AGX Orin平台RTC驱动导致reboot系统卡住问题调试
nvidia·jetson·orin
AndrewHZ18 天前
【三维渲染技术讨论】Blender输出的三维文件里的透明贴图在Isaac Sim里会丢失, 是什么原因?
算法·3d·blender·nvidia·贴图·具身智能·isaac sim
荔枝吻21 天前
【沉浸式解决问题】NVIDIA 显示设置不可用。 您当前未使用连接到NVIDIA GPU 的显示器。
nvidia·英伟达
算家计算22 天前
算力暴增!英伟达发布新一代机器人超级计算机,巨量算力驱动物理AI革命
人工智能·云计算·nvidia
可期不折腾23 天前
NVIDIA Nsight Systems性能分析工具
ubuntu·nvidia·nsight systems·性能分析工具
量子位1 个月前
黄仁勋子女成长路径曝光:一个学烘焙一个开酒吧,从基层做到英伟达高管
ai编程·nvidia
Ray Song1 个月前
CUDA杂记--nvcc使用介绍
nvidia·cuda·nvcc
吾鳴1 个月前
网信办约谈英伟达,H20芯片后门风波震动中国AI产业
人工智能·nvidia·芯片
mpr0xy2 个月前
编译支持cuda硬件加速的ffmpeg
ai·ffmpeg·nvidia·cuda