当前位置: 欣欣网 > 码农

性能碾压pandas、polars的数据分析神器来了

2024-06-05码农

添加微信号 " CNFeffery " 备注 " 数据分析 " 入技术交流群

本文完整代码及附件已上传至我的 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'), 5000000),
'数值': np.round(np.random.uniform(010000005000000), 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 相关教程文章,欢迎持续关注,一起来熟练掌握这款数据分析利器😉。

    以上就是本文的全部内容,欢迎在评论区与我们进行讨论~

    加入知识星球 【我们谈论数据科学】

    600+ 小伙伴一起学习!

    · 推荐阅读 ·