Expression API#
式を動的に構築し、インスタンス化するAPI
import duckdb
flights = duckdb.sql("""
SELECT
*
FROM 'https://github.com/plotly/datasets/raw/refs/heads/master/2015_flights.parquet'
""").limit(1000)
flights.show()
┌─────────────────┬───────────────┬──────────┬─────────────────────┐
│ DEPARTURE_DELAY │ ARRIVAL_DELAY │ DISTANCE │ SCHEDULED_DEPARTURE │
│ double │ double │ int64 │ double │
├─────────────────┼───────────────┼──────────┼─────────────────────┤
│ -11.0 │ -22.0 │ 1448 │ 0.08333333333333333 │
│ -8.0 │ -9.0 │ 2330 │ 0.16666666666666666 │
│ -2.0 │ 5.0 │ 2296 │ 0.3333333333333333 │
│ -5.0 │ -9.0 │ 2342 │ 0.3333333333333333 │
│ -1.0 │ -21.0 │ 1448 │ 0.4166666666666667 │
│ -5.0 │ 8.0 │ 1589 │ 0.4166666666666667 │
│ -6.0 │ -17.0 │ 1299 │ 0.4166666666666667 │
│ 14.0 │ -10.0 │ 2125 │ 0.5 │
│ -11.0 │ -13.0 │ 1464 │ 0.5 │
│ 3.0 │ -15.0 │ 1747 │ 0.5 │
│ · │ · │ · │ · │
│ · │ · │ · │ · │
│ · │ · │ · │ · │
│ NULL │ NULL │ 546 │ 7.083333333333333 │
│ -6.0 │ -9.0 │ 925 │ 7.083333333333333 │
│ -6.0 │ 3.0 │ 2039 │ 7.083333333333333 │
│ 0.0 │ -26.0 │ 990 │ 7.083333333333333 │
│ 4.0 │ 8.0 │ 1642 │ 7.083333333333333 │
│ 29.0 │ 30.0 │ 496 │ 7.083333333333333 │
│ -2.0 │ -18.0 │ 842 │ 7.083333333333333 │
│ -7.0 │ -9.0 │ 639 │ 7.083333333333333 │
│ -7.0 │ -51.0 │ 2434 │ 7.083333333333333 │
│ -8.0 │ 23.0 │ 130 │ 7.083333333333333 │
├─────────────────┴───────────────┴──────────┴─────────────────────┤
│ 1000 rows (20 shown) 4 columns │
└──────────────────────────────────────────────────────────────────┘
Column Expression#
列名のインスタンス化
flights.select(duckdb.ColumnExpression("DEPARTURE_DELAY"))
┌─────────────────┐
│ DEPARTURE_DELAY │
│ double │
├─────────────────┤
│ -11.0 │
│ -8.0 │
│ -2.0 │
│ -5.0 │
│ -1.0 │
│ -5.0 │
│ -6.0 │
│ 14.0 │
│ -11.0 │
│ 3.0 │
│ · │
│ · │
│ · │
│ NULL │
│ -6.0 │
│ -6.0 │
│ 0.0 │
│ 4.0 │
│ 29.0 │
│ -2.0 │
│ -7.0 │
│ -7.0 │
│ -8.0 │
├─────────────────┤
│ 1000 rows │
│ (20 shown) │
└─────────────────┘
複数列の場合はリストに
ColumnExpressionインスタンスを入れるColumnExpressionインスタンスは式を評価、メソッドの実行ができる
cols = [
duckdb.ColumnExpression("DEPARTURE_DELAY") - 1,
duckdb.ColumnExpression("ARRIVAL_DELAY").isnull(),
]
flights.select(*cols)
┌───────────────────────┬─────────────────────────┐
│ (DEPARTURE_DELAY - 1) │ (ARRIVAL_DELAY IS NULL) │
│ double │ boolean │
├───────────────────────┼─────────────────────────┤
│ -12.0 │ false │
│ -9.0 │ false │
│ -3.0 │ false │
│ -6.0 │ false │
│ -2.0 │ false │
│ -6.0 │ false │
│ -7.0 │ false │
│ 13.0 │ false │
│ -12.0 │ false │
│ 2.0 │ false │
│ · │ · │
│ · │ · │
│ · │ · │
│ NULL │ true │
│ -7.0 │ false │
│ -7.0 │ false │
│ -1.0 │ false │
│ 3.0 │ false │
│ 28.0 │ false │
│ -3.0 │ false │
│ -8.0 │ false │
│ -8.0 │ false │
│ -9.0 │ false │
├───────────────────────┴─────────────────────────┤
│ 1000 rows (20 shown) 2 columns │
└─────────────────────────────────────────────────┘
Star Expression#
すべての列を選択
オプション(
exclude)で特定の列を除外できる
flights.select(duckdb.StarExpression(exclude=["ARRIVAL_DELAY", "SCHEDULED_DEPARTURE"]))
┌─────────────────┬──────────┐
│ DEPARTURE_DELAY │ DISTANCE │
│ double │ int64 │
├─────────────────┼──────────┤
│ -11.0 │ 1448 │
│ -8.0 │ 2330 │
│ -2.0 │ 2296 │
│ -5.0 │ 2342 │
│ -1.0 │ 1448 │
│ -5.0 │ 1589 │
│ -6.0 │ 1299 │
│ 14.0 │ 2125 │
│ -11.0 │ 1464 │
│ 3.0 │ 1747 │
│ · │ · │
│ · │ · │
│ · │ · │
│ NULL │ 546 │
│ -6.0 │ 925 │
│ -6.0 │ 2039 │
│ 0.0 │ 990 │
│ 4.0 │ 1642 │
│ 29.0 │ 496 │
│ -2.0 │ 842 │
│ -7.0 │ 639 │
│ -7.0 │ 2434 │
│ -8.0 │ 130 │
├─────────────────┴──────────┤
│ 1000 rows (20 shown) │
└────────────────────────────┘
Constant Expression#
定数
Case ExpressionやFunction Expressionで利用できる
flights.select(duckdb.ConstantExpression(1))
┌────────────┐
│ 1 │
│ int32 │
├────────────┤
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ · │
│ · │
│ · │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
│ 1 │
├────────────┤
│ 1000 rows │
│ (20 shown) │
└────────────┘
Case Expression#
CASE WHEN (...) THEN (...) ELSE (...) END式を評価デフォルトでは
ELSEはNULLとなり、.else(value = ...)でELSEを設定WHEN (...) THEN (...)ブロックを.when(condition = ..., value = ...)として追加できる
distance = duckdb.ColumnExpression("DISTANCE")
case = duckdb.CaseExpression(
condition=(distance < 1000),
value=duckdb.ConstantExpression(0),
).otherwise(distance)
flights.select(case)
┌───────────────────────────────────────────────────────────┐
│ CASE WHEN ((DISTANCE < 1000)) THEN (0) ELSE DISTANCE END │
│ int64 │
├───────────────────────────────────────────────────────────┤
│ 1448 │
│ 2330 │
│ 2296 │
│ 2342 │
│ 1448 │
│ 1589 │
│ 1299 │
│ 2125 │
│ 1464 │
│ 1747 │
│ · │
│ · │
│ · │
│ 0 │
│ 0 │
│ 2039 │
│ 0 │
│ 1642 │
│ 0 │
│ 0 │
│ 0 │
│ 2434 │
│ 0 │
├───────────────────────────────────────────────────────────┤
│ 1000 rows (20 shown) │
└───────────────────────────────────────────────────────────┘
Function Expression#
関数を式として記述
任意の数の引数を指定できる
flights.select(
duckdb.FunctionExpression("abs", duckdb.ColumnExpression("DEPARTURE_DELAY"))
)
┌──────────────────────┐
│ abs(DEPARTURE_DELAY) │
│ double │
├──────────────────────┤
│ 11.0 │
│ 8.0 │
│ 2.0 │
│ 5.0 │
│ 1.0 │
│ 5.0 │
│ 6.0 │
│ 14.0 │
│ 11.0 │
│ 3.0 │
│ · │
│ · │
│ · │
│ NULL │
│ 6.0 │
│ 6.0 │
│ 0.0 │
│ 4.0 │
│ 29.0 │
│ 2.0 │
│ 7.0 │
│ 7.0 │
│ 8.0 │
├──────────────────────┤
│ 1000 rows (20 shown) │
└──────────────────────┘