查看原文
其他

datatable:比pandas更快的GB量级的库

大邓 大邓和他的Python 2022-07-09

虽然pandas是数据分析、机器学习等必备利器,但现在流行的机器学习应用训练模型动辄需要GB级别的数据,很多时候pandas无法快速读取大数据文件或者进行高效运算,甚至可能存在内存溢出等情况。

如果是R语言的用户应该很熟悉data.table库, 该库是R语言中data.frame库的拓展库,可以让R语言用户轻松处理海量数据,比如让电脑很轻松高速地读取100Gb文件。现在python生态圈也有了自己的data.table,这个库的名字叫做datatable。目前datatable不支持windows系统,相应的windows版本正在开发中。

安装

  1. !pip3 install datatable

一、读取数据

读取的数据先转化为Frame对象,是一种拥有很多行很多列的二维数组,功能类似于DataFrame或者SQL表。

我们用的测试数据来源于Kaggle的lending数据集 https://www.kaggle.com/wendykan/lending-club-loan-data#loan.csv, 该数据集包括2007-2015年的含有相关145个特征,共计226万条贷款记录。文件大概700M,我们可以使用pandas和datatable库分别读取,测试读取速度

  1. import numpy as np

  2. import pandas as pd

  3. import datatable as dt


  4. %time datatable_df = dt.fread('data.csv')

Run

  1. CPU times: user 33.2 s, sys: 8.96 s, total: 42.1 s

  2. Wall time: 24.6 s

再来看看pandas读取

  1. %time pandas_df = pd.read_csv('data.csv')

  1. CPU times: user 53.5 s, sys: 15 s, total: 1min 8s

  2. Wall time: 1min 12s

从上面两个读取方式看,pandas用时1分钟,而datatable用时14.2秒

二、 Frame转换

datatable读取数据可以转化为pd.DataFrame

  1. #转化为dataframe

  2. %time pandas_df = datatable_df.to_pandas()

  1. CPU times: user 21.3 s, sys: 28.8 s, total: 50.1 s

  2. Wall time: 1min 3s

正常来讲使用datatable读取数据再转化为pd.DataFrame格式 比 直接使用pandas读取要快一些。

三、基本的Frame属性

  1. print(datatable_df.shape) # (行数, 列数)

  2. print(datatable_df.names[:5]) # 前5列的字段名

  3. print(datatable_df.stypes[:5]) # 列的数据类型(前5列)

  1. (2260668, 145)

  2. ('id', 'member_id', 'loan_amnt', 'funded_amnt', 'funded_amnt_inv')

  3. (stype.bool8, stype.bool8, stype.int32, stype.int32, stype.float64)

显示前10行

  1. datatable_df.head(10)

字段名的颜色表示数据类型,其中红色表示文本,绿色表示整数,蓝色表示浮点型。

四、描述性统计

在pandas中进行描述性统计是一件很吃内存的进程,但datatable不怕这事。

  1. datatable_df.sum()

  2. datatable_df.nunique()

  3. datatable_df.sd()

  4. datatable_df.max()

  5. datatable_df.min()

  6. datatable_df.mean()

例如我们分别使用datatable和pandas来计算mean

  1. %time datatable_df.mean()

  1. CPU times: user 2.67 ms, sys: 729 µs, total: 3.4 ms

  2. Wall time: 2.32 ms

因为会抛出内存错误,上面的 pandas_df.mean() 无法在pandas中完成,所以大邓将代码加上注释,防止大家运行崩溃。

  1. #pandas_df.mean()

五、数据操作

数据的操作方法与dataframe类似

5.1 数据选择

选中所有行, 列只选择funded_amnt列

  1. datatable_df[:,'funded_amnt']

5.2 排序

根据 funded_amnt_inv 列进行排序

  1. # datatable

  2. %time datatable_df.sort('funded_amnt_inv')

CPU times: user 534 ms, sys: 67.96 ms, total: 602 ms

  1. Wall time: 179 ms

还别说,datatable一眨眼功夫就出来,排序真的很快

  1. # pandas排序

  2. %time pandas_df.sort_values(by = 'funded_amnt_inv')

  1. CPU times: user 8.76 s, sys: 2.87 s, total: 11.6 s

  2. Wall time: 12.4 s

而pandas排序用了12.4s,慢!

5.3 删除列

删除指定列,如下。

  1. del datatable_df[:, '列名']

5.4 条件筛选

条件筛选也跟dataframe很类似,这里要注意代码中的f代指的是Frame。输出的数据行列分别:

  • 所有的行中loan_amnt要大于funded_amnt

  • 只输出loan_amnt列

  1. datatable_df[dt.f.loan_amnt>dt.f.funded_amnt, "loan_amnt"]

5.5 保存结果

  1. datatable_df.to_csv('output.csv')

总结

与鼎鼎大名的pandas相比,datatable有很高效的执行速度,这在处理大型数据集时肯定是一个福音。 然而就功能而言,datatable落后于pandas。 但由于datatable仍在更新迭代,我们可能会在未来看到该库的一些重要补充。

推荐阅读

【视频课】文本数据分析快速入门

2019Stata & Python 实证计量与爬虫分析暑期工作坊

国人开发的数据可视化神库 pyecharts

pandas_profiling:生成动态交互的数据探索报告

cufflinks: 让pandas拥有plotly的炫酷的动态可视化能力

使用Pandas、Jinja和WeasyPrint制作pdf报告

使用Pandas更好的做数据科学

使用Pandas更好的做数据科学(二)

少有人知的python数据科学库

folium:地图数据可视化库

学习编程遇到问题,该如何正确的提问?

100G 文本分析语料资源(免费下载) 

如何用Google Colab高效的学习Python

大神kennethreitz写出requests-html号称为人设计的解析库

flashtext:大规模文本数据清洗利器

如果想要获取更多例子,可以关注本公众号,

后台回复'20190609'获得本教程的notebook代码下载方式


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存