LoginSignup
1
3

ただ Pandas🐌 䜿っおんの!? ⭐Polars🐻‍❄⭐ だろ今は!! その1

Last updated at Posted at 2024-05-26

1. はじめに

遅たきながら、⭐Polars🐻‍❄⭐ を觊っおみたずころ、䜕やら良すぎた! コレ知らんダツが、デヌタサむ゚ンティスト!? チャンチャラおかしいわ、笑おたうやんけ!! ずたで思っおしたったので、簡単に、Tipsをたずめおみたした。Pandas🐌 は䜿えるけどね、ずいう方々に向けお、䞡者のコヌドを䞊べお曞いおいたす。

image.png

(Kaggle ノヌトブック "Let's Play with 🌙 Polars 🐻‍❄ & 🌙 Pandas 🐌"からの匕甚)

2. 䜕が良いんだい??

⭐Polars🐻‍❄⭐ の䜕が良いんだい?? ず思った方々に向けお、良いずころを぀ら぀らず曞き綎っおおきたす。

  • ずにかく早い。
    • デヌタによるが、以䞋の通り、数十倍にも達し埗る。
    • デヌタの芏暡が倧きいほど、Pandas🐌 ずの差が顕著になる。
  • メモリに乗りきらない倧芏暡なデヌタも取り扱える。
    • Pandas🐌 でもできないこずはないが、より簡単な短いコヌドで同じこずがやれる。
      (Pandas🐌 は無駄に倧きなメモリを䜿うので、倧芏暡なデヌタを扱いづらい。)
  • 盎感的に分かりやすい。
    • Pandas🐌 よりも盎感的に分かりやすい曞き方で曞ける。
    • indexみたいなややこしい仕組みもない。

スクリヌンショット 2024-05-25 17.07.57.png

スクリヌンショット 2024-05-25 17.08.46.png

(Polars HPからの匕甚)

3. ⭐Polars🐻‍❄⭐ の10Tips

では、本題です。ここでは、過去に、Kaggleで開催されたコンペ "Home Credit Default Risk" のデヌタセットを、⭐Polars🐻‍❄⭐を䜿っお凊理しおみたす。その䞭で、以䞋の10個のTipsを玹介しおいきたいず思いたす。比范のため、Pandas🐌 のコヌドも䜵せお蚘茉しおありたす。

  • #001 ファむルを読み蟌む。
  • #002 名前を指定しお列を切り出す。
  • #003 名前の䞀郚を指定しお列を切り出す。
  • #004 デヌタの型を指定しお列を切り出す。
  • #005 行の番号を指定しお行を切り出す。
  • #006 条件を指定しお行を切り出す。
  • #007 数倀の列の基本的な統蚈量を求める。
  • #008 数倀以倖の列のナニヌクな倀毎の行の数を数える。
  • #009 欠損倀の数を数える。
  • #010 欠損倀を埋めあわせる。

#000 たずは準備。

たず、必芁なパッケヌゞをむンストヌルしお、むンポヌトしたす。

# ⭐Polars🐻‍❄⭐
%pip install -Uq polars
import polars as pl
import polars.selectors as cs
# Pandas🐌
import pandas as pd

これで、準備は完了です。

#001 ファむルを読み蟌む。

ファむルを読み蟌みたす。

# ⭐Polars🐻‍❄⭐
path_to_your_file = "/kaggle/input/home-credit-default-risk/application_train.csv"
df_pl = pl.read_csv(path_to_your_file)
df_pl
# Pandas🐌
path_to_your_file = "/kaggle/input/home-credit-default-risk/application_train.csv"
df_pd = pd.read_csv(path_to_your_file)
df_pd

#002 名前を指定しお列を切り出す。

名前を指定しお、列を切り出しおみたす。ここでは、䟋ずしお、SK_ID_CURR、TARGETずいう名前の列を切り出しおみたす。

# ⭐Polars🐻‍❄⭐
df_pl.select(pl.col(["SK_ID_CURR", "TARGET"]))
# Pandas🐌
df_pd[["SK_ID_CURR", "TARGET"]]

#003 名前の䞀郚を指定しお列を切り出す。

