Python 中的 Vaex 简介

pythonserver side programmingprogramming

在数据科学领域,我们需要考虑的一个重要方面是处理大型数据集。处理如此大量的数据对于内存管理和执行速度来说确实是一个挑战。

Vaex 是一个专门为解决此类问题而设计的 Python 库。它对于懒惰的 Out-of-Core 数据框架(如 Pandas)特别有用,因为仅在必要时才执行计算。它在大数据分析、操作和可视化方面提供了良好的解决方案。在本文中,我们将探讨 Vaex 的理念、功能以及如何在 Python 中使用它。

它利用多核 CPU 和 SSD 等当代技术的优势,实现快速、有效的计算。

我们为什么需要 Vaex?

Vaex 的惰性求值、虚拟列、内存映射、可视化和利用允许高效计算和减少内存使用等的表达系统,使我们能够高效、快速地处理大量数据集。 Vaex 有可能克服其他库(包括 pandas)中的各种限制。

开始使用 Vaex

我们可以通过两种方式安装 vaex −

  • 使用 Pip − pip install --upgrade vaex

  • 使用 Conda − conda install -c conda-forge vaex

安装后,您可以按如下方式导入和使用它 −

import vaex

读取数据性能

Vaex 读取大量表格数据的速度比 pandas 快得多。让我们通过将相同大小的数据集加载到两个库中进行分析。这里我将使用 vaex 提供的数据集。如果你想获得良好的结果并观察 Vaex 和 Pandas 的性能差异,请尝试使用大型数据集。本质上,如果您正在处理 Python 中的大量数据集,Vaex 可能就是适合您的库。

Vaex 的性能

我们将直接以 HDF5 格式加载 vaex 提供的数据集,该数据集使用 vaex.example() 命令进行内存映射。

示例

import vaex
%time df_v=vaex.example()
print(df_v.head(5))
df_v.describe()

输出

CPU times: user 10.7 ms, sys: 0 ns, total: 10.7 ms
Wall time: 10.7 ms

Pandas 的性能

我们将加载与 vaex 使用的相同的数据集并比较读取性能

示例

import pandas as pd
columns = df_v.get_column_names()
data = {}
for column in columns:
   data[column] = df_v[column].values
%time df_p = pd.DataFrame(data)
print(df_p.head(5))
df_p.describe()

输出

CPU times: user 4.17 ms, sys: 5.06 ms, total: 9.23 ms
Wall time: 13.7 ms

从以上结果我们可以得出结论,对于相同的数据集,Vaex 工具比 Pandas 花费的时间更少。

示例

print("Size =")
print(df_p.shape)
print(df_v.shape)

输出

Size =
(330000,11)
(330000,11)

使用 Vaex 进行数据操作/惰性计算

Vaex 使用一种称为"惰性求值"的技术来延迟操作的求值,直到需要其结果为止。这种技术有助于节省计算能力并有效管理内存。众所周知,Vaex 使用表达式系统,这些表达式是惰性求值的,这意味着仅在必要时执行计算。这样可以加快计算速度。让我们用一个示例来测试一下单个计算 -

Pandas DataFrame

示例

%time df_pandas['x'] + df_pandas['y']

输出

CPU times: user 2.15 ms, sys: 10 µs, total: 2.16 ms
Wall time: 1.51 ms

Vaex 数据框架

示例

%time df_v.x + df_v.y

输出

CPU times: user 280 µs, sys: 31 µs, total: 311 µs
Wall time: 318 µs
Expression = (x + y)
Length: 330,000 dtype: float32 (expression)
-------------------------------------------
     0  0.83494
     1  3.49052
     2   1.2058
     3  9.30084
     4  19.2119
      ...      
329995  2.78315
329996  4.43943
329997  13.3985
329998  1.34032
329999  17.4648

统计性能

Vaex 还可以执行一些操作,如平均值、标准差、计数等。让我们比较一下 pandas 和 Vaex 在计算统计数据时的表现 -

Pandas Dataframe

示例

%time df_p["L"].mean()

输出

Wall time:4.23 ms
920.81793

Vaex 数据框架

示例

%time df_v.mean(df_v.L)

输出

Wall time: 2.49 ms
array(920.81803276)

数据过滤

与 Pandas 不同,Vaex 在过滤、选择、清理数据时不会复制内存。以数据过滤为例。由于 Vaex 不进行内存复制,因此它只占用很少的 RAM 空间来完成,并且执行速度也会很快。

Pandas Dataframe

示例

%time df_p_filtered = df_p[df_p['x'] > 0]

输出

CPU times: user 13 ms, sys: 1.74 ms, total: 14.7 ms
Wall time: 19.7 ms

Vaex 数据框

示例

%time df_v_filtered = df_v[df_v['x'] > 0]

输出

CPU times: user 1.23 ms, sys: 20 µs, total: 1.25 ms
Wall time: 1.27 ms

Vaex 通过在一次数据传递中执行多次计算来展示其效率 −

示例

df_v.select(df_v.id < 15,name='less_than')
df_v.select(df_v.id >= 15,name='greater_than')
%time df_v.mean(df_v.id, selection=['less_than', 'greater_than'])

输出

CPU times: user 19.3 ms, sys: 0 ns, total: 19.3 ms
Wall time: 15.5 ms
array([ 7.00641717, 23.49799197])

Vaex 中的虚拟列

如果我们试图通过合并表达式在数据框中创建新列,虚拟列就会发挥作用。这些列类似于常规列,但不占用内存空间;相反,它们存储表达式本身。在 vaex 的世界中,虚拟列和常规列之间不存在任何区别,因为默认的 Expression 系统对它们都具有同等重要性。

示例

%time df_v['new_col'] = df_v['x']**2
print(df_v.head())
df_v.mean(df_v['new_col'])

输出

如您所见,表中添加了一个新列。

array(52.94398942)

可视化

Vaex 与 Matplotlib 和 Bokeh 等流行的可视化库无缝集成,使用户能够使用大型数据集创建高度详细且交互式的可视化。

Vaex 是一个功能极其强大的数据分析库,它使用户能够毫不费力地创建令人惊叹的可视化效果,超越单纯二维表示的界限,深入研究复杂的三维视野领域,即使在处理庞大复杂的数据集时也是如此。

我们将尝试创建一个一维图形 −

示例

%time df_v.viz.histogram(df_v.x, limits = [0, 10])

输出

我们将尝试创建一个二维图表 −

示例

df_v.viz.heatmap(df_v.x,df_v.y+df_v.z,limits=[-3, 20])

输出

此外,我们还可以添加一些统计表达式来可视化数据。表达式可以借助以下语法传递 -

语法

what=<statistic><Expression> 作为参数。

输出

我们还可以向这些计算中添加算术和 numpy 函数。


相关文章