日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
使用PyPolars,讓Pandas快三倍

Pandas是數(shù)據(jù)科學(xué)家處理數(shù)據(jù)的最重要的Python軟件包之一。Pandas庫主要用于數(shù)據(jù)探索和可視化,它隨帶大量的內(nèi)置函數(shù)。Pandas無法處理大型數(shù)據(jù)集,因?yàn)樗鼰o法在CPU的所有核心上擴(kuò)展或分布進(jìn)程。

為了加快計(jì)算速度,您可以使用CPU的所有核心,并加快工作流程。有各種開源庫,包括Dask、Vaex、Modin、Pandarallel和PyPolars等,它們可以在CPU的多個(gè)核心上并行處理計(jì)算。我們在本文中將討論P(yáng)yPolars庫的實(shí)現(xiàn)和用法,并將其性能與Pandas庫進(jìn)行比較。

PyPolars是什么?

PyPolars是一個(gè)類似Pandas的開源Python數(shù)據(jù)框庫。PyPolars利用CPU的所有可用核心,因此處理計(jì)算比Pandas更快。PyPolars有一個(gè)類似Pandas的API。它是用Rust和Python包裝器編寫的。

理想情況下,當(dāng)數(shù)據(jù)對于Pandas而言太大、對于Spark而言太小時(shí),使用 PyPolars。

PyPolars如何工作?

PyPolars庫有兩個(gè)API,一個(gè)是Eager API,另一個(gè)是Lazy API。Eager API與Pandas的API非常相似,執(zhí)行完成后立即獲得結(jié)果,這類似Pandas。Lazy API與Spark非常相似,一執(zhí)行查詢,就形成地圖或方案。然后在CPU的所有核心上并行執(zhí)行。

圖1. PyPolars API

PyPolars基本上是連接到Polars庫的Python綁定。PyPolars庫好用的地方是,其API與Pandas相似,這使開發(fā)人員更容易使用。

安裝:

可以使用以下命令從PyPl安裝 PyPolars:

 
 
 
 
  1. pip install py-polars 

并使用以下命令導(dǎo)入庫:

 
 
 
 
  1. iport pypolars as pl 

基準(zhǔn)時(shí)間約束:

為了演示,我使用了一個(gè)含有2500萬個(gè)實(shí)例的大型數(shù)據(jù)集(~6.4Gb)。

圖2. Pandas和Py-Polars基本操作的基準(zhǔn)時(shí)間數(shù)

針對使用Pandas和PyPolars庫的一些基本操作的上述基準(zhǔn)時(shí)間數(shù),我們可以觀察到 PyPolars幾乎比Pandas快2到3倍。

現(xiàn)在我們知道PyPolars有一個(gè)與Pandas非常相似的API,但仍沒有涵蓋Pandas的所有函數(shù)。比如說,PyPolars中就沒有.describe()函數(shù),相反我們可以使用df_pypolars.to_pandas().describe()。

用法:

 
 
 
 
  1. import pandas as pd 
  2. import numpy as np 
  3. import pypolars as pl 
  4. import time 
  5. WARNING! 
  6. py-polars was renamed to polars, please install polars! 
  7. https://pypi.org/project/polars/ 
  8.  
  9. path = "data.csv" 

讀取數(shù)據(jù):

 
 
 
 
  1. s = time.time() 
  2. df_pandas = pd.read_csv(path) 
  3. e = time.time() 
  4. pd_time = e - s 
  5. print("Pandas Loading Time = {}".format(pd_time)) 
  6. C:\ProgramData\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py:3071: DtypeWarning: Columns (2,7,14) have mixed types.Specify dtype option on import or set low_memory=False. 
  7.   has_raised = await self.run_ast_nodes(code_ast.body, cell_name, 
  8. Pandas Loading Time = 217.1734380722046 
  9.  
  10. s = time.time() 
  11. df_pypolars = pl.read_csv(path) 
  12. e = time.time() 
  13. pl_time = e - s  
  14. print("PyPolars Loading Time = {}".format(pl_time)) 
  15. PyPolars Loading Time = 114.0408570766449 

shape:

 
 
 
 
  1. s = time.time() 
  2. print(df_pandas.shape) 
  3. e = time.time() 
  4. pd_time = e - s 
  5. print("Pandas Shape Time = {}".format(pd_time)) 
  6. (25366521, 19) 
  7. Pandas Shape Time = 0.0 
  8.  
  9. s = time.time() 
  10. print(df_pypolars.shape) 
  11. e = time.time() 
  12. pl_time = e - s  
  13. print("PyPolars Shape Time = {}".format(pl_time)) 
  14. (25366521, 19) 
  15. PyPolars Shape Time = 0.0010192394256591797 

過濾:

 
 
 
 
  1. s = time.time() 
  2. temp = df_pandas[df_pandas['PAID_AMT']>500] 
  3. e = time.time() 
  4. pd_time = e - s 
  5. print("Pandas Filter Time = {}".format(pd_time)) 
  6. Pandas Filter Time = 0.8010377883911133 
  7.  
  8. s = time.time() 
  9. temp = df_pypolars[df_pypolars['PAID_AMT']>500] 
  10. e = time.time() 
  11. pl_time = e - s  
  12. print("PyPolars Filter Time = {}".format(pl_time)) 
  13. PyPolars Filter Time = 0.7790462970733643 

Groupby:

 
 
 
 
  1. s = time.time() 
  2. temp = df_pandas.groupby(by="MARKET_SEGMENT").agg({'PAID_AMT':np.sum, 'QTY_DISPENSED':np.mean}) 
  3. e = time.time() 
  4. pd_time = e - s 
  5. print("Pandas GroupBy Time = {}".format(pd_time)) 
  6. Pandas GroupBy Time = 3.5932095050811768 
  7.  
  8. s = time.time() 
  9. temp = df_pypolars.groupby(by="MARKET_SEGMENT").agg({'PAID_AMT':np.sum, 'QTY_DISPENSED':np.mean}) 
  10. e = time.time() 
  11. pd_time = e - s 
  12. print("PyPolars GroupBy Time = {}".format(pd_time)) 
  13. PyPolars GroupBy Time = 1.2332513110957213 

運(yùn)用函數(shù):

 
 
 
 
  1. %%time 
  2.  
  3. s = time.time() 
  4. temp = df_pandas['PAID_AMT'].apply(round) 
  5. e = time.time() 
  6. pd_time = e - s 
  7. print("Pandas Loading Time = {}".format(pd_time)) 
  8. Pandas Loading Time = 13.081078290939331 
  9. Wall time: 13.1 s 
  10.  
  11. s = time.time() 
  12. temp = df_pypolars['PAID_AMT'].apply(round) 
  13. e = time.time() 
  14. pd_time = e - s 
  15. print("PyPolars Loading Time = {}".format(pd_time)) 
  16. PyPolars Loading Time = 6.03610580444336 

值計(jì)算:

 
 
 
 
  1. %%time 
  2.  
  3. s = time.time() 
  4. temp = df_pandas['MARKET_SEGMENT'].value_counts() 
  5. e = time.time() 
  6. pd_time = e - s 
  7. print("Pandas ValueCounts Time = {}".format(pd_time)) 
  8. Pandas ValueCounts Time = 2.8194501399993896 
  9. Wall time: 2.82 s 
  10.  
  11. %%time 
  12.  
  13. s = time.time() 
  14. temp = df_pypolars['MARKET_SEGMENT'].value_counts() 
  15. e = time.time() 
  16. pd_time = e - s 
  17. print("PyPolars ValueCounts Time = {}".format(pd_time)) 
  18. PyPolars ValueCounts Time = 1.7622406482696533 
  19. Wall time: 1.76 s 

描述:

 
 
 
 
  1. %%time 
  2.  
  3. s = time.time() 
  4. temp = df_pandas.describe() 
  5. e = time.time() 
  6. pd_time = e - s 
  7. print("Pandas Describe Time = {}".format(pd_time)) 
  8. Pandas Describe Time = 15.48347520828247 
  9. Wall time: 15.5 s 
  10.  
  11. %%time 
  12.  
  13. s = time.time() 
  14. temp = df_pypolars[temp_cols].to_pandas().describe() 
  15. e = time.time() 
  16. pd_time = e - s 
  17. print("PyPolars Describe Time = {}".format(pd_time)) 
  18. PyPolars Describe Time = 44.31892013549805 
  19. Wall time: 44.3 s 

去重:

 
 
 
 
  1. %%time 
  2.  
  3. s = time.time() 
  4. temp = df_pandas['MARKET_SEGMENT'].unique() 
  5. e = time.time() 
  6. pd_time = e - s 
  7. print("Pandas Unique Time = {}".format(pd_time)) 
  8. Pandas Unique Time = 2.1443397998809814 
  9. Wall time: 2.15 s 
  10.  
  11. %%time 
  12.  
  13. s = time.time() 
  14. temp = df_pypolars['MARKET_SEGMENT'].unique() 
  15. e = time.time() 
  16. pd_time = e - s 
  17. print("PyPolars Unique Time = {}".format(pd_time)) 
  18. PyPolars Unique Time = 1.0320448875427246 
  19. Wall time: 1.03 s 

保存數(shù)據(jù):

 
 
 
 
  1. s = time.time() 
  2. df_pandas.to_csv("delete_1May.csv", index=False) 
  3. e = time.time() 
  4. pd_time = e - s 
  5. print("Pandas Saving Time = {}".format(pd_time)) 
  6. Pandas Saving Time = 779.0419402122498 
  7.  
  8. s = time.time() 
  9. df_pypolars.to_csv("delete_1May.csv") 
  10. e = time.time() 
  11. pd_time = e - s 
  12. print("PyPolars Saving Time = {}".format(pd_time)) 
  13. PyPolars Saving Time = 439.16817021369934 

結(jié)論

我們在本文中簡要介紹了PyPolars庫,包括它的實(shí)現(xiàn)、用法以及在一些基本操作中將其基準(zhǔn)時(shí)間數(shù)與Pandas相比較的結(jié)果。請注意,PyPolars的工作方式與Pandas非常相似, PyPolars是一種節(jié)省內(nèi)存的庫,因?yàn)樗С值膬?nèi)存是不可變內(nèi)存。

可以閱讀說明文檔詳細(xì)了解該庫。還有其他各種開源庫來并行處理Pandas操作,并加快進(jìn)程。

參考資料:

Polars說明文檔和GitHub存儲庫:https://github.com/ritchie46/polars

[1] Polars Documentation and GitHub repository: https://github.com/ritchie46/polars


分享文章:使用PyPolars,讓Pandas快三倍
文章網(wǎng)址:http://www.dlmjj.cn/article/cojoogj.html