Datatable Python软件包概述

“从文明诞生之初到2003年,人类创造了5 EB的信息,但是现在每两天创造相同数量的信息。” 埃里克·施密特(Eric Sc​​hmidt)


Datatable是一个Python库,用于执行有效的多线程数据处理。 数据表支持内存中不适合的数据集。

如果使用R编写,则可能已经在使用data.table包。 Data.tabledata.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上,安装是通过二进制发行版完成的:

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

当前,数据表在Windows下不起作用,但是正在朝这个方向进行,因此Windows支持只是时间问题。

有关安装数据表的详细信息,请参见此处

可以在 GitHub存储库中或在mybinder.org上找到本文将使用的代码。

读取数据


我们将在此处进行实验的数据集来自Kaggle( 借贷俱乐部贷款数据数据集 )。 该组包含有关2007-2015年发放的所有贷款的完整数据,包括贷款的当前状态(“当前”,“延迟”,“已全额偿还”等)以及最新的付款信息。 该文件包含226万行和145列。 该数据集的大小非常适合演示数据表库的功能。

 #    import numpy as np import pandas as pd import datatable as dt 

让我们将数据加载到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对象可以转换为numpypandas 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对象的基本属性。 它们与pandasDataFrame对象的相似属性非常相似:

 print(datatable_df.shape)       # ( ,  ) print(datatable_df.names[:5])   #   5  print(datatable_df.stypes[:5])  #   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) 


数据表中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我们无法获得结果-发出了与内存有关的错误。

资料处理


FrameDataFrame是作为表的数据结构。 在datatable ,方括号用于操作数据。 这类似于它们与常规矩阵的工作方式,但是在这里,当使用方括号时,可以使用其他功能。


使用方括号处理数据表数据

在数学中,当处理矩阵时,还使用形式为DT[i, j]构造。 在C,C ++和R, pandasnumpy包以及许多其他技术中都可以找到类似的结构。 考虑在数据表中执行常见的数据操作。

▍形成行或列样本


以下代码从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.fdatatable_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

亲爱的读者们! 您打算在项目中使用数据表包吗?



Source: https://habr.com/ru/post/zh-CN455507/


All Articles