Python数据分析专用数据库,与pandas结合,10倍提速 极致体验
创始人
2025-07-08 13:20:56
0

你有想过在 pandas 中直接使用 sql吗?我知道许多小伙伴已经知道一些库也可以做到这种体验,不过他们的性能太差劲了(基于sqlite,或其他服务端数据库)。

今天我要介绍另一个专用于数据分析的列式数据库,性能是其他同体验的库的1000倍以上。可以无缝接入 pandas ,做到了性能与使用体验同时提升。

这就是今天的主角,duckdb。

特点

duckdb 是一个单机数据库,你大概率会用它与 sqlite 比较。

最明显的区别就是,duckdb 是一个分析数据管理系统,而 sqlite 是一个事务型关系数据库。

这意味着,如果你现在有一大堆数据处理任务,期间无须顾忌会有其他用户插入新数据或删除数据。那么 duckdb 就可以非常好应对这种场景。

对于我们这种 pandas 老用户,duckdb 支持 pandas 的 dataFrame 通用底层格式(parquet/arrow等)上并行运行查询,而且没有单独的导入步骤。这就是它能保持使用体验的同时,大幅提升查询性能的最大原因。

我们需要安装这些库 :

pip install pandas duckdb -U

先看一个例子,看看它是如何便捷与 dataframe 交互。

变量等于表名?

首先,导入今天需要用到的库:

我们有一大堆销售数据,加载其中一份数据看看:

此时,希望使用 sql 做一些数据查询处理,你认为下面的 sql 简单吗?

(1) 直接使用 dataframe 的变量名作为表名查询

这真的可以做到吗?加上一点点 duckdb 的调用即可:

(2) duckdb.query 做查询

(3) df,把查询结果转回 dataframe

也就是,可以直接使用当前环境下的变量作为表名。

我知道之前就有其他的库可以做到这种体验,但是必需强调,duckdb 是直接使用 dataframe 的内存数据(因为底层数据格式通用),因此,这个过程中的输入和输出数据的传输时间几乎可以忽略不计。

并且,这个过程中,duckdb比 pandas 更快处理数据(多线程),并且内存使用量也比 pandas 要低得多。

特别在一些需要分组的数据处理任务上,就算只使用单线程的 duckdb 也会比 pandas 的快两倍。如果是过滤+分组+列投影,会存在 5-8倍 的差异。

如果加上表连接,则可能会到 15倍 的差异。

如果使用其他的一些 pandas 使用 sql 的库,比如 pandasSql ,它比 duckdb 性能差距 1000倍 以上!

以上性能对比指标,均是 duckdb 官方说明,以后有机会实际操作对比。

性能方面,就"吹"到这里。但是,我说 duckdb 有极致的使用体验,不仅仅只是可以直接使用 dataframe 变量名作为表名写 sql 。而是它提供了许多 sql 引擎没有的优化语法体验。

sql 的一些语法小痛点,duckdb 也在努力解决

现在我们需要加载所有的销售数据文件,如果使用 pandas 加载,则是这样子:

  • 行3:得到 data 目录下所有 csv 的文件路径
  • 行2:使用 pandas 加载

duckdb提供了许多方便的内置函数:

  • 行3:表名可以直接是本地的文件。同时还支持通配符

默认情况下,duckdb 会把 csv 的第一行也加入到记录中:

可以使用内置函数,通过参数设定一些加载规则:

  • 行4: read_csv_auto 可以设置具体加载文件时的设定

不过,这个 header 参数其实是加载所有数据之后,再设置第一行为表头。所以会看到实际数据仍然有一些表头行:

我们可以直接在条件过滤中一步到位过滤掉无用的行:

此时,我们可以随时切换使用方式。

sql 中有一些语句在特定场景下,会显得"无意义"。比如我希望查询所有的列:

每次都写一句 select * ,有点麻烦。在 duckdb 里面,我们可以直接省略 select 语句。

有时候,我们希望排除某几列,可以这么写:

  • 行2:使用 * exclude ,里面指定你希望排除的列名即可。注意,因为有一些列名有空格,你需要用双引号或单引号包围

这些功能都得益于它基于的列式数据储存方式。

再看几个小小的 sql 体验改进。

别名用在过滤条件中:

自动识别分组列名:

它还有许多有意思的特性,如果希望我后续做更多的教学,评论区告诉我。

duckdb 是一个很有潜力的数据分析处理工具,结合 pandas 能否大幅提升我们的工作效率,值得大家尝试使用。

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
P2P的自白|我不生产内容,我... 现在一提起P2P,人们就会联想到正在被有关部门“围剿”的互联网理财服务。×租宝事件使得劳...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...