欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

pandas處理大數(shù)據(jù)的技巧-創(chuàng)新互聯(lián)

refer : https://yq.aliyun.com/articles/530060?spm=a2c4e.11153940.blogcont181452.16.413f2ef21NKngz#

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供紫云網(wǎng)站建設(shè)、紫云做網(wǎng)站、紫云網(wǎng)站設(shè)計(jì)、紫云網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、紫云企業(yè)網(wǎng)站模板建站服務(wù),十載紫云做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

http://www.datayuan.cn/article/6737.htm

https://yq.aliyun.com/articles/210393?spm=a2c4e.11153940.blogcont381482.21.77131127S0t3io

-
pandas處理大數(shù)據(jù)的技巧

--

大文本數(shù)據(jù)的讀寫
有時(shí)候我們會(huì)拿到一些很大的文本文件,完整讀入內(nèi)存,讀入的過程會(huì)很慢,甚至可能無法讀入內(nèi)存,或者可以讀入內(nèi)存,但是沒法進(jìn)行進(jìn)一步的計(jì)算,這個(gè)時(shí)候如果我們不是要進(jìn)行很復(fù)雜的運(yùn)算,可以使用read_csv提供的chunksize或者iterator參數(shù),來部分讀入文件,處理完之后再通過to_csv的mode='a',將每部分結(jié)果逐步寫入文件。

pandas處理大數(shù)據(jù)的技巧

to_csv, to_excel的選擇
在輸出結(jié)果時(shí)統(tǒng)稱會(huì)遇到輸出格式的選擇,平時(shí)大家用的最多的.csv, .xls, .xlsx,后兩者一個(gè)是excel2003,一個(gè)是excel2007,我的經(jīng)驗(yàn)是csv>xls>xlsx,大文件輸出csv比輸出excel要快的多,xls只支持60000+條記錄,xlsx雖然支持記錄變多了,但是,如果內(nèi)容有中文常常會(huì)出現(xiàn)詭異的內(nèi)容丟失。因此,如果數(shù)量較小可以選擇xls,而數(shù)量較大則建議輸出到csv,xlsx還是有數(shù)量限制,而且 大數(shù)據(jù) 量的話,會(huì)讓你覺得python都死掉了

讀入時(shí)處理日期列
我之前都是在數(shù)據(jù)讀入后通過to_datetime函數(shù)再去處理日期列,如果數(shù)據(jù)量較大這又是一個(gè)浪費(fèi)時(shí)間的過程,其實(shí)在讀入數(shù)據(jù)時(shí),可以通過parse_dates參數(shù)來直接指定解析為日期的列。它有幾種參數(shù),TRUE的時(shí)候會(huì)將index解析為日期格式,將列名作為list傳入則將每一個(gè)列都解析為日期格式

關(guān)于to_datetime函數(shù)再多說幾句,我們拿到的時(shí)期格式常常出現(xiàn)一些亂七八糟的怪?jǐn)?shù)據(jù),遇到這些數(shù)據(jù)to_datimetime函數(shù)默認(rèn)會(huì)報(bào)錯(cuò),其實(shí),這些數(shù)據(jù)是可以忽略的,只需要在函數(shù)中將errors參數(shù)設(shè)置為'ignore'就可以了。

另外,to_datetime就像函數(shù)名字顯示的,返回的是一個(gè)時(shí)間戳,有時(shí)我們只需要日期部分,我們可以在日期列上做這個(gè)修改,datetime_col = datetime_col.apply(lambda x: x.date()),用map函數(shù)也是一樣的datetime_col = datetime_col.map(lambda x: x.date())

把一些數(shù)值編碼轉(zhuǎn)化為文字
前面提到了map方法,我就又想到了一個(gè)小技巧,我們拿到的一些數(shù)據(jù)往往是通過數(shù)字編碼的,比如我們有g(shù)ender這一列,其中0代表男,1代表女。當(dāng)然我們可以用索引的方式來完成

其實(shí)我們有更簡單的方法,對要修改的列傳入一個(gè)dict,就會(huì)達(dá)到同樣的效果。

