「Pandas 2.1の新機能」

Pandas 2.1 New Features

新リリースに関する最も興味深いこと

Photo by Lukas W. on Unsplash

pandas 2.1 は2023年8月30日にリリースされました。このリリースで導入されることや、pandasのワークロードの改善にどのように役立つのかを見てみましょう。これにはたくさんの改善点や新しい非推奨機能も含まれています。

pandas 2.1 は、pandas 2.0 で利用可能になった PyArrow の統合に重点を置いています。pandas 3.0 でデフォルトになることが期待されている新機能のサポートを大幅に強化することに注力しました。これがあなたにとってどういう意味を持つのか、詳しく見ていきましょう。最も重要な改善点を詳細に見ていきます。

私はpandasのコアチームの一員です。私はCoiledでオープンソースエンジニアとして働いており、pandasの統合を改善するためにDaskに取り組んでいます。

文字列列でのNumPyオブジェクトdtypeの回避

pandasの主な課題の一つは、効率の悪い文字列表現です。私たちはかなりの時間をかけてこの課題に取り組んできました。最初のPyArrowバックドの文字列dtypeは、pandas 1.3 で利用可能になりました。これにより、メモリ使用量を約70%削減し、パフォーマンスを向上させることができます。私は以前の投稿の中で、メモリの比較やパフォーマンスの測定など、このトピックをより詳しく探求しました(要約すると、印象的です)。

私たちは、すべての文字列列をPyArrow配列に格納する新しい設定オプションを導入することにしました。これにより、文字列列のキャストについて心配する必要はありません。これは自動的に機能します。

このオプションを以下のようにオンにすることができます:

pd.options.future.infer_string = True

この挙動は pandas 3.0 でデフォルトになりますので、文字列列は常に PyArrow でバックアップされます。このオプションを使用するためには、PyArrowをインストールする必要があります。

PyArrowはNumPyのオブジェクトdtypeとは異なる挙動をするため、詳細を把握するのに苦労することがあります。私たちは、このオプションで使用される文字列dtypeをNumPyのセマンティクスと互換性があるように実装しました。これは、NumPyのオブジェクト列とまったく同じように振る舞います。皆さんにもぜひお試しいただきたいです。

改善されたPyArrowのサポート

pandas 2.0 でPyArrowバックドのDataFrameを導入しました。私たちの主な目標の一つは、過去数カ月間においてpandas内での統合を改善することでした。NumPyバックドのDataFrameからの切り替えを可能な限り容易にすることを目指しました。これには、パフォーマンスのボトルネックの修正に重点を置きました。これにより、予期しないスローダウンが発生することがありました。

以下は例です:

import pandas as pdimport numpy as npdf = pd.DataFrame(    {        "foo": np.random.randint(1, 10, (1_000_000, )),        "bar": np.random.randint(1, 100, (1_000_000,)),    }, dtype="int64[pyarrow]")grouped = df.groupby("foo")

このDataFrameは100万行と10のグループを持っています。パフォーマンスをpandas 2.0.3とpandas 2.1で比較してみましょう:

# pandas 2.0.310.6 ms ± 72.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)# pandas 2.1.01.91 ms ± 3.16 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

この特定の例では、新しいバージョンの方が5倍速いです。merge は、今回もより高速になります。PyArrowバックドのDataFrameの体験が大幅に改善されたことを期待しています。

Copy-on-Write

Copy-on-Writeは、pandas 1.5.0 で初めて導入され、pandas 3.0 でデフォルトの挙動になることが期待されています。Copy-on-Writeは、すでにpandas 2.0.xで良い経験を提供します。私たちは主に既知のバグの修正と高速化に注力しました。今すぐ本番環境でこのモードを使用することをおすすめします。Copy-on-Writeについては、Copy-on-Writeが何であり、どのように動作するかを説明した一連のブログ記事を書いています。これらのブログ記事では、Copy-on-Writeの内部動作や挙動について詳しく解説しており、パフォーマンスや挙動についての期待値も説明しています。

Copy-on-Writeは、実世界のワークフローのパフォーマンスを50%以上向上させることがわかりました。

setitemのような操作での暗黙のアップキャストの非推奨化

過去のバージョンでは、pandasは、互換性のない値を設定すると、自動的に列のdtypeを変更していました。例を見てみましょう:

ser = pd.Series([1, 2, 3])0    11    22    3dtype: int64

整数のSeriesがあり、それにより整数のdtypeが得られます。次に、2番目の行に文字"a"を設定します:

ser.iloc[1] = "a"0    11    a2    3dtype: object

これにより、Seriesのdtypeがobjectに変更されます。Objectは、整数と文字列を保持できる唯一のdtypeです。これは多くのユーザーにとって大きな問題です。Object列は多くのメモリを使用し、計算が機能しなくなり、パフォーマンスが低下し、その他の問題が発生します。内部的には、これらの問題に対応するために多くの特殊なケースが追加されました。過去には、DataFrameでのdtypeの暗黙の変更は、私にとって大きな迷惑でした。この振る舞いは今後廃止予定であり、FutureWarningが発生します:

FutureWarning: 互換性のないdtypeの項目の設定は廃止予定であり、pandasの将来のエラーで発生します。値 'a' のdtypeはint64と互換性がないため、最初に互換性のあるdtypeに明示的にキャストしてください。  ser.iloc[1] = "a"

上記の例のような操作は、pandas 3.0ではエラーが発生します。DataFrameの列のdtypeは、異なる操作を介して一貫して維持されます。dtypeを変更する場合は、明示的に指定する必要があります。これにより、将来の開発者にとっても理解しやすくなりますが、コードが少し増えることになります。

この変更はすべてのdtypeに影響します。たとえば、浮動小数点値を整数列に設定すると、同様にエラーが発生します。

新バージョンへのアップグレード

新しいpandasバージョンをインストールするには、次のコマンドを使用します:

pip install -U pandas

または:

mamba install -c conda-forge pandas=2.1

これにより、環境に新しいリリースがインストールされます。

結論

効率的なコードを書くのに役立ついくつかの改善点を見てきました。パフォーマンスの向上、PyArrowをバックエンドとする文字列列への簡単なオプトイン、Copy-on-Writeのさらなる改善などが含まれます。また、次のメジャーリリースでpandasの振る舞いが予測しやすくなるための廃止予定も確認しました。

お読みいただきありがとうございました。ご意見やフィードバックをお寄せください。

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