データ処理ライブリのpandas 1.0.0がリリースされました!

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

オープンソースのデータ処理ライブラリである、pandas 1.0.0がリリースされました! このリリースには多くの機能追加やバグ修正、パフォーマンス改善、後方互換のない変更や廃止された機能の削除等が含まれています。

当エントリではいくつか気になる追加機能等をピックアップして見ていきます。全ての更新内容についてはドキュメントからご確認ください。

pandas 1.0.0 では、様々な改善とともに後方互換のない変更や前のバージョンで廃止された機能の削除も多く含まれています。pandas 1.0.0にアップデートする際には、まずpandas 0.25で警告(warning)が出ずに動く確認をすることが推奨されています。

追加機能

rolling.apply と expanding.apply で Numba が利用可能に

rolling.applyexpanding.applyengineNumbaが利用可能になりました。100万行以上のようなデータにおいてパフォーマンスの大幅な改善が期待できるようです。

ローリング操作でカスタムウインドウが利用可能に

pandas.api.indexers.BaseIndexerを利用して、カスタムウインドウの定義が可能となりました。パラメータに応じて行ごとにウインドウサイズを変更するといった、より自由なローリング操作が可能となります。

DataFrameをマークダウン形式に変換可能に

DataFrameからマークダウン形式の表を出力することができるようになりました。DataFrameでデータを集計し、その要約データをマークダウン形式で出力するといったことが簡単にできるようになります。

実験的な追加機能

今回のリリースで実験的に追加された機能が幾つかあります。ここではそのうちのpd.NAについてのみ紹介します。

実験的(experimental)機能は予告なく仕様が変更される場合があります。使用する際には注意が必要です。

欠損値を表現するための pd.NA

これまでfloatにはnp.nanが、object-dtypeにはnp.nanやNoneが、datetime系のデータにはpd.Natが使用されていました。今回のリリースで追加されたpd.NAの目的は、各型で欠損していることを示す値として共通で使えるようにすることのようです。

np.nanとpd.NAは次のように挙動が異なるようです。

pd.NA以外にも追加された機能があります。以下のドキュメントからご確認ください。

機能廃止

pandas 1.0からはSemantic Versioningを少し変えたものがpandasのバージョンリリースに採用されるようです。マイナーリリースで廃止(Deprecation)が導入されて、メジャーリリースで強制されるようです。実験的な機能以外の破壊的なAPIの変更はメジャーリリース(1.0.0や2.0.0など)のみで行われます。

また、今回のアップデートではこれまでに廃止とマークされた多くの機能が削除されているのと同時に、新たに廃止とマークされた機能も多くあります。

パフォーマンス改善

DataFrameでの算術演算や比較演算のパフォーマンス向上をはじめとした、いろいろなパフォーマンス改善があります。各改善には対応するissueやプルリクのリンクが掲載されています。その中にベンチマーク結果があるものが多いので、どういう改善によってどれくらいよくなったのか知ることができます。

バグ修正

修正されたバグの一覧がカテゴリごとに記載されています。記載されているバグの数を数えてみたところ、少なくとも100個以上はありました。前から気になっていたバグが合った場合は、探してみると、修正されているかもしれません。

やってみる

pandasをアップデートし、気軽に試せそうなDataFrameのマークダウン化機能を使ってみます。

pipを使ってるので、以下のコマンドでアップデートします。

pip install -U pandas

importし、バージョンを確認してみます。

import pandas as pd
pd.__version__

numpyで生成したランダムな数値列からDataFrameを作成します。

import numpy as np
df = pd.DataFrame(np.random.random((1000, 5)), columns=('a', 'b', 'c', 'd', 'e'))
df.describe()

データフレームの要約内容をマークダウン化してみます。

print(df.describe().to_markdown())

コピーしたマークダウンを貼り付けると、当然、次のように表形式で表示されます。

a b c d e
count 1000 1000 1000 1000 1000
mean 0.503029 0.512243 0.498299 0.488741 0.484092
std 0.287961 0.290322 0.288757 0.28516 0.289774
min 0.00266296 0.000143998 0.00139717 0.00029321 0.00139039
25% 0.252581 0.262014 0.246478 0.244841 0.221407
50% 0.506324 0.508858 0.504148 0.481039 0.473995
75% 0.749143 0.770178 0.752671 0.724446 0.733732
max 0.998502 0.999224 0.998614 0.999797 0.999316

ファイルオブジェクトを渡すことで、ファイルに書き出すこともできます。

with open('./sample.md', 'w') as f:
    df.describe().to_markdown(f)

ImportError: Missing optional dependency 'tabulate'.

to_markdown()を使う際に次のようなエラーが出る場合は、astanin/python-tabulateのインストールが必要です。

pipでtabulateをインストールすることでto_markdown()を使えるようになります。

pip install tabulate

さいごに

pandas 1.0.0のリリース内容を紹介しました。かなり多くの変更が含まれているので、アプリケーションやシステムで使用しているものをすぐにアップデートして使うというのは難しいかもしれません。ノートブックでのEDAや実験スクリプトでは積極的に使用し、早速恩恵を受けたいところです。