Altair 5.0中时间聚合数据Impute填充无效问题求助
Altair时间聚合数据缺失值填充0解决方案
你使用Altair 5.0编写的以下代码,无法为1981年的Miles_per_Gallon均值填充0:
alt.Chart(cars).mark_line().encode( x='year(Year):T', y=alt.Y('mean(Miles_per_Gallon):Q').impute(value=0) )
问题原因
encode参数中的impute仅能处理已有数据行中的缺失值,但1981年在按年份聚合后根本没有对应的行数据,因此该方法无法生效。如果之前尝试transform_impute未成功,通常是因为没有指定完整的时间范围作为补全依据。
可行解决方案
需要先生成包含所有目标年份的完整序列,再将聚合后的数据与该序列关联,最后填充缺失值为0。以下是两种实现方式:
方式一:结合transform_aggregate与transform_impute
import altair as alt from vega_datasets import data cars = data.cars() # 生成从数据最小年份到最大年份的完整序列 year_sequence = alt.sequence( start=cars['Year'].min(), stop=cars['Year'].max() + 1, step=1, as_='Year' ) alt.Chart(cars).transform_aggregate( mean_mpg='mean(Miles_per_Gallon)', groupby=['Year'] ).transform_impute( impute='mean_mpg', value=0, key='Year', sequence=year_sequence ).mark_line().encode( x='year(Year):T', y='mean_mpg:Q' )
方式二:用transform_sequence与transform_leftjoin补全
import altair as alt from vega_datasets import data cars = data.cars() alt.Chart(cars).transform_calculate( year='year(datum.Year)' ).transform_aggregate( mean_mpg='mean(Miles_per_Gallon)', groupby=['year'] ).transform_sequence( start='year(min(datum.Year))', stop='year(max(datum.Year)) + 1', step=1, as_='year' ).transform_leftjoin( alt.Chart(cars).transform_calculate( year='year(datum.Year)' ).transform_aggregate( mean_mpg='mean(Miles_per_Gallon)', groupby=['year'] ), on='year' ).transform_impute( impute='mean_mpg', value=0 ).mark_line().encode( x='year(year):T', y='mean_mpg:Q' )
关键逻辑说明
- 先通过
transform_aggregate按年份计算均值,得到已有年份的聚合结果; - 用
sequence生成包含所有缺失年份的完整时间序列; - 通过关联操作将聚合数据与完整序列合并,再用
transform_impute将缺失年份的均值填充为0。
内容的提问来源于stack exchange,提问作者Nam Wook Kim
相关产品推荐
相关产品推荐

