Skip to content

Latest commit

 

History

History
337 lines (220 loc) · 13 KB

overview-python-datatable-package.md

File metadata and controls

337 lines (220 loc) · 13 KB

Python 的 Datatable 包概述

原文:www.kdnuggets.com/2019/08/overview-python-datatable-package.html

c 评论

Parul Pandey

figure-name照片由Johannes Groll提供,来源于Unsplash


我们的前三大课程推荐

1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。

2. 谷歌数据分析专业证书 - 提升你的数据分析技能

3. 谷歌 IT 支持专业证书 - 支持你的组织的 IT


“在文明的曙光到 2003 年之间创建了 5 Exabytes 的信息,而现在每 2 天就会创建这么多信息”:Eric Schmidt

如果你是 R 用户,你可能已经在使用data.table包。[Data.table](https://cran.r-project.org/web/packages/data.table/data.table.pdf)是 R 中的[data.frame](https://www.rdocumentation.org/packages/base/versions/3.6.0/topics/data.frame)包的扩展。它也是 R 用户在快速聚合大型数据(包括 100GB 内存)时的首选包。

R 的data.table包因其易用性、便利性和编程速度而非常多功能且高性能。它在 R 社区中相当著名,每月下载量超过 40 万次,几乎有 650 个 CRAN 和 Bioconductor 包在使用它(source)。

那么,对于 Python 用户来说有什么好处呢?好消息是,data.table包在 Python 中也有一个对应的包叫做datatable,它明确关注大数据支持、高性能、内存和外存数据集,以及多线程算法。从某种程度上来说,它可以被称为data.table“小弟弟”。

Datatable

figure-name

现代机器学习应用需要处理大量数据并生成多个特征。这是为了构建更高准确性的模型。Python 的datatable模块就是为了解决这个问题而创建的。它是一个在单节点机器上以最大可能速度执行大数据(最多 100GB)操作的工具包。datatable 的开发得到了H2O.ai的赞助,datatable的首个用户是Driverless.ai

这个工具包与pandas非常相似,但更注重速度和大数据支持。Python 的datatable也致力于实现良好的用户体验、实用的错误信息和强大的 API。在本文中,我们将探讨如何使用 datatable,以及在处理大型数据集时它相较于 pandas 的优势。

安装

在 MacOS 上,可以通过 pip 轻松安装 datatable:

pip install datatable

在 Linux 上,安装可以通过以下二进制发行版完成:

# 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

目前,datatable 在 Windows 上不可用,但正在进行工作以添加对 Windows 的支持。

欲了解更多信息,请参阅构建说明

本文的代码可以从关联的Github 存储库访问,或通过点击下面的图像在我的 binder 上查看。

figure-name

读取数据

使用的数据集来自 Kaggle,属于Lending Club Loan Data Dataset*。*数据集包含了 2007-2015 年间所有贷款的完整信息,包括当前的贷款状态(当前、逾期、已还清等)和最新的支付信息。文件包含226 万行145 列。数据规模非常适合展示 datatable 库的能力。

# Importing necessary Librariesimport numpy as np
import pandas as pd
import datatable as dt

让我们将数据加载到Frame对象中。在 datatable 中,Frame是基本的分析单元。这与 pandas 的 DataFrame 或 SQL 表相同:数据以二维数组的形式排列,具有行和列。

使用 datatable

%%time
datatable_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、原始文本、归档和通配符。

  • 提供多线程文件读取以实现最大速度

  • 读取大型文件时包含进度指示器

  • 可以读取RFC4180合规和不合规的文件。

使用 pandas

现在,让我们计算 pandas 读取相同文件所花费的时间。

%%time
pandas_df= pd.read_csv("data.csv")
___________________________________________________________CPU times: user 47.5 s, sys: 12.1 s, total: 59.6 s
Wall time: 1min 4s

结果显示,datatable 在读取大型数据集时明显优于 pandas。相比之下,pandas 需要超过一分钟,而 datatable 只需几秒钟。

数据框转换

现有数据框也可以转换为 numpy 或 pandas 数据框,如下所示:

numpy_df = datatable_df.to_numpy()
pandas_df = datatable_df.to_pandas()

让我们将现有数据框转换为 pandas 数据框对象,并比较所需的时间。

%%time
datatable_pandas = datatable_df.to_pandas()
___________________________________________________________________
CPU times: user 17.1 s, sys: 4 s, total: 21.1 s
Wall time: 21.4 s

似乎将文件作为 datatable 数据框读取,然后转换为 pandas 数据框所需的时间少于直接通过 pandas 数据框读取。 因此,将大型数据文件通过 datatable 导入,然后转换为 pandas 数据框可能是一个好主意。

type(datatable_pandas)
___________________________________________________________________
pandas.core.frame.DataFrame

基本数据框属性

让我们看看 datatable 数据框的一些基本属性,这些属性类似于 pandas 的属性:

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)

