Файлы к уроку:
Ссылки:
Описание
В этом уроке мы с нуля разберем функция List.Accumulate в Power Query.
Функция List.Accumulate представляет из себя цикл For. Чтобы пользоваться этой функцией сначала нужно изучить цикл For.
В этом уроке вы узнаете:
- Что такое цикл For и как им пользоваться
- Как работает функция List.Accumulate в Excel
- Как создать список в Power Query при помощи List.Accumulate
- Как создать таблицу календаря в Power Query с помощью List.Accumulate
- Как сделать нарастающий итог в Power Query с помощью List.Accumulate
- Как преобразовать список в Power Query с помощью List.Accumulate
List.Accumulate на примерах
Найти сумму всех чисел в списке
Для удобства каждый параметр функции List.Accumulate сохраним в отдельную переменную/шаг.
Найдем сумму списка из чисел из {1..36}.
Seed — это начальное состояние.
let
list_number = {1 .. 36},
seed = 0,
fn = (state, current) => state + current,
list_accumulate = List.Accumulate(
list_number,
seed,
fn
)
in
list_accumulate
Список с нарастающим итогом
Имеем исходный список {1,2,3,4,5} и желаем в результате получить список с таким же количеством значений, где каждый элемент является суммой всех предыдущих.
Seed в данном случае будет изначально являться пустым списком, который дополняется новым значением с каждым витком цикла.
let
list_numbers = List.Buffer({1 .. 1000}),
seed = {},
fn = (state, current) =>
if List.Last(state) <> null then
state & {List.Last(state) + current}
else
{current},
list_accumulate = List.Accumulate(
list_numbers,
seed,
fn
)
in
list_accumulate
Посчитать количество элементов в списке
В каждом витке цикла значение будет увеличиваться на единицу.
Исходное положение — 0.
let
list_numbers = {1 .. 36},
seed = 0,
fn = (state, current) => state + 1,
list_accumulate = List.Accumulate(
list_numbers,
seed,
fn
)
in
list_accumulate
Создать список, номерующие элементы другого списка
В исходном списке {1,2,3,4,5} мы хотим посчитать значения.
Результат должен представлять из себя список, в котором каждый элемент считает количество элементов исходного списка до текущей позиции.
let
list_numbers = {1 .. 36},
seed = {},
fn = (state, current) =>
if List.Last(state) <> null then
state & {List.Last(state) + 1}
else
{1},
list_accumulate = List.Accumulate(
list_numbers,
seed,
fn
)
in
list_accumulate
Максимальное значение в списке
В каждом витке цикла сравнивается текущее значение с предыдущим. Если текущее значение больше, то оно назначается максимальным, а если нет, то пока максимальным остается предыдущее.
В первом витке цикла максимум назначается самое первое значение.
let
list_numbers = {1, 2, 100, - 40, 5},
seed = 0,
fn = (state, current) =>
if state < current then current else state,
list_accumulate = List.Accumulate(
list_numbers,
seed,
fn
)
in
list_accumulate
Найти сразу максимальное и минимальное значение и вернуть результат в виде записи
В исходном списке чисел найдем максимум и минимум и вернем оба результата в одной записи.
Изначально максимуму присвоим значение -бесконечность, а минимальному +бесконечность. Это сделано, чтобы уже в первом витке результаты обновились.
let
list_numbers = {1, 2, 100, - 40, 4},
seed = [min = #infinity, max = - #infinity],
fn = (state, current) => [
min =
if state[min] > current then
current
else
state[min],
max =
if state[max] < current then
current
else
state[max]
],
list_accumulate = List.Accumulate(
list_numbers,
seed,
fn
)
in
list_accumulate
Деление без остатка
Посчитаем количество элементов списка чисел, которые делятся на 3 без остатка.
Исходное значение = 0, а каждый раз, когда нам будет встречаться число, делящееся без остатка на 3, число будет увеличиваться на 1.
let
list_numbers = {1 .. 36},
seed = 0,
fn = (state, current) =>
if Number.Mod(current, 3) = 0 then
state + 1
else
state,
list_accumulate = List.Accumulate(
list_numbers,
seed,
fn
)
in
list_accumulate
Список чисел, которые делятся на 3 без остатка
В отличие от предыдущего примера в результате мы получим не одно число, а список всех чисел, которые делятся на 3 без остатка.
Теперь Seed будет не 0, а пустым списком, который будет наполняться с каждым витком цикла.
let
list_numbers = {1 .. 36},
seed = {},
fn = (state, current) =>
if List.Last(state) = null then
(
if Number.Mod(current, 3) = 0 then
state & {3}
else
state
)
else if Number.Mod(current, 3) = 0 then
state & {current}
else
state,
list_accumulate = List.Accumulate(
list_numbers,
seed,
fn
)
in
list_accumulate
Список месяцев года
Создадим список дат, которые являются первым числом каждого месяца, например, 2019 года.
let
list_numbers = {1 .. 12},
seed = {},
fn = (state, current) =>
state & {#date(2019, current, 1)},
list_accumulate = List.Accumulate(
list_numbers,
seed,
fn
)
in
list_accumulate
Создать таблицу-календарь
Сгенерируем таблицу с тремя столбцами: год, месяц, день.
В параметре Seed создадим пустую таблицу, которая будет заполняться с каждым витком цикла
let
list_numbers = List.Buffer(
List.Transform(
{
Number.From(Date.From("30.01.2010"))
.. Number.From(
Date.From(DateTime.LocalNow())
)
},
Date.From
)
),
seed = #table({}, {}),
fn = (state, current) =>
Table.Combine(
{
state,
#table(
{"Месяц", "День", "Год"},
{
{
Date.Year(current),
Date.Month(current),
Date.Day(current)
}
}
)
}
),
list_accumulate = Table.Buffer(
List.Accumulate(list_numbers, seed, fn)
)
in
list_accumulate
Выполнить агрегирование текста из элементов списка
Превратим исходный список {1,2,3,4,5} в строку «1,2,3,4,5».
Исходное значение является текстовой пустотой, которая заполняется текстом с каждым витком цикла.
let
list_numbers = {1989 .. 2020},
seed = "",
fn = (state, current) =>
Text.From(state) & Text.From(current) & ", ",
list_accumulate = List.Accumulate(
list_numbers,
seed,
fn
)
in
list_accumulate
Сколько лет из списка являются високосными
В исходном списке числа, которые обозначают год.
Нужно вычислить сколько из них являются високосными.
let
list_numbers = {1989 .. 2020},
list_transformed = List.Transform(
list_numbers,
each Date.From("01.01." & Text.From(_))
),
seed = 0,
fn = (state, current) =>
if Date.IsLeapYear(current) then
state + 1
else
state,
list_accumulate = List.Accumulate(
list_transformed,
seed,
fn
)
in
list_accumulate
Список високосных лет
Здесь примерно то же самое, что и в предыдущем примере, но вернем список високосных лет из исходного списка.
let
list_numbers = {1989 .. 2020},
list_transformed = List.Transform(
list_numbers,
each Date.From("01.01." & Text.From(_))
),
seed = {},
fn = (state, current) =>
if Date.IsLeapYear(current) then
state & {current}
else
state,
list_accumulate = List.Accumulate(
list_transformed,
seed,
fn
)
in
list_accumulate
Примененные функции
- List.Accumulate
- List.Buffer
- List.Last
- #infinity
- Number.Mod
- #date
- List.Transform
- Number.From
- Date.From
- DateTime.LocalNow
- #table
- Table.Combine
- Table.Buffer
- Text.From
- Date.IsLeapYear
Этот урок входит в Продвинутый курс Power Query
Номер урока | Урок | Описание |
---|---|---|
1 | Power Query Продвинутый №1. Введение в Язык М 1 | В этом уроке мы узнаем, почему стоит изучать формулы М в Power Query. Какие преимущества нам дает знание языка формул М. |
2 | Power Query Продвинутый №2. Введение в Язык М 2 | В этом втором вводном уроке по языку формул Power Query мы познакомимся с самыми основами языка форму М. |
3 | Power Query Продвинутый №3. Уровни владения Языком М | В этом уроке мы узнаем зачем изучать Power Query. Какой процент задач вы сможете решить только с пользовательским интерфейсом, а какой процент вы сможете решить с использованием функций М? Об этом узнаем в это видео. |
4 | Power Query Продвинутый №4. Объекты Power Query | В этом уроке мы познакомимся с объектами Power Query: Table, List, Record. |
5 | Power Query Продвинутый №5. Объект List 1 | В этом уроке мы начнем знакомиться с объектом List в Excel Power Query. Создадим простые List (списки) из чисел и букв. Познакомимся с функциями для создания листов/списков из чисел и дат. Научимся создавать список названий месяцев. Изучим функцию List.FindText. Создадим лист с условием при помощи List.Transform. Найдем среднее значение в листе/списке при помощи простой функции List.Average. |
6 | Power Query Продвинутый №6. Объект List 2 | В этом уроке мы продолжим знакомиться с объектом List. Мы узнаем как создавать листы, как ссылаться на элементы листа и изучим несколько полезных формул листа. |
7 | Power Query Продвинутый №7. Объект Record (Запись) | В этом уроке немного подробнее изучим объект Record в Power Query. Record — это набор пар ключ-значение. Каждый Record — это строка таблицы. В этом уроке мы изучим ссылки на Record и функции Record. |
8 | Power Query Продвинутый №8. Объект Table (Таблица) | В этом уроке мы познакомимся с объектом Table в Power Query. Что это такое и какие основные функции применяются к этому объекту. |
9 | Power Query Продвинутый №9. Ссылки 1 | В этом уроке из курса по Power Query мы повторим как ссылаться на строки таблицы. |
10 | Power Query Продвинутый №10. Ссылки 2 | В этом уроке из курса обучения Power Query будем практиковать ссылки. Помимо ссылок еще повторим и изучим несколько техник и команд: объединение листов по вертикали, Table.Skip, Table.PromoteHeaders. |
11 | Power Query Продвинутый №11. Ссылки 3 | В этом уроке курса по Power Query мы повторим ссылки на запись, ссылки на значение, ссылки на другую строку. Также вспомним как создавать таблицу параметров. |
12 | Power Query Продвинутый №12. Ссылки 4: Ссылка на другой шаг запроса и много практики | В этом уроке мы повторим/научимся ссылаться на ячейку, которая находится в другом шаге запроса. |
13 | Power Query Продвинутый №13. Пользовательские функции | В этом уроке мы научимся создавать пользовательские функции. Разберем пользовательские функции на примере столбца с нарастающим итогом. |
14 | Power Query Продвинутый №14. #datetime, #duration: работа с датой и временем | В этом уроке по Excel Power Query вы научитесь пользоваться функциями #duration и #datetime для создания даты/времени и длительности. Изучите функцию DateTimeZone.UtcNow() Узнаете как складывать данные в формате datetime и duration. Познакомитесь с функцией DateTime.LocalNow(). Научитесь преобразовывать дату/время в текст при помощи DateTime.ToText() |
15 | Power Query Продвинутый №15. Текстовые функции / Функции Text.* | В этом уроке по формулам Power Query мы разберем функции группировки, сведения, отмены сведения, сортировки и фильтра. |
Номер урока | Урок | Описание |
---|---|---|
16 | Power Query Продвинутый №16. Важные операции: Группировка, Пивот, Анпивот, Сортировка | В этом уроке по формулам Power Query мы разберем функции группировки, сведения, отмены сведения, сортировки и фильтра. |
17 | Power Query Продвинутый №17. Нюансы консолидации из разных книг/листов Excel и List PositionOf | В этом уроке мы узнаем о некоторых нюансах объединения таблиц по вертикали из разных файлов. |
18 | Power Query Продвинутый №18. Разделить столбец на строки, Text.Trim | В этом уроке мы разделим текстовый столбец на строки. Данные скучены в одной ячейке. Нужно разбить ее на несколько. |
19 | Power Query Продвинутый №19. Заголовки в двух строках, List.Zip | В этом уроке мы обработаем заголовки, которые находятся в двух строках. Нам понадобится функция List.Zip |
20 | Power Query Продвинутый №20. Вычисления в Power Query | В этом уроке мы научимся выполнять вычисления в Power Query и в Power Pivot. |
21 | Power Query Продвинутый №21. Скользящее среднее, List Range | В этом уроке мы научимся считать скользящее среднее в Power Query. Для примера рассчитаем скользящее среднее предыдущих 13 значений. Нам пригодятся функции List.Range и List.Average. |
22 | Power Query Продвинутый №22. Агрегирование текста, группировка | В этом уроке вы научитесь выполнять группировку с агрегированием текстовых значений в Power Query. |
23 | Power Query Продвинутый №23. Трансформация столбцов, Table.TransformColumns | В этом уроке мы изучим функцию Table.TransformColumns. |
24 | Power Query Продвинутый №24. Разгруппировка, Скрытые возможности Table.ReplaceValue | В этом уроке мы научимся делать разгруппировку данных в Power Query, а также изучим скрытые возможности функции Table.ReplaceValue. |
25 | Power Query Продвинутый №25. Функция List.Accumulate | В этом уроке мы с нуля разберем функцию List.Accumulate. Сначала я объясню цикл For, а потом мы закрепим знания на несложных, но очень интересных примерах. |
26 | Power Query Продвинутый №26. Множественная замена текста c List.Accumulate и VBA | В этом уроке мы научимся делать множественную текстовую замену с помощью Power Query. Для этого мы воспользуемся функцией List.Accumulate. Также разберем как решить эту задачу при помощи VBA. |
27 | Power Query Продвинутый №27. Генерируем список URL (Text.Format, List.Generate, List.Accumulate) | В этом уроке мы сгенерируем список веб-страниц, в которых будет меняться параметр id. Сделаем это всего лишь в одном шаге при помощи функций Text.Format, List.Generate и List.Accumulate. |
28 | Power Query Продвинутый №28. Множественная текстовая замена c List.Generate | В этом уроке мы научимся выполнять множественную текстовую замену в Power Query с помощью функции List.Generate. Для спонсоров канала я так же расскажу как это делать в VBA. |
29 | Power Query Продвинутый №29. Генераций таблиц с List.Generate, График платежей по кредиту | Продолжим изучать функцию List.Generate. Создадим при помощи этой функции целую таблицу, которая будет представлять из себя график платежей по кредиту. |
30 | Power Query Продвинутый №30. Нарастающий итог с List.Generate | В этом уроке мы разберем функцию List.Generate, а также при помощи этой функции выполним нарастающий итог, который в сотни раз быстрее предыдущих версий нарастающего итога. |