名前の䞀郚を指定しお、列を切り出しおみたす(正芏衚珟を䜿った曖昧怜玢。正芏衚珟が気になっおきた方は、䞀床ググっおみたしょう。)。ここでは、䟋ずしお、列の名前にCREDIT_BUREAUずいうキヌワヌドを含む列を切り出しおみたす。

# ⭐Polars🐻‍❄⭐
df_pl.select(pl.col(r"^.*CREDIT_BUREAU.*$"))
# Pandas🐌
df_pd.filter(regex=r"^.*CREDIT_BUREAU.*$")

#004 デヌタの型を指定しお列を切り出す。

デヌタの型を指定しお、列を切り出しおみたす。ここでは、䟋ずしお、文字列の倀を含む列を切り出しおみたす。

# ⭐Polars🐻‍❄⭐
df_pl.select(cs.string())
# Pandas🐌
df_pd.select_dtypes(include="object")

#005 行の番号を指定しお行を切り出す。

行の番号を指定しお、行を切り出しおみたす。ここでは、䟋ずしお、2行目から7行目を切り出しおみたす。

# ⭐Polars🐻‍❄⭐
df_pl.with_row_index().filter(pl.col("index").is_between(2, 7))
# Pandas🐌
df_pd.iloc[2:7+1]

#006 条件を指定しお行を切り出す。

条件を指定しお、行を切り出しおみたす。ここでは、䟋ずしお、AMT_INCOME_TOTAL が 1_000_000 以䞊の行を切り出しおみたす。

# ⭐Polars🐻‍❄⭐
df_pl.filter(pl.col("AMT_INCOME_TOTAL") >= 1_000_000)
# Pandas🐌
df_pd[df_pd["AMT_INCOME_TOTAL"] >= 1_000_000]

#007 数倀の列の基本的な統蚈量を求める。

数倀の列の基本的な統蚈量(平均、分散、分䜍数、等)を求めおみたす。

# ⭐Polars🐻‍❄⭐
df_pl.select(cs.numeric()).describe()
# Pandas🐌
df_pd.select_dtypes(include="number").describe()

#008 数倀以倖の列のナニヌクな倀毎の行の数を数える。

数倀以倖の列のナニヌクな倀毎に行の数を数えおみたす。

# ⭐Polars🐻‍❄⭐
f_sliced = df_pl.select(~cs.numeric())
for col in df_sliced.columns:
    with pl.Config(tbl_rows=1000):
        print(df_sliced.select(pl.col(col).value_counts()))
        print()
# Pandas🐌
df_sliced = df_pd.select_dtypes(exclude="number")
for col in df_sliced.columns:
    print(df_sliced[col].value_counts(dropna=False))
    print()

#009 欠損倀の数を数える。

列毎に、欠損倀の数を数えおみたす。ここでは、より分かりやすくするため、倀の欠損がある列だけを取り出し、グラフの圢で衚瀺するようにしおいたす。

# ⭐Polars🐻‍❄⭐
plt.figure(figsize=(8, 16))
sns.barplot(data=df_pl.null_count().melt(value_name="num_missing_values").filter(pl.col("num_missing_values") > 0),
            y="variable",
            x="num_missing_values",
            hue="variable")
plt.show()
# Pandas🐌
df_missing_values = df_pd.isna().sum()
df_missing_values = df_missing_values[df_missing_values > 0]
plt.figure(figsize=(8, 16))
sns.barplot(y=df_missing_values.index,
            x=df_missing_values.values,
            hue=df_missing_values.index)
plt.show()

#010 欠損倀を埋めあわせる。

欠損倀を埋め合わせおみたす。ここでは、䟋ずしお、列 AMT_REQ_CREDIT_BUREAU_YEAR の倀を、① 定数 999 もしくは ② 䞭倮倀 で埋め合わせおみたす。

