Pandas 2.0 データサイエンティストにとってのゲームチェンジャー?

Is Pandas 2.0 a game changer for data scientists?

効率的なデータ操作のトップ5の特徴

4月に、pandas 2.0.0が正式にリリースされ、データサイエンスコミュニティで大きな話題を呼びました。写真提供:Yancy Min on Unsplash

多機能で柔軟性が高いため、pandasは、あらゆるデータサイエンティストの心に特別な場所を確保しました。

データ入出力からデータクリーニングと変換まで、import pandas as pdを使用せずにデータ操作を考えることはほぼ不可能でしょう。

今回は、LLMに関する過去数か月の話題に追われて、pandasがメジャーリリースを行ったことを見逃してしまったのですが、pandas 2.0がリリースされ、大きな注目を集めました。

私はその話題を知らなかったのですが、データ中心のAIコミュニティが promptly に駆けつけてくれました:

2.0のリリースは、新しいバージョンに追加された修正を称賛する多くのユーザーがいるため、データサイエンスコミュニティにかなりの影響を与えたようです。著者によるスクリーンショット。

面白いことに:あなたはこのリリースが驚くべき3年間の準備の結果であることを知っていましたか?それこそが「コミュニティへの取り組み」だと私は呼びます!

では、pandas 2.0はどのような特徴を持っているのでしょうか?さっそく見ていきましょう!

1. パフォーマンス、スピード、およびメモリ効率

私たちは皆、pandasnumpyを使用して構築されていることを知っています。ただし、numpyはデータフレームライブラリのために意図的に設計されたわけではありませんでした。そのため、pandasの主要な制限の1つは、大規模なデータセットのメモリ内処理を扱うことでした。

このリリースでは、Apache Arrowをpandasデータのバックエンドとして導入することで大きな変化がありました。

Arrowは、いくつかのプログラミング言語(C、C++、R、Pythonなど)に対応した標準化されたインメモリのカラム形式のデータフォーマットです。Pythonでは、C++実装に基づくPyArrowがあり、そのために速いです!

つまり、長い話を短くすると、PyArrowは以前のバージョン1.Xのメモリ制限を解決し、特に大規模なデータセットに対してより高速でメモリ効率の良いデータ操作を実行することを可能にします。

ここでは、Hacker Newsデータセットを使用して、pyarrowバックエンドを使用してデータを読み込む場合と使用しない場合の比較を示します。これは約650 MBのデータ(ライセンスCC BY-NC-SA 4.0)です:

read_csv()の比較:pyarrowバックエンドを使用すると35倍速くなります。著者によるスニペット。

新しいバックエンドを使用すると、データの読み込みがほぼ35倍速くなります。その他のポイントとしては、次のとおりです。

  • pyarrowバックエンドを使用しない場合、各列/フィーチャは独自のデータ型で保存されます:数値フィーチャはint64またはfloat64として保存され、文字列値はobjectとして保存されます。
  • pyarrowを使用すると、すべてのフィーチャがArrowのdtypeを使用しています。つまり、[pyarrow]注釈と、int64float64stringtimestamp、およびdoubleなどの異なるデータ型があることに注意してください。

df.info(): 各DataFrameのデータ型を調査します。著者によるスニペット。

2. Arrowデータ型とNumpyインデックス

最も単純な場合であるデータの読み取りを超えて、文字列操作を含む一連の他の操作について、追加の改善が期待できます。 なぜなら、pyarrowの文字列データ型の実装が非常に効率的であるためです:

文字列操作の比較:arrowの実装の効率を示す。著者によるスニペット。

実際、Arrowには、numpyよりもデータ型が多く、科学的(数値)範囲外で必要なものがあります:日付、時間、期間、バイナリ、10進数、リスト、マップ。pyarrowでバックアップされたデータ型とnumpyデータ型の同等性を見てみることは、それらを活用する方法を学びたい場合には実際には良い演習になるかもしれません。

