窗口#
窗口转换对排序后的数据对象组执行计算。这些计算包括排名、提前/滞后分析以及累积求和和平均值等聚合。计算出的值被写回输入数据流,可以在其中通过编码进行引用。
例如,考虑以下累积频率分布
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 |
数字 |
分配一个值,该值来自在当前对象之前指定位置的数据对象。如果不存在此类对象,则分配 |
lead |
数字 |
分配一个值,该值来自在当前对象之后指定位置的数据对象。如果不存在此类对象,则分配 |
first_value |
无 |
分配当前滑动窗口帧中第一个数据对象的值。此操作必须在fields参数数组中具有对应的条目。 |
last_value |
无 |
分配当前滑动窗口帧中最后一个数据对象的值。此操作必须在fields参数数组中具有对应的条目。 |
nth_value |
数字 |
分配当前滑动窗口帧中第 n 个数据对象的值。如果不存在此类对象,则分配 |
聚合转换计算一个汇总所有数据对象的单一值,而窗口转换则为每个数据对象添加一个新属性。这个新属性是根据相邻的数据对象计算的:即,根据由窗口字段定义界定的数据对象计算。例如,考虑以下股票价格时间序列
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',
)
通过在窗口转换中使用两个聚合函数(mean
和stdev
),我们可以在计算转换(calculate transform)中计算 z-分数。
有关窗口转换参数的更多信息,请参阅WindowTransform
和Vega-Lite 文档。
转换选项#
transform_window()
方法构建在WindowTransform
类之上,它具有以下选项
点击显示表格
属性 |
类型 |
描述 |
---|---|---|
frame |
array([null, number]) |
帧(frame)规范是一个包含两个元素的数组,指示滑动窗口如何进行。数组条目应该是一个数字,指示相对于当前数据对象的偏移量,或者 null,指示当前数据对象之前或之后的行不受限制。默认值为 默认值:: |
groupby |
array( |
用于将数据对象分成单独窗口的数据字段。如果未指定,所有数据点将位于一个窗口中。 |
ignorePeers |
|
指示滑动窗口帧是否应忽略同等值(根据排序标准被视为相同的数据)。默认值为 false,导致窗口帧扩展以包含所有同等值。如果设置为 true,则窗口帧仅由偏移值定义。此设置仅影响依赖于窗口帧的操作,即聚合操作以及 first_value、last_value 和 nth_value 窗口操作。 默认值: |
sort |
array( |
用于在窗口内排序数据对象的排序字段定义。如果两个数据对象被比较器视为相等,它们被视为具有相等排名的“同等”值。如果未指定排序,则顺序未定义:数据对象按观察到的顺序处理,并且不被视为同等值(ignorePeers 参数被忽略并视为设置为 |
window |
array( |
窗口中字段的定义以及要使用的计算。 |