我们还可以使用 head 命令输出前 'n' 行。

datatable_df.head(10)

figure-namedatatable 数据框前 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

%%time
datatable_df.mean()
_______________________________________________________________
CPU times: user 5.11 s, sys: 51.8 ms, total: 5.16 s
Wall time: 1.43 s

使用 pandas

pandas_df.mean()
__________________________________________________________________
Throws memory error.

上述命令在 pandas 中无法完成,因为它开始抛出内存错误。

数据操作

数据表(如数据框)是列式数据结构。在 datatable 中,所有这些操作的主要工具是 方括号符号,灵感来自传统的矩阵索引,但具有更多功能。

figure-namedatatable 的 方括号符号

相同的 DT[i, j] 符号在数学中用于索引矩阵,在 C/C++、R、pandas、numpy 等中也使用。让我们看看如何使用 datatable 执行常见的数据操作活动:

#选择行/列的子集

以下代码从数据集中选择所有行和 funded_amnt 列。

datatable_df[:,'funded_amnt']

figure-name

以下是选择前 5 行和 3 列的方法

datatable_df[:5,:3]

figure-name

#排序数据框

使用 datatable

通过 datatable 可以按照特定列对数据框进行排序,如下所示:

%%time
datatable_df.sort('funded_amnt_inv')
_________________________________________________________________
CPU times: user 534 ms, sys: 67.9 ms, total: 602 ms
Wall time: 179 ms

使用 pandas:

%%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

注意 datatable 和 pandas 之间的显著时间差异。

#删除行/列

以下是如何删除名为 member_id 的列:

del datatable_df[:, 'member_id']

#分组

与 pandas 类似,datatable 也具有 groupby 功能。让我们看看如何按 grade 列分组并获取 funded_amount 列的均值。

使用 datatable

%%time
for 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 s
Wall time: 2.42 s

使用 pandas

%%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

.f 代表什么?

f 代表 frame proxy,并提供了一种简单的方式来引用我们当前操作的 Frame。在我们的例子中,dt.f 仅代表 dt_df

#筛选行

筛选行的语法与 GroupBy 非常相似。让我们筛选出 loan_amnt 中那些值大于 funded_amnt 的行。

datatable_df[dt.f.loan_amnt>dt.f.funded_amnt,"loan_amnt"]

保存 Frame

也可以将 Frame 的内容写入一个 csv 文件,以便将来使用。

datatable_df.to_csv('output.csv')

有关更多数据处理函数,请参阅 文档 页面。

结论

与默认的 pandas 相比,datatable 模块确实加快了执行速度,这在处理大数据集时无疑是一个福音。然而,datatable 在功能方面落后于 pandas。不过,由于 datatable 仍在积极开发中,我们可能会在未来看到一些重大更新。

参考文献

简介: Parul Pandey 是一位数据科学爱好者,经常为数据科学出版物如 Towards Data Science 撰写文章。

原文。经许可转载。

相关内容:

  • 25 个 Pandas 技巧

  • 10 个简单技巧加速 Python 数据分析

  • 成为 Pandas 专家,Python 的数据处理库

相关主题