Slide 1

Slide 1 text

Polars入門 (Python Kansai #03 with Mix Leap Study #74) 桂川大輝

Slide 2

Slide 2 text

自己紹介 ● 名前:桂川大輝(GitHub:daikikatsuragawa[1]) ● 職業:機械学習エンジニア/サーバーサイドエンジニア ● 使用頻度の高いプログラミング言語:Python ○ Pythonのエコシステムの全てにお世話になっています 🙇(頭が上がらない) ● 住所:京都府京都市(Kansai) 2 [1] daikikatsuragawa (Daiki Katsuragawa)(https://github.com/daikikatsuragawa)

Slide 3

Slide 3 text

自己紹介 ● 名前:桂川大輝(GitHub:daikikatsuragawa[1]) ● 職業:機械学習エンジニア/サーバーサイドエンジニア ● 使用頻度の高いプログラミング言語:Python ○ Pythonのエコシステムの全てにお世話になっています 🙇(頭が上がらない) ● 住所:京都府京都市(Kansai) 3 [1] daikikatsuragawa (Daiki Katsuragawa)(https://github.com/daikikatsuragawa) Python×Kansaiなエンジニア🤝

Slide 4

Slide 4 text

発表における用語の整理(1/2) ● データフレーム ○ 表形式のデータ(例: Python Kansai[2]) 4 event_id event_name event_date 1 Python Kansai #01 2019/07/14 2 PYTHON KANSAI #02 2019/12/08 3 Python Kansai #03 with Mix Leap Study #74 2024/04/17 participant_id event_id 12345 1 23456 1 34567 1 … … 34567 3 [2] Python Kansai - connpass(https://kansai-python.connpass.com/)

Slide 5

Slide 5 text

発表における用語の整理(2/2) ● Pandas[3] ○ データフレームを扱うデファクトスタンダードとなっているライブラリ( 2008年〜) ○ データ操作(結合、集約など)が可能 ● Polars[4] ○ データフレームを扱うライブラリ( 2020年〜) ○ データ操作(結合、集約など)が可能 5 [3] pandas - Python Data Analysis Library(https://pandas.pydata.org/) [4] Polars — DataFrames for the new era(https://pola.rs/)

Slide 6

Slide 6 text

データフレームを使っていますか? 6

Slide 7

Slide 7 text

Pandasを使っていますか? 7

Slide 8

Slide 8 text

Polarsを使っていますか? 8

Slide 9

Slide 9 text

発表者にとってのPolars ● 〜2023年、Pandasのデータフレームを使用 ○ Polarsの把握はしていたが、入門には至っていない ○ デファクトスタンダードへの信頼 ○ 主にパフォーマンス面(処理速度、メモリ効率)で Pandasの扱いに苦戦(課題) ● 2024年〜、Polarsのデータフレームも使用(Polars入門) ○ 課題に対する打ち手として Polarsを検討 ○ 恩恵の大きさと懸念の小ささを理解し、 Polars入門に至る 9

Slide 10

Slide 10 text

発表者にとってのPolars ● 〜2023年、Pandasのデータフレームを使用 ○ Polarsの把握はしていたが、入門には至っていない ○ デファクトスタンダードへの信頼 ○ 主にパフォーマンス面(処理速度、メモリ効率)で Pandasの扱いに苦戦(課題) ● 2024年〜、Polarsのデータフレームも使用(Polars入門) ○ 課題に対する打ち手として Polarsを検討 ○ 恩恵の大きさと懸念の小ささを理解し、 Polars入門に至る 10 Pandasを使用していた発表者がPolars入門に至った決め手に基づいて 「Polars入門」をしたくなる話を紹介📣

Slide 11

Slide 11 text

発表の目的 ● (これまで〜これから)Pandasなどによって データフレームを扱う方々に、 「Polars入門」という選択肢を増やしてもらうこと 11 pip install polars

Slide 12

Slide 12 text

目次 ● Polarsの概要 ● Polarsの特徴(≒発表者がPolars入門に至った決め手) ● 最近のPolarsの情報 ● まとめ 12

Slide 13

Slide 13 text

目次 ● Polarsの概要 ● Polarsの特徴(≒発表者がPolars入門に至った決め手) ● 最近のPolarsの情報 ● まとめ 13

Slide 14

Slide 14 text

Polarsの概要 ● データフレームの扱いが高速なライブラリ ● 主要な実装はRust(おそらくrsはRust由来) ● 備考 ○ 発音:ポーラス[5] ○ 由来(おそらく): Pandas(パンダ🐼)に対するPolars(シロクマ󰴜) 14 [5] What is Polars? - YouTube(https://youtu.be/QfLzEp-yt_U?feature=shared)

Slide 15

Slide 15 text

目次 ● Polarsの概要 ● Polarsの特徴(≒発表者がPolars入門に至った決め手) ● 最近のPolarsの情報 ● まとめ 15

Slide 16

Slide 16 text

Polarsの特徴(≒発表者がPolars入門に至った決め手) ● 高速な処理 ● 高いメモリ効率 ● 難しくはない記述方法 ● 高い評価 ● 高い互換性 16 恩恵の大きさ 懸念の小ささ

Slide 17

Slide 17 text

Polarsの高速な処理 ● Polarsは高速な処理を実現[6] ● 高速な処理を実現できる理由(ざっくりと) ○ Rustによる実装 ○ マルチスレッドによる処理 ○ 遅延評価が可能(クエリ最適化を実現) 17 [6] Polars — TPCH Benchmark(https://pola.rs/posts/benchmarks-2023/)

Slide 18

Slide 18 text

Polarsの高速な処理(Pandasとの比較) ● あるデータ処理に基づいた Pandasとの実行時間の比較 ○ あるデータ処理: Polarsのドキュメントの例[7]を 参考として調整 18 [7] Index - Polars user guide(https://docs.pola.rs/#example)

Slide 19

Slide 19 text

Polarsの高速な処理 ● Polarsは高速な処理を実現[6] ● 高速な処理を実現できる理由(ざっくりと) ○ Rustによる実装 ○ マルチスレッドによる処理 ○ 遅延評価が可能(クエリ最適化を実現) 19 実行時間について悩んでいる、作業を効率化させたい方にとって、 高速な処理を実現させるPolarsは有用👍 [6] Polars — TPCH Benchmark(https://pola.rs/posts/benchmarks-2023/)

Slide 20

Slide 20 text

Polarsの高いメモリ効率 ● Polarsは高いメモリ効率を実現[6] ● 高いメモリ効率を実現できる理由(ざっくりと) ○ Arrowメモリフォーマット ○ 遅延評価が可能(クエリ最適化を実現) 20 [6] Polars — TPCH Benchmark(https://pola.rs/posts/benchmarks/)

Slide 21

Slide 21 text

Polarsの高いメモリ効率 ● Polarsは高いメモリ効率を実現[6] ● 高いメモリ効率を実現できる理由(ざっくりと) ○ Arrowメモリフォーマット ○ 遅延評価が可能(クエリ最適化を実現) 21 [6] Polars — TPCH Benchmark(https://pola.rs/posts/benchmarks/) メモリ効率について悩んでいる方にとって、 高いメモリ効率を実現させるPolarsは有用👍

Slide 22

Slide 22 text

● Polarsの記述方法はPandasに対して難しくはない Polarsの難しくはない記述方法(1/9) 22 処理 Pandas Polars インポート (以降の前提) import pandas as pd import polars as pl

Slide 23

Slide 23 text

● 以降、以下のデータフレームを想定 Polarsの難しくはない記述方法(2/9) 23 event_id event_name event_date 1 Python Kansai #01 2019/07/14 2 PYTHON KANSAI #02 2019/12/08 3 Python Kansai #03 with Mix Leap Study #74 2024/04/17 participant_id event_id 12345 1 23456 1 34567 1 … … 34567 3 events_df(イベント) participants_df(参加者)

Slide 24

Slide 24 text

● Polarsの記述方法はPandasに対して難しくはない Polarsの難しくはない記述方法(3/9) 24 処理 Pandas Polars データフレーム作成 # 省略版 events_df = pd.DataFrame( { "event_id": [1, 2], "event_name": [ "Python Kansai #01", "PYTHON KANSAI #02" ] } ) # 省略版 events_df = pl.DataFrame( { "event_id": [1, 2], "event_name": [ "Python Kansai #01", "PYTHON KANSAI #02" ] } )

Slide 25

Slide 25 text

● Polarsの記述方法はPandasに対して難しくはない Polarsの難しくはない記述方法(4/9) 25 処理 Pandas Polars CSV読み込み pd.read_csv("participants.csv") pl.read_csv("participants.csv") CSV読み込み (遅延評価) - pl.scan_csv("participants.csv") CSV書き出し participants_df.to_csv(" participants.csv", index=False ) participants_df.write_csv( "participants.csv" )

Slide 26

Slide 26 text

Polarsの難しくはない記述方法(5/9) ● Polarsの記述方法はPandasに対して難しくはない 26 処理 Pandas Polars 列の抽出 events_df[ ["event_name", "event_date"] ] events_df.select( ["event_name", "event_date"] ) 検索条件 participants_df[ (participants_df["event_id"] == 3) ] participants_df.filter( (pl.col("event_id") == 3) )

Slide 27

Slide 27 text

Polarsの難しくはない記述方法(6/9) ● Polarsの記述方法はPandasに対して難しくはない 27 処理 Pandas Polars 列の追加 (他列から特定) events_df[ "event_year" ] = pd.to_datetime( events_df["event_date"] ) events_df.with_columns( events_df[ "event_date" ].dt.year().alias("event_year") ) events_df.assign(**{ "event_year": pd.to_datetime( events_df["event_date"] ) })

Slide 28

Slide 28 text

Polarsの難しくはない記述方法(7/9) ● Polarsの記述方法はPandasに対して難しくはない 28 処理 Pandas Polars 列の追加 (定数) events_df["category"] = "Python" events_df.with_columns( pl.lit("Python").alias("category") ) events_df.assign(**{ "category": "Python" })

Slide 29

Slide 29 text

Polarsの難しくはない記述方法(8/9) ● Polarsの記述方法はPandasに対して難しくはない 29 処理 Pandas Polars 集計 participants_df.groupby( "event_id" ).agg( {"participant_id": "count"} ) participants_df.groupby( "event_id" ).agg( pl.count("participant_id") )

Slide 30

Slide 30 text

Polarsの難しくはない記述方法(9/9) ● Polarsの記述方法はPandasに対して難しくはない 30 処理 Pandas Polars 結合(横) events_df.join( participants_df, on="event_id", how="left" ) events_df.join( participants_df, on="event_id", how="left" ) 結合(縦) pd.concat( [participants_df, new_participants_df] ) pl.concat( [participants_df, new_participants_df] )

Slide 31

Slide 31 text

Polarsの難しくはない記述方法(9/9) ● Polarsの記述方法はPandasに対して難しくはない 31 処理 Pandas Polars 結合(横) events_df.join( participants_df, on="event_id", how="left" ) events_df.join( participants_df, on="event_id", how="left" ) 結合(縦) pd.concat( [participants_df, new_participants_df] ) pl.concat( [participants_df, new_participants_df] ) Pandasと比較しても特別に難しくはないため、 Polarsを使った処理の実装(Pandasからの置換)は容易👍

Slide 32

Slide 32 text

Polarsの高い評価 ● GitHub [8]のスター数よりPolarsの評価は高い (Pandasに近づきつつある) 32 GitHubのリポジトリ リリース年 GitHubのスター数 (2024/04/17現在) pandas-dev/pandas[9] 2008 41.9k pola-rs/polars[10] 2020 25.8k [8] GitHub: (https://github.com/) [9] pandas-dev/pandas: (https://github.com/pandas-dev/pandas) [10] pola-rs/polars: (https://github.com/pola-rs/polars)

Slide 33

Slide 33 text

Polarsの高い評価 ● GitHub [8]のスター数よりPolarsの評価は高い (Pandasに近づきつつある) 33 [8] GitHub: (https://github.com/) [9] pandas-dev/pandas: (https://github.com/pandas-dev/pandas) [10] pola-rs/polars: (https://github.com/pola-rs/polars) 近年の周囲からの評価は高く Polarsを導入する懸念は小さい👍 GitHubのリポジトリ リリース年 GitHubのスター数 (2024/04/17現在) pandas-dev/pandas[9] 2008 41.9k pola-rs/polars[10] 2020 25.8k

Slide 34

Slide 34 text

Polarsの高い互換性 ● Polarsに対応するライブラリが拡大中 ○ scikit-learn[11] ○ LightGBM[12] ● 少なくともPandasのデータフレームへの変換が可能 ○ to_pandas[13]メソッド 34 [11] Support other dataframes like polars and pyarrow not just pandas · Issue #25896 · scikit-learn/scikit-learn(https://github.com/scikit-learn/scikit-learn/issues/25896) [12] [python-package] Adding support for polars for input data · Issue #6204 · microsoft/LightGBM(https://github.com/microsoft/LightGBM/issues/6204) [13] polars.DataFrame.to_pandas — Polars documentation(https://docs.pola.rs/docs/python/dev/reference/dataframe/api/polars.DataFrame.to_pandas.html)

Slide 35

Slide 35 text

Polarsの高い互換性 ● Polarsに対応するライブラリが拡大中 ○ scikit-learn[11] ○ LightGBM[12] ● 少なくともPandasのデータフレームへの変換が可能 ○ to_pandas[13]メソッド 35 [11] Support other dataframes like polars and pyarrow not just pandas · Issue #25896 · scikit-learn/scikit-learn(https://github.com/scikit-learn/scikit-learn/issues/25896) [12] [python-package] Adding support for polars for input data · Issue #6204 · microsoft/LightGBM(https://github.com/microsoft/LightGBM/issues/6204) [13] polars.DataFrame.to_pandas — Polars documentation(https://docs.pola.rs/docs/python/dev/reference/dataframe/api/polars.DataFrame.to_pandas.html) 周辺ライブラリや既存の処理との互換性を考えても Polarsを導入する懸念は小さい👍(小さく導入できる)

Slide 36

Slide 36 text

目次 ● Polarsの概要 ● Polarsの特徴(≒発表者がPolars入門に至った決め手) ● 最近のPolarsの情報 ● まとめ 36

Slide 37

Slide 37 text

● Polarsの書籍の発表(英語) ○ Python Polars: The Definitive Guide[14] ○ Polars Cookbook: Over 70 practical recipes to transform, manipulate, and analyze your data using Python Polars[15] 最近のPolarsの情報(1/5) 37 [14] Python Polars: The Definitive Guide [Book](https://www.oreilly.com/library/view/python-polars-the/9781098156077/) [15] Amazon | Polars Cookbook: Over 70 practical recipes to transform, manipulate, and analyze your data using Python Polars | Kakegawa, Yuki | Data & Information Visualization(https://www.amazon.co.jp/Polars-Cookbook-practical-transform-manipulate/dp/1805121154)

Slide 38

Slide 38 text

● Polarsの書籍の発表(日本語) ○ 「前処理大全」の改訂新版で Polarsのコードを採用[16] 最近のPolarsの情報(2/5) 38 [16] 改訂新版 前処理大全〜 SQL/pandas/Polars実践テクニック:書籍案内|技術評論社( https://gihyo.jp/book/2024/978-4-297-14138-7)

Slide 39

Slide 39 text

● 競合とのパフォーマンス比較の更新(2024/04/16)[17] ○ 結論:引き続き競合よりも優れたパフォーマンスを実現 ○ 継続的に改善(※他スライドの言及の根拠は 2023年版) 最近のPolarsの情報(3/5) 39 [17] Polars — TPCH Benchmark(https://pola.rs/posts/benchmarks/)

Slide 40

Slide 40 text

● PanderaによるPolarsへの対応[18] ○ Pandera[19]:データフレームのバリデーションを       実現するライブラリ 最近のPolarsの情報(4/5) 40 [18] Data Validation with Polars - pandera documentation(https://pandera--1373.org.readthedocs.build/en/1373/polars.html#polars) [19] pandera documentation(https://pandera--1373.org.readthedocs.build/en/1373/index.html)

Slide 41

Slide 41 text

● GPU対応によるさらなる高速化を予定[20] ○ 現状、cuDF(GPUを使ったPandasの代替)[21]の 処理の方が高速[22] 最近のPolarsの情報(5/5) 41 [20] Polars — Polars データフレームの高速化( https://github.com/scikit-learn/scikit-learn/issues/25896) [21] Welcome to the cuDF documentation! — cudf 24.04.00 documentation(https://docs.rapids.ai/api/cudf/stable/) [22] pandas vs polars vs cudf 速度比較 - ざこぷろのメモ( https://zakopilo.hatenablog.jp/entry/2023/02/04/220552)

Slide 42

Slide 42 text

● GPU対応によるさらなる高速化を予定[20] ○ 現状、cuDF(GPUを使ったPandasの代替)[21]の 処理の方が高速[22] 最近のPolarsの情報(5/5) 42 [20] Polars — Polars データフレームの高速化( https://github.com/scikit-learn/scikit-learn/issues/25896) [21] Welcome to the cuDF documentation! — cudf 24.04.00 documentation(https://docs.rapids.ai/api/cudf/stable/) [22] pandas vs polars vs cudf 速度比較 - ざこぷろのメモ( https://zakopilo.hatenablog.jp/entry/2023/02/04/220552) この流行に乗って「Polars入門」しましょう🏄

Slide 43

Slide 43 text

目次 ● Polarsの概要 ● Polarsの特徴(≒発表者がPolars入門に至った決め手) ● 最近のPolarsの情報 ● まとめ 43

Slide 44

Slide 44 text

まとめ ● Polarsの概要 ○ データフレームの扱いが高速なライブラリ(主要な実装は Rust) ● Polarsの特徴(≒発表者がPolars入門に至った決め手) ○ 高速な処理:実行時間について悩んでいる、作業を効率化させたい方にとって有用 ○ 高いメモリ効率:メモリ効率について悩んでいる方にとって、         高いメモリ効率を実現させる点で有用 ○ 難しくはない記述方法: Pandasと比較しても特別に難しくはないため、         処理の実装( Pandasからの置換)は容易 ○ 高い評価:近年の周囲からの評価は高く導入する懸念は小さい ○ 高い互換性:周辺ライブラリや既存の処理との互換性を考えても導入する懸念は小さい 44

Slide 45

Slide 45 text

まとめ ● Polarsの概要 ○ データフレームの扱いが高速なライブラリ(主要な実装は Rust) ● Polarsの特徴(≒発表者がPolars入門に至った決め手) ○ 高速な処理:実行時間について悩んでいる、作業を効率化させたい方にとって有用 ○ 高いメモリ効率:メモリ効率について悩んでいる方にとって、         高いメモリ効率を実現させる点で有用 ○ 難しくはない記述方法: Pandasと比較しても特別に難しくはないため、         処理の実装( Pandasからの置換)は容易 ○ 高い評価:近年の周囲からの評価は高く導入する懸念は小さい ○ 高い互換性:周辺ライブラリや既存の処理との互換性を考えても導入する懸念は小さい 45 「Polars入門」しましょう👊

Slide 46

Slide 46 text

まとめ ● Polarsの概要 ○ データフレームの扱いが高速なライブラリ(主要な実装は Rust) ● Polarsの特徴(≒発表者がPolars入門に至った決め手) ○ 高速な処理:実行時間について悩んでいる、作業を効率化させたい方にとって有用 ○ 高いメモリ効率:メモリ効率について悩んでいる方にとって、         高いメモリ効率を実現させる点で有用 ○ 難しくはない記述方法: Pandasと比較しても特別に難しくはないため、         処理の実装( Pandasからの置換)は容易 ○ 高い評価:近年の周囲からの評価は高く導入する懸念は小さい ○ 高い互換性:周辺ライブラリや既存の処理との互換性を考えても導入する懸念は小さい 46 質問/感想/情報共有などよろしくお願いします🙋