また、インデックスにより多くのnumpy数値型を保持できるようになりました。従来のint64uint64、およびfloat64は、numpy数値dtypesインデックスのすべてのnumpy数値dtypeインデックスのスペースを開きました。たとえば、32ビット版を指定できます:

32ビットnumpyインデックスを活用して、コードをよりメモリ効率的にします。著者によるスニペット。

これは、インデックスがpandasで最も使用される機能の1つであるため、pandasでフィルター、結合、およびシャッフルデータを含む他のデータ操作を可能にするため、歓迎すべき変更です。基本的に、Indexが軽量であれば、これらのプロセスはより効率的になります!

3. 欠損値の簡単な処理

numpyの上に構築されているため、pandasは欠損値を煩雑で柔軟な方法で扱うことが困難でした。なぜなら、numpyは一部のデータ型に対してnull値をサポートしていないためです。

たとえば、整数は自動的に浮動小数点数に変換されるため、理想的ではありません:

欠損値:floatに変換。著者によるスニペット。

pointsが1つのNone値を導入した後、int64からfloat64に自動的に変更されることに注意してください。

データフローにとって間違った型セットは最悪のことです、特にデータ中心のAIパラダイム内での場合です。

誤った型セットは、データの準備の決定に直接影響を与え、さまざまなデータチャンク間の非互換性を引き起こし、静かに渡す場合でも、返される意味のない結果を出力する一部の操作を危険にさらす可能性があります。

例えば、Data-Centric AI Communityでは、データプライバシーのための合成データに関するプロジェクトに取り組んでいます。機能の1つであるNOC(子供の数)には欠損値があり、データがロードされると自動的にfloatに変換されます。そのため、floatとしてジェネレーションモデルにデータを渡すと、2.5のような小数値が出力される可能性があります。数学者であり、2人の子供、新生児、奇妙なユーモアセンスを持っている場合を除いて、2.5人の子供を持つことは許容できません。

pandas 2.0では、dtype = 'numpy_nullable'を活用することで、欠損値を変更せずに考慮できます。したがって、オリジナルのデータ型(この場合はint64)を維持できます:

‘numpy_nullable’を活用して、pandas 2.0は元のデータ型を変更することなく欠損値を処理できます。著者によるスニペット。

微妙な変更のように思えるかもしれませんが、実際には、これは今後、pandasが欠損値を処理するために自分自身のバージョンを実装する必要がなくなるため、ネイティブにArrowの欠損値処理を使用できるようになったことを意味します。これにより、操作はpandasが各データ型のnull値を処理するための自己バージョンを実装する必要がなくなるため、はるかに効率的になります。

4. コピー・オン・ライト最適化

Pandas 2.0 は、DataFrame や Series オブジェクトのコピーを遅延させる新しいレイジーコピー機構を追加しました。

つまり、copy-on-write を有効にすると、一部のメソッドはコピーを行わずにビューを返すため、不必要なデータ複製を最小限に抑えることでメモリ効率が向上します。

ただし、チェインドアサインメントを使用する場合には特に注意が必要です。

コピー・オン・ライトモードが有効になっている場合、チェインドアサインメントは機能しないため、インデックス操作の結果として生成される一時オブジェクトを指すためです(コピー・オン・ライトではコピーとして動作します)。

copy_on_write無効になっている場合、スライシングなどの操作により、新しいデータフレームが変更された場合には、元の df が変更される可能性があります:

コピー・オン・ライトが無効にされた場合: チェインドアサインメントで元のデータフレームが変更されます。著者によるスニペット。

copy_on_write有効になっている場合、代入時にコピーが作成され、そのため 元のデータフレームは変更されません。 Pandas 2.0 は、これらの状況で ChainedAssignmentError を発生させて、サイレントバグを回避します:

コピー・オン・ライトが有効になっている場合: チェインドアサインメントで元のデータフレームは変更されません。著者によるスニペット。

5. オプション依存関係

