📜  Python的Vaex 介绍

📅  最后修改于: 2022-05-13 01:54:59.409000             🧑  作者: Mango

Python的Vaex 介绍

处理大数据在今天变得非常普遍,因此我们需要一些库来帮助我们处理来自我们系统(即台式机、笔记本电脑)的大数据,同时即时执行代码和低内存使用率。

Vaex是一个Python库,它帮助我们实现这一目标并使处理大型数据集变得非常容易。它特别适用于懒惰的核心外数据帧(类似于 Pandas)。它可以快速地对大型表格数据集进行可视化、探索和计算,并且占用的内存最少。

安装:

使用康达:

conda install -c conda-forge vaex

使用点子:

pip install --upgrade vaex

为什么是 Vaex?

Vaex 通过惰性计算、虚拟列、内存映射、零内存复制策略、高效的数据清理等帮助我们高效快速地处理大型数据集。 Vaex 具有高效的算法,它强调聚合数据属性而不是查看单个样本。它能够克服其他库的几个缺点(例如:-pandas)。所以,让我们探索 Vaex:-



阅读表现

对于大型表格数据,Vaex 的读取性能比 Pandas 快很多。让我们通过使用两个库导入相同大小的数据集来进行分析。数据集链接

Pandas 的阅读性能

Python3
import pandas as pd
%time df_pandas = pd.read_csv("dataset1.csv")


Python3
import vaex
%time df_vaex = vaex.open("dataset1.csv.hdf5")


Python3
print("Size =")
print(df_pandas.shape)
print(df_vaex.shape)


Python3
%time df_pandas['column2'] + df_pandas['column3']


Python3
%time df_vaex.column2 + df_vaex.column3


Python3
%time df_pandas["column3"].mean()


Python3
%time df_vaex.mean(df_vaex.column3)


Python3
%time df_pandas_filtered = df_pandas[df_pandas['column5'] > 1]


Python3
%time df_vaex_filtered = df_vaex[df_vaex['column5'] > 1]


Python3
df_vaex.select(df_vaex.column4 < 20, 
               name='less_than')
df_vaex.select(df_vaex.column4 >= 20,
               name='gr_than')
  
%time df_vaex.mean(df_vaex.column4,
                   selection=['less_than', 'gr_than'])


Python3
%time df_vaex['new_col'] = df_vaex['column3']**2
df_vaex.mean(df_vaex['new_col'])


Python3
%time df_vaex.count(binby=df_vaex.column7,
                    limits=[0, 20], shape=10)


Python3
%time df_vaex.viz.histogram(df_vaex.column1, 
                            limits = [0, 20])


Python
df_vaex.viz.heatmap(df_vaex.column7, df_vaex.column8 +
                    df_vaex.column9, limits=[-3, 20])


Python3
df_vaex.viz.heatmap(df_vaex.column1, df_vaex.column2,
                    what=(vaex.stat.mean(df_vaex.column4) /
                          vaex.stat.std(df_vaex.column4)),
                    limits='99.7%')


输出:

Wall time: 1min 8s

Vaex 的读取性能:(我们使用 vaex.open 在 Vaex 中读取数据集)

蟒蛇3

import vaex
%time df_vaex = vaex.open("dataset1.csv.hdf5")

输出:

Wall time: 1.34 s

与 Pandas 相比,Vaex 读取相同大小的数据集花费的时间很少:



蟒蛇3

print("Size =")
print(df_pandas.shape)
print(df_vaex.shape)

输出:

Size = 
12852000, 36
12852000, 36

Vaex 懒惰地进行计算

Vaex 使用惰性计算技术(即在不浪费 RAM 的情况下即时计算)。在这种技术中,Vaex 不做完整的计算,而是创建一个 Vaex 表达式,并在打印出来时显示一些预览值。因此 Vaex 仅在需要时才执行计算,否则它会存储表达式。这使得 Vaex 的计算速度异常的快。让我们执行一个简单计算的例子:

熊猫数据帧

蟒蛇3

