Kumulowanie list przy użyciu… List.Accumulate()

List.Accumulate to potężna funkcja, która jest często pomijana podczas robienia transformacji w edytorze Power Query. Jej podstawowa funkcjonalność jest wytłumaczona w dokumentacji. Działa poprzez kumulowanie wyników zadanej operacji (accumulator function) zaczynąjąc od wartości źródłowej i przechodząc wiersz po wierszu aż do końca wybranej listy.Radacad świetnie wytłumaczył podstawowe możliwości tej funkcji. Ja traktuję List.Accumulate jako funkcję, która pozwala mi dostać się do wartości z poprzedniego wiersza. Jest to częsta transformacja oczekiwana przez klientów, którzy korzystają z Excela jako źródła danych. 90% przypadków to sprawdzenie czy ID lub data ma inną wartość niż w poprzednim wierszu.

Ale jak to zrobić? Przykłady Radaca’a są super, ale chciałbym kumulować listy!

Zapoznajmy się ze składną na podstawie prostego przykładu skumulowanej sumy. W tym wypadku mam prostą tabelę z liczbami od 1 do 10.

Aby stworzyć listę ze skumulowaną sumą przy użyciu List.Accumulate(), wpisuję:

Wynikiem jest lista ze skumulowanymi wartościami:

Przejdźmy przez składnię:

Pierwszy argument wskazuje na listę, przez którą będziemy iterować. W naszym wypadku jest to jedna kolumna:

Drugim argumentem jest wartość źródłowa – seed. W naszym wypadku {0} – czyli lista mająca jeden element 0:

Trzecim argumentem jest operacja – accumulator function:

Dla wyjaśnienia: index – tutaj oznacza wartość w wierszu w jakim “znajduje się” funkcja, sum – to wynik operacji. Te nazwy można dowolnie modyfikować.

Jeśli index jest równa pierwszej wartości z listy, accumulator przyjmie wartość {index} – czyli lista z index. Poniższa linijka jest bardzo ważna, ponieważ nie chcemy wartości źródłowej jak pierwszej. Nie możemy też zmienić seed’a na pierwszą wartość w liście, ponieważ accumulator będzie chciał dodać seed to tej pierwszej wartości, dublując ją.

Poniższy kod oznacza: Jeśli index nie jest pierwszą wartością listy, chciałbym dołączyć do wyniku accumulatora (w drugim kroku będzie to {1}), listę, która ma wartość List.Last(sum) + index. List.Last(sum) + index oznacza, że wezmę ostatni element wyniku accumulatora i dodam do niego index. To zwróci mi listę z jednym elementem np. {3}, którą dodam do wyniku otrzymując {1,3}. Po powtórzeniu kroków 10 razy otrzymam skumulowane sumy.

Ostatnim krokiem jest połączenie tabeli i stworzonej listy:

Cały kod:

Inny przykład jest prosto z forum Power BI. Zadanie jest proste – stworzyć specjalny indeks, który wzrasta gdy wartość w kolumnie Product się zmienia:

Kod mojego rozwiązania:

Warto zwrócić uwagę na linię:

Jest bardzo podobna do poprzedniego przykładu. Jedyna zmiana to warunek “if else”, który sprawdza wyrażenie:

W tym wypadku iterujemy przez kolumnę z indeksem. Powyższa linia sprawdza czy wartości w kolumnie Category w tym i poprzednim wierszu są takie same. Jeśli tak, to accumulator dołącza do listy jej ostatni element:

W przeciwym wypadku dodaje 1 do ostatniej wartości:

Tutaj mój jeszcze jeden przykład z forum.

I to wszystko! Dajcie znać co myślicie o tym podejściu do List.Accumulate()!

Dzięki!

 

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *