《本文首发于公众号:深度学习与Python》
现代机器学习为了更精确地构建模型需要处理大量数据。大量数据的处理对于时间的要求有了很大的挑战,在Python提供很多数据处理的函数库,今天给大家介绍一个高效的数据处理函数库Python Datatable。 它是一个用于以最大可能的速度在单节点机器上执行大数据(超过100GB)操作的函数库。DAtatable库与Pandas库非常类似,但更侧重于速度和大数据支持,Python datatable还致力于实现良好的用户体验,明确的错误提醒和强大的API。 在本文中,我们将比较一下在大型数据集中使用Datatable和Pandas的性能。
安装
目前,datatable不支持在Windows上使用,后续版本可能会兼容windows,在MacOS上,可以使用pip轻松安装Datatable:
pip3 install datatable
在Linux上可以使用.whl文件进行安装,如下所示:
#如果你是Python 3.5
pip3 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
pip3 install https://s3.amazonaws.com/h2o-release/datatable/stable/datatable-0.8.0/datatable-0.8.0-cp36-cp36m-linux_x86_64.whl
现在我们通过加载数据、数据分组、数据排序等几个方面来比较以下pandas与Datatable的数据处理速度。看看Datatable如何将pandas摁在地上摩擦。
加载数据
使用的数据集来自Kaggle,属于Lending Club贷款数据数据集 。 该数据集包括2007-2015期间发放的所有贷款的完整贷款数据,包括当前贷款状态(当前,延迟,全额支付等)和最新支付信息。 该文件包含2.26百万行和145列 。 数据大小非常适合演示数据库库的功能。
使用Datatable
让我们将数据加载到Frame对象中。 数据表中的基本分析单位是Frame 。 它与pandas DataFrame或SQL表的概念相同:数据以行和列的二维数组排列。
%%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,原始文本,档案和glob。
- 提供多线程文件读取以获得最大速度
- 在读取大文件时包含进度指示器
- 可以读取兼容RFC4180和不兼容的文件。
现在,让我们计算一下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需要超过一分钟,但数据表只需要20多秒,Datatable的速度明显优于Pandas。
数据转换
Datatable读取数据后的Frame格式可以转换为numpy或pandas数据格式,转换方法如下:
numpy_df = datatable_df.to_numpy()
pandas_df = datatable_df.to_pandas()
下面计算一下将上面读取的Frame格式数据转换成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
加上读取数据花费的23.6秒,通过Datatable读取文件然后将其转换为pandas数据格式比直接使用pandas读取数据花费的时间更少。 因此,通过datatable加载大型数据文件然后将其转换为pandas数据格式更加高效。
数据排序
通过数据中某一列值对数据集进行排序来比较Datatable和Pandas的效率。
使用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
数据分组
与Pandas一样,datatable也有groupby函数。下面我们来比较一下按funded_amount
列分组并对分组后的数据求和时pandas和Datatable的耗时
。
使用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
Datatable的基本使用
Datatable的使用方法与Pandas基本相似,下面介绍一些Datatable的常用数据处理方法。
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)
Datatable也是使用head
命令输出数据的前n行。
datatable_df.head(10)
使用Datatable相关函数统计数据集的基本信息,此过程不消耗内存,而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()
Datatable数据保存
将Datatable Frame的内容写入csv文件,具体代码如下:
datatable_df.to_csv('output.csv')
参考
https://towardsdatascience.com/an-overview-of-pythons-datatable-package-5d3a97394ee9