Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Polars入門

 Polars入門

Daiki Katsuragawa

April 17, 2024
Tweet

More Decks by Daiki Katsuragawa

Other Decks in Programming

Transcript

  1. 発表における用語の整理(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/)
  2. 発表における用語の整理(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/)
  3. 発表者にとってのPolars • 〜2023年、Pandasのデータフレームを使用 ◦ Polarsの把握はしていたが、入門には至っていない ◦ デファクトスタンダードへの信頼 ◦ 主にパフォーマンス面(処理速度、メモリ効率)で Pandasの扱いに苦戦(課題)

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

    • 2024年〜、Polarsのデータフレームも使用(Polars入門) ◦ 課題に対する打ち手として Polarsを検討 ◦ 恩恵の大きさと懸念の小ささを理解し、 Polars入門に至る 10 Pandasを使用していた発表者がPolars入門に至った決め手に基づいて 「Polars入門」をしたくなる話を紹介📣
  5. Polarsの概要 • データフレームの扱いが高速なライブラリ • 主要な実装はRust(おそらくrsはRust由来) • 備考 ◦ 発音:ポーラス[5] ◦

    由来(おそらく): Pandas(パンダ🐼)に対するPolars(シロクマ󰴜) 14 [5] What is Polars? - YouTube(https://youtu.be/QfLzEp-yt_U?feature=shared)
  6. Polarsの高速な処理 • Polarsは高速な処理を実現[6] • 高速な処理を実現できる理由(ざっくりと) ◦ Rustによる実装 ◦ マルチスレッドによる処理 ◦

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

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

    [6] Polars — TPCH Benchmark(https://pola.rs/posts/benchmarks/) メモリ効率について悩んでいる方にとって、 高いメモリ効率を実現させるPolarsは有用👍
  9. • 以降、以下のデータフレームを想定 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(参加者)
  10. • 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" ] } )
  11. • 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" )
  12. 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) )
  13. 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"] ) })
  14. 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] )
  15. 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からの置換)は容易👍
  16. 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)
  17. 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
  18. 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)
  19. 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を導入する懸念は小さい👍(小さく導入できる)
  20. • 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)
  21. • 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)
  22. • 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)
  23. • 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入門」しましょう🏄
  24. まとめ • Polarsの概要 ◦ データフレームの扱いが高速なライブラリ(主要な実装は Rust) • Polarsの特徴(≒発表者がPolars入門に至った決め手) ◦ 高速な処理:実行時間について悩んでいる、作業を効率化させたい方にとって有用

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

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

    ◦ 高いメモリ効率:メモリ効率について悩んでいる方にとって、         高いメモリ効率を実現させる点で有用 ◦ 難しくはない記述方法: Pandasと比較しても特別に難しくはないため、         処理の実装( Pandasからの置換)は容易 ◦ 高い評価:近年の周囲からの評価は高く導入する懸念は小さい ◦ 高い互換性:周辺ライブラリや既存の処理との互換性を考えても導入する懸念は小さい 46 質問/感想/情報共有などよろしくお願いします🙋