%time df_pandas['column2'] + df_pandas['column3']

输出:

Vaex 数据帧

蟒蛇3

%time df_vaex.column2 + df_vaex.column3

输出:



统计性能:

Vaex 可以在每秒高达十亿 (10 9 ) 个对象/行的 N 维网格上计算诸如平均值、总和、计数、标准偏差等统计数据。因此,让我们在计算统计数据时比较 pandas 和 Vaex 的性能:-

熊猫数据框

蟒蛇3

%time df_pandas["column3"].mean()

输出:

Wall time: 741 ms
49.49811570183629

Vaex 数据框:

蟒蛇3

%time df_vaex.mean(df_vaex.column3)

输出:

Wall time: 347 ms
array(49.4981157)

Vaex 遵循零内存复制策略

与 Pandas 不同,Vaex 在数据过滤、选择、子集、清理过程中不会创建内存副本。让我们以数据过滤为例,在实现此任务时,Vaex 使用的内存非常少,因为 Vaex 中没有进行内存复制。并且执行的时间也是最少的。

熊猫



蟒蛇3

%time df_pandas_filtered = df_pandas[df_pandas['column5'] > 1]

输出:

Wall time: 24.1 s

瓦克斯

蟒蛇3

%time df_vaex_filtered = df_vaex[df_vaex['column5'] > 1]

输出:

Wall time: 91.4 ms

这里数据过滤导致对现有数据的引用,带有布尔掩码,该掩码跟踪选定行和非选定行。 Vaex 对数据执行多次计算:-

蟒蛇3

df_vaex.select(df_vaex.column4 < 20, 
               name='less_than')
df_vaex.select(df_vaex.column4 >= 20,
               name='gr_than')
  
%time df_vaex.mean(df_vaex.column4,
                   selection=['less_than', 'gr_than'])

输出:

Wall time: 128 ms
array([ 9.4940431, 59.49137605])

Vaex 中的虚拟列

当我们通过向 DataFrame 添加表达式来创建新列时,会创建虚拟列。这些列就像普通列一样,但不占用内存,只存储定义它们的表达式。这使得任务非常快并减少了 RAM 的浪费。 Vaex 不区分常规列和虚拟列。

蟒蛇3



%time df_vaex['new_col'] = df_vaex['column3']**2
df_vaex.mean(df_vaex['new_col'])

输出:

Vaex 中的分箱统计:

Vaex 为 Pandas 的 groupby 提供了一种更快的替代方案,即“binby”,它可以在常规 bin 中快速计算常规 N 维网格的统计数据。

蟒蛇3

%time df_vaex.count(binby=df_vaex.column7,
                    limits=[0, 20], shape=10)

输出:

Vaex 中的快速可视化:

大型数据集的可视化是一项乏味的任务。但是 Vaex 可以非常快速地计算这些可视化。当在 bin 中计算时,该数据集可以更好地了解数据分布,而 Vaex 在组聚合属性、选择和 bin 方面表现出色。因此,Vaex 能够快速且交互式地进行可视化。通过 Vaex,即使在大型数据集的 3 维中也可以进行可视化。
让我们绘制一个简单的一维图:

蟒蛇3

%time df_vaex.viz.histogram(df_vaex.column1, 
                            limits = [0, 20])

输出:



让我们绘制一个二维热图:

Python

df_vaex.viz.heatmap(df_vaex.column7, df_vaex.column8 +
                    df_vaex.column9, limits=[-3, 20])

输出:

我们可以通过传递“what=()”参数来添加统计表达式和可视化。所以让我们执行一个稍微复杂的可视化:

蟒蛇3

df_vaex.viz.heatmap(df_vaex.column1, df_vaex.column2,
                    what=(vaex.stat.mean(df_vaex.column4) /
                          vaex.stat.std(df_vaex.column4)),
                    limits='99.7%')

输出:

在这里,'vaex.stat.' 对象与 Vaex 表达式非常相似,它表示底层计算,我们也可以将典型的算术和 Numpy 函数应用于这些计算。