Pythonは、記述が解りやすくコンパイル不要で使えることが評価され、大規模開発にも利用されています。
一方、実務で使うことが多いエクセルや表形式データを取り扱うには、Pythonの拡張モジュールのNumpyとかPandasといったアプリが使われてきましたが、ここ1年ほどで登場しその高速性と扱いやすさで急激に普及しはじめたのが polars(しろくま)だと。特に大量データを取り扱うときに、その速さが際立ってるようです。IoTでは、得られるデータ量が極めて多いのが特徴なので、この特性は重要だと思えます。
元データ内容はそのままで、仮想的に様々な分析ができます。
エクセルは、合計行追加や列の非表示で元の姿が変化してしまう。
エクセルでは難しい「商品マスター」と「売り上げ」ファイルを、キー項目でリンクするデータベース的な利用も簡単。
英語の本家がこちら https://pola.rs/
WHY USE POLARS (なぜ POLARS を使うの?)
Polars was benchmarked against several other solutions on the independent TPCH Benchmark. This benchmark aims to replicate data wrangling operations used in practice. Polars easily trumps other solutions due to its parallel execution engine, efficient algorithms and use of vectorization with SIMD (Single Instruction, Multiple Data). Compared to pandas, it can achieve more than 30x performance gains.
(上記説明の翻訳)
Polars は、独立した TPCH ベンチマークで他のいくつかのソリューションに対してベンチマークが行われました。 このベンチマークは、実際に使用されるデータ ラングリング操作を再現することを目的としています。 Polars は、並列実行エンジン、効率的なアルゴリズム、SIMD (単一命令、複数データ) によるベクトル化の使用により、他のソリューションを容易に上回ります。 pandas と比較して、30 倍以上のパフォーマンス向上を達成できます。
出来たばかりで、Updateが頻繁に行われているので、最新版を利用することをお勧めします。
本家の機能紹介サイト https://docs.pola.rs/py-polars/html/reference/index.html
英語の本家サイトでは、各機能と使い方サンプルコードが丁寧に書かれていて、それだけでも十分に使い方が解ります。
一方、2023年後半から、日本語の紹介サイトが出始めました。最新では、下記のサイトが解りやすい。イメージしやすいごく入門部分を引用ご紹介。サイトでは、通常出会う場面のかなりの場合の解説があります。
@_jinta 氏の解説サイトの概要部分です。
超高速…だけじゃない!Pandasに代えてPolarsを使いたい理由
PolarsというPandasを100倍くらい高性能にしたライブラリがとても良いので布教します1。PolarsはRustベースのDataFrameライブラリですが、本記事ではPythonでのそれについて語ります。
ちなみにpolarsは白熊の意です。そりゃあまあ、白熊と大熊猫比べたら白熊のほうが速いし強いよねってことです2。
ポイント: 3. 書きやすい
実はこれが一番の推しポイントですが、あまり語られることが多くない気がします。ということで、この記事ではPolarsの書きやすさの話をメインでしていきます!!
……の前にまず、概要的なところを簡単に紹介しましょう。
Polars入門
10行で把握するPolars
irisデータセットを例に適当な処理を書いてみましょう。
データ項目は、[‘sepal_length’, ‘sepal_width’, ‘petal_length’, ‘petal_width’, ‘species’]です。
これに対して
import polars as pl
df = pl.read_csv("https://j.mp/iriscsv") # データ読み込み
df_agg = (
df
.select([pl.col("^sepal_.*$"), pl.col("species")]) # 列の選択
.with_columns((pl.col("sepal_width") * 2).alias("new_col")) # 列の追加
.filter(pl.col("sepal_length") > 5) # 行の選択
.group_by("species") # グループ化
.agg(pl.all().mean()) # 全列に対して平均を集計
)
df_agg.write_excel("result.xlsx") #結果をエクセルへ
Polarsは上のコードのように、処理を「.」のメソッドチェーンを繋いで記述することが多いです。
基本的には書いた順に処理が走るので、何も考えずにつなげていけばOKです。
( )内では、カッコが閉じるまで 改行も使えサンプルプログラムのように、見やすくできます。
上記で、df = pl. は porlars.DataFrame の宣言です
read_csv
:データの読み込み(※csvやxlsxやDBも読み込めます)select
:列の選択with_columns
:列の追加filter
:行の選択
条件指定 大 > >= == =< < 小
不一致 !=
一致 .is_in([“a”,”b”,”c”]) 列内の行の値列挙group_by
:グループ化agg
:計算 (合計・平均・分散・標準偏差などができます)- write_excel: 結果をエクセルファイルに書き出す
以上 部分引用終わり
polarsで複数エクセルをリンクできる
さらに重要なこと、polarsは、複数ファイルをキー項目一致でつなげることができる。DB言語では普通のSQLがpolarsでできる。
エクセルでは苦手な、複数ファイルリンクがpolarsを利用すると簡単だ。
共通のkey項目があるエクセルAとエクセルBをpolarsのread_excelで読み込み、リンクしたデータフレーム作り、エクセルファイルCに書き出す方法!
df_a=pl.read_excel(“path A”)
df_b=pl.read_excel(“path B”)
df_join=df_a.join(df_b, on=”key”)
df_join.write_excel(“path C”)
(補足)
上記プログラムは、ネットにある5列x150行データを読み込み、列選択と追加・条件付けで行の抽出・グループ化・集計(平均値)を行っています。
各列の列名 columns のリストは
print(df.columns)
で得られます。
[‘sepal_length’, ‘sepal_width’, ‘petal_length’, ‘petal_width’, ‘species’]
これをもとに、列を扱うプログラムを作っていくことになります。このコンマがセパレータの150行データcsvはこんな形です。
sepal_length | sepal_width | petal_length | petal_width | species |
5.1 | 3.5 | 1.4 | 0.2 | setosa |
4.9 | 3 | 1.4 | 0.2 | setosa |
4.7 | 3.2 | 1.3 | 0.2 | setosa |
6.5 | 3 | 5.2 | 2 | virginica |
6.2 | 3.4 | 5.4 | 2.3 | virginica |
5.9 | 3 | 5.1 | 1.8 | virginica |
これを読み込むと、列名・列のデータ種別(文字・数字など)が下記のように自動判別されます。
1.Pandasで自動で付く行ナンバーがない。これ単体で、複数のデータフレームをキー項目でリンクできSQLも使え、CSVやXLSXや各種データベースから直接読み込める。
2.文字取り扱いで標準で正規表現が使える。(上記の列選択で "sepal_"
で始まるものを選択も利用)
3.上記プログラムの結果は下記
print(df_agg)
shape: (3, 4)
┌──────┬──────────┬─────────┬───────┐
│ species ┆ sepal_length ┆ sepal_width ┆ new_col │
│ — — –┆ — ——— ┆ ————– ┆ ——– │
│ str ┆ f64 ┆ f64 ┆ f64 │
╞═════╪═════╪═════╪══════╡
│ virginica ┆ 6.622449 ┆ 2.983673 ┆ 5.967347 │
│ versicolor ┆ 5.997872 ┆ 2.804255 ┆ 5.608511 │
│ setosa ┆ 5.313636 ┆ 3.713636 ┆ 7.427273 │
┌──────┬──────────┬─────────┬───────┐
計算時間
上記プログラムは、ネット掲載データ(5列x150行)を読み込んでいるので、通信環境の影響を受け、0.5秒程度かかりましたが
ノートパソコンに取り込んだcsvファイルからの読み込みでは、所要時間は0.03秒 でした。
参考になる解説サイト
三重大学奥村晴彦名誉教授 導入から利用例までワンセット[2023-10-13]版
※元情報処理学会データサイエンス教育委員会委員
Polars https://okumuralab.org/~okumura/python/polars.html
よく利用する機能の補足説明
大量データから、特定のユニークな項目リストとその関係数量の合計を求める場合、
イメージ例 県名・店名ごとの売上合計を求めたい
次の手順を多用。
group_by([group項目リスト]).agg(pl.col([合計項目リスト]).sum())
1.group_byの項目リスト記載項目(県名・店名)の行が選択され、
2.次のagg(=計算)で指定された項目(店の売上)が集められて項目内のリスト(list)になり、
3.sum()でそのシリーズの合計計算され、結果は
4.group項目リストと合計項目リストのDataFrame (県名・店名・売上)になる
※plでは、ドットつなぎで、左から順に実行され、次のドットに渡されます。
agg: aggregation 計算する
sum: 合計する
group: グループ
list: データの列
メモリー不足エラー: polarsはcsvなどを読み込む場合、列の定義のための読み込み行数制限(デフォルト100)が原因で, 定義困難・メモリー不足などのエラー発生する場合があります。その場合は、read_optionを調整すると解消できる場合があります。
(例: pl.read_csv(file=”file_name.csv”, read_option{infer_schema_length: None})にすると、全行を読み込みます。