使用Python「秒开」100GB+数据

本文转载自公众号量化投资与机器学习
如果你50GB甚至500GB的数据集,打开他们都很困难了,更别说分析了 。
在处理这样的数据集时,我们通常采用3种方法 。
第一种对数据进抽样:这里的缺点是显而易见的,样本数据能否代表整个数据 。
第二种使用分布式计算:虽然在某些情况下这是一种有效的方法,但是它带来了管理和维护集群的巨大开销 。想象一下,必须为一个刚好超出RAM范围的数据集设置一个集群,比如在30-50GB范围内 。这有点过分了 。
第三种租用一个强大的云服务:例如,AWS提供了具有TB内存的实例 。在这种情况下,你仍然需要管理云数据,每次启动时都要等待一个个的数据传输 。处理将数据放到云上所带来的遵从性问题,以及处理在远程机器上工作所带来的所有不便 。更不用说成本了,尽管开始时成本很低,但随着时间的推移,成本往往会越来越高 。
在本文中,我们将向你展示一种新的方法: 一种更快、更安全、总体上更方便的方法,可以使用几乎任意大小的数据进行数据研究分析 ,只要它能够适用于笔记本电脑、台式机或服务器的硬盘驱动器 。

使用Python「秒开」100GB+数据

文章插图
 
Vaex是一个开源的DataFrame库,它可以对表格数据集进行可视化、探索、分析,甚至机器学习,这些数据集和你的硬盘驱动器一样大 。它可以在一个n维网格上每秒计算超过10亿(10^9)个对象的平均值、和、计数、标准差等统计信息。可视化使用直方图、使用直方图、密度图和3D立体渲染进行可视化 。为此,Vaex采用了内存映射、高效的外核算法和延迟计算等概念来获得最佳性能(不浪费内存)。所有这些都封装在一个类似Pandas的API中 。
GitHub: https://github.com/vaexio/vaex
使用Python「秒开」100GB+数据

文章插图
 
为了说明Vaex的性能,我们为大家举个例子 。
数据准备
我们使用纽约市出租车的数据集,该数据集包含了出租车在2009年至2015年间超过10亿次出租车出行的信息 。数据可从下面的网站下载,并以 CSV 格式提供:
https://www1.nyc.gov/site/tlc/about/tlc-trip-record-data.page
使用Python「秒开」100GB+数据

文章插图
 
数据清洗
第一步将数据转换为内存映射文件格式,如Apache Arrow、Apache Parque 或HDF5 。一旦数据成为内存映射格式,使用Vaex打开它是瞬间的(数据的磁盘大小超过100GB) 。有多块?
0.052秒!
将CSV数据转换为HDF5的代码如下:
使用Python「秒开」100GB+数据

文章插图
 
为什么这么快?
当你使用Vaex打开内存映射文件时,实际上没有数据读取 。Vaex只读取文件元数据,比如磁盘上数据的位置、数据结构(行数、列数、列名和类型)、文件描述等等。那么,如果我们想要检查或与数据交互呢?打开一个数据集会得到一个标准的DataFrame:
使用Python「秒开」100GB+数据

文章插图
 
再次注意,单元执行时间非常短 。这是因为显示Vaex DataFrame或列只需要从磁盘读取前5行和后5行 。这就引出了另一个重要的问题: V aex只会在必要时遍历整个数据集,而且它会尽可能少地遍历数据 。
现在开始清理数据集 。一个好的开始方法是使用 describe 方法获得数据的概览:
使用Python「秒开」100GB+数据

文章插图
 
describe 方法很好地说明了Vaex的性能和效率:所有这些统计数据都是在macBook Pro(15英寸,2018年,2.6GHz Intel Core i7,32GB RAM)上用 不到3分钟 计算出来的 。其他库或方法需要分布式计算或超过100GB的云才能预先相同的计算 。有了Vaex,你所需要的只是数据,以及只有几GB内存的笔记本电脑 。
查看description的输出,很容易注意到数据包含一些严重的异常值 。由于我们使用的是如此庞大的数据集,直方图是最有效的可视化方法 。用Vaex创建和显示柱状图和热图是如此的快,这样的图可又是交互式的!
df.plot_widget(df.pickup_longitude,df.pickup_latitude,shape=512,limits='minmax',f='log1p',colormap='plasma')
使用Python「秒开」100GB+数据

文章插图
 
一旦我们决定了想要关注纽约的哪个区域,我们就可以简单地创建一个过滤后的 DataFrame:


推荐阅读