如何解决如何在Power Query / Power BI中的列中插入缺失值?
那里有一个帖子,在一个非常具体的示例中描述了如何执行该操作:
https://community.powerbi.com/t5/Community-Blog/Linear-Interpolation-with-Power-BI/ba-p/341202
但是代码不是很可移植,因为它通过名称等来引用特定的列。
它也不会将代码打包为一个函数,因此您的超级查询将被大量额外的步骤和变量所困扰。
解决方法
我编写了一个(相对)通用函数,用于在幂查询中插值(对于幂bi和m代码也很有用)。
它将一个表和两个列名作为输入。它根据最接近的x,y对输出具有内插的y缺失值的表-如通过数据的顺序(不是数值紧密度)所指示。如果您需要数值接近度,只需在传递给此函数之前按x(可能还有缓冲区)进行排序即可。
(Input as table,xColumn as text,yColumn as text) =>
//Interpolates missing yColumn values based on nearest existing xColumn,yColumn pairs
let
Buffer = Table.Buffer(Input),//index for joining calculations and preserving original order
#"Added Main Index" = Table.AddIndexColumn(Buffer,"InterpolateMainIndex",1),#"Two Columns and Index" = Table.RemoveColumns(#"Added Main Index",List.Select(Table.ColumnNames(#"Added Main Index"),each _ <> xColumn and _ <> yColumn and _ <> "InterpolateMainIndex")),#"Remove Blanks" = Table.SelectRows(#"Two Columns and Index",each Record.Field(_,yColumn) <> null and Record.Field(_,yColumn) <> ""),//index for refering to next non-blank record
#"Added Sub Index" = Table.AddIndexColumn(#"Remove Blanks","InterpolateSubIndex",//m = (y2 - y1) / (x2 - x1)
m = Table.AddColumn(#"Added Sub Index","m",each (Number.From(Record.Field(_,yColumn))-Number.From(Record.Field(#"Added Sub Index"{[InterpolateSubIndex]+1},yColumn))) /
(Number.From(Record.Field(_,xColumn))-Number.From(Record.Field(#"Added Sub Index"{[InterpolateSubIndex]+1},xColumn))),type number),//b = y - m * x
b = Table.AddColumn(m,"b",yColumn) - [#"m"] * Number.From(Record.Field(_,xColumn)),//rename or remove columns to allow full join
#"Renamed Columns" = Table.RenameColumns(b,{{"InterpolateMainIndex","InterpolateMainIndexCopy"}}),xColumnmb = Table.RemoveColumns(#"Renamed Columns",{yColumn,xColumn,"InterpolateSubIndex"}),Join = Table.Join(#"Added Main Index",xColumnmb,"InterpolateMainIndexCopy",JoinKind.FullOuter),//enforce orignal sorting
#"Sorted by Main Index" = Table.Sort(Join,Order.Ascending}}),#"Filled Down mb" = Table.FillDown(#"Sorted by Main Index",{"m","b"}),//y = m * x + b
Interpolate = Table.ReplaceValue(#"Filled Down mb",null,each ([m] * Number.From(Record.Field(_,xColumn)) + [b]),Replacer.ReplaceValue,{yColumn}),//clean up
#"Remove Temporary Columns" = Table.RemoveColumns(Interpolate,"InterpolateMainIndexCopy"}),#"Restore Types" = Value.ReplaceType(#"Remove Temporary Columns",Value.Type(Input))
in
#"Restore Types"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。