首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >媲美Pandas?一文入门Python的Datatable操作

媲美Pandas?一文入门Python的Datatable操作

作者头像
AI科技大本营
发布于 2019-07-03 07:09:41
发布于 2019-07-03 07:09:41
8.8K00
代码可运行
举报
运行总次数:0
代码可运行

作者 | Parul Pandey

译者 | linstancy

责编 | Jane

出品 | Python大本营(id:pythonnews)

【导读】工具包 datatable 的功能特征与 Pandas 非常类似,但更侧重于速度以及对大数据的支持。此外,datatable 还致力于实现更好的用户体验,提供有用的错误提示消息和强大的 API 功能。通过本文的介绍,你将学习到如何在大型数据集中使用 datatable 包进行数据处理,特别在数据量特别大的时候你可以发现它可能比 Pandas 更加强大。

前言

data.table 是 R 中一个非常通用和高性能的包,使用简单、方便而且速度快,在 R 语言社区非常受欢迎,每个月的下载量超过 40 万,有近 650 个 CRAN 和 Bioconductor 软件包使用它。如果你是 R 的使用者,可能已经使用过 data.table 包。

而对于 Python 用户,同样存在一个名为 datatable 包,专注于大数据支持、高性能内存/内存不足的数据集以及多线程算法等问题。 在某种程度上,datatable 可以被称为是 Python 中的 data.table。

Datatable初教程

为了能够更准确地构建模型,现在机器学习应用通常要处理大量的数据并生成多种特征,这已成为必要的。而 Python 的 datatable 模块为解决这个问题提供了良好的支持,以可能的最大速度在单节点机器上进行大数据操作 (最多100GB)。datatable 包的开发由 H2O.ai 赞助,它的第一个用户是 Driverless.ai。

接下来,我们就开始初体验一下 datatable 的简单使用。

安装

MacOS 系统上,datatable 包可以通过 pip 命令安装,如下图所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install datatable

Linux 平台上,安装过程需要通过二进制分布来实现,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# If you have Python 3.5
pip 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.6
pip install https://s3.amazonaws.com/h2o-release/datatable/stable/datatable-0.8.0/datatable-0.8.0-cp36-cp36m-linux_x86_64.whl
代码语言:javascript
代码运行次数:0
运行
复制

很遗憾的是,目前 datatable 包还不能在 Windows 系统上工作,但 Python 官方也在努力地增加其对 Windows 的支持。更多的信息可以查看 Build instructions 的说明。

地址: https://datatable.readthedocs.io/en/latest/install.html

数据读取

这里使用的数据集是来自 Kaggle 竞赛中的 Lending Club Loan Data 数据集, 该数据集包含2007-2015期间所有贷款人完整的贷款数据,即当前贷款状态 (当前,延迟,全额支付等) 和最新支付信息等。整个文件共包含226万行和145列数据,数据量规模非常适合演示 datatable 包的功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Importing necessary Librariesimport numpy as npimport pandas as pdimport datatable as dt

首先将数据加载到 Frame 对象中,datatable 的基本分析单位是 Frame,这与Pandas DataFrame 或 SQL table 的概念是相同的:即数据以行和列的二维数组排列展示。

  • datatable 读取
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%%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 读取

下面,使用 Pandas 包来读取相同的一批数据,并查看程序所运行的时间。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%%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 的形式,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
numpy_df = datatable_df.to_numpy()
pandas_df = datatable_df.to_pandas()

‍下面,将 datatable 读取的数据帧转换为 Pandas dataframe 形式,并比较所需的时间,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%%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 的做法是个不错的主意。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type(datatable_pandas)___________________________________________________________________pandas.core.frame.DataFrame

帧的基础属性

下面来介绍 datatable 中 frame 的一些基础属性,这与 Pandas 中 dataframe 的一些功能类似。

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(datatable_df.shape)       # (nrows, ncols)
print(datatable_df.names[:5])   # top 5 column names
print(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)
代码语言:javascript
代码运行次数:0
运行
复制

