デモ 〜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
Truncated to displaylimit of 10.

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