(数据科学学习手札161)高性能数据分析利器DuckDB在Python中的使用

news/2025/3/17 13:57:18/文章来源:https://www.cnblogs.com/feffery/p/18233565

本文完整代码及附件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes

1 简介

  大家好我是费老师,就在几天前,经过六年多的持续开发迭代,著名的开源高性能分析型数据库DuckDB发布了其1.0.0正式版本。

  DuckDB具有极强的单机数据分析性能表现,功能丰富,具有诸多拓展插件,且除了默认的SQL查询方式外,还非常友好地支持在PythonRJavaNode.js等语言环境下使用,特别是在Python中使用非常的灵活方便,今天的文章,费老师我就将带大家一起快速了解DuckDBPython中的常见使用姿势😎~

2 DuckDB在Python中的使用

  DuckDB的定位是嵌入式关系型数据库,在Python中安装起来非常的方便,以当下最主流的开源Python环境管理工具mamba为例,直接在终端中执行下列命令,我们就一步到位的完成了对应演示虚拟环境的创建,并在环境中完成了python-duckdbjupyterlabpandaspolars等相关分析工具的安装:

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默认可直接导入csvparquetjson等常见格式的文件,我们首先使用下列代码生成具有五百万行记录的简单示例数据,并分别导出为csvparquet格式进行比较:

# 利用pandas生成示例数据文件
import numpy as np
import pandas as pdgenerated_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')

  针对两种格式的文件,分别比较默认情况下DuckDBpandaspolars的读取速度:

  • csv格式
  • parquet格式

  可以看到,无论是对比pandas还是polarsDuckDB的文件读取性能都是大幅领先甚至碾压级的⚡。

  除此之外,DuckDB也可以通过SQL语句的方式进行等价操作:

2.1.2 读取其他框架的数据对象

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

2.2 执行分析运算

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

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

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

2.3 计算结果转换

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

  基于此,就不用担心通过DuckDB计算的数据结果不好导出为其他各种格式文件了~

  如果你恰好需要转出为csvparquet等格式,那么直接使用DuckDB的文件写出接口,性能依旧是非常强大的:

  • csv格式
  • parquet格式

  更多有关DuckDBPython中应用的内容,请移步官方文档(https://duckdb.org/docs/api/python/overview),费老师我也会在之后持续的分享DuckDB相关教程文章,欢迎持续关注,一起来熟练掌握这款数据分析利器😉。


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/720453.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ApsaraMQ Copilot for RocketMQ:消息数据集成链路的健康管家

为了帮助用户更高效地使用 RocketMQ,阿里云消息队列 ApsaraMQ 提供了一套名为 RocketMQ Copilot 的辅助工具集。它将专家的实践经验产品化,使得即便是缺乏经验的用户也能迅速掌握 RocketMQ 客户端的正确用法,利用云消息队列 RocketMQ 版的可观测性工具进行监控、并高效地排查…

无缝融合:使用 Python 和 PyFFmpeg 合并视频的完整指南

前言 在当今数字化时代,视频内容无处不在。从社交媒体到在线教育,视频已经成为我们生活中不可或缺的一部分。但是,有时候我们可能需要将多个视频片段合并成一个,创造出更丰富、更有吸引力的内容。而今天,我们将向您展示如何使用 Python 和 PyFFmpeg 工具实现这一目标。 准…

音频剪裁大师:使用 Python 和 ffmpeg 分割音频的完整指南

前言 在音频处理中,有时候我们需要对音频文件进行分割,提取其中的部分内容以满足特定需求。而 Python 提供了许多强大的工具和库来实现这一目标,其中 ffmpeg 是一个功能强大的工具,它不仅支持音频分割,还能进行音频转码、合并、提取等操作。本文将介绍如何使用 Python 和 …

正则 .*? 和 .* 的区别是什么

在正则表达式中,.* 和 .*? 的区别在于它们的贪婪程度: .* 是贪婪的,意味着它会尽可能多地匹配字符,直到没有更多字符可匹配。 .*? 是非贪婪的(或懒惰的),意味着它会尽可能少地匹配字符,一旦找到满足整体模式的最小匹配,就会停止。 举例说明: 对于字符串 123456 和模…

钉钉机器人远程重启系统服务

from flask import Flask, request import subprocessapp = Flask(__name__)@app.route(/send_message, methods=[GET]) def send_message():webhook_url = https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN    # YOUR_TOKEN是钉钉机器人的hookmessage = {&…

kalman fiter

卡尔曼滤波是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。 组成以及步骤 1.预测状态方程 目的:由系统状态变量k-1时刻的最优值和系统输入计算出k时刻的…

计算机英文教材太难啃?Higress 和通义千问帮你!

本文将介绍基于 AI 大语言模型进行英文技术内容翻译,并基于又免费又好用的翻译软件进行内容呈现,帮助大家轻松学习计算机英文原版教材。作者:张添翼(澄潭) 计算机相关英文教材的中译本质量堪忧,对于计算机专业的学生来说,应该深有体会。因为大部分教材的译者本人可能未必…

合工大毕业论文LaTeX模板使用指南

本文是在笔者为班级同学编写的指南的基础上修改而来的。 前言 LaTeX 是目前主流的计算机排版系统之一。目前社区维护了一份合工大毕业论文的 LaTeX 模板(以下简称“模板”):https://github.com/HFUTTUG/HFUT_Thesis 考虑到大部分同学对 Word 都谈不上精通,使用 LaTeX 排版毕…

巧用pause,一次性画出多个系统的阶跃响应

num=1;den1=[0.5 1 2 4 6 8];hold; for i=1:6 step(tf(num,[den1(i), 1])); pause(2);endlegend(num2str(den1(1)),num2str(den1(2)),num2str(den1(3)),num2str(den1(4)),num2str(den1(5)),num2str(den1(6)))结果: 人就像是被蒙着眼推磨的驴子,生活就像一…

流畅的python--第七章

把函数视为对象 在python中,函数是一等对象。编程语言研究人员把“一等对象”定义为满足以下条件的程序实体:在运行时创建; 能赋值给变量或数据结构中的元素; 能作为参数传给函数; 能作为函数的返回结果。 示例7-1 创建并测试一个函数,读取函数的__doc__属性,再检查函数…

OA-SLAM 笔记

4.1 基于 ORB-SLAM2 (tracking, local mapping, loop closure) , 增加了 针对于 objects 的模块。这些模块使用 the ellipse/ellipsoid modeling framework, 和 points 使用相同的策略, 即在 frames 上跟踪 objects, 以 3D 的方式估计,插入到地图,然后不断优化。object tr…

iLogtail 2.0 重大升级,端上支持 SPL

SLS 推出了 SPL(SLS Processing Language)语法,以此统一查询、端上处理、数据加工等的语法,保证了数据处理的灵活性。iLogtail 作为日志、时序数据采集器,在 2.0 版本中,全面支持了 SPL 。作者:太业 流式处理语言发展早期流式处理概念:20 世纪 70 年代,编程语言如 APL…