Vaex Python是Pandas库的一个替代品,它使用Out of Core Dataframe对巨大的数据进行计算时需要更少的时间。它还具有快速、互动的可视化功能。
Pandas是最广泛使用的Python库,用于处理数据框架和加工。它的流行是由于它所提供的方便、易懂的API以及各种各样的工具。但是,Pandas也有它的不足之处,一个替代方案是Vaex。让我们来看看到底是什么原因!
1.为什么我们需要Vaex?
Pandas是一个广泛用于读取csv文件和处理数据帧的python库。虽然pandas在处理较小的数据时工作顺利,但当有巨大的数据集时,它就变得非常缓慢和低效。
如今,遇到数据集大于系统的可用内存的情况已经非常普遍。在这样的情况下,pandas无法帮助你。另外,在pandas中,复杂的groupby操作也非常慢。它也不支持内存映射的数据集。
我们需要的解决方案是什么?
我们需要一个能够解决上述所有问题的解决方案,同时还能提供一个方便的API。这个解决方案就是Vaex !
在接下来的章节中,我将告诉你Vaex到底是什么,为什么它是pandas的替代品。
相关文章。如何通过使用Modin改变一行代码来加快pandas的速度?
2.什么是Vaex?
Vaex是一个与Pandas非常相似的python库。Vaex是一个专门针对懒惰的核心外数据框架的库**,有助于可视化和探索大的表格式数据集。**它是一个高性能的库,可以解决pandas的许多缺点。由于API与pandas相似,用户在转移时不会面临困难。它还与Jupyter集成,这使得它很容易。
Vaex能够计算N维网格上的统计数据,如平均值、标准差等,每秒可计算**10亿(109109)个对象/行。**它还可以帮助使用直方图、密度图和三维体积渲染进行可视化,允许对大数据进行交互式探索。
Vaex通过内存映射、零内存复制策略和懒人计算等组合实现了这种高性能。如果你对这些术语感到困惑,请不要担心。我将用例子详细解释每一个术语。
首先,安装并导入python库,如下图所示。
# !pip install vaex
import vaex
3.Vaex使用内存映射来处理大型数据集
正如我们之前所讨论的,Vaex在处理巨大的表格数据集时非常有用。假设我们有一个数据集,它比可用的RAM大。你怎么能用vaex加载这个数据呢?
Vaex使用内存映射来解决这个问题。所有读入vaex的数据集文件都是内存映射的。
当你用Vaex打开一个内存映射的文件时,你实际上并没有读取数据。Vaex将迅速读取文件的元数据(如数据在磁盘上的位置、行数、列数、列名和类型)、文件描述。因此,你可以快速打开这些文件,不管你有多少内存。但是请记住,可内存映射文件的格式是Apache Arrow , HDF5等。
让我们看一个例子。你可以从这里下载我所使用的数据集
# Reading data from local disk
df=vaex.open('yellow_tripdata_2020-01.hdf5')
但是很多时候,可用的数据是CSV文件的形式。在这种情况下,你必须将CSV数据转换为HDF5格式。
如何用vaex将csv文件转换为hdf5?
我们这里有一个很大的csv文件。你可以使用vaex.from_csv()
函数来载入 csv 文件。有一个参数convert
,决定你是否要将其转换为HDF5。在这种情况下,我们选择convert=True
。
Vaex将分块读取CSV文件,并将每个分块转换为一个临时的HDF5文件,然后进一步串联成一个HDF5文件。你可以使用chunk_size
参数来决定各个分块的大小。
# Converting csv into HDF5 and reading dataframe
%time df = vaex.from_csv('yellow_tripdata_2020-01.csv', convert=True)
df
Wall time: 1.43 s
[ ](https://www.machinelearningplus.com/wp-content/uploads/2021/05/car_trip_data.png)
你可以看到,它只花了1.43秒!让我们看看它会花多少时间。 让我们看看使用普通的pandas会花费多少时间。
import pandas as pd
%time pandas_df = pd.read_csv('yellow_tripdata_2020-01.csv')
花了2分34秒,与使用vaex相比,这太慢了。我希望你能通过这个比较了解内存映射可以节省多少时间。
4.Vaex是懒惰的:节省内存
我们知道,Vaex与pandas的API非常相似。但是,Vaex和pandas之间有一个根本区别。
Vaex是懒惰的。
这意味着,除非有必要,否则vaex不会实际执行操作或读完整个数据(不像pandas)。例如,如果你调用一个表达式,比如。df['passenger_count'].mean
,实际的计算并没有发生。它只是记下它必须做的计算。取而代之的是创建一个vaex表达式对象,当打印出来时,它显示一些预览值。这大大节省了内存空间。
df['passenger_count'].mean
让我们看一下另一个懒惰计算的例子。
import numpy as np
np.sqrt(df.passenger_count**2 + df.trip_distance**2)
Expression = sqrt(((passenger_count ** 2) + (trip_distance ** 2)))
Length: 6,405,008 dtype: float64 (expression)
---------------------------------------------
0 1.56205
1 1.56205
2 1.16619
3 1.28062
4 1
...
6405003 nan
6405004 nan
6405005 nan
6405006 nan
6405007 nan
有了表达式系统,vaex只在需要时执行计算。而且,数据不需要是本地的,表达式可以通过电线发送,统计数据可以远程计算,这是vaex-server包所提供的东西。
让我们继续前进,看看vaex的其他有趣的功能。你将能够观察到 "懒惰计算 "是其中许多功能背后的主要基础。
5.虚拟列
当你写表达式在vaex数据框架中创建一个新的列时,一个虚拟列被创建。
但什么是虚拟列呢?
一个虚拟列的行为就像一个普通的列,但**不占用内存。**为什么会这样呢?
这是因为Vaex只记住了定义它们的表达式。它不像pandas那样预先计算数值。这既节省了内存又节省了时间。这些列只有在必要时才会被懒惰地评估,从而保持较低的内存使用率。
让我们看一个例子。
考虑到我们在上一节加载的数据框架df
。我们在这里也将使用同样的方法。让我们写一个表达式,按照下面的表达式创建一个新的列new_trip_distance
。这个列现在将是一个虚拟列,不需要分配内存。让我们也记录一下所花的时间。
%time df['new_trip_distance'] = df['trip_distance'] + 10
Wall time: 998 µs
该任务在微秒内完成,因为不需要分配内存。让我们看看在pandas数据框架上执行同样的任务,我们节省了多少时间。看看下面的代码和时间。
%time pandas_df['new_trip_distance'] = pandas_df['trip_distance'] + 10
这几乎花费了1500倍的时间!
另外,这个虚拟列new_trip_distnace
,在需要的时候会被懒惰地评估。
df
[ ](https://www.machinelearningplus.com/wp-content/uploads/2021/05/car_trip_data.png)
我希望你能理解虚拟列是如何工作的,让我们继续讨论其他的操作和功能。
6.用Vaex清洗数据
数据清理和过滤是在python中经常占用大量时间的关键步骤。例如,让我们来看看我们在前几节中使用的同一个数据框架。假设你希望过滤掉那些passenger_count
大于10的记录。让我们用普通的pandas来试试,看看需要多少时间。
%time df_filtered=pandas_df[pandas_df['passenger_count']>10]
Wall time: 13.6 s
你可以看到,它很慢。让我们看看在vaex数据框架上执行同样的任务。
%time df_filtered=df[df['passenger_count']>10]
Wall time: 611 ms
Parser : 106 ms
Vaex将所需时间从13.6秒减少到了微秒!
Vaex是如何做到这一点的?
这是因为vaex所遵循的零内存拷贝策略。这意味着过滤一个DataFrame所花费的内存非常少,而且不会复制数据。df_filtered
,对原始数据有一个 "视图"。即使你过滤一个1TB的文件,也只是读取该文件的一小部分。这意味着,当你有大量的缺失值时,你可以放弃它们或填补它们,几乎不需要任何成本。
%time df_fillna=df.fillna(value=0, column_names=['passenger_count'])
df_fillna
Wall time: 483 ms
[](https://www.machinelearningplus.com/wp-content/uploads/2021/05/car_trip_data_dropna.png)
Vaex为我们很快完成了这个痛苦的任务。
7.统计性能:Vaex vs Pandas
Vaex因其在统计方面的高性能而非常受欢迎。当处理大的表格数据集时,你将需要一个替代pandas的groupby
。你需要一个计算速度更快的解决方案。因此,Vaex允许你在一个常规的N维网格上进行统计,它的速度非常快。事实证明,Vaex可以在一秒钟内计算出大约10亿行数据的平均值!
下面是一个在N维网格上高效计算统计数据的例子
# Every statistic method accepts a binby argument to compute statistics on regular Nd array
df.mean(df.passenger_count, binby=df.DOLocationID, shape=20)
array([1.53489408, 1.49914832, 1.49319968, 1.54545849, 1.49560378,
1.52010031, 1.50486626, 1.52510748, 1.51555149, 1.55267282,
1.50574786, 1.5412169 , 1.50043236, 1.48509443, 1.52030571,
1.53979913, 1.48159731, 1.51295217, 1.51658428, 1.52362767])
现在我们来比较一下pandas和vaex的一些统计计算。
下面,让我们试着用pandas和vaex来计算任何一列的平均值。
%time df.mean(df.fare_amount)
Wall time: 769 ms
array(12.69410812)
%time pandas_df['fare_amount'].mean()
Wall time: 1.64 s
12.69410811978051
在上述情况下,Vaex的速度是3倍。
8.选择
在上一节中,我们看到了vaex在统计方面的强大能力。让我们来探索vaex提供的另一个有趣的功能:选择。
选择是用来定义数据的一个子集。这在两个方面有帮助。首先,它有助于从数据框中快速过滤数据。除此之外,选择使你能够在一次通过数据时计算多个子集的统计数据。我们可以在一行中完成多个步骤,而且速度快得惊人这个应用非常有用,特别是在处理那些不适合在内存中使用的DataFrames时(Out-of-core)。
让我们通过一个例子来了解如何使用选择。假设对于之前的纽约出租车数据框架,我们需要根据乘客数量创建子集,并找到每个子集的平均票价。使用选择,它可以在一个简单的行中完成,如下所示。
df.mean(df.fare_amount,selection=[df.passenger_count<2,df.passenger_count>2])
array([12.38094964, 12.6061761 ])
你可能也注意到了,这个过程非常快!因为,vaex并没有把这些数据复制给你。因为,vaex并不像pandas那样复制数据。那么,它是怎么做的呢?Vaex内部一直在跟踪哪些行被选中。
除此以外,bin计算和选择功能还有另一个主要用途:它们使可视化变得更快、更容易!让我们在下文中了解它们。让我们在下一节中了解一下它们。
9.用Vaex快速可视化
可视化是理解我们所拥有的数据的一个关键部分。它提供了一个清晰的结果来描绘趋势并得出洞察力。但是当你有一百万行的巨大数据框架时,制作标准的散点图需要很长的时间。不仅如此,可视化的数据也难以辨认,不清晰。这里的解决方案是什么?
Vaex又一次拯救了我们。
在分组聚合、选择和分类的帮助下,Vaex可以很快计算出这些可视化的数据。大部分的可视化是在1或2个维度上完成的。另外,Vaex很好地包装了Matplotlib,这样python用户就很方便。我们将在本节中看到一些快速可视化的例子。
一维图
考虑到之前使用的数据框架。比方说,我们需要将fare_amount
的值可视化。通过使用vaex的plot1d()
函数,你可以很容易地通过一维绘图进行可视化。有一个参数limits
,将显示一个显示99.7%数据的直方图,如下图所示。
%time df.plot1d(df.fare_amount,limits='99.7%')
Wall time: 404 ms
[]
二维图
我们还可以在二维直方图或热图中对数据进行可视化。DataFrame.plot()
函数就是用于此。
现在,让我们尝试用纽约市出租车数据的同一数据框架绘制一个二维图。请看下面的代码。
df.plot(df.total_amount , df.trip_distance, limits=[-20,20])
让我们再看几个例子。为此,我将使用vaex中内置的示例数据框架。你可以通过调用vaex.example()
,简单地加载它。下面是这个数据框架的视图。
df_example = vaex.example()
df_example
让我们使用这个df_example
,创建一个2D图。vaex提供的一个惊人的功能是plot()
函数的参数what
。你可以定义需要绘制的数学关系(形状等于什么参数的长度)。下面是一个二维绘图的例子
df_example.plot(df_example.x, df_example.y, what=vaex.stat.mean(df_example.E)**2, limits='99.7%')
绘图的选择
之前,我们看到vaex使用选择来加快过滤速度。这些也有助于快速可视化。你可以在你的DataFrame中拥有4个(命名的)选择,而不是像pandas中那样过滤和拥有4个不同的列。现在,你可以只通过一次数据来计算统计数据。特别是当你的数据集比你的内存大的时候,这就明显快了。让我们看看下面的例子。我使用三个选择进行了绘制。
df_example.plot(df_example.x, df_example.y, what=np.log(vaex.stat.count()+1), limits='99.7%',
selection=[None, df_example.x < df_example.y, df_example.x < -10]);
你可以看到,在默认情况下,图形是在彼此的顶部淡化的类型。如果你想让它成为独立的列,那么你可以通过visual
参数来传递这个选项。这将把每个选择绘制成一个列。请看下面的例子
import numpy as np
df_example.plot(df_example.x, df_example.y, what=np.log(vaex.stat.count()+1), limits='99.7%',
selection=[None, df_example.x < df_example.y, df_example.x < -10],visual=dict(column='selection'))
The postVaex - Faster Pandas Alternate in Pythonappeared first onMachine Learning Plus.