数据转换#

在可视化数据的过程中,通常需要对数据进行转换或过滤。在 Altair 中,您可以通过以下两种方式实现:

  1. 在图表定义之前,使用标准的 pandas 数据转换。

  2. 在图表定义之内,使用 Vega-Lite 的数据转换工具。

在大多数情况下,我们建议您使用第一种方法,因为它对于熟悉 Python 中数据操作的人来说更直接,而且 pandas 包在数据操作方面比 Vega-Lite 提供了更多的灵活性。

当数据源不是 dataframe,而是例如指向 JSON 或 CSV 文件的 URL 指针时,第二种方法就会派上用场。它在复合图表中也很有用,其中数据集的不同视图需要不同的转换。

第二种方法——在图表规范本身中指定数据转换——可以通过顶级对象的 transform_* 方法来实现

转换

方法

描述

聚合

transform_aggregate()

通过聚合现有列来创建新的数据列。

分箱

transform_bin()

通过对现有列进行分箱来创建新的数据列。

计算

transform_calculate()

使用对现有列进行算术计算来创建新的数据列。

密度

transform_density()

创建一个包含输入数据的核密度估计的新数据列。

范围

transform_extent()

查找字段的范围并将结果存储在参数中。

过滤

transform_filter()

根据条件选择数据子集。

展平

transform_flatten()

将数组数据展平为列。

折叠

transform_fold()

将宽格式数据转换为长格式数据(与 pivot 相反)。

填充缺失值

transform_impute()

填充缺失数据。

连接聚合

transform_joinaggregate()

聚合转换后与原始数据连接。

LOESS

transform_loess()

创建包含数据 LOESS 平滑结果的新列。

查找

transform_lookup()

基于查找键对两个数据集进行单边连接。

透视

transform_pivot()

将长格式数据转换为宽格式数据(与 fold 相反)。

分位数

transform_quantile()

计算数据集的经验分位数。

回归

transform_regression()

对数据集拟合回归模型。

采样

transform_sample()

从数据集的行中进行随机子采样。

堆叠

transform_stack()

计算值的堆叠版本。

时间单位

transform_timeunit()

按时间单位(日、月、年等)对日期进行离散化/分组。

窗口

transform_window()

计算窗口聚合

访问转换后的数据#

当图表显示时,数据转换由 Vega JavaScript 库在浏览器中执行。在构建图表的过程中检查转换后的数据结果通常很有帮助。一种方法是在由文本标记组成的表中显示转换后的数据结果,就像在刷选散点图以在表中显示数据图库示例中所示。

虽然这种方法可行,但有些繁琐,并且仍然无法从 Python 中访问转换后的数据。为了使转换后的数据结果在 Python 中可用,Altair 提供了 transformed_data() 图表方法,该方法与 VegaFusion 集成,以便在 Python 内核中评估数据转换。

首先,安装启用嵌入附加功能的 VegaFusion。

pip install "vegafusion[embed]"

然后创建一个 Altair 图表并调用 transformed_data() 方法来提取包含转换后数据的 pandas DataFrame。

import altair as alt
from vega_datasets import data

cars = data.cars.url
chart = alt.Chart(cars).mark_bar().encode(
    y='Cylinders:O',
    x='mean_acc:Q'
).transform_aggregate(
    mean_acc='mean(Acceleration)',
    groupby=["Cylinders"]
)
chart.transformed_data()
       Cylinders   mean_acc  mean_acc_start  mean_acc_end
    0          8  12.837037             0.0     12.837037
    1          4  16.616425             0.0     16.616425
    2          6  16.263095             0.0     16.263095
    3          3  13.250000             0.0     13.250000
    4          5  18.633333             0.0     18.633333

transformed_data() 方法目前支持 Altair 的大部分(但非全部)转换。请参见下表。