“从文明诞生之初到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 。
亲爱的读者们! 您打算在项目中使用数据表包吗?

