窗口#

窗口转换对排序后的数据对象组执行计算。这些计算包括排名、提前/滞后分析以及累积求和和平均值等聚合。计算出的值被写回输入数据流,可以在其中通过编码进行引用。

例如,考虑以下累积频率分布

import altair as alt
from vega_datasets import data

alt.Chart(data.movies.url).transform_window(
    sort=[{'field': 'IMDB_Rating'}],
    frame=[None, 0],
    cumulative_count='count(*)',
).mark_area().encode(
    x='IMDB_Rating:Q',
    y='cumulative_count:Q',
)

首先,我们传递一个排序字段定义,它指示数据对象应如何在窗口内排序。在这里,电影应按其 IMDB 评分排序。接下来,我们传递帧(frame),它指示当前数据对象之前和之后应包含多少数据对象。在这里,应包含截至当前电影的所有电影。最后,我们传递一个窗口字段定义,它指示应如何在窗口内聚合数据对象。在这里,应计算电影的数量。

Altair 中内置了许多聚合函数。除了在分箱和聚合中给出的函数外,我们还可以在窗口字段定义中使用以下函数

聚合

参数

描述

row_number

为每个数据对象分配一个从 1 开始的连续行号。

rank

为窗口中的每个数据对象分配一个排名值,从 1 开始。同等值被赋予相同的排名。后续排名分数包含之前值的数量。例如,如果前两个值并列第 1 名,则第三个值被赋予第 3 名。

dense_rank

为窗口中的每个数据对象分配一个密集排名值,从 1 开始。同等值被赋予相同的排名。后续排名分数不包含之前值的数量。例如,如果前两个值并列第 1 名,则第三个值被赋予第 2 名。

percent_rank

为窗口中的每个数据对象分配一个百分比排名值。百分比计算为 (rank - 1) / (group_size - 1)。

cume_dist

为窗口中的每个数据对象分配一个介于 0 和 1 之间的累积分布值。

ntile

数字

为窗口中的每个数据对象分配一个分位数(例如,百分位数)值。接受一个整数参数,指示要使用的桶数(例如,百分位数用 100,五分位数用 5)。

lag

数字

分配一个值,该值来自在当前对象之前指定位置的数据对象。如果不存在此类对象,则分配null。接受一个偏移量参数(默认值为1),指示位置的数量。此操作必须在fields参数数组中具有对应的条目。

lead

数字

分配一个值,该值来自在当前对象之后指定位置的数据对象。如果不存在此类对象,则分配null。接受一个偏移量参数(默认值为1),指示位置的数量。此操作必须在fields参数数组中具有对应的条目。

first_value

分配当前滑动窗口帧中第一个数据对象的值。此操作必须在fields参数数组中具有对应的条目。

last_value

分配当前滑动窗口帧中最后一个数据对象的值。此操作必须在fields参数数组中具有对应的条目。

nth_value

数字

分配当前滑动窗口帧中第 n 个数据对象的值。如果不存在此类对象,则分配null。需要一个非负整数参数,指示相对于窗口帧起始位置的偏移量。此操作必须在fields参数数组中具有对应的条目。

聚合转换计算一个汇总所有数据对象的单一值,而窗口转换则为每个数据对象添加一个新属性。这个新属性是根据相邻的数据对象计算的:即,根据由窗口字段定义界定的数据对象计算。例如,考虑以下股票价格时间序列

import altair as alt
from vega_datasets import data

alt.Chart(data.stocks.url).mark_line().encode(
    x='date:T',
    y='price:Q',
    color='symbol:N',
)

在上面的示例中很难看到整体模式,因为谷歌的股票价格远高于其他股票价格。如果我们绘制股票价格的z-分数,而不是股票价格本身,那么整体模式就会变得更清晰

import altair as alt
from vega_datasets import data

alt.Chart(data.stocks.url).transform_window(
    mean_price='mean(price)',
    stdev_price='stdev(price)',
    frame=[None, None],
    groupby=['symbol'],
).transform_calculate(
    z_score=(alt.datum.price - alt.datum.mean_price) / alt.datum.stdev_price,
).mark_line().encode(
    x='date:T',
    y='z_score:Q',
    color='symbol:N',
)

通过在窗口转换中使用两个聚合函数(meanstdev),我们可以在计算转换(calculate transform)中计算 z-分数。

有关窗口转换参数的更多信息,请参阅WindowTransformVega-Lite 文档

转换选项#

transform_window()方法构建在WindowTransform类之上,它具有以下选项

点击显示表格

属性

类型

描述

frame

array([null, number])

帧(frame)规范是一个包含两个元素的数组,指示滑动窗口如何进行。数组条目应该是一个数字,指示相对于当前数据对象的偏移量,或者 null,指示当前数据对象之前或之后的行不受限制。默认值为[null, 0],表示滑动窗口包含当前对象和之前的所有对象。值[-5, 5]表示窗口应包含当前对象之前的五个对象和之后的五个对象。最后,[null, null]表示窗口帧应始终包含所有数据对象。如果你使用此帧并想为添加的对象分配相同的值,可以使用更简单的join aggregate transform <https://vega.github.io/vega-lite/docs/joinaggregate.html>__。受影响的唯一操作是聚合操作以及first_valuelast_valuenth_value窗口操作。其他窗口操作不受此影响。

默认值:: [null, 0](包含当前对象和之前的所有对象)

groupby

array(FieldName)

用于将数据对象分成单独窗口的数据字段。如果未指定,所有数据点将位于一个窗口中。

ignorePeers

boolean

指示滑动窗口帧是否应忽略同等值(根据排序标准被视为相同的数据)。默认值为 false,导致窗口帧扩展以包含所有同等值。如果设置为 true,则窗口帧仅由偏移值定义。此设置仅影响依赖于窗口帧的操作,即聚合操作以及 first_value、last_value 和 nth_value 窗口操作。

默认值: false

sort

array(SortField)

用于在窗口内排序数据对象的排序字段定义。如果两个数据对象被比较器视为相等,它们被视为具有相等排名的“同等”值。如果未指定排序,则顺序未定义:数据对象按观察到的顺序处理,并且不被视为同等值(ignorePeers 参数被忽略并视为设置为true)。

window

array(WindowFieldDef)

窗口中字段的定义以及要使用的计算。