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


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

文章插图
 
上面的代码块的优点在于: 它所需要的内存可以忽略不计 !在过滤Vaex DataFrame时,不会生成数据副本 。相反,只创建对原始对象的引用,并在其上应用二进制掩码 。掩码选择显示哪些行并用于将来的计算 。这为我们节省了100GB的RAM,如果要复制数据,就需要这样做,就像现在许多标准的数据分析所做的那样 。
现在,让我们检查一下 passenger_count 列 。单次乘坐出租车的最高记录是255人,这似乎有点极端 。让我们数一数每一名乘客的出行次数 。使用 value_counts 方法很容易做到这一点:
使用Python「秒开」100GB+数据

文章插图
 
应用10亿行的“value_counts”方法只需要20秒!
从上图中我们可以看出,乘客超过6人的出行很可能是罕见的异常值,或者是数据输入错误 。也有大量的出现,没有(0名)乘客 。既然现在我们还不知道这些旅行是否合法,那就让我们把它们过滤掉吧 。
让我们做一个关于类似出行距离的操作 。由于这是一个连续的变量,我们可以画出出行距离的分布 。看看最小和最大的距离,让我们用一个更合理的范围来绘制直方图 。
使用Python「秒开」100GB+数据

文章插图
 
从上图中我们可以看到,出行次数随着距离的增加而减少 。在大约100英里的距离上,分布有很大的下降 。现在,我们用这个作为分界点,来消除基于行程距离的极端异常值:
出行距离列中存在的极端离群值是调查出租车出行时间和平均速度的原因 。这些特征在数据集中是不容易获得的,但是计算起来很简单:
使用Python「秒开」100GB+数据

文章插图
 
上面的代码块需要零内存,不需要执行时间! 这是因为代码会创建虚拟列 。这些列只包含数学表达式,仅在需要时才计算它们 。 否则,虚列的行为与任何其他常规列一样 。注意,其他标准库需要10s的GB内存来完成相同的操作 。
让我们画出行程时间的分布图:
使用Python「秒开」100GB+数据

文章插图
 
从上图我们可以看到,95% 的出租车行程花费不到30分钟到达目的地,尽管有些行程花费了4-5个小时 。你能想象在纽约被困在出租车里超过3个小时的情景吗?考虑所有总共不超过3小时的行程:
现在让我们看一下出租车的平均速度,同时为数据限制选择一个合理的范围:
使用Python「秒开」100GB+数据

文章插图
 
根据分布趋平的地方,我们可以推断出合理的出租车平均速度在每小时1到60英里之间,因此我们可以更新过滤后的dataframe:
让我们把焦点转移到出租车的费用上 。从describe方法的输出中,我们可以看到在fare_amount、total_amount和tip_amount列中存在一些异常值 。对于初学者来说,这些列中的任何值都不应该是负值 。让我们看看这些数据的分布在一个相对合理的范围内:
使用Python「秒开」100GB+数据

文章插图
 

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

文章插图
 
我们看到上面的三个分布都有相当长的尾部 。尾部的一些值可能是正确的,而其他值可能是错误的数据输入 。无论如何,让我们现在保守一点,只考虑票价为fare_amount、total_amount和tip_amount低于200美元的乘客 。我们还要求fare_amount、total_amount的值大于0 。
最后,在所有初始数据清理之后,让我们看看还剩下多少出租车次数供我们分析:
超过11亿次的出行!
具体分析
假设我们使用这个数据集来学习 如何最大化利润,最小化成本  。
让我们从找出从平均值而言,能带来较好收入的载客地点开始 。我们只需绘制一张热点地区接送地点的热图,对平均票价进行颜色编码,然后查看热点地区 。然而,出租车司机也有自己的成本 。例如,燃料费用 。因此,把乘客带到很远的地方可能会导致更高的票价,但这也意味着更大的燃料消耗和时间损失 。此外,从偏远的地方载一个乘客去市中心可能不那么容易,因此在没有乘客的情况下开车回去可能会很贵 。一种解释的方法是,用票价金额与出行距离之比的平均值来表示热图的颜色 。让我们考虑一下这两种方法:


推荐阅读