スキーマ
Polars の DataFrame または LazyFrame のスキーマは、列の名前とデータ型を定義します。 DataFrame または LazyFrame の .schema メソッドを使ってスキーマを確認できます。
OrderedDict({'foo': String, 'bar': Int64})
スキーマは、Lazy API で重要な役割を果たします。
Lazy API でのタイプチェック
Lazy API の利点の 1 つは、Polars がデータを処理する前にスキーマをチェックすることです。このチェックは、Lazy クエリを実行するときに行われます。
整数の bar 列に .round 式を呼び出す以下の簡単な例で、この仕組みがわかります。
q4 = (
    pl.DataFrame({"foo": ["a", "b", "c"], "bar": [0, 1, 2]})
    .lazy()
    .with_columns(pl.col("bar").round(0))
)
.round 式は、浮動小数点型の列でのみ有効です。整数列に .round を呼び出すと、collect でクエリを評価したときに InvalidOperationError が発生します。このスキーマチェックは、データを処理する前の collect の呼び出し時に行われます。
try:
    print(q4.collect())
except Exception as e:
    print(e)
`round` operation not supported for dtype `i64`
このクエリをイーガーモードで実行すると、エラーは最初のステップでデータが処理された後にのみ見つかります。
Lazy クエリを実行すると、Polars は時間のかかるデータ処理の前に、潜在的な InvalidOperationError をチェックします。
Lazy API にはスキーマが必要
Lazy API では、Polars のクエリオプティマイザがクエリプランのあらゆるステップでスキーマを推測できる必要があります。これは、事前にスキーマが分からない操作は Lazy API で使えないことを意味します。
事前にスキーマが分からない操作の典型例は .pivot 操作です。.pivot では、新しい列名がある列のデータから決まります。これらの列名は事前に分からないため、.pivot は Lazy API では使えません。
Lazy API で使えない操作への対処
パイプラインに Lazy API で使えない操作が含まれる場合は、通常以下のようにするのが最善です:
- その操作までは Lazy モードで実行
- .collectでパイプラインを実行し、- DataFrameを具体化
- DataFrameで非 Lazy の操作を実行
- 出力を再び LazyFrameに変換 (lazy) し、Lazy モードで続行
- .filterなどの操作を行う
- 最後に .collectでクエリを実行し、DataFrameを取得
以下の例では、この手順を示しています:
- 簡単な DataFrameを作成
- .lazyで- LazyFrameに変換
- .with_columnsで変換
- .collectでクエリを実行し- DataFrameを取得
- DataFrameで- .pivotを実行
- 再び LazyFrameに変換 (lazy)
- .filterを実行
- 最後に .collectでクエリを実行しDataFrameを取得
lazy_eager_query = (
    pl.DataFrame(
        {
            "id": ["a", "b", "c"],
            "month": ["jan", "feb", "mar"],
            "values": [0, 1, 2],
        }
    )
    .lazy()
    .with_columns((2 * pl.col("values")).alias("double_values"))
    .collect()
    .pivot(
        index="id", columns="month", values="double_values", aggregate_function="first"
    )
    .lazy()
    .filter(pl.col("mar").is_null())
    .collect()
)
print(lazy_eager_query)
shape: (2, 4)
┌─────┬──────┬──────┬──────┐
│ id  ┆ jan  ┆ feb  ┆ mar  │
│ --- ┆ ---  ┆ ---  ┆ ---  │
│ str ┆ i64  ┆ i64  ┆ i64  │
╞═════╪══════╪══════╪══════╡
│ a   ┆ 0    ┆ null ┆ null │
│ b   ┆ null ┆ 2    ┆ null │
└─────┴──────┴──────┴──────┘