datatable如何生成级联数据_Python Datatable:性能碾压pandas的高效多线程数据处理库

6f064e407f9bb7315026d6c8fc04b8eb.png

《本文首发于公众号:深度学习与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)

17184fb583b9951227c3448470fb2cb0.png

使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值