“从文明诞生之初到2003年,人类创造了5 EB的信息,但是现在每两天创造相同数量的信息。” 埃里克·施密特(Eric Schmidt)Datatable是一个Python库,用于执行有效的多线程数据处理。 数据表支持内存中不适合的数据集。
如果使用R编写,则可能已经在使用
data.table
包。
Data.table是
data.frame R包的扩展。 此外,那些使用R来快速聚合大数据集的用户离不开该程序包(尤其是我们谈论的是RAM中约100 GB的数据)。
R的
data.table
包非常灵活且功能强大。 使用它既简单又方便,使用它的程序很快就可以编写出来。 该程序包在R编程器中是众所周知的。 每月下载量超过40万次,几乎用在650个CRAN和Bioconductor软件包中(
来源 )。
Python数据挖掘的用途是什么? 事实是,有一个Python数据表包,它类似于world R中的
data.table
。该数据表包显然专注于处理大型数据集。 它的特点是高性能-在处理完全放在RAM中的数据时以及在处理大小超过可用RAM量的数据时均如此。 它支持多线程数据处理。 通常,可以将
datatable包称为
data.table的弟弟。
数据表
现代机器学习系统需要处理大量数据并生成许多功能。 这对于建立尽可能精确的模型是必要的。 创建了数据表Python模块来解决此问题。 这是一组工具,用于以最快的速度在单台计算机上执行大容量(最大100 GB)数据量的操作。 该数据表由
datatable
赞助,该包的第一个用户是
Driverless.ai 。
该工具包与
pandas非常相似,但是它更加专注于提供高速数据处理和支持大型数据集。 此外,
datatable
包的开发人员还努力使用户方便使用它。 特别是强大的API和经过深思熟虑的错误消息。 在本文中,我们将讨论如何使用
datatable
以及在处理大型数据集时与
pandas
相比的外观。
安装方式
在macOS上,可以使用
pip
轻松安装数据表:
pip install datatable
在Linux上,安装是通过二进制发行版完成的:
当前,数据表在Windows下不起作用,但是正在朝这个方向进行,因此Windows支持只是时间问题。
有关安装数据表的详细信息,请参见
此处 。
可以在
此 GitHub存储库中或在mybinder.org上找到本文将使用的代码。
读取数据
我们将在此处进行实验的数据集来自Kaggle(
借贷俱乐部贷款数据数据集 )。 该组包含有关2007-2015年发放的所有贷款的完整数据,包括贷款的当前状态(“当前”,“延迟”,“已全额偿还”等)以及最新的付款信息。 该文件包含226万行和145列。 该数据集的大小非常适合演示数据表库的功能。
让我们将数据加载到
Frame
对象中。 数据表中分析的基本单位是
Frame
。 这与
pandas
或SQL表中的
DataFrame
相同。 即,我们正在谈论以二维数组组织的数据,其中可以区分行和列。
using使用数据表加载数据
%%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存档和Excel文件下载数据,通过URL检索数据,等等。
此外,数据表解析器还具有以下功能:
- 它可以自动检测定界符,标题,列类型,字符转义规则等。
- 他可以从各种来源读取数据。 其中包括文件系统,URL,命令外壳,原始文本,档案。
- 他能够执行多线程数据读取以达到最佳性能。
- 读取大文件时,它会显示进度指示器。
- 它可以读取符合和不符合RFC4180的文件 。
using使用熊猫下载数据
现在,让我们看看
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
您可以看到,读取大型数据集时,数据表显然比
pandas
快。 在我们的实验中,
Pandas
需要花费一分钟以上的时间,而数据表所需的时间以秒为单位。
框架对象转换
现有的数据表包
Frame
对象可以转换为
numpy
或
pandas
DataFrame
对象。 这样做是这样的:
numpy_df = datatable_df.to_numpy() pandas_df = datatable_df.to_pandas()
让我们尝试将现有的
Frame
转换为
DataFrame
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
似乎将文件读取到
Frame
,然后将其转换为
pandas
DataFrame
对象比使用
pandas
将数据加载到
DataFrame
所需的时间更少。 因此,也许,如果您打算使用
pandas
处理大量数据,最好使用
datatable
加载它们,然后将其转换为
DataFrame
。
type(datatable_pandas) ___________________________________________________________________ pandas.core.frame.DataFrame
框架对象的基本属性
考虑数据表中
Frame
对象的基本属性。 它们与
pandas
的
DataFrame
对象的相似属性非常相似:
print(datatable_df.shape)
在这里,我们可以使用
head()
方法,该方法显示前
n
行:
datatable_df.head(10)
数据表中Frame对象的前10行标题颜色指示数据类型。 红色表示行,绿色表示整数,蓝色表示浮点数。
统计摘要
计算
pandas
摘要统计信息是一项需要大量内存才能完成的操作。 对于数据表,情况并非如此。 以下是可用于计算数据表中各种指标的命令:
datatable_df.sum() datatable_df.nunique() datatable_df.sd() datatable_df.max() datatable_df.mode() datatable_df.min() datatable_df.nmodal() datatable_df.mean()
我们使用数据表和
pandas
计算各列的平均值,并分析完成此操作所需的时间。
using使用数据表查找平均值
%%time datatable_df.mean() _______________________________________________________________ CPU times: user 5.11 s, sys: 51.8 ms, total: 5.16 s Wall time: 1.43 s
using使用熊猫求平均值
pandas_df.mean() __________________________________________________________________ Throws memory error.
如您所见,在
pandas
我们无法获得结果-发出了与内存有关的错误。
资料处理
Frame
和
DataFrame
是作为表的数据结构。 在
datatable
,方括号用于操作数据。 这类似于它们与常规矩阵的工作方式,但是在这里,当使用方括号时,可以使用其他功能。
使用方括号处理数据表数据在数学中,当处理矩阵时,还使用形式为
DT[i, j]
构造。 在C,C ++和R,
pandas
和
numpy
包以及许多其他技术中都可以找到类似的结构。 考虑在数据表中执行常见的数据操作。
▍形成行或列样本
以下代码从
funded_amnt
列中选择所有行:
datatable_df[:,'funded_amnt']
选择funded_amnt列的所有行以下是选择前5行和3列的方法:
datatable_df[:5,:3]
选择前5行和3列using使用数据表排序数据
按所选列对数据集进行排序:
%%time datatable_df.sort('funded_amnt_inv') _________________________________________________________________ CPU times: user 534 ms, sys: 67.9 ms, total: 602 ms Wall time: 179 ms
using使用熊猫排序数据
%%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
请注意,对数据表和
pandas
进行排序所需的时间存在显着差异。
▍删除行和列
以下是删除名为
member_id
的列的方法:
del datatable_df[:, 'member_id']
分组
数据表(如
pandas
)支持数据分组功能。 让我们看一下如何获得
funded_amound
列的平均值,其中的数据按
grade
列分组。
using使用数据表对数据进行分组
%%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
在这里,您可以看到
.f
构造的用法。 这就是所谓的框架代理-一种简单的机制,允许您引用当前正在执行某些操作的
Frame
对象。 在我们的例子中,
dt.f
与
datatable_df
相同。
using使用熊猫分组数据
%%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
行过滤
过滤语法类似于分组语法。
loan_amnt
掉那些那些
loan_amnt
值大于
funded_amnt
。
datatable_df[dt.f.loan_amnt>dt.f.funded_amnt,"loan_amnt"]
保存框架对象
可以将
Frame
对象的内容写入CSV文件,以便将来使用数据。 这样做是这样的:
datatable_df.to_csv('output.csv')
您可以
在此处阅读有关使用数据的其他数据表方法的信息。
总结
数据表Python模块肯定比普通
pandas
快。 对于那些需要处理非常大的数据集的人来说,这也是一个福音。 到目前为止,与
pandas
相比,唯一的负数据表是功能量。 但是,有关数据表的工作正在进行中,因此将来很有可能数据表将在各个方面超过
pandas
。
亲爱的读者们! 您打算在项目中使用数据表包吗?

