
作者 | Parul Pandey
【导读】工具包 datatable 的功能特征与 Pandas 非常类似,但更侧重于速度以及对大数据的支持。此外,datatable 还致力于实现更好的用户体验,提供有用的错误提示消息和强大的 API 功能。通过本文的介绍,你将学习到如何在大型数据集中使用 datatable 包进行数据处理,特别在数据量特别大的时候你可以发现它可能比 Pandas 更加强大。
data.table 是 R 中一个非常通用和高性能的包,使用简单、方便而且速度快,在 R 语言社区非常受欢迎,每个月的下载量超过 40 万,有近 650 个 CRAN 和 Bioconductor 软件包使用它。如果你是 R 的使用者,可能已经使用过 data.table 包。
而对于 Python 用户,同样存在一个名为 datatable 包,专注于大数据支持、高性能内存/内存不足的数据集以及多线程算法等问题。在某种程度上,datatable 可以被称为是 Python 中的 data.table。
为了能够更准确地构建模型,现在机器学习应用通常要处理大量的数据并生成多种特征,这已成为必要的。而 Python 的 datatable 模块为解决这个问题提供了良好的支持,以可能的最大速度在单节点机器上进行大数据操作 (最多100GB)。datatable 包的开发由 H2O.ai 赞助,它的第一个用户是 Driverless.ai。
接下来,我们就开始初体验一下 datatable 的简单使用。
在 MacOS 系统上,datatable 包可以通过 pip 命令安装,如下图所示:
pip install datatable
在 Linux 平台上,安装过程需要通过二进制分布来实现,如下所示:
# If you have Python 3.5pip install https://s3.amazonaws.com/h2o-release/datatable/stable/datatable-0.8.0/datatable-0.8.0-cp35-cp35m-linux_x86_64.whl# If you have Python 3.6pip install https://s3.amazonaws.com/h2o-release/datatable/stable/datatable-0.8.0/datatable-0.8.0-cp36-cp36m-linux_x86_64.whl
很遗憾的是,目前 datatable 包还不能在 Windows 系统上工作,但 Python 官方也在努力地增加其对 Windows 的支持。更多的信息可以查看 Build instructions 的说明。
地址:https://datatable.readthedocs.io/en/latest/install.html
这里使用的数据集是来自 Kaggle 竞赛中的 Lending Club Loan Data 数据集, 该数据集包含2007-2015期间所有贷款人完整的贷款数据,即当前贷款状态 (当前,延迟,全额支付等) 和最新支付信息等。整个文件共包含226万行和145列数据,数据量规模非常适合演示 datatable 包的功能。
# Importing necessary Librariesimport numpy as npimport pandas as pdimport datatable as dt
首先将数据加载到 Frame 对象中,datatable 的基本分析单位是 Frame,这与Pandas DataFrame 或 SQL table 的概念是相同的:即数据以行和列的二维数组排列展示。
datatable 读取%%timedatatable_df = dt.fread("data.csv")____________________________________________________________________CPU times: user 30 s, sys: 3.39 s, total: 33.4 s Wall time: 23.6 s
如上图,fread() 是一个强大又快速的函数,能够自动检测并解析文本文件中大多数的参数,所支持的文件格式包括 .zip 文件、URL 数据,Excel 文件等等。此外,datatable 解析器具有如下几大功能:
能够自动检测分隔符,标题,列类型,引用规则等。能够读取多种文件的数据,包括文件,URL,shell,原始文本,档案和 glob 等。提供多线程文件读取功能,以获得最大的速度。在读取大文件时包含进度指示器。可以读取 RFC4180 兼容和不兼容的文件。
下面,使用 Pandas 包来读取相同的一批数据,并查看程序所运行的时间。
%%timepandas_df= pd.read_csv("data.csv")___________________________________________________________CPU times: user 47.5 s, sys: 12.1 s, total: 59.6 sWall time: 1min 4s
由上图可以看到,结果表明在读取大型数据时 datatable 包的性能明显优于 Pandas,Pandas 需要一分多钟时间来读取这些数据,而 datatable 只需要二十多秒。
帧转换 (Frame Conversion)
对于当前存在的帧,可以将其转换为一个 Numpy 或 Pandas dataframe 的形式,如下所示:
numpy_df = datatable_df.to_numpy()pandas_df = datatable_df.to_pandas()
下面,将 datatable 读取的数据帧转换为 Pandas dataframe 形式,并比较所需的时间,如下所示:
%%timedatatable_pandas = datatable_df.to_pandas()___________________________________________________________________CPU times: user 17.1 s, sys: 4 s, total: 21.1 sWall time: 21.4 s
看起来将文件作为一个 datatable frame 读取,然后将其转换为 Pandas dataframe比直接读取 Pandas dataframe 的方式所花费的时间更少。因此,通过 datatable 包导入大型的数据文件再将其转换为 Pandas dataframe 的做法是个不错的主意。
type(datatable_pandas)___________________________________________________________________pandas.core.frame.DataFrame
下面来介绍 datatable 中 frame 的一些基础属性,这与 Pandas 中 dataframe 的一些功能类似。
print(datatable_df.shape) # (nrows, ncols)print(datatable_df.names[:5]) # top 5 column namesprint(datatable_df.stypes[:5]) # column types(top 5)______________________________________________________________(2260668, 145)('id', 'member_id', 'loan_amnt', 'funded_amnt', 'funded_amnt_inv')(stype.bool8, stype.bool8, stype.int32, stype.int32, stype.float64)
也可以通过使用 head 命令来打印出输出的前 n 行数据,如下所示:
datatable_df.head(10)
注意:这里用颜色来指代数据的类型,其中红色表示字符串,绿色表示整型,而蓝色代表浮点型。
在 Pandas 中,总结并计算数据的统计信息是一个非常消耗内存的过程,但这个过程在 datatable 包中是很方便的。如下所示,使用 datatable 包计算以下每列的统计信息:
datatable_df.sum() datatable_df.nunique()datatable_df.sd() datatable_df.max()datatable_df.mode() datatable_df.min()datatable_df.nmodal() datatable_df.mean()
下面分别使用 datatable 和Pandas 来计算每列数据的均值,并比较二者运行时间的差异。
datatable 读取%%timedatatable_df.mean()_______________________________________________________________CPU times: user 5.11 s, sys: 51.8 ms, total: 5.16 sWall time: 1.43 s
Pandas 读取pandas_df.mean()__________________________________________________________________Throws memory error.
可以看到,使用 Pandas 计算时抛出内存错误的异常。
和 dataframe 一样,datatable 也是柱状数据结构。在 datatable 中,所有这些操作的主要工具是方括号,其灵感来自传统的矩阵索引,但它包含更多的功能。诸如矩阵索引,C/C++,R,Pandas,Numpy 中都使用相同的 DT[i,j] 的数学表示法。下面来看看如何使用 datatable 来进行一些常见的数据处理工作。
选择行/列的子集
下面的代码能够从整个数据集中筛选出所有行及 funded_amnt 列:
datatable_df[:,'funded_amnt']
这里展示的是如何选择数据集中前5行3列的数据,如下所示:
datatable_df[:5,:3]
帧排序
datatable 排序
在 datatable 中通过特定的列来对帧进行排序操作,如下所示:
%%timedatatable_df.sort('funded_amnt_inv')_________________________________________________________________CPU times: user 534 ms, sys: 67.9 ms, total: 602 msWall time: 179 ms
Pandas 排序%%timepandas_df.sort_values(by = 'funded_amnt_inv')___________________________________________________________________CPU times: user 8.76 s, sys: 2.87 s, total: 11.6 sWall time: 12.4 s
可以看到两种包在排序时间方面存在明显的差异。
删除行/列
下面展示如何删除 member_id 这一列的数据:
del datatable_df[:, 'member_id']
分组 (GroupBy)
与 Pandas 类似,datatable 同样具有分组 (GroupBy) 操作。下面来看看如何在 datatable 和 Pandas 中,通过对 grade 分组来得到 funded_amout 列的均值:
datatable 分组%%timefor i in range(100): datatable_df[:, dt.sum(dt.f.funded_amnt), dt.by(dt.f.grade)]____________________________________________________________________CPU times: user 6.41 s, sys: 1.34 s, total: 7.76 sWall time: 2.42 s
pandas 分组%%timefor i in range(100): pandas_df.groupby("grade")["funded_amnt"].sum()____________________________________________________________________CPU times: user 12.9 s, sys: 859 ms, total: 13.7 sWall time: 13.9 s
f 代表什么
在 datatable 中,f 代表 frame_proxy,它提供一种简单的方式来引用当前正在操作的帧。在上面的例子中,dt.f 只代表 dt_df。
过滤行
在 datatable 中,过滤行的语法与GroupBy的语法非常相似。下面就来展示如何过滤掉 loan_amnt 中大于 funding_amnt 的值,如下所示。
datatable_df[dt.f.loan_amnt>dt.f.funded_amnt,"loan_amnt"]
保存帧
在 datatable 中,同样可以通过将帧的内容写入一个 csv 文件来保存,以便日后使用。如下所示:
datatable_df.to_csv('output.csv')
有关数据操作的更多功能,可查看 datatable 包的说明文档
地址:https://datatable.readthedocs.io/en/latest/using-datatable.html
总结
在数据科学领域,与默认的 Pandas 包相比,datatable 模块具有更快的执行速度,这是其在处理大型数据集时的一大优势所在。然而,就功能而言,目前 datatable 包所包含的功能还不如 pandas 完善。相信在不久的将来,不断完善的 datatable 能够更加强大。
译者 | linstancy
责编 | Jane
出品 | Python大本营(id:pythonnews)
本文所涉及的代码可以从 Github 或 binder 上获取:
Github 地址:https://github.com/parulnith/An-Overview-of-Python-s-Datatable-package)binder 地址:https://mybinder.org/v2/gh/parulnith/An-Overview-of-Python-s-Datatable-package/master?filepath=An%20Overview%20of%20Python%27s%20Datatable%20package.ipynb
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
随机森林算法的核心特点:原理、优势与应用解析 在机器学习领域,随机森林(Random Forest)作为集成学习(Ensemble Learning) ...
2025-09-05Excel 区域名定义:从基础到进阶的高效应用指南 在 Excel 数据处理中,频繁引用单元格区域(如A2:A100、B3:D20)不仅容易出错, ...
2025-09-05CDA 数据分析师:以六大分析方法构建数据驱动业务的核心能力 在数据驱动决策成为企业共识的当下,CDA(Certified Data Analyst) ...
2025-09-05SQL 日期截取:从基础方法到业务实战的全维度解析 在数据处理与业务分析中,日期数据是连接 “业务行为” 与 “时间维度” 的核 ...
2025-09-04在卷积神经网络(CNN)的发展历程中,解决 “梯度消失”“特征复用不足”“模型参数冗余” 一直是核心命题。2017 年提出的密集连 ...
2025-09-04CDA 数据分析师:驾驭数据范式,释放数据价值 在数字化转型浪潮席卷全球的当下,数据已成为企业核心生产要素。而 CDA(Certified ...
2025-09-04K-Means 聚类:无监督学习中数据分群的核心算法 在数据分析领域,当我们面对海量无标签数据(如用户行为记录、商品属性数据、图 ...
2025-09-03特征值、特征向量与主成分:数据降维背后的线性代数逻辑 在机器学习、数据分析与信号处理领域,“降维” 是破解高维数据复杂性的 ...
2025-09-03CDA 数据分析师与数据分析:解锁数据价值的关键 在数字经济高速发展的今天,数据已成为企业核心资产与社会发展的重要驱动力。无 ...
2025-09-03解析 loss.backward ():深度学习中梯度汇总与同步的自动触发核心 在深度学习模型训练流程中,loss.backward()是连接 “前向计算 ...
2025-09-02要解答 “画 K-S 图时横轴是等距还是等频” 的问题,需先明确 K-S 图的核心用途(检验样本分布与理论分布的一致性),再结合横轴 ...
2025-09-02CDA 数据分析师:助力企业破解数据需求与数据分析需求难题 在数字化浪潮席卷全球的当下,数据已成为企业核心战略资产。无论是市 ...
2025-09-02Power BI 度量值实战:基于每月收入与税金占比计算累计税金分摊金额 在企业财务分析中,税金分摊是成本核算与利润统计的核心环节 ...
2025-09-01巧用 ALTER TABLE rent ADD INDEX:租房系统数据库性能优化实践 在租房管理系统中,rent表是核心业务表之一,通常存储租赁订单信 ...
2025-09-01CDA 数据分析师:企业数字化转型的核心引擎 —— 从能力落地到价值跃迁 当数字化转型从 “选择题” 变为企业生存的 “必答题”, ...
2025-09-01数据清洗工具全景指南:从入门到进阶的实操路径 在数据驱动决策的链条中,“数据清洗” 是决定后续分析与建模有效性的 “第一道 ...
2025-08-29机器学习中的参数优化:以预测结果为核心的闭环调优路径 在机器学习模型落地中,“参数” 是连接 “数据” 与 “预测结果” 的关 ...
2025-08-29CDA 数据分析与量化策略分析流程:协同落地数据驱动价值 在数据驱动决策的实践中,“流程” 是确保价值落地的核心骨架 ——CDA ...
2025-08-29CDA含金量分析 在数字经济与人工智能深度融合的时代,数据驱动决策已成为企业核心竞争力的关键要素。CDA(Certified Data Analys ...
2025-08-28CDA认证:数据时代的职业通行证 当海通证券的交易大厅里闪烁的屏幕实时跳动着市场数据,当苏州银行的数字金融部连夜部署新的风控 ...
2025-08-28