(数据科学学习手札161)高性能数据分析利器DuckDB在Python中的使用
本文完整代码及附件已上传至我的
Github
仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
大家好我是费老师,就在几天前,经过六年多的持续开发迭代,著名的开源高性能分析型数据库DuckDB
发布了其1.0.0
正式版本。

DuckDB
具有极强的单机数据分析性能表现,功能丰富,具有诸多拓展插件,且除了默认的SQL
查询方式外,还非常友好地支持在Python
、R
、Java
、Node.js
等语言环境下使用,特别是在Python
中使用非常的灵活方便,今天的文章,费老师我就将带大家一起快速了解DuckDB
在Python
中的常见使用姿势😎~
2 DuckDB在Python中的使用
DuckDB
的定位是嵌入式关系型数据库,在Python
中安装起来非常的方便,以当下最主流的开源Python
环境管理工具mamba
为例,直接在终端中执行下列命令,我们就一步到位的完成了对应演示虚拟环境的创建,并在环境中完成了python-duckdb
、jupyterlab
、pandas
、polars
等相关分析工具的安装:
mamba create -n duckdb-demo python=3.9 -y && mamba activate duckdb-demo && mamba install python-duckdb jupyterlab pandas polars pyarrow -y
2.1 数据集的导入#
2.1.1 直接导入文件#
作为一款数据分析工具,能够方便灵活的导入各种格式的数据非常重要,DuckDB
默认可直接导入csv
、parquet
、json
等常见格式的文件,我们首先使用下列代码生成具有五百万行记录的简单示例数据,并分别导出为csv
和parquet
格式进行比较:
# 利用pandas生成示例数据文件
import numpy as np
import pandas as pd
generated_df = pd.DataFrame(
{
'类别': np.random.choice(list('ABCDEF'), 1000000),
'数值': np.round(np.random.uniform(0, 1000000, 1000000), 3)
}
)
# 分别导出为csv、parquet格式
generated_df.to_csv('./demo_data.csv', index=False)
generated_df.to_parquet('./demo_data.parquet')
针对两种格式的文件,分别比较默认情况下DuckDB
、pandas
、polars
的读取速度:
csv
格式

parquet
格式

可以看到,无论是对比pandas
还是polars
,DuckDB
的文件读取性能都是大幅领先甚至碾压级的⚡。
除此之外,DuckDB
也可以通过SQL
语句的方式进行等价操作:

2.1.2 读取其他框架的数据对象#
除了默认可直接读取少数几种常见数据格式外,DuckDB
在Python
中还支持直接以执行SQL
语句的方式,直接读取pandas
、polars
等框架中的数据框,这一点可太强大了,意味着只要是pandas
、polars
等框架可以读取的格式,DuckDB
都可以直接“拿来吧你”🤣:

2.2 执行分析运算#
DuckDB
作为一款关系型数据库,其执行分析运算最直接的方式就是写SQL
,针对DuckDB
默认读取到内存中的对象(DuckDB
中称作关系):

我们可以通过duckdb.sql()
直接将关系当作表名,书写SQL
语句进行查询分析,下面是一些简单的例子:

比较一下与pandas
、polars
之间执行相同任务的耗时差异,DuckDB
依旧是碾压级的存在👍:

2.3 计算结果转换#
DuckDB
默认自带的文件写出接口比较少,依旧是只针对csv
、parquet
等主流格式具有相应的write_parquet()
、write_csv()
可以直接导出文件,但是针对Python
,DuckDB
提供了多样化的数据转换接口,可以快捷高效地将计算结果转换为Python
对象、pandas
数据框、polars
数据框、numpy
数组等常用格式:

基于此,就不用担心通过DuckDB
计算的数据结果不好导出为其他各种格式文件了~
如果你恰好需要转出为csv
、parquet
等格式,那么直接使用DuckDB
的文件写出接口,性能依旧是非常强大的:
csv
格式

parquet
格式

更多有关DuckDB
在Python
中应用的内容,请移步官方文档(https://duckdb.org/docs/api/python/overview
),费老师我也会在之后持续的分享DuckDB
相关教程文章,欢迎持续关注,一起来熟练掌握这款数据分析利器😉。
以上就是本文的全部内容,欢迎在评论区与我们进行讨论~
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
2022-06-05 (数据科学学习手札137)orjson:Python中最好用的json库
2020-06-05 (数据科学学习手札86)全平台支持的pandas运算加速神器
2019-06-05 (数据科学学习手札59)从抓取数据到生成shp文件并展示
2018-06-05 (数据科学学习手札40)tensorflow实现LSTM时间序列预测