通過shift函數(shù)求用戶的相鄰兩次登錄記錄的時(shí)間差
之前有個(gè)項(xiàng)目需要計(jì)算用戶相鄰兩次登錄記錄的時(shí)間差,咋看起來其實(shí)這個(gè)需求很簡單,但是數(shù)據(jù)量大起來的話,就不是一個(gè)簡單的任務(wù),拆解開來做的話,需要兩個(gè)步驟,第一步將登錄數(shù)據(jù)按照用戶分組,再計(jì)算每個(gè)用戶兩次登錄之間的時(shí)間間隔。數(shù)據(jù)的格式很單純,如下所示

如果數(shù)據(jù)量不大的,可以先unique uid,再每次計(jì)算一個(gè)用戶的兩次登錄間隔,類似這樣

這種方法雖然計(jì)算邏輯比較清晰易懂,但是缺點(diǎn)也非常明顯,計(jì)算量巨大,相當(dāng)與有多少量記錄就要計(jì)算多少次。

那么為什么說pandas的shift函數(shù)適合這個(gè)計(jì)算呢?來看一下shift函數(shù)的作用

剛好把值向下錯(cuò)位了一位,是不是恰好是我們需要的。讓我們用shift函數(shù)來改造一下上面的代碼。

上面的代碼就把pandas向量化計(jì)算的優(yōu)勢發(fā)揮出來了,規(guī)避掉了計(jì)算過程中最耗費(fèi)時(shí)間的按uid循環(huán)。如果我們的uid都是一個(gè)只要排序后用shift(1)就可以取到所有前一次登錄的時(shí)間,不過真實(shí)的登錄數(shù)據(jù)中有很多的不用的uid,因此再將uid也shift一下命名為uid0,保留uid和uid0匹配的記錄就可以了。


-

Python數(shù)據(jù)預(yù)處理:使用Dask和Numba并行化加速

【方向】 2018-03-12 11:11:49 瀏覽2650 評論0
python

大數(shù)據(jù)
摘要: 本文是針對Python設(shè)計(jì)一種并行處理數(shù)據(jù)的解決方案——使用Dask和Numba并行化加速運(yùn)算速度。案例對比分析了幾種不同方法的運(yùn)算速度,非常直觀,可供參考。

如果你善于使用Pandas變換數(shù)據(jù)、創(chuàng)建特征以及清洗數(shù)據(jù)等,那么你就能夠輕松地使用Dask和Numba并行加速你的工作。單純從速度上比較,Dask完勝Python,而Numba打敗Dask,那么Numba+Dask基本上算是無敵的存在。將數(shù)值計(jì)算分成Numba sub-function和使用Dask map_partition+apply,而不是使用Pandas。對于100萬行數(shù)據(jù),使用Pandas方法和混合數(shù)值計(jì)算創(chuàng)建新特征的速度比使用Numba+Dask方法的速度要慢許多倍。

Python:60.9x | Dask:8.4x | Numba:5.8x |Numba+Dask:1x

8be99f10ed908533e525b81fcd04bcdf3b27db2d

作為舊金山大學(xué)的一名數(shù)據(jù)科學(xué)碩士,會(huì)經(jīng)常跟數(shù)據(jù)打交道。使用Apply函數(shù)是我用來創(chuàng)建新特征或清理數(shù)據(jù)的眾多技巧之一?,F(xiàn)在,我只是一名數(shù)據(jù)科學(xué)家,而不是計(jì)算機(jī)科學(xué)方面的專家,但我是一個(gè)喜歡搗鼓并使得代碼運(yùn)行更快的程序員?,F(xiàn)在,我將會(huì)分享我在并行應(yīng)用上的經(jīng)驗(yàn)。

大多Python愛好者可能了解Python實(shí)現(xiàn)的全局解釋器鎖(GIL),GIL會(huì)占用計(jì)算機(jī)中所有的CPU性能。更糟糕的是,我們主要的數(shù)據(jù)處理包,比如Pandas,很少能實(shí)現(xiàn)并行處理代碼。