也可以通过使用 head 命令来打印出输出的前 n 行数据,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
datatable_df.head(10)

注意:这里用颜色来指代数据的类型,其中红色表示字符串,绿色表示整型,而蓝色代表浮点型。

统计总结

在 Pandas 中,总结并计算数据的统计信息是一个非常消耗内存的过程,但这个过程在 datatable 包中是很方便的。如下所示,使用 datatable 包计算以下每列的统计信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 读取
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%%timedatatable_df.mean()_______________________________________________________________CPU times: user 5.11 s, sys: 51.8 ms, total: 5.16 sWall time: 1.43 s
  • Pandas 读取
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pandas_df.mean()__________________________________________________________________Throws memory error.

可以看到,使用 Pandas 计算时抛出内存错误的异常。

数据操作

和 dataframe 一样,datatable 也是柱状数据结构。在 datatable 中,所有这些操作的主要工具是方括号,其灵感来自传统的矩阵索引,但它包含更多的功能。诸如矩阵索引,C/C++,R,Pandas,Numpy 中都使用相同的 DT[i,j] 的数学表示法。下面来看看如何使用 datatable 来进行一些常见的数据处理工作。

▌选择行/列的子集

下面的代码能够从整个数据集中筛选出所有行及 funded_amnt 列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
datatable_df[:,'funded_amnt']

这里展示的是如何选择数据集中前5行3列的数据,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
datatable_df[:5,:3]

▌帧排序

  • datatable 排序

在 datatable 中通过特定的列来对帧进行排序操作,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%%timedatatable_df.sort('funded_amnt_inv')_________________________________________________________________CPU times: user 534 ms, sys: 67.9 ms, total: 602 msWall time: 179 ms
  • Pandas 排序
代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%%time
pandas_df.sort_values(by = 'funded_amnt_inv')
___________________________________________________________________
CPU times: user 8.76 s, sys: 2.87 s, total: 11.6 s
Wall time: 12.4 s
代码语言:javascript
代码运行次数:0
运行
复制

可以看到两种包在排序时间方面存在明显的差异。

▌删除行/列

下面展示如何删除 member_id 这一列的数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
del datatable_df[:, 'member_id']

▌分组 (GroupBy)

与 Pandas 类似,datatable 同样具有分组 (GroupBy) 操作。下面来看看如何在 datatable 和 Pandas 中,通过对 grade 分组来得到 funded_amout 列的均值:

  • datatable 分组
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%%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 分组
代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%%time
for i in range(100):
    pandas_df.groupby("grade")["funded_amnt"].sum()
____________________________________________________________________
CPU times: user 12.9 s, sys: 859 ms, total: 13.7 s
Wall time: 13.9 s
代码语言:javascript
代码运行次数:0
运行
复制

▌.f 代表什么

在 datatable 中,f 代表 frame_proxy,它提供一种简单的方式来引用当前正在操作的帧。在上面的例子中,dt.f 只代表 dt_df。

▌过滤行

在 datatable 中,过滤行的语法与GroupBy的语法非常相似。下面就来展示如何过滤掉 loan_amnt 中大于 funding_amnt 的值,如下所示。

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
datatable_df[dt.f.loan_amnt>dt.f.funded_amnt,"loan_amnt"]
代码语言:javascript
代码运行次数:0
运行
复制

▌保存帧

在 datatable 中,同样可以通过将帧的内容写入一个 csv 文件来保存,以便日后使用。如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
datatable_df.to_csv('output.csv')
代码语言:javascript
代码运行次数:0
运行
复制

有关数据操作的更多功能,可查看 datatable 包的说明文档

地址: https://datatable.readthedocs.io/en/latest/using-datatable.html

总结

在数据科学领域,与默认的 Pandas 包相比,datatable 模块具有更快的执行速度,这是其在处理大型数据集时的一大优势所在。 然而,就功能而言,目前 datatable 包所包含的功能还不如 pandas 完善。相信在不久的将来,不断完善的 datatable 能够更加强大。

