pandas分批讀取大數(shù)據(jù)集教程
如果你的電腦內(nèi)存較小那么想在本地做一些事情是很有局限性的(哭喪臉),比如想拿一個kaggle上面的競賽來練練手,你會發(fā)現(xiàn)多數(shù)訓(xùn)練數(shù)據(jù)集都是大幾G或者幾十G的,自己那小破電腦根本跑不起來。行,你有8000w條樣本你牛逼,我就取400w條出來跑跑總行了吧(狡滑臉)。
下圖是2015年kaggle上一個CTR預(yù)估比賽的數(shù)據(jù)集:
看到train了吧,原始數(shù)據(jù)集6個G,特征工程后得多大?那我就取400w出來train。為了節(jié)省時間和完整介紹分批讀入數(shù)據(jù)的功能,這里以test數(shù)據(jù)集為例演示。其實就是使用pandas讀取數(shù)據(jù)集時加入?yún)?shù)chunksize。
可以通過設(shè)置chunksize大小分批讀入,也可以設(shè)置iterator=True后通過get_chunk選取任意行。
當然將分批讀入的數(shù)據(jù)合并后就是整個數(shù)據(jù)集了。
ok了!
補充知識:用Pandas 處理大數(shù)據(jù)的3種超級方法
易上手, 文檔豐富的Pandas 已經(jīng)成為時下最火的數(shù)據(jù)處理庫。此外,Pandas數(shù)據(jù)處理能力也一流。
其實無論你使用什么庫,大量的數(shù)據(jù)處理起來往往回遇到新的挑戰(zhàn)。
數(shù)據(jù)處理時,往往會遇到?jīng)]有足夠內(nèi)存(RAM)這個硬件問題。 企業(yè)往往需要能夠存夠數(shù)百, 乃至數(shù)千 的GB 數(shù)據(jù)。
即便你的計算機恰好有足夠的內(nèi)存來存儲這些數(shù)據(jù), 但是讀取數(shù)據(jù)到硬盤依舊非常耗時。
別擔心! Pandas 數(shù)據(jù)庫會幫我們擺脫這種困境。 這篇文章包含3種方法來減少數(shù)據(jù)大小,并且加快數(shù)據(jù)讀取速度。 我用這些方法,把超過100GB 的數(shù)據(jù), 壓縮到了64GB 甚至32GB 的內(nèi)存大小。
快來看看這三個妙招吧。
數(shù)據(jù)分塊
csv 格式是一種易儲存, 易更改并且用戶易讀取的格式。 pandas 有read_csv ()方法來上傳數(shù)據(jù),存儲為CSV 格式。當遇到CSV 文件過大,導(dǎo)致內(nèi)存不足的問題該怎么辦呢?試試強大的pandas 工具吧!我們先把整個文件拆分成小塊。這里,我們把拆分的小塊稱為chunk。
一個chunk 就是我們數(shù)據(jù)的一個小組。 Chunk 的大小主要依據(jù)我們內(nèi)存的大小,自行決定。
過程如下:
1.讀取一塊數(shù)據(jù)。
2.分析數(shù)據(jù)。
3.保存該塊數(shù)據(jù)的分析結(jié)果。
4.重復(fù)1-3步驟,直到所有chunk 分析完畢。
5.把所有的chunk 合并在一起。
我們可以通過read_csv()方法Chunksize來完成上述步驟。 Chunksize是指pandas 一次能讀取到多少行csv文件。這個當然也是建立在RAM 內(nèi)存容量的基礎(chǔ)上。
假如我們認為數(shù)據(jù)呈現(xiàn)高斯分布時, 我們可以在一個chunk 上, 進行數(shù)據(jù)處理和視覺化, 這樣會提高準確率。
當數(shù)據(jù)稍微復(fù)雜時, 例如呈現(xiàn)泊松分布時, 我們最好能一塊塊篩選,然后把每一小塊整合在一起。 然后再進行分析。很多時候, 我們往往刪除太多的不相關(guān)列,或者刪除有值行。 我們可以在每個chunk 上,刪除不相關(guān)數(shù)據(jù), 然后再把數(shù)據(jù)整合在一起,最后再進行數(shù)據(jù)分析。
代碼如下:
刪除數(shù)據(jù)
有時候, 我們一眼就能看到需要分析的列。事實上, 通常名字,賬號等列,我們是不做分析的。
讀取數(shù)據(jù)前, 先跳過這些無用的列,可以幫我們節(jié)省很多內(nèi)存。 Pandas 可以允許我們選擇想要讀取的列。
把包含無用信息的列刪除掉, 往往給我們節(jié)省了大量內(nèi)存。
此外,我們還可以把有缺失值的行,或者是包含“NA” 的行刪除掉。 通過dropna()方法可以實現(xiàn):
有幾個非常有用的參數(shù),可以傳給dropna():
how: 可選項:“any”(該行的任意一列如果出現(xiàn)”NA”, 刪除該行)
“all” (只有某行所有數(shù)數(shù)據(jù)全部是”NA” 時才刪除)
thresh: 設(shè)定某行最多包含多少個NA 時,才進行刪除
subset: 選定某個子集,進行NA 查找
可以通過這些參數(shù), 尤其是thresh 和 subset 兩個參數(shù)可以決定某行是否被刪除掉。
Pandas 在讀取信息的時候,無法刪除列。但是我們可以在每個chunk 上,進行上述操作。
為列設(shè)定不同的數(shù)據(jù)類型
數(shù)據(jù)科學(xué)家新手往往不會對數(shù)據(jù)類型考慮太多。 當處理數(shù)據(jù)越來越多時, 就非常有必要考慮數(shù)據(jù)類型了。
行業(yè)常用的解決方法是從數(shù)據(jù)文件中,讀取數(shù)據(jù), 然后一列列設(shè)置數(shù)據(jù)類型。 但當數(shù)據(jù)量非常大時, 我們往往擔心內(nèi)存空間不夠用。
在CSV 文件中,例如某列是浮點數(shù), 它往往會占據(jù)更多的存儲空間。 例如, 當我們下載數(shù)據(jù)來預(yù)測股票信息時, 價格往往以32位浮點數(shù)形式存儲。
但是,我們真的需要32位浮點數(shù)碼? 大多數(shù)情況下, 股票價格以小數(shù)點后保留兩位數(shù)據(jù)進行交易。 即便我們想看到更精確的數(shù)據(jù), 16位浮點數(shù)已經(jīng)足夠了。
我們往往會在讀取數(shù)據(jù)的時候, 設(shè)置數(shù)據(jù)類型,而不是保留數(shù)據(jù)原類型。 那樣的話,會浪費掉部分內(nèi)存。
通過read_csv() 中設(shè)置dtype參數(shù)來完成數(shù)據(jù)類型設(shè)置。還可以設(shè)置字典類型,設(shè)置該列是鍵, 設(shè)置某列是字典的值。
請看下面的pandas 例子:
文章到這里結(jié)束了! 希望上述三個方法可以幫你節(jié)省時間和內(nèi)存。
以上這篇pandas分批讀取大數(shù)據(jù)集教程就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
django的分頁器Paginator 從django中導(dǎo)入類
這篇文章主要介紹了django的分頁器Paginator 從django中導(dǎo)入類,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07Python開發(fā)網(wǎng)站目錄掃描器的實現(xiàn)
這篇文章主要介紹了Python開發(fā)網(wǎng)站目錄掃描器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02python去除刪除數(shù)據(jù)中\(zhòng)u0000\u0001等unicode字符串的代碼
這篇文章主要介紹了python去除刪除數(shù)據(jù)中\(zhòng)u0000\u0001等unicode字符串的代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03如何基于Python pygame實現(xiàn)動畫跑馬燈
這篇文章主要介紹了如何基于Python pygame實現(xiàn)動畫跑馬燈,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11