赞
踩
“在笔记本电脑上分析100GB数据”,看似是天方夜谭,但使用Python就可以做到!
近日,Jovan Veljanoski发表了一篇名为《How to analyse 100 GB of data on your laptop with Python》的文章。该文展示了一种快捷、安全的数据处理方法——Vaex。
Jovan Veljanoski是XebiaLabs的一名数据科学家,热衷于用数据驱动的方法解决复杂的问题。
他表示,目前人们都在尝试收集和运用数据,以改善其业务运作方式、增加收入或影响世界。因此,处理50GB甚至500GB大小的数据集变得越来越普遍。
然而,这些数据集有使用起来有点不太舒服。它们小到可以装进你日常使用的笔记本电脑的硬盘,但对于笔记本的内存来说,这些数据集太大了。因此,它们已经很难打开和检查,更不用说探索或分析了。
处理较大的数据集时,通常采用3种策略。
首先是对数据进行抽样。其缺点是显而易见的:如果不看相关部分,可能会错过重要的见解,或者更糟的是,如果不看所有的数据,就会误解它所讲述的事实。第二个策略是使用分布式计算。虽然在某些情况下这是一种有效的方法,但是它带来了管理和维护集群的巨大开销。
第三个策略是,可以租用一个强大的云实例,该实例具有处理相关数据所需的足够大的内存。例如,AWS提供了tb级RAM的实例。
在这种情况下,仍然需要管理云数据存储桶,每次实例启动时都要等待从存储桶到实例的数据传输,还要处理在数据存储到云中时遇到的合规性问题,并解决在远程计算机上工作带来的所有不便。
尽管开始的时候成本很低,但随着时间的推移,成本往往会增加。
本文展示的数据处理方法Vaex,是一种更快速、安全、全面和便捷的方法,可以使用几乎任意大小的数据进行数据科学研究,只要把它放在笔记本电脑、台式机或服务器的硬盘上即可。
Vaex
Vaex是一个开放源代码的数据流模型库,可以在与硬盘一样大的数据集上进行可视化、探索、分析甚至机器学习。
为了做到这一点,Vaex采用了一些概念,如内存映射、高效的out-of-core算法和延迟计算。所有这些都在一个类似pandas的API中,因此任何人都可以立即开始。十亿出租车数据分析为了说明这一概念,研究者对一个数据集进行简单的探索性数据分析,该数据集远不适合典型笔记本电脑的内存。
在本文中,将使用纽约市(NYC)出租车数据集,其中包含2009年至2015年之间的超过10亿次的出租车出行信息。
数据可以从该网站下载,并且为CSV格式。完整的分析可以在此Jupyter笔记本中单独查看。
Cleaning the streets第一步是将数据转换为内存可映射文件格式,例如Apache Arrow,Apache Parquet或HDF5。
此处提供了如何将CSV数据转换为HDF5的示例。数据以内存可映射格式后,立即使用Vaex打开数据(0.052秒!),尽管磁盘上的数据量超过100GB:
为什么这么快?当使用Vaex打开内存映射文件时,实际上没有读取任何数据。Vaex仅读取文件元数据,例如磁盘上数据的位置,数据结构(行数,列数,列名和类型),文件描述等。
那么,如要检查数据或与数据交互怎么办?打开数据集会生成一个标准的DataFrame并对其进行快速检查:
再次注意,单元执行时间非常短。这是因为显示Vaex DataFrame或列只需要读取前5行和后5行。
这将引向另一个重要点:Vaex只会在需要时遍历整个数据集,并且会尝试通过尽可能少的数据传递来做到这一点。无论如何,从极端异常值或错误的数据输入中清理数据集开始。一个很好的方法是使用describe方法获得数据的高级概览,该方法显示样本数,缺失值数和每一列的数据类型。
如果列的数据类型为数字,则还将显示平均值,标准偏差以及最小值和最大值。所有这些统计信息都是通过对数据的一次传递来计算的。
describe方法很好地说明了Vaex的功能和效率:所有这些统计数据都是在MacBook Pro上不到3分钟的时间内计算出来的。
其他库或方法都需要分布式 计算或具有超过100GB的云实例来执行相同的计算。使用Vaex,你只需要数据和只有几GB内存的笔记本电脑。查看describe的输出,很容易注意到数据包含一些严重的异常值。首先,让我们开始检查pick-up locations。
消除异常值的最简单方法是绘制出pick-up和drop-off locations,并直观地定义要集中分析的NYC区域。
因为使用了比较大的数据集,因此直方图是最有效的可视化效果。用Vaex创建和显示柱状图和热图的速度很快,而且这样的图可以是交互式的!
一旦互式决定了要关注的NYC区域,就可以简单地创建一个过滤的DataFrame:关于上面的代码块,最厉害的是它只需要很少的内存来执行!过滤Vaex DataFrame时,不会复制数据。而是仅创建对原始对象的引用,在该引用上应用了二进制掩码。
掩码选择要显示的行,并将其用于将来的计算。像今天许多标准数据科学工具一样,如果要复制数据,这将节省100GB的内存。现在检查passenger_count列。单次出租车旅行记录的最大乘客数为255,这似乎有些极端。通过value_counts方法以轻松计算每位乘客的旅行次数。
从上图可以看出,载客超过6人的行程是罕见的异常值,或者仅仅是错误的数据输入。还有大量的载有0位乘客行程。由于目前尚不了解这些行程是否合法,因此也将其过滤掉。
从上图可以看出,随着距离的增加行程次数减少。在约100英里的距离数据处,行程次数分布曲线有很大的下降。目前,以此为起点,根据行程距离消除极端离群值:
在出行距离列中存在极端异常值,可以作为调查出租车出行时长和平均速度的动机。这些特性在数据集中不易获得,但计算起来却很简单:
上面的代码块需要零内存,不需要执行时间! 这是因为代码会创建虚拟列。 这些列只包含数学表达式,仅在需要时才计算它们。
否则,虚列的行为与任何其他常规列一样。注意,其他标准库需要10s的GB内存来完成相同的操作。看一下行程持续时间的分布图:
从上面的图中可以看出,尽管有一些行程可能需要花费4至5个小时以上的时间,但95%的出租车行程只需要不到30分钟即可到达目的地。
你能想象在纽约市被困在出租车中超过3个小时吗?无论如何,要保持开放的态度,并考虑所有出行时间少于3小时的出行:
接下来,分析出租车的平均速度,同时也为数据限制选择一个合理的范围:
根据分布趋平的地方,可以推断出合理的出租车平均速度在每小时1到60英里之间,因此可以更新过滤后的数据DataFrame:
把焦点转移到出租车旅行的费用上。从describe方法的输出中,可以看到fare_amount、total_amount和tip_amount列中有一些异常值。
对于初学者来说,这些列中的任何值都不应该是负数。与之相反的是,这些数字表明,一些幸运的司机仅开一次出租车就差点成为百万富翁。但是这些数量的分布又在一个相对合理的范围内:
上面的三个分布都有相当长的尾部。尾部的一些值可能是正确的,而其他值可能是错误的数据输入。在任何情况下,只考虑票价为fare_amount、total_amount和tip_amount低于200美元的骑行。还要求fare_amount、total_amount的值大于$0。
最后,在初步清除所有数据之后,看看还有多少出租车需要进行分析:
研究者有超过11亿次的行程数据!这些数据足以对出租车行程产生一些有价值的见解。
余下的内容,图灵君明天将会呈现给大家!
视频点击预测大赛火热进行中
3万元奖金、证书、实习、就业机会已准备就位,快叫上小伙伴一起来组队参赛吧。
赛题:希望参赛者通过已有的用户信息、视频信息以及他们是否观看过某些视频,来预测我们推荐给这些用户的视频对方是否会观看。
个人、高等院校、科研单位、互联网企业、创业团队、学生社团等人员均可报名。
报名及组队时间:即日起至2020年2月1日
报名入口:图灵联邦 Turingtopiawww.turingtopia.com
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。