Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
4 years ago
Solved

Linear regression in Power Query with grouping

Hello I followed Stephen Roughley's brilliant post: https://stephenroughley.com/2022/02/28/simple-linear-regression-in-power-query/ and it almost worked for me. My problem is I have my xcol repeat...
  • AlexisOlson's avatar
    4 years ago

    Here's an example similar to yours that demonstrates what I was suggesting:

    let
        Forecast = (sourceTable as table, xcol as text, ycol as text) =>
        let
            range = Table.SelectRows(sourceTable, each Record.Field(_, ycol) <> 0),
            rowcount = Table.RowCount(range),
            sumx  = List.Sum(Table.Column(range, xcol)),
            sumx2 = List.Sum(List.Transform(Table.Column(range, xcol), each Number.Power(_, 2))),
            sumy  = List.Sum(Table.Column(range, ycol)),
            sumxy = List.Sum(Table.TransformRows(range, each Record.Field(_, xcol) * Record.Field(_, ycol))),
            avgx  = List.Average(Table.Column(range, xcol)),
            avgy  = List.Average(Table.Column(range, ycol)),
            Slope = ((rowcount * sumxy - sumx * sumy) / (rowcount * sumx2 - Number.Power(sumx, 2))),
            Intercept = avgy - Slope * avgx,
            Result = Table.AddColumn(sourceTable, Text.Combine({ycol, "Forecast"}), each
                if Record.Field(_, ycol) = 0
                then Intercept + Slope * Record.Field(_, xcol)
                else 0, type number )
        in
            Result,
            
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("ZZBRCsAgDEPv0m8/pkbHziJ+bPc/xIw4XOhHCTxC0rY1ixbsHkNNxXrYKHGioEznKQhjDiHFkSrkWXUoglgHdbEuqwsuatel3y1VCDWqaZ4CQXBJmv0tfimiVkVzcUVwUT58/am/", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [dimA = _t, dimB = _t, dimX = _t, FactY = _t]),
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"dimA", Int64.Type}, {"dimB", type text}, {"dimX", Int64.Type}, {"FactY", Int64.Type}}),
        #"Grouped Rows" = Table.Group(#"Changed Type", {"dimA", "dimB"}, {{"SubTable", each Forecast(_, "dimX", "FactY"), type table [dimA=nullable number, dimB=nullable text, dimX=nullable number, FactY=nullable number, FactYForecast=nullable number]}}),
        #"Expanded SubTable" = Table.ExpandTableColumn(#"Grouped Rows", "SubTable", {"dimX", "FactY", "FactYForecast"}, {"dimX", "FactY", "FactYForecast"})
    in
        #"Expanded SubTable"

     

    The highlighted column is the result: