全文共 5270 字,預(yù)計(jì)學(xué)習(xí)時(shí)長 11 分鐘或更長
圖片來源:pexels.com/@divinetechygirl
從文明之初到2003年,只創(chuàng)造了5艾字節(jié)的信息,但是現(xiàn)在每兩天就有如此之多的信息產(chǎn)生。
埃里克·施密特(Eric Schmidt)
如果你是R使用者,可能你已經(jīng)使用過data.table程序包。Data.table是R中數(shù)據(jù)幀程序包的延伸。涉及大型數(shù)據(jù)(包括RAM中1的10GB)快速集合時(shí),該數(shù)據(jù)包也是R使用者的首選程序包。
R的data.table程序包使用簡易方便,非常通用且擁有高性能。在R領(lǐng)域,此包十分出名,其每月下載量超過了4萬,幾乎650 CRAN(新型無線接入網(wǎng)構(gòu)架)及Bioconductor包使用這個(gè)datatable包。
所以,Python使用者可以從中得到什么?好消息是Python中也有與data.table等同的程序包,稱為datatable,其明確注重大數(shù)據(jù)支持、高性能、內(nèi)存外存數(shù)據(jù)集以及多線程算法。某種程度上來說,這個(gè)也可以稱為data.table的年輕同胞。
Datatable
?
現(xiàn)代機(jī)器學(xué)習(xí)應(yīng)用需要處理巨大數(shù)量的數(shù)據(jù)并生成多個(gè)功能。為了構(gòu)建更精確的模型,這是必需的。Python的datatable模塊正是為了應(yīng)對(duì)這種類問題而創(chuàng)建的。這就相當(dāng)于是一個(gè)在單節(jié)機(jī)器上以盡可能最大的速度運(yùn)行大數(shù)據(jù)(達(dá)100GB)的工具包。datatable由H2O.ai 出資開發(fā),其首個(gè)使用者是 Driverless.ai。
此工具箱與panda非常相似,但更側(cè)重于速度和大數(shù)據(jù)支持。
Pythondatatable也力求用戶良好體驗(yàn),反饋錯(cuò)誤信息,擁有強(qiáng)大的API(應(yīng)用程序編程接口)。通過本文,可以了解如何使用此datatable以及其用于大數(shù)據(jù)時(shí)是如何優(yōu)于pandas的。
安裝
在MacOs中,datatable可簡單地利用pip進(jìn)行安裝:
pip install datatable
在Linux中,利用二進(jìn)制發(fā)行版,就可以實(shí)現(xiàn)安裝,如下所示:
# If you have Python 3.5
pip install https://s3.amazonaws.com/h2o-
release/datatable/stable/datatable-
0.8.0/datatable-0.8.0-cp35-cp35m-
linux_x86_64.whl
目前,datatable還未能運(yùn)用于Windows,但是其也正在實(shí)現(xiàn)對(duì)Windows的支持。
Github Repository傳送門:https://github.com/parulnith/An-Overview-of-Python-s-Datatable-package
讀取數(shù)據(jù)
使用的數(shù)據(jù)集來自于Kaggle網(wǎng),屬于Lending Club Loan DataDataset。此數(shù)據(jù)集是2007——2015年所有發(fā)布的貸款信息中完整的貸款數(shù)據(jù),包括當(dāng)前貸款狀況(當(dāng)前、滯后、全部付清等)以及最想念付款信息。此文件包含226萬行,145列。數(shù)據(jù)規(guī)模是datatable庫性能的最理想說明。
# Importing necessary Libraries
import numpy as npimport pandas as pdimport datatable as dt
將數(shù)據(jù)加載到Frame對(duì)象中。datatable的基本分析單元就是一個(gè)Frame,這和pandas 的DataFrame 或 SQL 表是相同的概念:數(shù)據(jù)排列成具有行和列的二維數(shù)組。
利用datatable
%%timedatatable_df = dt.fread("data.csv")
__________________________________CPU
times: user 30 s, sys: 3.39 s, total: 33.4 s
Wall time: 23.6 s
?
上述fread() 函數(shù)不僅功能強(qiáng)大,而且速度極快。其可自動(dòng)刪除和分析絕大多數(shù)文本文件、.zip壓縮文檔中的下載數(shù)據(jù)或URLs、讀取Excel文件以及其他文件。
不僅如此,datatable分析程序還有以下功能:
· 可以自動(dòng)刪除分隔符、頁眉、列類型以及引號(hào)規(guī)則等。
· 可以多源讀取數(shù)據(jù),包括包括文件、URL、shell、原始文本、存檔和glob。
· 極速多線程文件讀取。
· 顯示讀取文件的進(jìn)度條。
· 可以讀取 RFC4180相容型及非相容型文件。(傳送門:https://tools.ietf.org/html/rfc4180)
利用pandas
現(xiàn)在,計(jì)算一下利用pandas來讀取相同文件所用的時(shí)間。
%%time
pandas_df= pd.read_csv("data.csv")
__________________________________
CPU times: user 47.5 s, sys: 12.1 s, total: 59.6
sWall time: 1min 4s
?
結(jié)果顯示,datatable在讀取大數(shù)據(jù)集時(shí)優(yōu)于pandas。因?yàn)槎糹相同數(shù)據(jù)時(shí),pandas讀取時(shí)間超過了一分鐘,而datatable則只使用了數(shù)秒。
Frame轉(zhuǎn)換
現(xiàn)有的Frame還可以如下所示轉(zhuǎn)化為numpy或dateframe。
numpy_df = datatable_df.to_numpy()
pandas_df = datatable_df.to_pandas()
?
現(xiàn)在將現(xiàn)有frame轉(zhuǎn)化為pandas的dataframe對(duì)象那個(gè),對(duì)比所用時(shí)間。
%%time
datatable_pandas = datatable_df.to_pandas()
__________________________________
CPU times: user 17.1 s, sys: 4 s, total: 21.1
sWall time: 21.4 s
?
看來將文件讀取為datatable框架,然后將其轉(zhuǎn)換為panda的dataframe所需的時(shí)間比直接利用pandas的dataframe讀取文件所需的時(shí)間要少。所以,通過datatable導(dǎo)入一個(gè)大數(shù)據(jù)文件,然后將其轉(zhuǎn)換為panda的dataframe,這似乎是一個(gè)好主意。
type(datatable_pandas)
__________________________________
pandas.core.frame.DataFrame
?
基礎(chǔ)Frame屬性
一起來看看與pandas性能相似的datatable fame的基礎(chǔ)性能。
?
print(datatable_df.shape)
# (nrows, ncols)print(datatable_df.names[:5])
# top 5 column namesprint(datatable_df.stypes[:5])
# column types(top 5)
__________________________________
(2260668, 145)
('id', 'member_id', 'loan_amnt', 'funded_amnt',
'funded_amnt_inv')
(stype.bool8, stype.bool8, stype.int32,
stype.int32, stype.float64)
?
也可利用head 指令輸出靠前的“n”行。
datatable_df.head(10)
datatableframe中前10行略表
顏色表示數(shù)據(jù)類型。其中,紅色表示字符串,綠色表示整數(shù),藍(lán)色則代表浮動(dòng)。
匯總統(tǒng)計(jì)信息
在panda中計(jì)算匯總統(tǒng)計(jì)信息是一個(gè)消耗內(nèi)存的過程,但在datatable中就不是如此了。下面每列匯總信息均可通過datatable來計(jì)算:
datatable_df.sum()
datatable_df.nunique()datatable_df.sd()
datatable_df.max()datatable_df.mode()
datatable_df.min()datatable_df.nmodal()
datatable_df.mean()
利用datatable和pandas來計(jì)算平均值,測(cè)量各所需計(jì)算時(shí)間之間的差異。
利用datatable
%%timedatatable_df.mean()
__________________________________
CPU times: user 5.11 s, sys: 51.8 ms, total: 5.16 sWall time: 1.43 s
?
利用pandas
pandas_df.mean()
__________________________________
Throws memory error.
?
上述指令在pandas中未能實(shí)現(xiàn),因?yàn)槠湓陂_始就顯示內(nèi)存錯(cuò)誤。
數(shù)據(jù)操作
像dataframe這類數(shù)據(jù)表是柱狀數(shù)據(jù)結(jié)構(gòu)。在datatable中,所有操作最基礎(chǔ)的媒介就是方括號(hào)符號(hào),即傳統(tǒng)矩陣索引,只不過其具備更多的功能。
datatable中的方括號(hào)符號(hào)
在指數(shù)矩陣、C/C++, R, pandas, numpy等數(shù)學(xué)運(yùn)算中利用相同的DT[i, j]符號(hào)。來看看如何利用datatable執(zhí)行常見的數(shù)據(jù)操作活動(dòng):
#選擇行/列子集
下列代碼從數(shù)據(jù)集中選擇所有的行及 funded_amnt列。
datatable_df[:,'funded_amnt']
?
?
這里展示了是如何選取5行及3列的。
datatable_df[:5,:3]
?
#Frame排序
利用datatable
通過datatable完成利用特定列隊(duì)frame的排序,如下所示:
%%timedatatable_df.sort('funded_amnt_inv')
__________________________________
CPU times: user 534 ms, sys: 67.9 ms,
total: 602 msWall time: 179 ms
?
利用pandas
%%timepandas_df.sort_values(by = 'funded_amnt_inv')
__________________________________
CPU times: user 8.76 s, sys: 2.87 s,
total: 11.6 sWall time: 12.4 s
?
關(guān)注datatable和pandas大量的時(shí)間差異。
#刪除行/列
這里闡述了如何刪除名為member_id的列:
del datatable_df[:, 'member_id']
?
#分組
就像在pandas中的一樣,datatable也有分組功能。來看看如何利用grade列來對(duì)funded_amount列平均值進(jìn)行分組。
利用datatable
%%timefor i in range(100):
pandas_df.groupby("grade")["funded_amnt"].
sum()__________________________________
CPU times: user 12.9 s, sys: 859 ms, total: 13.7
sWall time: 13.9 s
.f代表什么?
f代表frame proxy,提供一種簡單的方法來使用當(dāng)前操作的Frame。就例子而言,dt.f代表dt_df。
#篩選行
篩選行的句法與分組相似。對(duì)loan_amnt的這些行進(jìn)行篩選,其中,loan_amnt的值大于funded_amnt。
datatable_df[dt.f.loan_amnt>dt.f.funded_amnt,"loan_amnt"
儲(chǔ)存Frame
圖片來源:unsplash.com/@pinewatt
還可以將Frame的內(nèi)容寫入csv文件,以便將來使用
datatable_df.to_csv('output.csv')
documentation傳送門,了解更多操作功能:https://datatable.readthedocs.io/en/latest/using-datatable.html
?
結(jié)論
與默認(rèn)的Panda相比,datatable模塊無疑加快了執(zhí)行速度,這在處理大型數(shù)據(jù)集時(shí)無疑是一個(gè)優(yōu)勢(shì)所在。然而,datatable在功能方面卻落后于Panda。但是,由于仍在積極地開發(fā)datatable,將來可能會(huì)增加一些庫。
留言 點(diǎn)贊 關(guān)注
我們一起分享AI學(xué)習(xí)與發(fā)展的干貨
歡迎關(guān)注全平臺(tái)AI垂類自媒體 “讀芯術(shù)”
(添加小編微信:dxsxbb,加入讀者圈,一起討論最新鮮的人工智能科技哦~)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
