Работа без негатива: что нужно знать о функции Data

16 января 2025
0 комментариев

Получение доступа в нужное место массива — это основное назначение функции Data. Она позволяет извлечь данные из любой ячейки таблицы по имени столбца и номеру строки. Чтобы исключить неудачные сценарии применения, важно понимать, когда использование функции оправдано и знать ее особенности.

Зачем нужна функция 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

Как только возникает потребность в функции Data, становится понятно, что значений в одной строке недостаточно. Для простоты понимания можно рассмотреть три примера использования:

  1. Вычисление разницы цены относительно первоначальной;
  2. Изменение продаж по сравнению с предыдущим днем;
  3. Заполнение пропусков.

Вычисление разницы цены относительно первоначальной

Допустим есть таблица, в каждой строке которой указана цена на продукт и нужно посчитать как она менялась со временем по сравнению с начальной, когда продукт только появился на рынке. В таблице входные данные.

Данные для расчета разницы с первоначальной ценой

Требуется найти разность между текущим значением и значением в первой строке. Если столбец «Цена» имеет имя 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 во всех задачах, где нужно работать со значениями из нескольких строк, если есть более простые и менее ресурсоемкие решения.
  • В синтаксисе следует обращать внимание на правильность указания имен столбцов в кавычках, а также на особенности пересчета строк, начиная с нуля.
  • При рекурсивном использовании нужно обязательно активировать опцию Кэшировать.
  • Функция Data почти всегда используется в паре с функциями RowNum() и RowCount(). Чтобы правильно определить номер последней строки с помощью функции RowCount(), нужно помнить, что строки нумеруются с нуля.
  • Функцию Data можно использовать внутри кода JavaScript. Это увеличивает одновременно и гибкость, и ресурсоемкость.

Можно подвести итог, да, функция Data помогает во многих задачах анализа. Для некоторых ее применение — неизбежность. Но есть случаи, когда ее использовать можно, но лучше не нужно. Понимание ее особенностей, важных деталей, поможет не допускать стандартных ошибок, а значит эффективно ею пользоваться.

Другие материалы по теме:

Особенности работы с NULL в Loginom

Работа с Датой и Временем в Калькуляторе

#loginom

Смотрите также

Подписывайтесь на телеграмм-канал Loginom
Новости, материалы по аналитике, кейсы применения, активное сообщество
Подписаться