专栏首页深度学习与pythonPython Datatable:性能碾压pandas的高效多线程数据处理库

Python Datatable:性能碾压pandas的高效多线程数据处理库

现代机器学习为了更精确地构建模型需要处理大量数据。大量数据的处理对于时间的要求有了很大的挑战,在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') 

本文分享自微信公众号 - 深度学习与python(PythonDC),作者:Python语音识别

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Normalization vs Standardization:规范化与标准化

    标准化、规范化以及正则化是机器学习中三个常用的数据处理方法,其中标准化和规范化解决不同单位和比例的数据间的差异,用于数据缩放;而正则化主要解决模型的过拟合问题。...

    深度学习与Python
  • Python pandas十分钟教程

    Pandas是数据处理和数据分析中最流行的Python库。本文将为大家介绍一些有用的Pandas信息,介绍如何使用Pandas的不同函数进行数据探索和操作。 包...

    深度学习与Python
  • 2019斯坦福自然语言理解课程开放:视频代码PDF都有,名师上课还免费 | 资源

    新课程名为自然语言理解(Natural Language Understanding),代号CS224U,是斯坦福大学今年春季的新课程。

    深度学习与Python
  • Sqoop之导入到Hive时特殊字符导致数据变乱

        Sqoop从关系型数据库导入数据到Hive时,发现数据量增多了,查找之后发现是由于源数据中含义\r\t\n特殊字符的数据,这样Hive遇到之后就将其视为...

    克虏伯
  • Python3学习笔记 | 四、Python的类型与运算-字符串(上)

    在Python里字符串是一个有序的字符的集合,用来存储和表现基于文本的信息。字符串可以用来表示能够像文本那样编辑的任何信息:符号和词语、在入道内存中的文本的内容...

    TeamsSix
  • strspn 和strcspn

    1、strcspn 头文件:#inclued<string.h> 定义函数:size_t strcspn(const char *s, const char...

    marsggbo
  • Android内存优化(五)详解内存分析工具MAT

    前言 在这个系列的前四篇文章中,我分别介绍了DVM、ART、内存泄漏和内存检测工具的相关知识点,这一篇我们通过一个小例子,来学习如何使用内存分析工具MAT。 ...

    用户1269200
  • Android追加换行写入内容到txt文件中

    实现思路为:使用Context.MODE_APPEND属性将每次内容的写入到上次内容的尾部,然后在每次写入内容完成之后写入一个回车换行符**fos.write(...

    IT大飞说
  • 爆款游戏《贪吃蛇大作战》的 Python 实现

    感觉游戏审核新政实施后,国内手游市场略冷清,是不是各家的新游戏都在排队等审核。媒体们除了之前竞相追捧《Pokemon Go》热闹了一把,似乎也听不到什么声音了。...

    Crossin先生
  • opencv2.4.9:为caffe编译精简的opencv_core,opencv_imgproc,opencv_highgui全静态库

    编译caffe时用到了opencv,其实caffe只用到OpenCV很小一部功能 ,具体就是opencv_core,opencv_imgproc,opencv_...

    用户1148648

扫码关注云+社区

领取腾讯云代金券