選択(SELECT)
Polars SQL では、SELECT
文を使用して、テーブルからデータを DataFrame
に取り出します。Polars SQL の SELECT
文の基本的な構文は次のとおりです:
SELECT column1, column2, ...
FROM table_name;
ここで column1
、column2
などは、テーブルから選択したい列を指します。ワイルドカード *
を使って、すべての列を選択することもできます。table_name
は、データを取り出したいテーブルの名前です。以下のセクションでは、より一般的な SELECT のバリエーションについて説明します。
df = pl.DataFrame(
{
"city": [
"New York",
"Los Angeles",
"Chicago",
"Houston",
"Phoenix",
"Amsterdam",
],
"country": ["USA", "USA", "USA", "USA", "USA", "Netherlands"],
"population": [8399000, 3997000, 2705000, 2320000, 1680000, 900000],
}
)
ctx = pl.SQLContext(population=df, eager_execution=True)
print(ctx.execute("SELECT * FROM population"))
shape: (6, 3)
┌─────────────┬─────────────┬────────────┐
│ city ┆ country ┆ population │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ i64 │
╞═════════════╪═════════════╪════════════╡
│ New York ┆ USA ┆ 8399000 │
│ Los Angeles ┆ USA ┆ 3997000 │
│ Chicago ┆ USA ┆ 2705000 │
│ Houston ┆ USA ┆ 2320000 │
│ Phoenix ┆ USA ┆ 1680000 │
│ Amsterdam ┆ Netherlands ┆ 900000 │
└─────────────┴─────────────┴────────────┘
GROUP BY(グループ化)
GROUP BY
句は、テーブル内の行を 1 つ以上の列でグループ化し、各グループに対して集計関数を計算するために使用されます。
result = ctx.execute(
"""
SELECT country, AVG(population) as avg_population
FROM population
GROUP BY country
"""
)
print(result)
shape: (2, 2)
┌─────────────┬────────────────┐
│ country ┆ avg_population │
│ --- ┆ --- │
│ str ┆ f64 │
╞═════════════╪════════════════╡
│ Netherlands ┆ 900000.0 │
│ USA ┆ 3.8202e6 │
└─────────────┴────────────────┘
ORDER BY(並べ替え)
ORDER BY
句は、クエリの結果セットを 1 つ以上の列で昇順または降順に並べ替えるために使用されます。
result = ctx.execute(
"""
SELECT city, population
FROM population
ORDER BY population
"""
)
print(result)
shape: (6, 2)
┌─────────────┬────────────┐
│ city ┆ population │
│ --- ┆ --- │
│ str ┆ i64 │
╞═════════════╪════════════╡
│ Amsterdam ┆ 900000 │
│ Phoenix ┆ 1680000 │
│ Houston ┆ 2320000 │
│ Chicago ┆ 2705000 │
│ Los Angeles ┆ 3997000 │
│ New York ┆ 8399000 │
└─────────────┴────────────┘
JOIN(結合)
income = pl.DataFrame(
{
"city": [
"New York",
"Los Angeles",
"Chicago",
"Houston",
"Amsterdam",
"Rotterdam",
"Utrecht",
],
"country": [
"USA",
"USA",
"USA",
"USA",
"Netherlands",
"Netherlands",
"Netherlands",
],
"income": [55000, 62000, 48000, 52000, 42000, 38000, 41000],
}
)
ctx.register_many(income=income)
result = ctx.execute(
"""
SELECT country, city, income, population
FROM population
LEFT JOIN income on population.city = income.city
"""
)
print(result)
shape: (6, 4)
┌─────────────┬─────────────┬────────┬────────────┐
│ country ┆ city ┆ income ┆ population │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ str ┆ i64 ┆ i64 │
╞═════════════╪═════════════╪════════╪════════════╡
│ USA ┆ New York ┆ 55000 ┆ 8399000 │
│ USA ┆ Los Angeles ┆ 62000 ┆ 3997000 │
│ USA ┆ Chicago ┆ 48000 ┆ 2705000 │
│ USA ┆ Houston ┆ 52000 ┆ 2320000 │
│ USA ┆ Phoenix ┆ null ┆ 1680000 │
│ Netherlands ┆ Amsterdam ┆ 42000 ┆ 900000 │
└─────────────┴─────────────┴────────┴────────────┘
関数
Polars には、次のような幅広い SQL 関数が用意されています:
- 数学関数:
ABS
、EXP
、LOG
、ASIN
、ACOS
、ATAN
など - 文字列関数:
LOWER
、UPPER
、LTRIM
、RTRIM
、STARTS_WITH
、ENDS_WITH
- 集計関数:
SUM
、AVG
、MIN
、MAX
、COUNT
、STDDEV
、FIRST
など - 配列関数:
EXPLODE
、UNNEST
、ARRAY_SUM
、ARRAY_REVERSE
など
サポートされている関数の完全なリストは、API ドキュメンテーション を参照してください。以下の例では、クエリ内で関数を使用する方法を示しています。
result = ctx.execute(
"""
SELECT city, population
FROM population
WHERE STARTS_WITH(country,'U')
"""
)
print(result)
shape: (5, 2)
┌─────────────┬────────────┐
│ city ┆ population │
│ --- ┆ --- │
│ str ┆ i64 │
╞═════════════╪════════════╡
│ New York ┆ 8399000 │
│ Los Angeles ┆ 3997000 │
│ Chicago ┆ 2705000 │
│ Houston ┆ 2320000 │
│ Phoenix ┆ 1680000 │
└─────────────┴────────────┘
テーブル関数
先ほどの例では、最初に DataFrame を生成し、SQLContext
に登録しました。Polars では、SQL クエリ内で read_xxx
テーブル関数を使って、CSV、Parquet、JSON、IPC から直接読み取ることもできます。
result = ctx.execute(
"""
SELECT *
FROM read_csv('docs/data/iris.csv')
"""
)
print(result)
shape: (150, 5)
┌──────────────┬─────────────┬──────────────┬─────────────┬───────────┐
│ sepal_length ┆ sepal_width ┆ petal_length ┆ petal_width ┆ species │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ f64 ┆ f64 ┆ f64 ┆ f64 ┆ str │
╞══════════════╪═════════════╪══════════════╪═════════════╪═══════════╡
│ 5.1 ┆ 3.5 ┆ 1.4 ┆ 0.2 ┆ Setosa │
│ 4.9 ┆ 3.0 ┆ 1.4 ┆ 0.2 ┆ Setosa │
│ 4.7 ┆ 3.2 ┆ 1.3 ┆ 0.2 ┆ Setosa │
│ 4.6 ┆ 3.1 ┆ 1.5 ┆ 0.2 ┆ Setosa │
│ 5.0 ┆ 3.6 ┆ 1.4 ┆ 0.2 ┆ Setosa │
│ … ┆ … ┆ … ┆ … ┆ … │
│ 6.7 ┆ 3.0 ┆ 5.2 ┆ 2.3 ┆ Virginica │
│ 6.3 ┆ 2.5 ┆ 5.0 ┆ 1.9 ┆ Virginica │
│ 6.5 ┆ 3.0 ┆ 5.2 ┆ 2.0 ┆ Virginica │
│ 6.2 ┆ 3.4 ┆ 5.4 ┆ 2.3 ┆ Virginica │
│ 5.9 ┆ 3.0 ┆ 5.1 ┆ 1.8 ┆ Virginica │
└──────────────┴─────────────┴──────────────┴─────────────┴───────────┘