見出し画像

Polarsデータフレームをseabornで可視化する

Pythonのデータフレームライブラリとして、Polarsはその使いやすさと高速性で人気が高まっています。しかし、データ可視化ライブラリのseabornは現状ではpandas向けに設計されている部分もあるため、Polarsのデータをseabornで使う際には工夫が必要です。

この記事では、Polarsのデータをseabornで可視化した際につまずいた点とその解決方法をいくつか紹介します。


▍Polarsの特徴と簡単な対処方法

Polarsとpandasの大きな違いの一つに、Polarsにはインデックスがないことが挙げられます。そのため、seabornなどの他のライブラリがインデックスを前提に設計されている場合には工夫が求められます。

このような工夫を毎回行うのは大変なので、seabornで可視化する際にはいったんPolarsからpandasに変換するのが最も手っ取り早い方法です。

▍対処例

ここではtitanicのデータセットで棒グラフ、ヒートマップ、散布図行列を例にします。

# 準備
import polars as pl
import pandas as pd
import seaborn as sns

# titanicデータセットをPolarsデータフレームに変換
df = pl.DataFrame(sns.load_dataset("titanic"))

■ 棒グラフ

Polarsのデータフレームをseabornのbarplotで使う場合、軸ラベルのデータ型に注意が必要です。軸ラベルがString型だとエラーになるため、Categorical型に変換します。

# 集計
df_bar = df.group_by("who").agg(count=pl.len())

# whoはString型でエラーが発生
# sns.barplot(df_bar, x="who", y="count")
# RuntimeError: Encountered an exception when converting data source to a pandas DataFrame

# whoをCategorical型に変換して可視化
df_bar_cat = df_bar.cast({"who": pl.Categorical})
sns.barplot(df_bar_cat, x="who", y="count")

# データフレームpandasに変換して可視化
sns.barplot(df_bar.to_pandas(), x="who", y="count")

ちなみに、エラーメッセージからseabornは与えられたデータをpandasのデータフレームに変換しようとしていることが分かります。

■ ヒートマップ

まず、今回ヒートマップに使用するデータを紹介します。

# 集計
df_heat = df.pivot(index="who", columns="class", values="survived", aggregate_function="len")
ヒートマップ用に集計したデータ

who列をインデックスに指定すると、Seabornのheatmapをスムーズに利用できます。しかし、Polarsではインデックスを指定できないため、インデックスを軸ラベル(yticklabels)として別途指定する必要があります。また、列名も読み取られないので、それも軸ラベル(xticklabels)として明示的に指定します。

# ラベルを指定しない場合、0から連番が振られる
# sns.heatmap(
#     df_heat.drop("who"),
# )

# ラベルを指定して可視化
sns.heatmap(
    df_heat.drop("who"),
    xticklabels=df_heat.drop("who").columns,
    yticklabels=df_heat["who"]
)

# データフレームをpandasに変換して可視化(whoをインデックスに指定)
sns.heatmap(df_heat.to_pandas().set_index("who"))

pandasに変換した方が可読性が高いです。

■ 散布図行列

seabornのpairplotはpandasデータフレームを前提としています。Polarsデータフレームを使用すると以下のエラーが発生します。

TypeError: 'data' must be pandas DataFrame object, not: <class 'polars.dataframe.frame.DataFrame'>
# 列を選択
df_pair = df.select(["survived", "age", "fare"])

# データフレームをpandasに変換して可視化
sns.pairplot(df_pair.to_pandas(), hue="survived")

▍おわりに

Polarsの高速性と使いやすさは魅力的ですが、seabornとの組み合わせでは工夫が必要なこともあります。簡単で共通的な対処方法は、可視化の前にPolarsデータフレームをpandasデータフレームに変換することです。

今後、他のライブラリもPolarsに対応していくことが期待されますが、それまでの暫定対応としてこの記事が参考になればうれしく思います。

ご精読いただき、ありがとうございました!


私たちのデジタル技術活用の記事は以下のマガジンにあります。ぜひご覧ください!

いいなと思ったら応援しよう!