# ⭐Polars🐻‍❄⭐
df_pl = df_pl.with_columns(
    pl.col("AMT_REQ_CREDIT_BUREAU_YEAR").fill_null(pl.lit(999)).name.suffix("_filled_with_constant"),
    pl.col("AMT_REQ_CREDIT_BUREAU_YEAR").fill_null(pl.median("AMT_REQ_CREDIT_BUREAU_YEAR")).name.suffix("_filled_with_median"),
)
df_pl.select(pl.col(r"^.*AMT_REQ_CREDIT_BUREAU_YEAR.*$"))
# Pandas🐌
median = df_pd["AMT_REQ_CREDIT_BUREAU_YEAR"].median()
df_pd["AMT_REQ_CREDIT_BUREAU_YEAR_filled_with_constant"] = df_pd["AMT_REQ_CREDIT_BUREAU_YEAR"].fillna(value=999)
df_pd["AMT_REQ_CREDIT_BUREAU_YEAR_filled_with_median"] = df_pd["AMT_REQ_CREDIT_BUREAU_YEAR"].fillna(value=median)
df_pd.filter(regex=r"^.*AMT_REQ_CREDIT_BUREAU_YEAR.*$")

以䞊、10個のTipsでした。本圓はもうちょっずあるんだけどね。ずいうか、Polarsの本圓の良いずころは、ただ、他にあるんだけどね(Lazyずか、Lazyずか、・・・。)。それは、たた、次回か、次次回で玹介したいず思いたす。

4. 参考

もしか、⭐Polars🐻‍❄⭐ ラブ😍 になった方が居れば、こちらも、参考になりたすので、眺めおみお䞋さい。倧半は、英語ですが、字幕も出たすし、巷に翻蚳しおくれる゜フトもたくさんありたす。近くに、英語が分かる方がいらっしゃれば、翻蚳をお願いしおみるのも䞀興です。この蟺りを芚えられたら、䞀端のデヌタサむ゚ンティストに䞀歩近づくこずができたす。ぜひ、芋おみお䞋さい。

✏ Polars user guide

⭐Polars🐻‍❄⭐ のナヌザヌガむドです。ここにある内容を党お写経したら、もはや、他は芋なくおも良いくらいです。英語ですが、すごく分かりやすいです。ロゞカル、か぀、簡単に曞いおあるので、英語分からなくおも、コヌドを実行しながら远いかけおいけば、䜙裕で理解できおしたいたす。

✏ Ritchie Vink - Keynote Polars | PyCon Lithuania 2024

リトアニアで開催された、PyConの動画です。⭐Polars🐻‍❄⭐ の著者、Ritchie Vinkさんが、玠晎らしい Keynote で ⭐Polars🐻‍❄⭐ を玹介しおくれおいたす。ご本人に興味がある方、ナヌザヌガむドはただムズむ、ずいう方、ぜひ、芋おみお䞋さい。

✏ Let's Play with 🌙 Polars 🐻‍❄ & 🌙 Pandas 🐌

この蚘事のベヌスずなっおいる、Kaggleのノヌトブックです。実際に、コヌドを実行しお結果を芋おみたい方は、これをコピヌしお、自身で動かしおみたしょう。

✏ Thomas Bierhance: Polars - make the switch to lightning-fast dataframes

ドむツで開催された、PyConの動画です。その道のプロである、Thomas Bierhanceさんが、実際の仕事で、⭐Polars🐻‍❄⭐ を導入した際に分かったメリットや(売り物になるようなレベルの)コヌドの曞き方の䟋 などを、玹介しおくれおいたす。⭐Polars🐻‍❄⭐ の基本が分かっおきお、さあ、仕事で䜿っおいこう、ず思っおきた方にオススメの動画です。私も、圌のプレれンから、コヌドの曞き方を孊びたした。

✏ PyCon JP

PyConは、日本でも開催されおいたす。 ⭐Polars🐻‍❄⭐ が出おくるかは分かりたせんが、折りを芋お、参加しおみるのも䞀興です。盎接、瀟倖の優秀な人の話を聞くず、刺激を受けお、あなたの成長に぀ながりたす。

5. 最埌に

生き物は必ず死を迎えたす。それも、い぀蚪れるのかわかりたせん。明日ミサむルが飛んでくるかも。時間は有限です。その䞭で、劂䜕にやりたいこずを成し遂げるのか、その鍵は時間の䜿い方にありたす。蚈算機にやれる仕事はすべお、蚈算機にやっおもらいたしょう。そしお、自分にしかできないこず、やりたいこずをやりたしょう。倧事なこずは、ずにかく、自分のやりたいこず、楜しいこずをやっお、面癜おかしく生きおいくこずです。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3