デモ 〜pandas vs DuckDB〜#
消費者物価指数#
13009354行、10列
DataFrameでのmemory usage: 1.1GB
mkdir data
wget https://pub-5c988f48e21d45ec95c1e3eca8ab1787.r2.dev/0003427113.parquet -O data/cpi.parquet
%%sql
SELECT * FROM 'data/cpi.parquet' LIMIT 3
Running query in 'duckdb:///:memory:'
| tab_code | 表章項目 | cat01_code | 2020年基準品目 | area_code | 地域(2020年基準) | time_code | 時間軸(年・月) | unit | value | annotation |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 指数 | 1 | 0001 総合 | 13A01 | 13100 東京都区部 | 1970000303 | 1970年3月 | None | 31.2 | None |
| 1 | 指数 | 1 | 0001 総合 | 00000 | 全国 | 1970000303 | 1970年3月 | None | 30.6 | None |
| 1 | 指数 | 1 | 0001 総合 | 00012 | 大都市 | 1970000303 | 1970年3月 | None | 30.8 | None |
%%sql
SUMMARIZE SELECT * FROM 'data/cpi.parquet'
Running query in 'duckdb:///:memory:'
| column_name | column_type | min | max | approx_unique | avg | std | q25 | q50 | q75 | count | null_percentage |
|---|---|---|---|---|---|---|---|---|---|---|---|
| tab_code | BIGINT | 1 | 3 | 3 | 1.9436672259052985 | 0.8036591582210666 | 1 | 2 | 3 | 13009354 | 0.00 |
| 表章項目 | VARCHAR | 前年同月比 | 指数 | 3 | None | None | None | None | None | 13009354 | 0.00 |
| cat01_code | BIGINT | 1 | 9960 | 776 | 706.5324039149061 | 1909.3410020521355 | 57 | 110 | 160 | 13009354 | 0.00 |
| 2020年基準品目 | VARCHAR | 0001 総合 | 9960 葬儀料 | 997 | None | None | None | None | None | 13009354 | 0.00 |
| area_code | VARCHAR | 00000 | 47A01 | 65 | None | None | None | None | None | 13009354 | 0.00 |
| 地域(2020年基準) | VARCHAR | 01100 札幌市 | 関東地方 | 66 | None | None | None | None | None | 13009354 | 0.00 |
| time_code | BIGINT | 1970000000 | 2024000808 | 822 | 1998292648.206217 | 15630403.227719367 | 1984836666 | 1998627781 | 2011994200 | 13009354 | 0.00 |
| 時間軸(年・月) | VARCHAR | 1970年 | 2024年8月 | 725 | None | None | None | None | None | 13009354 | 0.00 |
| unit | VARCHAR | % | % | 1 | None | None | None | None | None | 13009354 | 35.27 |
| value | DOUBLE | -100.0 | 8969.7 | 23917 | 37.4491113317429 | 121.21838954551153 | 0.0 | 2.4027208469098835 | 77.99257638955794 | 13009354 | 0.00 |
groupbyの処理をpandasとDuckDBでそれぞれ実行#
pandas
pd.read_parquet("data/cpi.parquet").groupby("cat01_code").get_group(1).groupby(
"area_code"
).get_group("00000").groupby("time_code", as_index=False)["value"].mean()
DuckDB
SELECT
time_code,
avg(value)
FROM
'data/cpi.parquet'
WHERE
cat01_code = 1
AND area_code = '00000'
GROUP BY
time_code
ORDER BY
time_code