什么是Vaex?#

Vaex 是一个用于懒加载超大数据框架(类似于 Pandas)的 Python 库,用于可视化和探索大型表格数据集。它可以在N维网格上计算统计量,如均值、总和、计数、标准差等,每秒处理多达十亿\(10^9\))个对象/行。可视化通过直方图密度图3D 体积渲染完成,允许对大数据的交互式探索。Vaex 使用内存映射、零内存复制策略和懒加载计算,以实现最佳性能(不浪费内存)。

为什么选择vaex#

  • 性能: 能够处理海量的表格数据,每秒处理超过 \(\gt 10^9\)

  • 懒加载/虚拟列: 动态计算,不浪费内存

  • 内存高效 在进行过滤/选择/子集操作时无需内存复制。

  • 可视化: 直接支持,通常一行代码就足够了。

  • 用户友好的API: 你只需要处理DataFrame对象,标签补全和文档字符串会帮助你:ds.mean,感觉非常类似于Pandas。

  • Lean: 分为多个包

    • vaex-core: DataFrame 和核心算法,以 numpy 数组作为输入列。

    • vaex-hdf5: 提供内存映射的 numpy 数组到 DataFrame。

    • vaex-arrow: Arrow 支持跨语言数据共享。

    • vaex-viz: 基于 matplotlib 的可视化。

    • vaex-jupyter: 基于 Jupyter widgets / ipywidgets、bqplot、ipyvolume 和 ipyleaflet 的交互式可视化。

    • vaex-astro: 天文学相关的转换和 FITS 文件支持。

    • vaex-server: 提供远程访问 DataFrame 的服务器。

    • vaex-distributed: (已弃用) 现在是 vaex-enterprise 的一部分。

    • vaex-qt: 使用 Qt GUI 编写的程序。

    • vaex: 安装上述所有包的元包。

    • vaex-ml: 机器学习

  • Jupyter 集成: vaex-jupyter 将在 Jupyter notebook 和 Jupyter lab 中提供交互式可视化和选择功能。

安装#

使用 conda:

  • conda install -c conda-forge vaex

使用 pip:

  • pip install --upgrade vaex

或者阅读详细说明

入门指南#

我们假设您已经安装了vaex,并且正在运行一个Jupyter notebook服务器。我们首先导入vaex并要求它给我们一个示例数据集。

[1]:
import vaex
df = vaex.example()  # open the example dataset provided with vaex

相反,您可以下载一些更大的数据集,或者读取您的csv文件

[2]:
df  # will pretty print the DataFrame
[2]:
# x y z vx vy vz E L Lz FeH
0 -0.7774707672.10626292 1.93743467 53.276722 288.386047 -95.2649078-121238.171875 831.0799560546875 -336.426513671875 -2.309227609164518
1 3.77427316 2.23387194 3.76209331 252.810791 -69.9498444-56.3121033-100819.91406251435.1839599609375-828.7567749023438 -1.788735491591229
2 1.3757627 -6.3283844 2.63250017 96.276474 226.440201 -34.7527161-100559.96093751039.2989501953125920.802490234375 -0.7618109022478798
3 -7.06737804 1.31737781 -6.10543537 204.968842 -205.679016-58.9777031-70174.8515625 2441.724853515625 1183.5899658203125 -1.5208778422936413
4 0.243441463 -0.822781682-0.206593871-311.742371-238.41217 186.824127 -144138.75 374.8164367675781 -314.5353088378906 -2.655341358427361
... ... ... ... ... ... ... ... ... ... ...
329,9953.76883793 4.66251659 -4.42904139 107.432999 -2.1377129617.5130272 -119687.3203125746.8833618164062 -508.96484375 -1.6499842518381402
329,9969.17409325 -8.87091351 -8.61707687 32.0 108.089264 179.060638 -68933.8046875 2395.633056640625 1275.490234375 -1.4336036247720836
329,997-1.14041007 -8.4957695 2.25749826 8.46711349 -38.2765236-127.541473-112580.359375 1182.436279296875 115.58557891845703 -1.9306227597361942
329,998-14.2985935 -5.51750422 -8.65472317 110.221558 -31.392559186.2726822 -74862.90625 1324.59265136718751057.017333984375 -1.225019818838568
329,99910.5450506 -8.86106777 -4.65835428 -2.10541415-27.61088563.80799961 -95361.765625 351.0955505371094 -309.81439208984375-2.5689636894079477