本文所涉及的代码可以从 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

原文链接:

https://towardsdatascience.com/an-overview-of-pythons-datatable-package-5d3a97394ee9

(*本文为 AI科技大本营转载文章,转载请微信联系 1092722531)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI科技大本营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
如何解决Redis复制风暴?
作为一个DBA,已经遇到过很多次Redis复制异常了。下面让我来介绍一下Redis复制风暴原因及其处理方式。
用户10842762
2023/11/24
6871
面试题:讲讲Redis主从架构?
单机的 redis,能够承载的 QPS 大概就在上万到几万不等。对于缓存来说,一般都是用来支撑读高并发的。因此架构做成主从(master-slave)架构,一主多从,主负责写,并且将数据复制到其它的 slave 节点,从节点负责读。所有的读请求全部走从节点。这样也可以很轻松实现水平扩容,支撑读高并发。
用户1263954
2019/07/04
6010
Redis复制缓冲区案例
可以看到,主库在进行了bgsave的时候,发生了中断,和从库之间的连接被断开了,原因也很清楚,就是超过了output buffer的值
AsiaYe
2021/10/14
1.3K0
Redis缓冲区不会还有人不知道吧?
会导致缓冲区需越来越多内存暂存数据。当缓冲区占用内存>设定上限阈值,就会出现缓冲区溢出。发生溢出,就会丢数据。不给缓冲区设上限,不就没这问题了?No!随累积数据增多,缓冲区所占内存空间越大,耗尽Redis机器可用内存时,Redis实例就会崩溃!
JavaEdge
2023/02/01
1.2K0
Redis知识思维导图总结
Redis基础知识总结思维导图,系统的学习Redis。不定时更新。 主要包括: 基本数据和应用场景 常见问题分析 性能优化 持久化 集群模式 子模块 基本知识 基本数据类型和使用场景 基本数据类型 string 二进制安全,可以包含任何数据,一个键最大能存储512M hash 键值对集合,存储、读取、修改用户属性 list 链表(双向链表),可用于最新消息排行等功能(比如朋友圈的时间线)和消息队列 set 哈希表实现,元素不重复。可用于利用唯一性,统计访问网站的所有独立ip和好友推荐时
zeekling
2022/08/26
4670
Redis知识思维导图总结
redis灵魂拷问:聊一聊主从复制缓冲区
在我之前《redis灵魂拷问:怎样搭建一个哨兵主从集群》搭建的集群主从哨兵集群,有1个主节点和2个从节点环境如下表:
jinjunzhu
2020/11/04
1.4K0
redis灵魂拷问:聊一聊主从复制缓冲区
Redis pipeline(12)原
Pipeline模式:是一次性发送多个命令,最后一次取回所有的返回结果,这种模式通过减少网络的往返时间和io读写次数,大幅度提高通信性能。
兜兜毛毛
2020/04/23
1K0
记录一次redis cluster集群故障-运维笔记
公司的一个系统业务出现故障,提示查询redis失败。查询相关日志,分析过程记录如下:
洗尽了浮华
2018/12/04
5.4K0
Redis:22---客户端API:client、monitor)
一、client list client list命令能列出与Redis服务端相连的所有客户端连接信息。例如下面代码是在一个Redis实例上执行client list的结果,其中每一行代表一个客户端信
用户3479834
2021/02/03
8390
Redis:22---客户端API:client、monitor)
Redis事件循环
Redis基于IO多路复用模式开发了自己的网络事件处理器,这个处理器被称为文件事件处理器,该处理器核心运作流程如下:
大忽悠爱学习
2022/12/30
5980
Redis事件循环
如何保证 redis 的高并发和高可用?(redis 主从架构)
如果你用 redis 缓存技术的话,肯定要考虑如何用 redis 来加多台机器,保证 redis 是高并发的,还有就是如何让 redis 保证自己不是挂掉以后就直接死掉了,即 redis 高可用。
IT技术小咖
2019/11/22
2K0
Redis学习五(Redis 阻塞的原因及其排查方向).
因为 Redis 是单线程的,大量的慢查询可能会导致 redis-server 阻塞,可以通过 slowlog get n 获取慢日志,查看详情情况。
JMCui
2020/11/05
2.3K0
Redis学习五(Redis 阻塞的原因及其排查方向).
redis.conf翻译与配置(六)【redis6.0.6】
当散列有少量条目且最大条目不超过给定的阈值时,使用内存高效数据结构对其进行编码。可以使用以下指令配置这些阈值:
看、未来
2022/05/06
7030
如何确保Redis Pub/Sub模式的数据安全?
最近遇到一个生产环境问题,排查了比较久,记录一下,方便以后反思。 业务场景:实现每天的考勤打卡提醒,根据配置的规则数据,比如每天提前几分钟,提醒员工打卡,所以会下班前几分钟推送消息到微信公众号,提醒员工,记得打卡考勤
SmileNicky
2024/12/23
2140
《Redis设计与实现》读书笔记(十九) ——Redis客户端创建关闭及客户端总结
《Redis设计与实现》读书笔记(十九) ——Redis客户端创建关闭及客户端总结 (原创内容,转载请注明来源,谢谢) 一、客户端的创建于关闭 1、普通客户端连接 普通的客户端,通过connect
用户1327360
2018/03/07
1.7K0
《Redis设计与实现》读书笔记(十九)  ——Redis客户端创建关闭及客户端总结
redisclient命令_redisconnection
对于每个与服务器进行连接的客户端,服务器都为这些客户端建立了相应的 redis.h/redisClient结构(客户端状态),这个结构保存了客户端当前的状态信息,以及执行相关功能时需要用到的数据结构,其中包括:
全栈程序员站长
2022/11/04
5340
redisclient命令_redisconnection
redis安装配置
redis安装配置文档 # 非常详细redis的介绍 http://blog.chinaunix.net/uid-790245-id-3766268.html wget http://redis.googlecode.com/files/redis-2.6.10.tar.gz tar zxvf redis-2.6.10.tar.gz -C /usr/local/ cd /usr/local/redis-2.6.10 make make install # make命令执行完成后,会在src目录下生成5个可执
程序员同行者
2018/07/02
9480
redis8.0新特性之Rdb Channel Replication:如何使复制过程更快,提升主节点在全量同步期间的性能
水平及维护精力所限,译文不免存在错误或过时之处,如有疑问,请查阅原文(文末英文链接)。
崔认知
2025/03/03
2850
redis8.0新特性之Rdb Channel Replication:如何使复制过程更快,提升主节点在全量同步期间的性能
Redis 复制过程详解
Redis 的复制功能分为同步( sync )和命令传播( command propagate )两个步骤:
程序员历小冰
2019/09/22
5040
Redis 复制过程详解
Redis的缓冲区
在Redis中,也存在缓冲区,即使Redis本身就是将数据存储在内存中,但也利用了内存缓冲区来避免因为请求处理速度跟不上请求接收速度而导致的数据丢失和性能问题。
夜半钟鸣
2021/02/19
1.5K0
相关推荐
如何解决Redis复制风暴?
更多 >
LV.3
华为大数据开发工程师
目录
  • 前言
  • Datatable初教程
    • 安装
    • 数据读取
    • 帧转换 (Frame Conversion)
    • 帧的基础属性
    • 统计总结
    • 数据操作
      • ▌选择行/列的子集
      • ▌帧排序
      • ▌删除行/列
      • ▌分组 (GroupBy)
      • ▌.f 代表什么
      • ▌过滤行
    • ▌保存帧
  • 总结
加入讨论
的问答专区 >
游戏行业解决方案总监擅长2个领域
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档