alterlab-polars について
Python と Rust の DataFrame ライブラリ Polars による表形式データ処理を案内するスキルです。式ベースの変換や遅延クエリの最適化に加え、pandas からの移行や単一マシンでのデータパイプラインも扱います。
主な機能
- 01式によるデータ変換の構築
- 02遅延クエリ計画の最適化
- 03一般的なデータ形式の読み書き
- 04結合、集計、データ整形
- 05pandas 移行のガイダンス
活用シーン
- 01単一マシンで pandas の処理を高速化
- 02遅延スキャンによる ETL パイプライン構築
- 03大規模なメモリ内テーブルの集計と結合
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ alterlab-ieu/ alterlab-academic-skills --skill alterlab-polarsインストール後、Claude Code で/alterlab-polarsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evals/evals.jsonreferences/best_practices.mdcore_concepts.mdio_guide.mdoperations.mdpandas_migration.mdtransformations.md詳細
Polars
概要
Polars は、Apache Arrow を基盤とする Python と Rust 向けの超高速 DataFrame ライブラリです。Polars の式ベースの API、遅延評価フレームワーク、高性能なデータ操作機能を活用して、効率的なデータ処理、pandas からの移行、データパイプラインの最適化を実現できます。
このスキルを使用する場面
- pandas のコードが遅すぎるものの、データ(または遅延クエリが参照する列)が 1 台のマシンに収まる場合
- 遅延スキャン(
scan_csv、scan_parquet)とクエリ最適化を活用して ETL や特徴量パイプラインを構築する場合 - pandas のコードを Polars の式 API に移行する場合
- 大規模なインメモリテーブルでウィンドウ関数、結合、グループ化集計を行う場合
対象外
| シナリオ | 代わりに使用 |
|---|---|
| クラスター全体での分散実行、またはタスクスケジューラーとダッシュボードを使った既存の pandas/NumPy コードのスケーリング | alterlab-dask |
| メモリマップされた HDF5/Arrow ファイルを使った、数十億行のアウトオブコア探索とビッグデータのプロット | alterlab-vaex |
| 不慣れなデータファイルの初回調査:構造、欠損状況、品質レポート | alterlab-eda |
クイックスタート
インストールと基本的な使い方
最近の 1.x にバージョンを固定します(以下の例では Polars 1.x API を使用しています)。
uv add 'polars>=1.0,<2'
Polars 2.0 はリリース候補版(2.0.0rc2、2026 年 9 月)として公開されています。アップグレードガイドには、結果が気付かないうちに変わる変更が記載されています。LazyFrame.collect() はデフォルトでストリーミングエンジンを使用するようになり(結合やピボット解除によっては行の順序が変わることがあります)、pl.concat(how="horizontal") では高さが等しい必要があります(how="horizontal_extend" は不足分を埋めます)。explode() は空のリストから null 行を生成せず削除するようになり、is_in は情報を失うキャストを拒否し、LazyFrame.profile() は削除され、ヘッダーのない CSV の列名は column_0 から付けられます。2.x に移行する前に https://docs.pola.rs/releases/upgrade/ を確認してください。
DataFrame の基本的な作成と操作:
import polars as pl
# Create DataFrame
df = pl.DataFrame({
"name": ["Alice", "Bob", "Charlie"],
"age": [25, 30, 35],
"city": ["NY", "LA", "SF"]
})
# Select columns
df.select("name", "age")
# Filter rows
df.filter(pl.col("age") > 25)
# Add computed columns
df.with_columns(
age_plus_10=pl.col("age") + 10
)
コアコンセプト
式
式は Polars の操作を構成する基本要素です。データに対する変換を記述し、組み合わせ、再利用、最適化できます。
主な原則:
pl.col("column_name")を使って列を参照します- メソッドをチェーンして複雑な変換を構築します
- 式は遅延実行され、コンテキスト(select、with_columns、filter、group_by)の中でのみ実行されます
例:
# Expression-based computation
df.select(
pl.col("name"),
(pl.col("age") * 12).alias("age_in_months")
)
遅延評価と即時評価
即時評価(DataFrame): 操作はすぐに実行されます
df = pl.read_csv("file.csv") # Reads immediately
result = df.filter(pl.col("age") > 25) # Executes immediately
遅延評価(LazyFrame): 操作によってクエリプランが構築され、実行前に最適化されます
lf = pl.scan_csv("file.csv") # Doesn't read yet
result = lf.filter(pl.col("age") > 25).select("name", "age")
df = result.collect() # Now executes optimized query
遅延評価を使用する場面:
- 大規模なデータセットを扱う場合
- 複雑なクエリパイプラインを扱う場合
- 一部の列や行だけが必要な場合
- パフォーマンスが重要な場合
遅延評価のメリット:
- クエリの自動最適化
- 述語プッシュダウン
- 射影プッシュダウン
- 並列実行
詳しいコンセプトについては、references/core_concepts.md を読み込んでください。
一般的な操作
選択
列を選択して操作します:
# Select specific columns
df.select("name", "age")
# Select with expressions
df.select(
pl.col("name"),
(pl.col("age") * 2).alias("double_age")
)
# Select all columns matching a pattern
df.select(pl.col("^.*_id$"))
フィルター
条件に基づいて行を絞り込みます:
# Single condition
df.filter(pl.col("age") > 25)
# Multiple conditions (cleaner than using &)
df.filter(
pl.col("age") > 25,
pl.col("city") == "NY"
)
# Complex conditions
df.filter(
(pl.col("age") > 25) | (pl.col("city") == "LA")
)
列の追加
既存の列を保持したまま、列を追加または変更します:
# Add new columns
df.with_columns(
age_plus_10=pl.col("age") + 10,
name_upper=pl.col("name").str.to_uppercase()
)
# Parallel computation (all columns computed in parallel)
df.with_columns(
pl.col("value") * 10,
pl.col("value") * 100,
)
グループ化と集計
データをグループ化して集計します:
# Basic grouping
df.group_by("city").agg(
pl.col("age").mean().alias("avg_age"),
pl.len().alias("count")
)
# Multiple group keys
df.group_by("city", "department").agg(
pl.col("salary").sum()
)
# Conditional aggregations
df.group_by("city").agg(
(pl.col("age") > 30).sum().alias("over_30")
)
詳しい操作パターンについては、references/operations.md を読み込んでください。
集計とウィンドウ関数
集計関数
group_by コンテキストでよく使われる集計:
pl.len()- 行数pl.col("x").sum()- 値の合計pl.col("x").mean()- 平均値pl.col("x").min()/pl.col("x").max()- 最小値/最大値pl.first()/pl.last()- 最初/最後の値
over() によるウィンドウ関数
行数を保持したまま集計を適用します:
# Add group statistics to each row
df.with_columns(
avg_age_by_city=pl.col("age").mean().over("city"),
rank_in_city=pl.col("salary").rank().over("city")
)
# Multiple grouping columns
df.with_columns(
group_avg=pl.col("value").mean().over("category", "region")
)
マッピング戦略:
group_to_rows(デフォルト):元の行順を保持しますexplode:行数を変更します(with_columnsではなくselectで使用してください)。出力はグループ化されますjoin:リスト列を作成します
データの入出力
対応形式
Polars は以下の読み込みと書き込みに対応しています:
- CSV、Parquet、JSON、Excel
- データベース(コネクター経由)
- クラウドストレージ(S3、Azure、GCS)
- Google BigQuery
- 複数ファイル/パーティション分割されたファイル
一般的な I/O 操作
CSV:
# Eager
df = pl.read_csv("file.csv")
df.write_csv("output.csv")
# Lazy (preferred for large files)
lf = pl.scan_csv("file.csv")
result = lf.filter(...).select(...).collect()
Parquet(パフォーマンス重視の場合に推奨):
df = pl.read_parquet("file.parquet")
df.write_parquet("output.parquet")
JSON:
df = pl.read_json("file.json")
df.write_json("output.json")
I/O の詳細なドキュメントについては、references/io_guide.md を読み込んでください。
変換
結合
DataFrame を結合します:
# Inner join
df1.join(df2, on="id", how="inner")
# Left join
df1.join(df2, on="id", how="left")
# Join on different column names
df1.join(df2, left_on="user_id", right_on="id")
連結
DataFrame を積み重ねます:
# Vertical (stack rows)
pl.concat([df1, df2], how="vertical")
# Horizontal (add columns)
pl.concat([df1, df2], how="horizontal")
# Diagonal (union with different schemas)
pl.concat([df1, df2], how="diagonal")
ピボットとアンピボット
データの形状を変更します:
# Pivot (wide format): on= is the column whose values become new columns
df.pivot("product", index="date", values="sales")
# Unpivot (long format)
df.unpivot(index="id", on=["col1", "col2"])
変換の詳細な例については、references/transformations.md を読み込んでください。
Pandas からの移行
Polars は、よりすっきりとした API により、pandas と比べて大幅なパフォーマンス向上を実現します。主な違いは次のとおりです。
概念上の違い
- インデックスなし:Polars では整数位置のみを使用します
- 厳密な型付け:暗黙的な型変換は行われません
- 遅延評価:LazyFrame で利用できます
- デフォルトで並列処理:操作は自動的に並列化されます
一般的な操作の対応関係
| 操作 | Pandas | Polars |
|---|---|---|
| 列の選択 | df["col"] | df.select("col") |
| フィルター | df[df["col"] > 10] | df.filter(pl.col("col") > 10) |
| 列の追加 | df.assign(x=...) | df.with_columns(x=...) |
| グループ化 | df.groupby("col").agg(...) | df.group_by("col").agg(...) |
| ウィンドウ | df.groupby("col").transform(...) | df.with_columns(...).over("col") |
主な構文パターン
Pandas の逐次処理(低速):
df.assign(
col_a=lambda df_: df_.value * 10,
col_b=lambda df_: df_.value * 100
)
Polars の並列処理(高速):
df.with_columns(
col_a=pl.col("value") * 10,
col_b=pl.col("value") * 100,
)
移行の詳細なガイドについては、references/pandas_migration.md を読み込んでください。
ベストプラクティス
Polars 1.x API に関する注意点(0.x 以降に名称変更)
古いチュートリアルや LLM のトレーニングデータには、次の旧名称が記載されていることがあります。1.x 形式を使用してください。
read_csv(dtypes=...)->read_csv(schema_overrides=...)pl.Utf8->pl.Stringpl.NUMERIC_DTYPES->import polars.selectors as cs; cs.numeric()join(how="outer")->join(how="full")(また、how="full"ではキーが自動的に統合されなくなりました。以前の動作にするにはcoalesce=Trueを渡してください)pivot(columns=...)->pivot(on=...)(onは最初の位置引数です)collect(streaming=True)->collect(engine="streaming")read_database(connection_uri=...)->read_database_uri(uri=...)
パフォーマンスの最適化
-
大規模なデータセットには遅延評価を使用します:
lf = pl.scan_csv("large.csv") # Don't use read_csv result = lf.filter(...).select(...).collect() -
処理頻度の高い箇所では Python 関数を避けます:
- 並列化のため、式 API の範囲内で処理します
.map_elements()は必要な場合にのみ使用します- Polars のネイティブ操作を優先します
-
ピーク時のメモリ使用量を抑えるには、ストリーミングエンジンを使用します:
lf.collect(engine="streaming") # `streaming=True` is deprecated -
必要な列だけを早い段階で選択します:
# Good: Select columns early lf.select("col1", "col2").filter(...) # Bad: Filter on all columns first lf.filter(...).select("col1", "col2") -
適切なデータ型を使用します:
- カーディナリティの低い文字列にはカテゴリ型を使用します
- 適切な整数サイズを使用します(i32 と i64)
- 時系列データには日付型を使用します
式のパターン
条件付き操作:
pl.when(condition).then(value).otherwise(other_value)
複数の列に対する列操作:
df.select(pl.col("^.*_value$") * 2) # Regex pattern
Null の処理:
pl.col("x").fill_null(0)
pl.col("x").is_null()
pl.col("x").drop_nulls()
その他のベストプラクティスやパターンについては、references/best_practices.md を読み込んでください。
リソース
このスキルには、包括的なリファレンスドキュメントが含まれています。
references/
core_concepts.md- 式、遅延評価、型システムの詳細な説明operations.md- 一般的なすべての操作を例とともに解説する包括的なガイドpandas_migration.md- pandas から Polars への完全な移行ガイドio_guide.md- サポートされているすべての形式でのデータ I/O 操作transformations.md- 結合、連結、ピボット、形状変更の操作best_practices.md- パフォーマンス最適化のヒントと一般的なパターン
特定のトピックについて詳しい情報が必要な場合は、必要に応じてこれらのリファレンスを読み込んでください。