Forum Discussion

Dicken's avatar
Dicken
Post Prodigy
29 days ago
Solved

Accumulated average


I want to accumulte the but as ans average,   so :  { 1, 1, 1 ,1} =  1 / 1 ,  2 /2 ,  3/3 , 4/ 4 
so here the average is calculated in select;

let
  alist =
    let
      alist = List.Numbers(1, 12, 1)
    in
      alist,
  result = List.Generate(
    () => [x = 0, y = alist{0}, z = y / (x + 1)],
    each [x] < List.Count(alist),
    each [x = [x] + 1, y = alist{x}, z = [z] + y],
    each [z] / ([x] + 1)
  )
in
  result


but can i get the average in the function, i have tried various such as ;

= List.Generate
               ()=> [ x = 1 ,  y = alist {0} , z = y / x  ] , 
               each [x] < List.Count( alist ), 
               each [ x  = [x] + 1, y = alist {x} , z =  List.Sum( { [z], y} ) / x  ],
               each [z] )



i have played around with various x = 0 , x = 1 etc. but cannot get one to work?

  • Dicken's avatar
    Dicken
    28 days ago

    I want the cuumulative average, the example i gave shows a correct result. 

7 Replies

  • Not sure what you want for a result.

    What result would you like to see for your List.Numbers(1,12,1) list?
    Your code gives the average where for each row n, the average of values alist{0..n}

    Perhaps if you gave an example other than {1,1,1,1}??

    • Dicken's avatar
      Dicken
      Post Prodigy

      I want the cuumulative average, the example i gave shows a correct result. 

    • Dicken's avatar
      Dicken
      Post Prodigy

      o as is said, but done within the  fuunction, not select part of generate so;

      • ronrsnfld's avatar
        ronrsnfld
        Super User

        Still not sure exactly what you want.

        If you want a standalone function that will do the computation, then try:

        (alist as list)=>
            List.Generate(
                ()=>[a=alist{0}, idx=0],
                each [idx] < List.Count(alist),
                each [idx=[idx]+1, a = List.Sum(List.Range(alist,0, idx+1))/(idx+1)],
                each [a])

        You could use like:

        let
          alist = List.Numbers(1,12,1),
          avg = fnRunningAvg(alist),
          tbl = Table.FromColumns({alist, avg}, type table[Numbers=Int64.Type, Running Avg = number])
        in
           tbl

         

         

         



    • Dicken's avatar
      Dicken
      Post Prodigy

      posssibel method adapted from post prodigy; 

      let 
      alist = {1..12},
          Custom1 = List.Generate( ()=> 1, 
       each _ < List.Count( alist ) , 
       each _ + 1, each List.Average( List.Range( alist, 0,_ )) ) 
      in Custom1
  • Hi

    List.Transform(
    {1..List.Count(alist)},
    each List.Average(List.FirstN(alist, _))
    )

     

    List.Generate(
    ()=>[i=1, x=alist{0}],
    each [i]<=List.Count(alist),
    each [i=[i]+1, x= ([x]*[i]+alist{[i]}) / ([i]+1) ],
    each [x]
    )

    Stéphane