什么是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.777470767 | 2.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.9140625 | 1435.1839599609375 | -828.7567749023438 | -1.788735491591229 |
2 | 1.3757627 | -6.3283844 | 2.63250017 | 96.276474 | 226.440201 | -34.7527161 | -100559.9609375 | 1039.2989501953125 | 920.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,995 | 3.76883793 | 4.66251659 | -4.42904139 | 107.432999 | -2.13771296 | 17.5130272 | -119687.3203125 | 746.8833618164062 | -508.96484375 | -1.6499842518381402 |
329,996 | 9.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.3925591 | 86.2726822 | -74862.90625 | 1324.5926513671875 | 1057.017333984375 | -1.225019818838568 |
329,999 | 10.5450506 | -8.86106777 | -4.65835428 | -2.10541415 | -27.6108856 | 3.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