mcpField
A
alterlab-polars

alterlab-polars

github.com/alterlab-ieuデータ・データベース7866 回インストール5 週間前に更新
リポジトリ

alterlab-polars について

Python と Rust の DataFrame ライブラリ Polars による表形式データ処理を案内するスキルです。式ベースの変換や遅延クエリの最適化に加え、pandas からの移行や単一マシンでのデータパイプラインも扱います。

主な機能

  1. 01式によるデータ変換の構築
  2. 02遅延クエリ計画の最適化
  3. 03一般的なデータ形式の読み書き
  4. 04結合、集計、データ整形
  5. 05pandas 移行のガイダンス

活用シーン

  1. 01単一マシンで pandas の処理を高速化
  2. 02遅延スキャンによる ETL パイプライン構築
  3. 03大規模なメモリ内テーブルの集計と結合

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/alterlab-ieu/alterlab-academic-skills --skill alterlab-polars

インストール後、Claude Code で/alterlab-polarsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

evals/
evals.json
references/
best_practices.md
core_concepts.md
io_guide.md
operations.md
pandas_migration.md
transformations.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 で利用できます
  • デフォルトで並列処理:操作は自動的に並列化されます
一般的な操作の対応関係
操作PandasPolars
列の選択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.String
  • pl.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=...)
パフォーマンスの最適化
  1. 大規模なデータセットには遅延評価を使用します:

    lf = pl.scan_csv("large.csv")  # Don't use read_csv
    result = lf.filter(...).select(...).collect()
    
  2. 処理頻度の高い箇所では Python 関数を避けます:

    • 並列化のため、式 API の範囲内で処理します
    • .map_elements() は必要な場合にのみ使用します
    • Polars のネイティブ操作を優先します
  3. ピーク時のメモリ使用量を抑えるには、ストリーミングエンジンを使用します:

    lf.collect(engine="streaming")  # `streaming=True` is deprecated
    
  4. 必要な列だけを早い段階で選択します:

    # Good: Select columns early
    lf.select("col1", "col2").filter(...)
    
    # Bad: Filter on all columns first
    lf.filter(...).select("col1", "col2")
    
  5. 適切なデータ型を使用します:

    • カーディナリティの低い文字列にはカテゴリ型を使用します
    • 適切な整数サイズを使用します(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 - パフォーマンス最適化のヒントと一般的なパターン

特定のトピックについて詳しい情報が必要な場合は、必要に応じてこれらのリファレンスを読み込んでください。

コメント