填充#

填充转换(impute transform)允许您填充数据集中的缺失条目。例如,考虑以下数据,其中包含我们在长格式表示中过滤掉的缺失值(有关更多信息,请参见长格式与宽格式数据)。

import numpy as np
import pandas as pd

data = pd.DataFrame({
    't': range(5),
    'x': [2, np.nan, 3, 1, 3],
    'y': [5, 7, 5, np.nan, 4]
}).melt('t').dropna()
data
       t variable  value
    0  0        x    2.0
    2  2        x    3.0
    3  3        x    1.0
    4  4        x    3.0
    5  0        y    5.0
    6  1        y    7.0
    7  2        y    5.0
    9  4        y    4.0

注意结果:x 系列在 t=1 处没有条目,而 y 系列在 t=3 处有一个缺失条目。如果我们直接使用 Altair 可视化此数据,线条将跳过缺失的条目。

import altair as alt

raw = alt.Chart(data).mark_line(point=True).encode(
    x='t:Q',
    y='value:Q',
    color='variable:N'
)
raw

这并不总是可取的,因为(特别是对于没有点的折线图)它可能暗示存在实际上不存在的数据。

通过编码进行填充#

为了解决这个问题,您可以使用编码通道的填充方法。例如,我们可以使用一个常量值进行填充(背景中会浅色显示原始图表以供参考)。

background = raw.encode(opacity=alt.value(0.2))
chart = alt.Chart(data).mark_line(point=True).encode(
    x='t:Q',
    y=alt.Y('value:Q').impute(value=0),
    color='variable:N'
)
background + chart

或者我们可以使用任何支持的聚合方法进行填充。

chart = alt.Chart(data).mark_line(point=True).encode(
    x='t:Q',
    y=alt.Y('value:Q').impute(method='mean'),
    color='variable:N'
)
background + chart

通过转换进行填充#

分箱(Bin)聚合(Aggregate)类似,也可以在编码外部将填充(impute)指定为一种转换。例如,以下是上面两个图表的等效表示。

chart = alt.Chart(data).transform_impute(
    impute='value',
    key='t',
    value=0,
    groupby=['variable']
).mark_line(point=True).encode(
    x='t:Q',
    y='value:Q',
    color='variable:N'
)
background + chart
chart = alt.Chart(data).transform_impute(
    impute='value',
    key='t',
    method='mean',
    groupby=['variable']
).mark_line(point=True).encode(
    x='t:Q',
    y='value:Q',
    color='variable:N'
)
background + chart

如果您想使用更局部的填充值,可以指定一个 frame 参数,类似于窗口(Window),它将控制用于填充的值。例如,在这里我们使用两侧相邻点的平均值来填充缺失值。

chart = alt.Chart(data).transform_impute(
    impute='value',
    key='t',
    method='mean',
    frame=[-1, 1],
    groupby=['variable']
).mark_line(point=True).encode(
    x='t:Q',
    y='value:Q',
    color='variable:N'
)
background + chart

转换选项#

transform_impute() 方法基于 ImputeTransform 类构建,该类具有以下选项。

点击显示表格

属性

类型

描述

frame

array([null, number])

一个双元素数组的框架规范,用于控制应用指定方法的窗口。数组条目应为表示与当前数据对象偏移量的数字,或 null 表示当前数据对象之前或之后的不受限行。例如,值 [-5, 5] 表示窗口应包含当前对象之前的五个对象和之后的五个对象。

默认值: [null, null] 表示窗口包含所有对象。

groupby

array(FieldName)

一个可选的字段数组,用于对值进行分组。然后将按组别执行填充。

impute

FieldName

应填充缺失值的 数据字段。

key

FieldName

在组内唯一标识数据对象的关键字段。将填充缺失的关键值(数据中存在但在当前组中不存在的值)。

keyvals

anyOf(array(any), ImputeSequence)

定义应考虑用于填充的关键值。可以是关键值数组,也可以是定义数字序列 <https://vega.github.io/vega-lite/docs/impute.html#sequence-def>__ 的对象。

如果提供,这将与输入数据中观察到的关键值一起使用。如果未提供,则这些值将从 key 字段的所有唯一值中派生。对于 encoding 中的 impute,如果 y 字段被填充,则关键字段是 x 字段,反之亦然。

如果没有任何填充分组,则必须指定此属性。

method

ImputeMethod

用于填充数据对象字段值的填充方法。可以是 "value""mean""median""max""min" 之一。

默认值: "value"

value

any

当填充 method"value" 时使用的字段值。