pip を使用する場合、バージョン2.0 ではオプション依存関係をインストールできるため、カスタマイズやリソースの最適化においてプラスになります。

必要のないものにディスクスペースを使わずに、インストールを特定の要件に合わせることができます。

さらに、開発環境で他のパッケージとの互換性問題や競合の可能性を減らすことができ、依存関係の問題を解消することができます:

オプション依存関係のインストール。著者によるスニペット。

試してみる!

しかし、疑問が残ります。ブームは本当に正当化されているのでしょうか?日常的に使用するパッケージに対して、pandas 2.0 が大きな改善を提供しているのかどうかを確認するために、興味を持ちました。その中から、ydata-profilingを試すことにしました。コミュニティにとって必要不可欠な pandas 2.0 のサポートを追加したためです!新しいリリースでは、pandas 2.0 を使用している場合でもパイプラインが破損しないことが保証されるため、これは大きなプラスです!でも、その他には何があるのでしょうか?

正直に言えば、ydata-profiling は探索的データ分析のお気に入りのツールの1つであり、素早いベンチマークでもあります。私にとっては1行のコードですが、データサイエンティストとして計算を実行するための要素がたくさんあります。例えば、記述統計、ヒストグラムのプロット、相関関係の分析などです。

そこで、pyarrow エンジンのすべての影響を最小限に抑えて、それらすべての影響を試すのに最適なのは何でしょうか?

ydata-profiling によるベンチマーク。著者によるスニペット。

再度、データの読み取りは明らかに pyarrow エンジンを使用する方が良いですが、データプロファイルの作成については、速度に大きな変化はありません。

ただし、メモリ効率に関しては、別の分析を実行する必要があります。また、データに対して実行される分析の種類を調べることもできます。一部の操作では、1.5.2 と 2.0 バージョンの違いは無視できる程度です。

しかし、この点で重要な違いがあることに気づいたのは、ydata-profiling がまだ pyarrow のデータ型を活用していないことです。 この更新により、スピードとメモリの両方に大きな影響を与えることができ、将来の開発に期待しています!

結論:パフォーマンス、柔軟性、相互運用性!

この新しいpandas 2.0リリースでは、「ハッチの下」で微妙で重要な修正が行われ、柔軟性とパフォーマンスの最適化が多く提供されます。

データ操作の分野に新参者にとっては「派手ではない」かもしれませんが、以前のバージョンの制限を克服するために手段を尽くしていたベテランデータサイエンティストにとっては、まさに砂漠に水のようなものです。

それでは、新しいリリースで導入された主要な利点は次のとおりです。

  • パフォーマンスの最適化:Apache Arrowバックエンドの導入、より多くのnumpy dtypeインデックス、および書き込み時にコピーするモードの導入により、
  • 柔軟性とカスタマイズ性の向上:オプションの依存関係を制御し、Apache Arrowデータ型(最初からnullabilityを含む!)を活用することができます。
  • 相互運用性:新しいバージョンの「評価の高くない」利点かもしれませんが、大きな影響を与えます。Arrowは言語に依存しないため、Apache Arrowバックエンドを使用するPythonだけでなく、R、Spark、その他のプログラム間でインメモリデータを転送できます!

以上です!pandas 2.0のデータ操作タスクへの適用可能性について、いくつかの疑問が解消されたことを願っています。

皆さんは、pandas 2.0の導入により、日々のコーディングに大きな違いを見つけたかどうかもまだ興味があります!もしよろしければ、私に会いにData-Centric AI Communityに来て、ご意見をお聞かせください! そこでお会いしましょうか?

私について

博士号、機械学習研究者、教育者、データアドバイザー、そして全体的に「何でも屋」。VoAGIでは、Data-Centric AIおよびData Qualityについて書き、データサイエンス&機械学習コミュニティに、不完全なデータから知的データへの移行方法を教育しています。

YData Developer Relations | Data-Centric AIコミュニティ | GitHub | Instagram | Google Scholar | LinkedIn

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more