使用方括号[],我们可以轻松地过滤或获取DataFrame的不同视图。

[3]:
df_negative = df[df.x < 0]  # easily filter your DataFrame, without making a copy
df_negative[:5][['x', 'y']]  # take the first five rows, and only the 'x' and 'y' column (no memory copy!)
[3]:
# x y
0 -0.777471 2.10626
1 -7.06738 1.31738
2 -5.17174 7.82915
3-15.9539 5.77126
4-12.3995 13.9182

在处理庞大的数据集时,比如十亿行数据(\(10^9\)),对数据进行计算可能会浪费内存,新增一列可能占用高达8 GB的内存。相反,vaex使用惰性计算,只存储计算的表示形式,并在需要时即时进行计算。你可以像使用普通数组一样使用许多numpy函数。

[4]:
import numpy as np
# creates an expression (nothing is computed)
some_expression = df.x + df.z
some_expression  # for convenience, we print out some values
[4]:
<vaex.expression.Expression(expressions='(x + z)')> instance at 0x118f71550 values=[1.159963903, 7.53636647, 4.00826287, -13.17281341, 0.036847591999999985 ... (total 330000 values) ... -0.66020346, 0.5570163800000003, 1.1170881900000003, -22.95331667, 5.8866963199999995]

这些表达式可以添加到DataFrame中,创建我们所谓的虚拟列。这些虚拟列与普通列类似,只是它们不浪费内存。

[5]:
df['r'] = some_expression  # add a (virtual) column that will be computed on the fly
df.mean(df.x), df.mean(df.r)  # calculate statistics on normal and virtual columns
[5]:
(-0.06713149126400597, -0.0501732470530304)

vaex 的核心功能之一是其能够在常规(N维)网格上计算统计数据。网格的维度由 binby 参数(类似于 SQL 的 groupby)以及形状和限制指定。

[6]:
df.mean(df.r, binby=df.x, shape=32, limits=[-10, 10]) # create statistics on a regular grid (1d)
[6]:
array([-9.67777315, -8.99466731, -8.17042477, -7.57122871, -6.98273954,
       -6.28362848, -5.70005784, -5.14022306, -4.52820368, -3.96953423,
       -3.3362477 , -2.7801045 , -2.20162243, -1.57910621, -0.92856689,
       -0.35964342,  0.30367721,  0.85684123,  1.53564551,  2.1274488 ,
        2.69235585,  3.37746363,  4.04648274,  4.59580105,  5.20540601,
        5.73475069,  6.28384101,  6.67880226,  7.46059303,  8.13480148,
        8.90738265,  9.6117928 ])
[7]:
df.mean(df.r, binby=[df.x, df.y], shape=32, limits=[-10, 10]) # or 2d
df.count(df.r, binby=[df.x, df.y], shape=32, limits=[-10, 10]) # or 2d counts/histogram
[7]:
array([[22., 33., 37., ..., 58., 38., 45.],
       [37., 36., 47., ..., 52., 36., 53.],
       [34., 42., 47., ..., 59., 44., 56.],
       ...,
       [73., 73., 84., ..., 41., 40., 37.],
       [53., 58., 63., ..., 34., 35., 28.],
       [51., 32., 46., ..., 47., 33., 36.]])

这些一维和二维网格可以使用任何绘图库(如matplotlib)进行可视化,但设置可能很繁琐。为了方便,我们可以使用heatmap,或者查看其他可视化命令

[8]:
df.viz.heatmap(df.x, df.y, show=True);  # make a plot quickly
_images/index_19_0.png

继续#

继续教程 或查看 指南