Apply函數(shù)vs Multiprocessing.map

Tidyverse已經(jīng)為處理數(shù)據(jù)做了一些美好的事情,Plyr是我最喜愛的數(shù)據(jù)包之一,它允許R語言使用者輕松地并行化他們的數(shù)據(jù)應(yīng)用。Hadley Wickham說過:

“plyr是一套處理一組問題的工具:需要把一個(gè)大的數(shù)據(jù)結(jié)構(gòu)分解成一些均勻的數(shù)據(jù)塊,之后對每一數(shù)據(jù)塊應(yīng)用一個(gè)函數(shù),最后將所有結(jié)果組合在一起?!?/p>

對于Python而言,我希望有類似于plyr這樣的數(shù)據(jù)包可供使用。然而,目前這樣的數(shù)據(jù)包還不存在,但我可以使用并行數(shù)據(jù)包構(gòu)成一個(gè)簡單的解決方案。

Dask

bbcc3ca9a96dc7ad7129d9047a2d58be57a4ed84

之前在Spark上花費(fèi)了一些時(shí)間,因此當(dāng)我開始使用Dask時(shí),還是比較容易地掌握其重點(diǎn)內(nèi)容。Dask被設(shè)計(jì)成能夠在多核CPU上并行處理任務(wù),此外也借鑒了許多Pandas的語法規(guī)則。

現(xiàn)在開始本文所舉例子。對于最近的數(shù)據(jù)挑戰(zhàn)而言,我試圖獲取一個(gè)外部數(shù)據(jù)源(包含許多地理編碼點(diǎn)),并將其與要分析的一大堆街區(qū)相匹配。在計(jì)算歐幾里得距離的同時(shí),使用大啟發(fā)式將大值分配給一個(gè)街區(qū)。

8809febd555c55a69522a58770971c8cf0c57af5

最初的apply:

Dask apply:

二者看起來很相似,apply核心語句是map_partitions,最后有一個(gè)compute()語句。此外,不得不對npartitions初始化。 分區(qū)的工作原理就是將Pandas數(shù)據(jù)幀劃分成塊,對于我的電腦而言,配置是6核-12線程,我只需告訴它使用的是12分區(qū),Dask就會(huì)完成剩下的工作。

接下來,將map_partitions的lambda函數(shù)應(yīng)用于每個(gè)分區(qū)。由于許多數(shù)據(jù)處理代碼都是獨(dú)立地運(yùn)行,所以不必過多地?fù)?dān)心這些操作的順序問題。最后,compute()函數(shù)告訴Dask來處理剩余的事情,并把最終計(jì)算結(jié)果反饋給我。在這里,compute()調(diào)用Dask將apply適用于每個(gè)分區(qū),并使其并行處理。

由于我通過迭代行來生成一個(gè)新隊(duì)列(特征),而Dask apply只在列上起作用,因此我沒有使用Dask apply,以下是Dask程序:

Numba、Numpy和Broadcasting

由于我是根據(jù)一些簡單的線性運(yùn)算(基本上是勾股定理)對數(shù)據(jù)進(jìn)行分類,所以認(rèn)為使用類似下面的Python代碼會(huì)運(yùn)行得更快一些。

d31908d0ecfefd263b3e5373461b34374de9adf5

Broadcasting用以描述Numpy中對兩個(gè)形狀不同的矩陣進(jìn)行數(shù)學(xué)計(jì)算的處理機(jī)制。假設(shè)我有一個(gè)數(shù)組,我會(huì)通過迭代并逐個(gè)變換每個(gè)單元格來改變它

相反,我完全可以跳過for循環(huán),并對整個(gè)數(shù)組執(zhí)行操作。Numpy與broadcasting混合使用,用來執(zhí)行元素智能乘積(對位相乘)。

Broadcasting可以實(shí)現(xiàn)更多的功能,現(xiàn)在看看骨架代碼:

