DUICUO

PyPolars を使用すると、Pandas は 3 倍高速になります。

[[422464]]

[51CTO.com クイック翻訳] Pandasは、データサイエンティストがデータ処理に用いる最も重要なPythonパッケージの一つです。Pandasライブラリは主にデータの探索と可視化に使用され、多数の組み込み関数を備えています。しかし、PandasはスケーリングやCPUコア全体への分散処理ができないため、大規模なデータセットを扱うことができません。

計算を高速化するには、CPUのすべてのコアを活用し、ワークフローを高速化することができます。Dask、Vaex、Modin、Pandaralel、PyPolarsなど、複数のCPUコア間で並列計算を処理できるオープンソースライブラリが数多く存在します。この記事では、PyPolarsライブラリの実装と使用方法について説明し、Pandasライブラリとのパフォーマンスを比較します。

PyPolarsとは何ですか?

PyPolarsは、Pandasに似たオープンソースのPythonデータフレームライブラリです。PyPolarsは利用可能なすべてのCPUコアを活用するため、Pandasよりも高速に計算できます。PyPolarsはPandasに似たAPIを備えており、RustとPythonのラッパーで記述されています。

理想的には、データが Pandas には大きすぎ、Spark には小さすぎる場合に PyPolars を使用します。

PyPolars はどのように機能しますか?

PyPolarsライブラリには、Eager APIとLazy APIという2つのAPIがあります。Eager APIはPandas APIに非常に似ており、Pandasと同様に実行後すぐに結果を返します。Lazy APIはSparkに非常に似ており、クエリ実行時にマップまたはソリューションを生成し、それをすべてのCPUコアで並列実行します。

図1. PyPolars API

PyPolarsは、Polarsライブラリに接続するPythonバインディングです。PyPolarsライブラリの優れた点は、APIがPandasに似ているため、開発者にとって使いやすいことです。

インストール:

次のコマンドを使用して、PyPl から PyPolars をインストールできます。

  1. pipでpy-polarsをインストールする

次のコマンドを使用してライブラリをインポートします。

  1. pypolarsをplとしてインポートする

ベースラインの時間制約:

デモンストレーションのために、2500 万のインスタンスを含む大規模なデータセット (約 6.4 GB) を使用しました。

図2. PandasとPy-Polarsの基本操作のベースライン時間

Pandas および PyPolars ライブラリを使用したいくつかの基本操作の上記のベンチマーク時間に基づくと、PyPolars は Pandas よりもほぼ 2 ~ 3 倍高速であることがわかります。

PyPolars には Pandas に非常によく似た API があることは分かりましたが、それでも Pandas のすべての機能をカバーしているわけではありません。例えば、PyPolars には `.describe()` 関数がありませんが、代わりに `df_pypolars.to_pandas().describe()` を使用できます。

使用法:

  1. pandasをpdとしてインポートする
  2. numpyをnpとしてインポートする
  3. pypolars をplとしてインポートする
  4. インポート時間 
  5. 警告!
  6. py-polars は polars名前が変更されました。polars をインストールしてください。
  7. https://pypi.org/project/polars/
  8.  
  9. パス = "data.csv"  

データの読み取り:

  1. s =時間.時間( )
  2. df_pandas = pd.read_csv(パス)
  3. e =時間.時間( )
  4. pd_time = e - s
  5. print( "Pandas 読み込み時間 = {}" .format(pd_time))
  6. C:\ProgramData\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py:3071: DtypeWarning: 列 (2,7,14) には混合型があります。dtypeオプションを指定してください 輸入または  low_memory = Falseを設定します
  7. has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
  8. パンダの読み込み時間= 217.1734380722046
  9.  
  10. s =時間.時間( )
  11. df_pypolars = pl.read_csv(パス)
  12. e =時間.時間( )
  13. pl_time = e - s
  14. print( "PyPolars 読み込み時間 = {}" .format(pl_time))
  15. PyPolars 読み込み時間= 114.0408570766449

形:

  1. s =時間.時間( )
  2. 印刷(df_pandas.shape)
  3. e =時間.時間( )
  4. pd_time = e - s
  5. print( "Pandas Shape Time = {}" .format(pd_time))
  6. (25366521, 19)
  7. パンダの形状時間= 0.0
  8.  
  9. s =時間.時間( )
  10. 印刷(df_pypolars.shape)
  11. e =時間.時間( )
  12. pl_time = e - s
  13. print( "PyPolars Shape Time = {}" .format(pl_time))
  14. (25366521, 19)
  15. PyPolars シェイプ時間= 0.0010192394256591797

フィルター:

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

グループ化:

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

関数の使用:

  1. %%時間 
  2.  
  3. s =時間.時間( )
  4. temp = df_pandas[ 'PAID_AMT' ].apply(round)
  5. e =時間.時間( )
  6. pd_time = e - s
  7. print( "Pandas 読み込み時間 = {}" .format(pd_time))
  8. パンダの読み込み時間= 13.081078290939331
  9. ウォールタイム:13.1秒
  10.  
  11. s =時間.時間( )
  12. temp = df_pypolars[ 'PAID_AMT' ].apply(round)
  13. e =時間.時間( )
  14. pd_time = e - s
  15. print( "PyPolars 読み込み時間 = {}" .format(pd_time))
  16. PyPolars 読み込み時間= 6.03610580444336

価値計算:

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

説明する:

  1. %%時間 
  2.  
  3. s =時間.時間( )
  4. temp = df_pandas.describe()
  5. e =時間.時間( )
  6. pd_time = e - s
  7. print( "Pandas Describe Time = {}" .format(pd_time))
  8. パンダが時間を説明する= 15.48347520828247
  9. ウォールタイム:15.5秒
  10.  
  11. %%時間 
  12.  
  13. s =時間.時間( )
  14. temp = df_pypolars[temp_cols].to_pandas().describe()
  15. e =時間.時間( )
  16. pd_time = e - s
  17. print( "PyPolars 記述時間 = {}" .format(pd_time))
  18. PyPolars 記述時間= 44.31892013549805
  19. ウォールタイム:44.3秒

重複排除:

  1. %%時間 
  2.  
  3. s =時間.時間( )
  4. temp = df_pandas[ 'MARKET_SEGMENT' ] .unique ()
  5. e =時間.時間( )
  6. pd_time = e - s
  7. print( "Pandas のユニークタイム = {}" .format(pd_time))
  8. パンダユニーク 時間= 2.1443397998809814
  9. ウォールタイム:2.15秒
  10.  
  11. %%時間 
  12.  
  13. s =時間.時間( )
  14. temp = df_pypolars[ 'MARKET_SEGMENT' ] .unique ()
  15. e =時間.時間( )
  16. pd_time = e - s
  17. print( "PyPolars の固有時間 = {}" .format(pd_time))
  18. PyPolarsユニーク 時間= 1.0320448875427246
  19. ウォールタイム:1.03秒

保存データ:

  1. s =時間.時間( )
  2. df_pandas.to_csv( "delete_1May.csv" インデックス= False )
  3. e =時間.時間( )
  4. pd_time = e - s
  5. print( "Pandas の時間節約 = {}" .format(pd_time))
  6. パンダの時間の節約= 779.0419402122498
  7.  
  8. s =時間.時間( )
  9. df_pypolars.to_csv( "delete_1May.csv" )
  10. e =時間.時間( )
  11. pd_time = e - s
  12. print( "PyPolars の時間の節約 = {}" .format(pd_time))
  13. PyPolars の節約時間= 439.16817021369934

結論は

この記事では、PyPolarsライブラリの概要、実装、使用方法、そしていくつかの基本的な操作におけるPandasとのベンチマーク時間の比較などについて説明します。PyPolarsはPandasと非常によく似た動作をし、不変メモリをサポートしているためメモリ効率に優れています。

このライブラリの詳細については、ドキュメントをご覧ください。他にも、Pandas の処理を​​並列化して処理を高速化するためのオープンソースライブラリが数多く存在します。

参考文献:

Polars のドキュメントと GitHub リポジトリ: https://github.com/ritchie46/polars

[1] PolarsドキュメントとGitHubリポジトリ: https://github.com/ritchie46/polars

原題: PyPolars で Pandas を 3 倍高速化する、著者: Satyam Kumar

[この記事は51CTOによって翻訳されました。提携サイトへの転載の際は、元の翻訳者と出典を51CTO.comとして明記してください。]