pandas库+3个小技巧=内存占用小、读取时间少?
點(diǎn)擊上方關(guān)注,All in AI中國(guó)
Pandas已經(jīng)成為最受歡迎的數(shù)據(jù)科學(xué)庫(kù)之一。它易于使用,文檔非常棒,而且功能強(qiáng)大。
然而,無(wú)論使用哪一個(gè)庫(kù),大型的數(shù)據(jù)集總是會(huì)帶來(lái)額外的挑戰(zhàn),這些是需要謹(jǐn)慎處理的。
你一開(kāi)始遇到硬件障礙,是因?yàn)槟鷽](méi)有足夠的內(nèi)存來(lái)保存所有數(shù)據(jù)。尤其是遇到企業(yè)公司存儲(chǔ)的數(shù)據(jù)集最多可達(dá)到100GB或甚至1000的GB的情況。
即使你確實(shí)是購(gòu)買(mǎi)了足夠內(nèi)存來(lái)存儲(chǔ)所有數(shù)據(jù)的計(jì)算機(jī),將其讀入內(nèi)存中的速度也會(huì)非常慢。
但是Pandas庫(kù)將再次幫助我們。本文將討論三種技巧,你可以使用它們來(lái)減少大數(shù)據(jù)集的內(nèi)存占用和讀取時(shí)間。我已經(jīng)嘗試將這些技術(shù)用于超過(guò)100GB大小的數(shù)據(jù)集,并將它們壓縮到只有64 GB甚至32GB RAM的機(jī)器上。
下面讓我們來(lái)看看吧!
整理你的數(shù)據(jù)
CSV格式是一種非常方便的數(shù)據(jù)存儲(chǔ)方式,易于編寫(xiě)且人們可讀。 另外,有一個(gè)很好的pandas函數(shù)read_csv()用于加載存儲(chǔ)為CSV的數(shù)據(jù)。但是當(dāng)你的CSV太大以至于內(nèi)存不足時(shí)會(huì)發(fā)生什么?有一個(gè)非常簡(jiǎn)單的Pandas技巧來(lái)處理它! 我們并不是嘗試去一次性處理我們的數(shù)據(jù),而是將它們分成幾個(gè)部分。 通常,這些部分稱(chēng)為塊。塊只是我們數(shù)據(jù)集的一部分。 我們可以根據(jù)需要去制作成大塊或小塊,這取決于我們有多少內(nèi)存。
這個(gè)過(guò)程是這樣進(jìn)行的:
- 先讀入一大塊
- 并處理塊
- 保存塊的結(jié)果
- 重復(fù)步驟1到3,直到得到所有塊結(jié)果
- 組合塊的結(jié)果
我們可以使用名為chunksize的read_csv()函數(shù)的方便變量來(lái)執(zhí)行上述所有步驟。chunksize表示一次讀取多少CSV行。這當(dāng)然取決于您有多少內(nèi)存以及每一行有多大。
如果我們認(rèn)為我們的數(shù)據(jù)像高斯分布一樣很容易處理,那么我們就可以一對(duì)一的,對(duì)每個(gè)塊執(zhí)行我們想要的處理和可視化,因此不會(huì)損失太多的準(zhǔn)確性。
如果我們的分布有點(diǎn)像泊松分布那樣復(fù)雜,那么最好在處理之前過(guò)濾每個(gè)塊并將所有小塊放在一起。大多數(shù)情況下,您最終會(huì)刪除許多不相關(guān)的列或刪除缺少值的行。我們可以對(duì)每個(gè)塊都這樣做,使它們更小,然后將它們放在一起,并對(duì)最終的數(shù)據(jù)文件執(zhí)行數(shù)據(jù)分析。
以下的代碼執(zhí)行了這些步驟。
刪除數(shù)據(jù)
有時(shí)候,我們會(huì)先知道我們想要分析數(shù)據(jù)集中的哪些列。事實(shí)上,通常情況下,有幾個(gè)或多個(gè)列是我們不關(guān)心的。
在讀取數(shù)據(jù)之前直接跳過(guò)列可以節(jié)省大量?jī)?nèi)存。pandas允許我們,而且指定我們想要讀取的列:
丟棄包含沒(méi)有用的信息的列,將是節(jié)省內(nèi)存的方法之一。
我們可以做的另一件事是過(guò)濾掉任何缺失或NA值的行。這是用dropna()函數(shù)最簡(jiǎn)單的:
有一些非常有用的變量,我們可以傳遞給dropna():
方法:
這將允許你指定"any"(如果其中任何列是NA,則刪除一行)或"all"(僅當(dāng)所有列都是NA時(shí),才刪除一行)
thresh:設(shè)置一個(gè)閾值,表示要?jiǎng)h除一行需要多少個(gè)NA值
subset:選擇將考慮用于檢查NA值的列子集
你可以使用這些參數(shù),尤其是thresh和subset來(lái)真正具體了解哪些行將被刪除。
Pandas在讀取時(shí)沒(méi)有像列一樣的方法來(lái)做這個(gè),但我們可以像上面那樣在每個(gè)塊上做到這一。
為每一列設(shè)置特定的數(shù)據(jù)類(lèi)型
對(duì)于許多初學(xué)數(shù)據(jù)科學(xué)家來(lái)說(shuō),為每列設(shè)置特定數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型,并沒(méi)有在過(guò)多考慮范圍之內(nèi)。 但是一旦開(kāi)始處理非常大的數(shù)據(jù)集時(shí),處理數(shù)據(jù)類(lèi)型就變得至關(guān)重要。
通常的做法是讀取dataframe,然后根據(jù)需要轉(zhuǎn)換列的數(shù)據(jù)類(lèi)型。但是對(duì)于一個(gè)大的數(shù)據(jù)集,我們真的必須注意內(nèi)存空間。CSV中可能有一些列,比如浮點(diǎn)數(shù),它們將占用比它們需要的更多的空間。例如,如果我們下載了一個(gè)用于預(yù)測(cè)股票價(jià)格的數(shù)據(jù)集,我們的價(jià)格可能被保存為32位浮點(diǎn)數(shù)!
但我們真的需要32個(gè)浮點(diǎn)數(shù)(float)嗎?大多數(shù)情況下,股票是以小數(shù)點(diǎn)后兩位指定的價(jià)格買(mǎi)進(jìn)的。即使我們想要非常精確,浮點(diǎn)數(shù)16也足夠了。
因此,我們不是使用列的原始數(shù)據(jù)類(lèi)型讀入數(shù)據(jù)集,而是指定我們希望pandas在我們的列中使用讀取的數(shù)據(jù)類(lèi)型。 這樣,我們永遠(yuǎn)不會(huì)消耗比實(shí)際需要更多的內(nèi)存。
使用read_csv()函數(shù)中的dtype參數(shù)很容易做到這一點(diǎn)。我們可以指定一個(gè)字典,其中每個(gè)鍵是數(shù)據(jù)集中的一列,每個(gè)值是我們希望使用該鍵的數(shù)據(jù)類(lèi)型。
舉個(gè)pandas的例子:
我們的教程到此結(jié)束!希望這三個(gè)技巧能幫你節(jié)省很多時(shí)間和內(nèi)存!
編譯出品
總結(jié)
以上是生活随笔為你收集整理的pandas库+3个小技巧=内存占用小、读取时间少?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ppt中触发器的使用
- 下一篇: dell n4050怎么开启无线功能?