這篇文章是 加速數(shù)據(jù)分析系列文章的一部分:
Accelerated Data Analytics: Faster Time Series Analysis with RAPIDS cuDF 帶您完成使用 RAPID cuDF 處理時(shí)間序列數(shù)據(jù)的常見步驟。
本帖 討論了 pandas 庫如何在 Python 中提供高效、富有表現(xiàn)力的函數(shù)。
氣候建模、醫(yī)療保健、金融和零售業(yè)的數(shù)字進(jìn)步正在產(chǎn)生前所未有的數(shù)據(jù)量和類型。 IDC 表示,到 2025 年,將有 180 ZB 的數(shù)據(jù),而 2020 年為 64 ZB ,這將擴(kuò)大對數(shù)據(jù)分析的需求,將所有數(shù)據(jù)轉(zhuǎn)化為見解。
每天兩次的衛(wèi)星圖像為 空氣質(zhì)量 、 淹水 和 太陽耀斑建模提供信息,以幫助識別自然風(fēng)險(xiǎn)。
Advanced 基因組學(xué) 和 基因測序提供了用見解編碼的遺傳數(shù)據(jù)池,可以使我們更接近癌癥的治愈。
數(shù)字購買 和網(wǎng)絡(luò)系統(tǒng)正在產(chǎn)生數(shù) TB 的市場和 行為 數(shù)據(jù)。
NVIDIA 提供 RAPIDS 開源軟件庫和 API 套件,使數(shù)據(jù)科學(xué)家能夠完全在 GPU 上執(zhí)行端到端的數(shù)據(jù)科學(xué)和分析管道。這包括使用我們的 DataFrame API : RAPIDS cuDF 進(jìn)行分析和數(shù)據(jù)科學(xué)的常見數(shù)據(jù)準(zhǔn)備任務(wù)。
在典型的數(shù)據(jù)分析工作流程中,速度高達(dá) 40 倍,加速的數(shù)據(jù)分析為您節(jié)省了時(shí)間,并增加了可能受到當(dāng)前分析工具限制的迭代機(jī)會。
為了解釋加速數(shù)據(jù)分析的價(jià)值,我們在本文中使用 RAPIDS cuDF 進(jìn)行了一個(gè)簡單的探索性數(shù)據(jù)分析( EDA )教程。
如果您現(xiàn)在使用 Spark 3.0 來處理大型數(shù)據(jù)集,請參閱 RAPIDS accelerator for Spark 。如果您現(xiàn)在已經(jīng)準(zhǔn)備好開始使用 RAPIDS ,請參閱 Step-by-Step Guide to Building a Machine Learning Application with RAPIDS 。
為什么 RAPIDS cuDF 適用于 EDA ?
如今,大多數(shù)數(shù)據(jù)科學(xué)家使用 pandas ,這是在 Python 之上構(gòu)建的 popular 開源軟件庫,專門用于 EDA 任務(wù)的數(shù)據(jù)操作和分析。它的 flexible and expressive data structures 旨在使處理關(guān)系數(shù)據(jù)或標(biāo)記數(shù)據(jù)變得簡單直觀,尤其是對于 EDA 等開放式工作流。
然而, pandas 被設(shè)計(jì)為在單核上運(yùn)行,當(dāng)數(shù)據(jù)大小達(dá)到 1-2GB 時(shí),速度會開始減慢,這限制了它的適用性。如果數(shù)據(jù)大小超過 10-20 GB 的范圍,則應(yīng)考慮使用 Dask 和 Apache Spark 等分布式計(jì)算工具。缺點(diǎn)是它們需要重寫代碼,這可能會成為采用的障礙。
對于 2-10 GB 的中間值, RAPIDS cuDF 是 Goldilocks 的解決方案。
RAPIDS cuDF 將計(jì)算并行到 GPU 中的多個(gè)核心,并抽象為類似 pandas 的API。 cuDF 的功能模仿了 pandas 中許多最流行和標(biāo)準(zhǔn)的操作,[ZBK9的運(yùn)行方式與[ZBK5類似,但速度更快。將 RAPIDS 視為當(dāng)前 pandas 工作負(fù)載的渦輪增壓按鈕。
帶有 RAPIDS cuDF 的 EDA
這篇文章展示了 cuDF 在采用 EDA 方法時(shí)是多么容易。
根據(jù)本文所述的操作,與 pandas 相比,我們觀察到使用 cuDF 時(shí)的操作速度提高了 15 倍。這種適度的收益可以幫助您在處理多個(gè)項(xiàng)目時(shí)節(jié)省時(shí)間。
有關(guān)進(jìn)行時(shí)間序列分析的更多信息,請參閱 Exploratory Data Analysis Using cuDF GitHub 存儲庫中的完整筆記本 Exploratory Data Analysis Using cuDF 和 RAPIDS 。在整個(gè)工作流程中,觀察到的加速速度增加到了 15 倍。
數(shù)據(jù)集
Meteonet 是一個(gè)天氣數(shù)據(jù)集,匯集了 2016-2018 年巴黎各地氣象站的讀數(shù)。這是一個(gè)真實(shí)的數(shù)據(jù)集,有缺失和無效的數(shù)據(jù)。
分析方法
對于這篇文章,假設(shè)你是一名數(shù)據(jù)科學(xué)家,閱讀這些匯總數(shù)據(jù)并評估其質(zhì)量。用例是開放式的;這些讀數(shù)可以用于報(bào)告、天氣預(yù)報(bào)或土木工程用例。
通過以下步驟構(gòu)建您的分析以將數(shù)據(jù)置于情境中:
了解變量。
識別數(shù)據(jù)集中的差距。
分析變量之間的關(guān)系。
步驟 1. 了解變量
首先,導(dǎo)入 cuDF 庫并讀取數(shù)據(jù)集。要下載并創(chuàng)建 NW.csv ,其中包含西北站 2016 年、 2017 年和 2018 年的數(shù)據(jù),請參閱 Exploratory Data Analysis Using cuDF 筆記本。
# Import cuDF and CuPy import cudf import cupy as cp # Read in the data files into DataFrame placeholders gdf_2016 = cudf.read_csv('./NW.csv')
查看數(shù)據(jù)集并了解您正在使用的變量。這有助于您了解 DataFrame 中數(shù)據(jù)的維度和類型。整個(gè)語法與 pandas 有相似之處。
使用. info 命令查看整個(gè) DataFrame 結(jié)構(gòu),該命令與 pandas 中的命令相同:
GS_cudf.info() RangeIndex: 22034571 entries, 0 to 22034570 Data columns (total 12 columns): # Column Dtype --- ------ ----- 0 number_sta int64 1 lat float64 2 lon float64 3 height_sta float64 4 date datetime64[ns] 5 dd float64 6 ff float64 7 precip float64 8 hu float64 9 td float64 10 t float64 object dtypes: datetime64[ns](1), float64(9), int64(1), object(1) memory usage: 6.5+ GB
從輸出中,觀察到了 12 個(gè)變量,您可以看到它們的標(biāo)題。
要進(jìn)一步了解數(shù)據(jù),請確定 DataFrame 的整體形狀:逐行逐列。
# Checking the DataFrame dimensions. Millions of rows by 12 columns. GS_cudf.shape (65826837, 12)
在這一點(diǎn)上,數(shù)據(jù)集的維度是已知的,但每個(gè)變量的數(shù)據(jù)范圍是未知的。由于有 65826837 行,您無法一次可視化整個(gè)數(shù)據(jù)集。
相反,查看 DataFrame 的前五行,以檢查耗材樣本中的變量輸入:
# Display the first five rows of the DataFrame to examine details GS_cudf.head()
number_sta | lat | lon | height_sta | date | dd | ff | precip | hu | td | t | psl | |
0 | 14066001 | 49.33 | -0.43 | 2.0 | 2016-01-01 | 210.0 | 4.4 | 0.0 | 91.0 | 278.45 | 279.85 | |
1 | 14126001 | 49.15 | 0.04 | 125.0 | 2016-01-01 | 0.0 | 99.0 | 278.35 | 278.45 | |||
2 | 14137001 | 49.18 | -0.46 | 67.0 | 2016-01-01 | 220.0 | 0.6 | 0.0 | 92.0 | 276.45 | 277.65 | 102360.0 |
3 | 14216001 | 48.93 | -0.15 | 155.0 | 2016-01-01 | 220.0 | 1.9 | 0.0 | 95.0 | 278.25 | 278.95 | |
4 | 14296001 | 48.80 | -1.03 | 339.0 | 2016-01-01 | 0.0 | 278.35 |
表 1 。輸出結(jié)果
現(xiàn)在,您可以了解每一行包含的內(nèi)容。有多少數(shù)據(jù)來源?看看收集所有這些數(shù)據(jù)的臺站數(shù)量:
# How many weather stations are covered in this dataset? # Call nunique() to count the distinct elements along a specified axis. number_stations = GS_cudf['number_sta'].nunique() print("The full dataset is composed of {} unique weather stations.".format(GS_cudf['number_sta'].nunique()))
完整的數(shù)據(jù)集由 287 個(gè)獨(dú)特的氣象站組成。這些電臺多久更新一次數(shù)據(jù)?
## Investigate the frequency of one specific station's data ## date column is datetime dtype, and the diff() function calculates the delta time ## TimedeltaProperties.seconds can help get the delta seconds between each record, divide by 60 seconds to see the minutes difference. delta_mins = GS_cudf['date'].diff().dt.seconds.max()/60 print(f"The data is recorded every {delta_mins} minutes")
每 6.0 分鐘記錄一次數(shù)據(jù)。氣象站每小時(shí)產(chǎn)生 10 個(gè)記錄。
現(xiàn)在,您了解了以下數(shù)據(jù)特征:
數(shù)據(jù)類型
數(shù)據(jù)集的維度
獲取數(shù)據(jù)集的來源數(shù)量
數(shù)據(jù)集更新頻率
然而,您仍然必須探究這些數(shù)據(jù)是否存在重大缺口,無論是數(shù)據(jù)輸入缺失還是無效。這些問題會影響這些數(shù)據(jù)是否可以單獨(dú)用作可靠的來源。
步驟 2. 確定差距
這些氣象站有多個(gè)傳感器。任何一個(gè)傳感器都可能在一年中出現(xiàn)故障或提供不可靠的讀數(shù)。一些缺失的數(shù)據(jù)是可以接受的,但如果監(jiān)測站過于頻繁地關(guān)閉,這些數(shù)據(jù)可能會歪曲全年的真實(shí)情況。
要了解此數(shù)據(jù)源的可靠性,請分析數(shù)據(jù)丟失率和無效輸入的數(shù)量。
要評估數(shù)據(jù)丟失率,請將讀數(shù)數(shù)量與預(yù)期讀數(shù)數(shù)量進(jìn)行比較。
數(shù)據(jù)集包括 271 個(gè)獨(dú)特的站點(diǎn),每小時(shí)輸入 10 條記錄(每 6 分鐘輸入一條)。假設(shè)傳感器沒有停機(jī)時(shí)間,預(yù)計(jì)記錄的數(shù)據(jù)條目數(shù)量為 271 x 10 x 24 x 365 = 23739600 。但是,正如前面從. shape 操作中觀察到的那樣,您只有 22034571 行數(shù)據(jù)。
# Theoretical number of records is... theoretical_nb_records = number_stations * (60 / delta_mins) * 365 * 24 actual_nb_of_rows = GS_cudf.shape[0] missing_record_ratio = 1 - (actual_nb_of_rows/theoretical_nb_records) print("Percentage of missing records of the NW dataset is: {:.1f}%".format(missing_record_ratio * 100)) print("Theoretical total number of values in dataset is: {:d}".format(int(theoretical_nb_records))) Percentage of missing records of the NW dataset is: 12.7%
當(dāng)對全年進(jìn)行上下文分析時(shí), 12.7% 表示每年約有 19.8 周的數(shù)據(jù)缺失。
你知道,在 36 個(gè)月中,大約有 5 個(gè)月的數(shù)據(jù)根本沒有被記錄下來。對于其他數(shù)據(jù)點(diǎn),您有一些缺失的數(shù)據(jù),其中記錄了一些變量,但沒有記錄其他變量。您在查看數(shù)據(jù)集的前五行時(shí)看到了這一點(diǎn),其中包含 NA 。
要了解你有多少 NA 數(shù)據(jù),首先要確定哪些變量有 NA 讀數(shù)。評估每個(gè)類別有多少無效讀數(shù)。在這部分分析中,將數(shù)據(jù)集縮減為僅考慮 2018 年的數(shù)據(jù)。
# Finding which items have NA value(s) during year 2018 NA_sum = GS_cudf[GS_cudf['date'].dt.year==2018].isna().sum() NA_data = NA_sum[NA_sum>0] NA_data.index StringIndex(['dd' 'ff' 'precip' 'hu' 'td' 't' 'psl'], dtype='object') NA_data dd 8605703 ff 8598613 precip 1279127 hu 8783452 td 8786154 t 2893694 psl 17621180 dtype: int64
您可以看到 PSL (海平面壓力)的缺失讀數(shù)數(shù)量最多。大約 80% 的總讀數(shù)沒有被記錄。在低端,降水有約 6% 的無效讀數(shù),這表明傳感器是穩(wěn)健的。
這兩個(gè)指標(biāo)有助于您了解數(shù)據(jù)集中存在的差距以及在分析過程中需要依賴哪些參數(shù)。有關(guān)數(shù)據(jù)有效性每月變化的綜合分析,請參閱筆記本。
現(xiàn)在你已經(jīng)很好地掌握了數(shù)據(jù)的樣子及其差距,你可以看看可能影響統(tǒng)計(jì)分析的變量之間的關(guān)系。
步驟 3. 分析變量之間的關(guān)系
所有 ML 應(yīng)用程序都依賴于統(tǒng)計(jì)建模以及許多分析應(yīng)用程序。對于任何用例,都要注意高度相關(guān)的變量,因?yàn)樗鼈兛赡軙でY(jié)果。
對于這篇文章來說,分析氣象類別的讀數(shù)是最相關(guān)的。為整個(gè) 3 年數(shù)據(jù)集生成一個(gè)相關(guān)矩陣,以評估需要注意的任何依賴關(guān)系。
# Only analyze meteorological columns Meteo_series = ['dd', 'ff', 'precip' ,'hu', 'td', 't', 'psl'] Meteo_df = cudf.DataFrame(GS_cudf,columns=Meteo_series) Meteo_corr = Meteo_df.dropna().corr() # Check the items with correlation value > 0.7 Meteo_corr[Meteo_corr>0.7]
dd | ff | precip | hu | td | t | psl | |
dd | 1.0 | ||||||
ff | 1.0 | ||||||
precip | 1.0 | ||||||
hu | 1.0 | ||||||
td | 1.0 | 0.840558357 | |||||
t | 0.840558357 | 1.0 | |||||
psl |
表 2 。輸出結(jié)果
在矩陣中,td(露點(diǎn))和t(溫度)之間存在顯著的相關(guān)性。如果您正在使用任何假設(shè)變量是獨(dú)立的未來算法,如 linear regression ,請考慮這一點(diǎn)。你可以回到無效數(shù)據(jù)分析,看看其中一個(gè)是否比另一個(gè)有更多的缺失讀數(shù)作為選擇的指標(biāo)。
經(jīng)過基本的探索,您現(xiàn)在了解了數(shù)據(jù)的維度和變量,并查看了變量相關(guān)矩陣。還有更多的 EDA 技術(shù),但本文中的方法是通用的,有一組任何數(shù)據(jù)科學(xué)家都熟悉的典型起點(diǎn)。正如您在整個(gè)教程中看到的那樣, cuDF 與 pandas 語法幾乎相同。
EDA 基準(zhǔn) RAPIDS cuDF
如前所述,這篇文章是完整筆記本中完整工作流程的簡化演練。在這篇文章中,我們觀察到了 9.55 倍的加速。這些結(jié)果是在 NVIDIA A6000 GPU 上實(shí)現(xiàn)的。
圖 1 ??碧綌?shù)據(jù)分析的基準(zhǔn)結(jié)果 秒
表 3 顯示了一個(gè)性能比較,包括本帖和完整筆記本的結(jié)果。
Full Notebook (15x speed-up) | Pandas on CPU (Intel Core i7-7800X CPU) |
user 1 min 15 sec sys: 14.3 sec total: 1 min 30 sec |
RAPIDS cuDF on NVIDIA A6000 |
user 3.92 sec sys: 2.03 sec total: 5.95 sec |
表 3 。在 NVIDIA RTX A6000 GPU 上使用 RAPID cuDF 執(zhí)行的 EDA 實(shí)現(xiàn)了 15 倍的加速
主要收獲
來自真實(shí)來源的真實(shí)數(shù)據(jù)存在差距、信息缺失和相關(guān)性,在對其進(jìn)行建模以發(fā)展見解之前,必須解決這些問題。
通過觀察到的 15 倍的加速,您可以推斷出為更長、更復(fù)雜的工作負(fù)載節(jié)省的時(shí)間。如果運(yùn)行 EDA 步驟需要 1 小時(shí),那么您可以在 4 分鐘內(nèi)完成這項(xiàng)工作。這讓您有 56 分鐘的時(shí)間來解決數(shù)據(jù)中不可預(yù)見的問題,完成數(shù)據(jù)處理,向該集合中再添加一年的數(shù)據(jù)以最大限度地減少差距,并開始設(shè)計(jì)數(shù)據(jù)集以適應(yīng)您的用例。最棒的是,你可以重新控制自己的時(shí)間。
-
NVIDIA
+關(guān)注
關(guān)注
14文章
4856瀏覽量
102713 -
AI
+關(guān)注
關(guān)注
87文章
29824瀏覽量
268116 -
數(shù)據(jù)分析
+關(guān)注
關(guān)注
2文章
1413瀏覽量
33987
發(fā)布評論請先 登錄
相關(guān)推薦
評論