Получение доступа в нужное место массива — это основное назначение функции Data. Она позволяет извлечь данные из любой ячейки таблицы по имени столбца и номеру строки. Чтобы исключить неудачные сценарии применения, важно понимать, когда использование функции оправдано и знать ее особенности.
Зачем нужна функция Data и как она работает? Когда требуется найти книгу в библиотеке, но неизвестно где она находится, в лучшем случае, может потребоваться несколько недель. Но если известен номер стеллажа и полки, надо просто взять ее из нужного места.
Так же работает функция Data, по имени столбца (стеллажа) и номеру строки (полки) сразу находит нужную ячейку и выдает ее значение. Это ее основное достоинство — она дает доступ к любому месту массива.
Важно, что Data — это функция, которая работает только внутри узла Калькулятор. Ни в каких других узлах она не используется.
В подавляющем большинстве случаев работа Калькулятора ведется со значениями строки. Самый тривиальный пример использования: имеется цена товара и его количество, перемножив можно рассчитать сумму продаж. Каждая строка рассматривается, как отдельное событие, которые идут друг за другом, и Калькулятор работает с ними поочередно, сверху вниз. Таких задач много. Чаще всего в аналитике работа с данными ведется именно таким образом, потому что это самый популярный кейс.
Но возникают ситуации, когда нужно работать со значениями не одной, а нескольких строк. Вот тут и возникает потребность в функции Data. Она рассматривает весь массив и позволяет обратиться к любой ячейке.
Функция возвращает значение столбца ИмяСтолбца, взятое из строки НомерСтроки.
Data("ИмяСтолбца", НомерСтроки) |
---|
Если столбец «Численность населения (тыс.чел.)» имеет имя Population, чтобы вернуть выделенное значение из таблицы нужна функция вида Data("Population", 3)
.
Важно, что первый аргумент представляет собой строковое значение, т.е. явно заданное ИмяСтолбца
должно быть указано обязательно в кавычках. Визуально выделена четвертая строка, но в качестве второго аргумента, НомерСтроки
, надо указать 3, поскольку в Loginom отсчет строк начинается с нуля.
В рассмотренном ниже примере, при вычислениях в узле Калькулятор, к столбцам из входного набора добавляются новые столбцы с именами выражений (Expr1, Expr2, Expr3).
Когда речь идет о столбцах из входного набора (Col1, Col2), то с помощью функции Data можно обращаться к значению любой ячейки.
Когда о новых столбцах с именами выражений (Expr1, Expr2, Expr3), можно обращаться к значениям выражений, которые вычисляются раньше текущего, или к значениям любого выражения в строках с номерами, меньше номера текущей строки.
Зеленым цветом выделены ячейки, к которым функция Data может обратиться при вычислении значения текущей ячейки, красным — к которым обратиться нельзя.
При работе с Data для определения номера строки почти всегда используются функции: RowNum()
— возвращает номер текущей строки и RowCount()
— возвращает число строк. Важно отметить, что при использовании этих функций есть особенности. Соответственно, чтобы обратиться к первой строке, нужно указать ноль. К предыдущей, нужно указать RowNum() - 1
, к последующей RowNum() + 1
. Чтобы обратиться к последней строке RowCount() - 1
, отсчет начинается с нуля и если строки три, то номер последней будет два.
При рекурсивном использовании данной функции в окне Параметры выражения важно выбрать Кэшировать, поставив галочку в чекбокс.
Это позволяет функции запоминать ранее вычисленные результаты, избегая повторных расчетов для одинаковых запросов. Об этом важно помнить, но даже если по какой-то причине это не будет учтено, Loginom выведет напоминание.
Как только возникает потребность в функции Data, становится понятно, что значений в одной строке недостаточно. Для простоты понимания можно рассмотреть три примера использования:
Допустим есть таблица, в каждой строке которой указана цена на продукт и нужно посчитать как она менялась со временем по сравнению с начальной, когда продукт только появился на рынке. В таблице входные данные.
Требуется найти разность между текущим значением и значением в первой строке. Если столбец «Цена» имеет имя Price, в узле Калькулятор необходима следующая формула:
Price - Data("Price", 0) |
---|
В выражении вычисляется разность текущего значения цены и значения цены в первой строке Price - Data("Price", 0)
.
В результате добавился еще один столбец, в котором указано, как изменилась цена товара по отношению к первоначальной.
Еще одной распространенной задачей является расчет скорости изменений, когда требуется узнать, насколько было продано больше или меньше по сравнению с предыдущим днем. В качестве входных данных используется таблица, содержащая информацию о количестве проданного товара.
Чтобы узнать, насколько изменились продажи нужно из текущего значения вычесть значение предыдущего дня. Соответственно, если продано больше, будет положительное число, если меньше, то отрицательное. Если столбец «Продано» имеет имя Sales, выражение в узле Калькулятор будет таким:
IF(RowNum() = 0, 0, Sales - Data("Sales", RowNum() - 1)) |
---|
В выражении: если RowNum() = 0
, т.е. это первая строка, возвращается 0, иначе — разность текущего значения продаж и значения продаж в предыдущей строке Sales - Data("Sales", RowNum() - 1)
. В результате к таблице добавится столбец, где указано изменение продаж по отношению к предыдущему дню.
Это еще один пример, когда недостаточно информации из одной строки. Здесь даже в условии сказано, что необходимо найти разницу с предыдущим днем, что по своей сути говорит о том, что нужно посмотреть на одну строку выше.
Еще одно направление, где функция Data критически важна — работа с пропусками в массивах данных. Такая проблема есть в задачах прогнозирования продаж, где критична работа с историческими данными.
Другой пример — обработка, где пропуски заполняются значениями из предыдущих строк. Например, для расчета объема перекачиваемого газа в трубопроводе требуются замеры давления и температуры. Если один параметр может измениться очень быстро, то другой достаточно инертный. Поэтому давление измеряется каждую минуту, а температура через пять минут. Данные в таблице будут иметь следующий вид.
Для расчета объема нужны оба показателя. Чтобы заполнить пропуски (Null) надо взять значения из предыдущих строк. Если столбец «Температура» имеет имя Temperature, в узле Калькулятор необходимо следующее выражение:
IF(RowNum() <> 0 and IsNull(Temperature), Data("Fill", RowNum() - 1), Temperature) |
---|
В выражении: если RowNum() <> 0
, т.е. это не первая строка и если пустое значение IsNull(Temperature)
, возвращается значения из предыдущей строки нового столбца «Заполнение» Data("Fill", RowNum() - 1)
, иначе текущее значение столбца «Температура».
В результате получится еще один столбец «Заполнение», где все ячейки показаний температуры заполнены.
Здесь приведено только три примера. На практике, задач, которые решают аналитики, где функция Data выступает в роли ключевого элемента очень много, но разбирать их все не имеет смысла.
Как упоминалось выше, обычно Калькулятор работает по строкам и логика здесь очень простая, каждая колонка рассматривается, как значение переменной в текущей строке. Что касается функции Data, то она изначально более ресурсоемкая, при обращении к ней работа идет с целым массивом. Поэтому если нет необходимости выходить за рамки одной строки, то ее лучше не использовать.
Также не стоит применять эту функцию, если можно задействовать другие обработчики, с которыми решить задачу проще.
Например, в качестве данных на вход, имеется простейшая таблица и с помощью функции Data надо преобразовать значение столбца с именем IP в строку через запятую. Задачи такого рода очень распространены на практике. Важно, чтобы на входе узла и в параметрах выражения тип данных был строковым.
В узле Калькулятор нужно написать следующее выражение:
IF(RowNum() = 0, IP, Concat(Data("IP1", RowNum() - 1), ", " + IP)) |
---|
В выражении: если RowNum() = 0
, т.е. это первая строка, возвращается значение столбца IP. Иначе объединяем в одну строку функцией Concat значение из предыдущей строки нового столбца IP1 Data("IP1", RowNum() - 1)
с запятой и пробелом ", "
и текущее значение столбца IP. В результате добавится еще один столбец IP1, в последней строке которого будут стоять значения IP через запятую.
Чтобы выделить последнюю строку нужно обратиться к узлу Группировка, получится желаемый результат.
То же преобразование удобнее сделать сразу с помощью узла Группировка. Тип данных на входе узла должен быть строковым.
Для получения строки через запятую, столбец IP надо просто переместить в Показатели:
и в Вариантах агрегации выбрать Список, поставив галочку в чекбокс.
Буквально в два клика получается тот же результат.
При выборе Вариантов агрегации становятся активными настройки, которые покрывают почти все стандартные случаи задач. Можно выбрать разные разделители, сделать сортировку по возрастанию или по убыванию, а также поставить двойные или одинарные кавычки. Последнее очень важно, потому что такой подход зачастую применяют для интеграции с другими приложениями, когда требуется преобразовать данные в соответствии с форматом, который требуется внешней системе. Например, для формата JSON, позволяет провести преобразование значений столбца в набор пар «ключ-значение».
Но надо сказать, что если задача очень специфическая, допустим, в наборе разделителей нет нужного или перед номером нужно поставить, например IP, то решать ее опять придется с функцией Data.
Следует также отметить, что для большей гибкости, в узле Калькулятор реализована возможность написания кода на JavaScript и внутри этого кода тоже можно использовать функцию Data. Важно понимать, что это увеличивает ресурсоемкость, поэтому если есть вариант более простого решения, нужно использовать его.
Итак, что важно учесть для правильного использования функции Data:
Можно подвести итог, да, функция Data помогает во многих задачах анализа. Для некоторых ее применение — неизбежность. Но есть случаи, когда ее использовать можно, но лучше не нужно. Понимание ее особенностей, важных деталей, поможет не допускать стандартных ошибок, а значит эффективно ею пользоваться.
Другие материалы по теме: