|
[[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 をインストールできます。 - pipでpy-polarsをインストールする
次のコマンドを使用してライブラリをインポートします。 - 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()` を使用できます。 使用法:- pandasをpdとしてインポートする
- numpyをnpとしてインポートする
- pypolars をplとしてインポートする
- インポート時間
- 警告!
- py-polars は polarsに名前が変更されました。polars をインストールしてください。
- https://pypi.org/project/polars/
-
- パス = "data.csv"
データの読み取り: - s =時間.時間( )
- df_pandas = pd.read_csv(パス)
- e =時間.時間( )
- pd_time = e - s
- print( "Pandas 読み込み時間 = {}" .format(pd_time))
- C:\ProgramData\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py:3071: DtypeWarning: 列 (2,7,14) には混合型があります。dtypeオプションを指定してください 輸入時または low_memory = Falseを設定します。
- has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
- パンダの読み込み時間= 217.1734380722046
-
- s =時間.時間( )
- df_pypolars = pl.read_csv(パス)
- e =時間.時間( )
- pl_time = e - s
- print( "PyPolars 読み込み時間 = {}" .format(pl_time))
- PyPolars 読み込み時間= 114.0408570766449
形:- s =時間.時間( )
- 印刷(df_pandas.shape)
- e =時間.時間( )
- pd_time = e - s
- print( "Pandas Shape Time = {}" .format(pd_time))
- (25366521, 19)
- パンダの形状時間= 0.0
-
- s =時間.時間( )
- 印刷(df_pypolars.shape)
- e =時間.時間( )
- pl_time = e - s
- print( "PyPolars Shape Time = {}" .format(pl_time))
- (25366521, 19)
- PyPolars シェイプ時間= 0.0010192394256591797
フィルター:- s =時間.時間( )
- temp = df_pandas[df_pandas[ 'PAID_AMT' ]>500]
- e =時間.時間( )
- pd_time = e - s
- print( "Pandas フィルター時間 = {}" .format(pd_time))
- Pandas フィルター時間= 0.8010377883911133
-
- s =時間.時間( )
- temp = df_pypolars[df_pypolars[ 'PAID_AMT' ]>500]
- e =時間.時間( )
- pl_time = e - s
- print( "PyPolars フィルター時間 = {}" .format(pl_time))
- PyPolars フィルター時間= 0.7790462970733643
グループ化:- s =時間.時間( )
- temp = df_pandas.groupby( by = "MARKET_SEGMENT" ).agg({ 'PAID_AMT' :np.sum , ' QTY_DISPENSED' :np.mean})
- e =時間.時間( )
- pd_time = e - s
- print( "Pandas GroupBy Time = {}" .format(pd_time))
- パンダのグループ時間= 3.5932095050811768
-
- s =時間.時間( )
- temp = df_pypolars.groupby( by = "MARKET_SEGMENT" ).agg({ 'PAID_AMT' :np.sum , ' QTY_DISPENSED' :np.mean})
- e =時間.時間( )
- pd_time = e - s
- print( "PyPolars GroupBy Time = {}" .format(pd_time))
- PyPolars GroupBy時間= 1.2332513110957213
関数の使用:- %%時間
-
- s =時間.時間( )
- temp = df_pandas[ 'PAID_AMT' ].apply(round)
- e =時間.時間( )
- pd_time = e - s
- print( "Pandas 読み込み時間 = {}" .format(pd_time))
- パンダの読み込み時間= 13.081078290939331
- ウォールタイム:13.1秒
-
- s =時間.時間( )
- temp = df_pypolars[ 'PAID_AMT' ].apply(round)
- e =時間.時間( )
- pd_time = e - s
- print( "PyPolars 読み込み時間 = {}" .format(pd_time))
- PyPolars 読み込み時間= 6.03610580444336
価値計算: - %%時間
-
- s =時間.時間( )
- temp = df_pandas[ 'MARKET_SEGMENT' ].value_counts()
- e =時間.時間( )
- pd_time = e - s
- print( "Pandas ValueCounts Time = {}" .format(pd_time))
- Pandas ValueCounts時間= 2.8194501399993896
- ウォールタイム:2.82秒
-
- %%時間
-
- s =時間.時間( )
- temp = df_pypolars[ 'MARKET_SEGMENT' ].value_counts()
- e =時間.時間( )
- pd_time = e - s
- print( "PyPolars ValueCounts Time = {}" .format(pd_time))
- PyPolars ValueCounts時間= 1.7622406482696533
- ウォールタイム:1.76秒
説明する: - %%時間
-
- s =時間.時間( )
- temp = df_pandas.describe()
- e =時間.時間( )
- pd_time = e - s
- print( "Pandas Describe Time = {}" .format(pd_time))
- パンダが時間を説明する= 15.48347520828247
- ウォールタイム:15.5秒
-
- %%時間
-
- s =時間.時間( )
- temp = df_pypolars[temp_cols].to_pandas().describe()
- e =時間.時間( )
- pd_time = e - s
- print( "PyPolars 記述時間 = {}" .format(pd_time))
- PyPolars 記述時間= 44.31892013549805
- ウォールタイム:44.3秒
重複排除: - %%時間
-
- s =時間.時間( )
- temp = df_pandas[ 'MARKET_SEGMENT' ] .unique ()
- e =時間.時間( )
- pd_time = e - s
- print( "Pandas のユニークタイム = {}" .format(pd_time))
- パンダユニーク 時間= 2.1443397998809814
- ウォールタイム:2.15秒
-
- %%時間
-
- s =時間.時間( )
- temp = df_pypolars[ 'MARKET_SEGMENT' ] .unique ()
- e =時間.時間( )
- pd_time = e - s
- print( "PyPolars の固有時間 = {}" .format(pd_time))
- PyPolarsユニーク 時間= 1.0320448875427246
- ウォールタイム:1.03秒
保存データ:- s =時間.時間( )
- df_pandas.to_csv( "delete_1May.csv" 、インデックス= False )
- e =時間.時間( )
- pd_time = e - s
- print( "Pandas の時間節約 = {}" .format(pd_time))
- パンダの時間の節約= 779.0419402122498
-
- s =時間.時間( )
- df_pypolars.to_csv( "delete_1May.csv" )
- e =時間.時間( )
- pd_time = e - s
- print( "PyPolars の時間の節約 = {}" .format(pd_time))
- 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として明記してください。] |