從本質(zhì)上講,代碼的功能是改變數(shù)組。好的一方面是運(yùn)行很快,甚至能和Dask并行處理速度比較。其次,如果使用的是最基本的Numpy和Python,那么就可以及時(shí)編譯任何函數(shù)。壞的一面在于它只適合Numpy和簡單Python語法。我不得不把所有的數(shù)值計(jì)算從我的函數(shù)轉(zhuǎn)換成子函數(shù),但其計(jì)算速度會(huì)增加得非???。

將其一起使用

簡單地使用map_partition()就可以將Numba函數(shù)與Dask結(jié)合在一起,如果并行操作和broadcasting能夠密切合作以加快運(yùn)行速度,那么對于大數(shù)據(jù)集而言,將會(huì)看到其運(yùn)行速度得到大幅提升。

09e60c6e34586f4760449a2159928877d49958cf

d9d0d60dc749ba864cbb200bb05b60e71ff6adcf

上面的第一張圖表明,沒有broadcasting的線性計(jì)算其表現(xiàn)不佳,并行處理和Dask對速度提升也有效果。此外,可以明顯地發(fā)現(xiàn),Dask和Numba組合的性能優(yōu)于其它方法。

上面的第二張圖稍微有些復(fù)雜,其橫坐標(biāo)是對行數(shù)取對數(shù)。從第二張圖可以發(fā)現(xiàn),對于1k到10k這樣小的數(shù)據(jù)集,單獨(dú)使用Numba的性能要比聯(lián)合使用Numba+Dask的性能更好,盡管在大數(shù)據(jù)集上Numba+Dask的性能非常好。

優(yōu)化

為了能夠使用Numba編譯JIT,我重寫了函數(shù)以更好地利用broadcasting。之后,重新運(yùn)行這些函數(shù)后發(fā)現(xiàn),平均而言,對于相同的代碼,JIT的執(zhí)行速度大約快了24%。

c9f6a34759b5b1298033c2e4ffd5d78a63994af5

可以肯定的說,一定有進(jìn)一步的優(yōu)化方法使得執(zhí)行速度更快,但目前沒有發(fā)現(xiàn)。Dask是一個(gè)非常友好的工具,本文使用Dask+Numba實(shí)現(xiàn)的最好成果是提升運(yùn)行速度60倍。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)頁題目:pandas處理大數(shù)據(jù)的技巧-創(chuàng)新互聯(lián)
新聞來源:http://aaarwkj.com/article40/dshdho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、網(wǎng)頁設(shè)計(jì)公司App設(shè)計(jì)、ChatGPT建站公司、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
亚洲精品一级理论片对面| 亚洲国产精品综合色在线| 深夜毛片一区二区三区| 人妻在线中文字幕一区| 国产三级av高清一区二区| 日韩免费高清不卡视频| 日本高清精品视频免费| 亚洲日本乱码一区二区三| 久久亚洲av麻衣北条麻妃| 成人免费在线视频不卡| 久久精品国产亚洲七七| 无毛亚洲视频在线观看| 日韩欧美中文字幕综合网| 国产精品一级片一区二区| 日本亚洲中文字幕网站| 一级黄片国产精品久久| 国产高清视频成人在线观看| 国产日韩视频一区二区| 99亚洲综合一区二区三区| 草草在线成年免费视频| 麻豆精品国产免费av影片| 国产不卡视频观看网站| 日本亚洲一级中文字幕| 日本韩国欧美一区在线| 亚洲欧美日韩有码一区| 日本一区二区三区久久久| 风韵丰满熟妇啪啪老熟女| 美女高潮久久久777| 欧美十八一区二区三区| 少妇又色又爽又高潮欧美| 日本午夜福利久久久| 日本在线观看高清区一区二| 亚洲国产精品中文字幕一区久久| 亚洲av一本岛在线播放| 91九色在线视频观看| 粉嫩一区二区三区av| 日韩国产精品视频二区| 久久精品色妇熟妇丰满人妻| 亚洲欧美日韩另类自拍| 亚洲中国av一区二区| 欧美亚洲国产日韩熟女|