Список функций


Главная » Ресурсы » Здесь

Основное назначение функций — расширение возможностей Envision там, где базового синтаксиса не хватает. Ниже приводится список функций, поддерживаемых Envision.


Синтаксис функций

Общий синтаксис для функций выглядит следующим образом:
x = fun(arg1, arg2, arg3, ..., argN) by [Group] sort [Order]
Оператор fun будет заменен на имя функции, а arg1, arg2, arg3, ..., argN — на ее аргументы. Все функции работают по векторам.

Лишь некоторые определенные функции поддерживают дополнительные параметры by и sort. Несмотря на то, что синтаксис таких функций похож на синтаксис агрегаторов, они таковыми не являются. Аргумент by не является обязательным. Если его опустить, значение будет равно by 1. Параметры Group и Order поддерживают кортежи векторов, то есть группы векторов, разделенных запятыми. Например:
R = rank() by [A, B] sort [1]

Математические функции

  • abs(number) — напоминает функцию ABS в Excel.
  • ceiling(number) — напоминает функцию ОКРВВЕРХ в Excel.
  • exp(number) — напоминает функцию EXP в Excel.
  • floor(number) — напоминает функцию ОКРВНИЗ в Excel.
  • log(number, base) — напоминает функцию LOG в Excel. Аргумент base не является обязательным. Если его опустить, значение будет равно 10.
  • max(num1, num2, num3, ..., numN) — напоминает функцию МАКС в Excel.
  • min(num1, num2, num3, ..., numN) — напоминает функцию МИН в Excel.
  • percent(N) by [Group] — возвращает значение N, разделенное на сумму всех значений в пределах Group.
  • norminv(number) — напоминает функцию НОРМОБР в Excel со средним значением 0 и стандартным отклонением 1.
  • pow(number, exponent) — напоминает функцию СТЕПЕНЬ в Excel. Envision также поддерживает оператор степени number ^ exponent, который выполняет ту же функцию.
  • round(number, digits) — напоминает функцию ОКРУГЛ в Excel. Второй аргумент не является обязательным, он отражает количество символов, которое необходимо отобразить.
  • sqrt(number) — напоминает функцию SQRT в Excel.

Текстовые функции

  • concat(text1, text2, ..., textN) — объединяет текстовые значения от text1 до textN.
  • contains(text, pattern) — возвращает значение true, если текст содержит указанную последовательность.
  • endswith(text, pattern) — возвращает значение true, если текст содержит указанную последовательность в конце.
  • field(text, separator, index): — возвращает n-ое поле (с нулевым индексом) в текстовом значении, которое содержит несколько вложенных строк, отделенных указанным разделителем. Пример: field("a-b-c-d-", "-", 2) == "c". Данная функция вводится для прочтения значений, которые соединены в одном столбце таблицы.
  • field.r(text, separator, index) — напоминает функцию field(), однако подсчет делителей начинается справа. Пример: field.r("a-b-c-d-", "-", 0) == "c".
  • indexof(text, pattern) — возвращает индекс первого случая появления последовательности в тексте, или -1, если такой случай не обнаружен.
  • lowercase(text) — возвращает текст в нижнем регистре.
  • parsedate(text, format) — преобразует текст в дату в указанном формате. Формат указывать необязательно. При пропуске формата дата считывается в соответствии с функцией автоматического распознавания дат Envision. Если формат указан, дата считывается в соответствии с ним. См. «Выбор пользовательского формата даты» для получения более подробной информации о соответствующем синтаксисе. Если дату считать невозможно, будет установлено значение 2001-01-01.
  • parsenumber(text) — преобразует текст в число. Анализатор использует функцию автоматического распознавания чисел Envision. Если число не прочитывается, значение устанавливается на ноль.
  • parsetime(text, format) — преобразует время дня в дробь от 0 до 1. Формат указывать необязательно. Если формат не указан, по умолчанию используется yyyy-MM-dd HH:mm:ss. В Envision используется пользовательский формат времени .NET.
  • replace(text, pattern, replacement) — заменяет все случаи появления определенного элемента в тексте на заданную единицу. Данная функция напоминает функцию ЗАМЕНЫ в Excel, кроме аргумента instance_num.
  • startswith(text, pattern) — возвращает значение true, если текст начинается с указанной последовательности символов.
  • strlen(text) — возвращает длину текстового аргумента.
  • substr(text, start, count) — начальное положение определяется параметром start. Отрицательное значение подразумевает отклонение от конца строки, в иных случаях отклонение отсчитывается от начала строки. Длина возвращенной строки определяется по count, это значение приравнивается к 0 при count < 0. Если сегмент полностью или частично выходит за пределы строки, например substr("A", 2, 1), то он обрезается до нужного размера. Функция substr(text, start) определяется как substr(text, start, <infinity>).
  • uppercase(text) — возвращает текст в верхнем регистре.

Календарные функции

  • "\{myDate:yyyy-MM-dd}" — пользовательский формат даты через интерполяцию строки. Формат даты указывается токеном, который стоит после точки с запятой. Подробнее о строках формата даты.
  • chineseYear(date) — возвращает текущий год по китайскому календарю.
  • chineseYearEnd(date) — возвращает последний день текущего года по китайскому календарю.
  • chineseYearStart(date) — возвращает первый день текущего года по китайскому календарю.
  • date(y, m, d) — возвращает дату, состоящую из года, месяца и дня, являющихся аргументами. Аргументы y, m и d должны быть представлены числами.
  • monday(date) — возвращает дату первого понедельника перед датой (включительно).
  • month(date) — возвращает номер месяца, в котором содержится дата, расчет месяцев начинается с 1 января 2001 г.
  • monthnum(date) — возвращает соответствующий номер месяца (1–12) для даты, являющейся аргументом.
  • today(timezone) — возвращает дату, при этом временной пояс является аргументом и выражается в виде разницы в часах по сравнению с UTC.
  • year(date) — возвращает соответствующий год для даты, являющейся аргументом. Напоминает функцию ГОД в Excel.
  • yearStart(date) — возвращает первый день текущего года.
  • yearEnd(date) — возвращает последний день текущего года.
  • weeknum(date) — напоминает функцию НОМНЕДЕЛИ (System 2) в Excel.

Ранжирующие функции

  • argfirst() by [Group] sort [Order] — возвращает значение true для одного первого значения группы в соответствии с порядком значений (сортировка). Группу указывать необязательно. Когда группа указана, функция возвращает значение true один раз для каждой группы. Перегрузка argfirst() by [Group] sort [Order] where condition также предоставляется для удобства. При использовании опции where могут появиться группы без значений true, потому что условие является false (ложным) для всей группы.
  • arglast() by [Group] sort [Order] — то же самое, что argfirst(), но возвращает значение true для одного последнего значения.
  • cumsum(N) by [Group] sort [Order] — возвращает накопленную сумму всех чисел N в соответствии с возрастанием ранга. Группу указывать необязательно. Если группа указана, она используется для расчета локальной накопленной суммы для каждой группы.
  • fifo(V, T.D, T.Q) — помощь при проведении FIFO-анализа запасов. Возвращает количество нераспроданных товаров в виде вектора T. Вектор V отражает все запасы. Таблица T содержит заказы на закупку. В T.D содержатся даты, а в T.Q — объемы закупок. Данная функция рассчитывает количество нераспроданного товара, воспроизводя заказы на закупку в обратном хронологическом порядке. См. также Принцип FIFO
  • rank() by [Group] sort [Order] — возвращает ранг числовых значений без привязок. Напоминает функцию РАНГ.РВ в Excel, однако здесь все числа получают отдельный ранг (приоритет элементов с одинаковым рангом выбирается произвольно). Группу указывать необязательно. Если группа указана, она используется для расчета локальных рангов для каждой группы.
  • rank(N, Group, S) — более сложная функция ранжирования, заметно отличается от других перегрузок типа rank(). Данная перегрузка предназначена для создания приоритетного списка закупок. В частности, rank(N, Group, S) нельзя представить в виде простого выражения сортировки и группировки. Это двухэтапный императивный алгоритм. На первом этапе значения группируются по параметру Group в стеки, каждый из которых упорядочивается по увеличению S. На втором этапе алгоритм находит наивысшее значение N среди верхних элементов всех стеков, выделяет этот элемент, присваивает ему ранг (начиная с 1), а затем повторяет все действия до тех пор, пока элементы стеков не закончатся.
  • rankd(N) by [Group] — возвращает ранги числовых значений N, одинаковые значения получают одинаковый ранг. Напоминает функцию РАНГ.РВ в Excel.

Графические функции

  • canonical(A, B) — выдает канонического представителя для всех значений A. На практике данная функция используется для замены кодов (например для замены кодов SKU). Например, функция canonical(OldSku, NewSku) выдает значения последних доступных SKU для каждого элемента, после чего выполняет замены. См. также nonCanonical().
  • nonCanonical(A, B) — возвращает значение true, когда невозможно рассчитать канонического представителя для A. Это происходит при обнаружении циклических алгоритмов или алгоритмов ветвления.
  • connected(A, B) by [Group] — анализирует неориентированный граф, описанный всеми ребрами (A,B), а затем возвращает для всех узлов A имя наименьшего узла связанного компонента A. Под "наименьшим" узлом понимается узел с самым маленьким именем (получено путем сравнения строк). Группу указывать необязательно. Если группа указана, набор данных сначала разделяется в соответствии с указанными группами.

Алгебра распределения

См. статью об алгебре распределения

Параметрические функции распределения

Система позволяет создавать параметрические функции, в которых число выступает в роли аргумента (параметра) и которые возвращают функцию распределения.

  • dirac(n) — возвращает функцию равную нулю во всех точках, кроме n, где она равна 1.
  • identity(n) — возвращает функцию $\text{id}: k \to k$, но она ограничена сегментом [0;n] и равна 0 в других точках.
  • uniform(n) — возвращает функцию $\text{unif}: k \to 1$, но она ограничена сегментом [0;n] и равна 0 в других точках.
  • uniform(m, n) — возвращает функцию $\text{unif}: k \to 1$, но она ограничена сегментом [m;n] и равна 0 в других точках. If $m - 1 = n$, the uniform() возвращает нулевое распределение.
  • uniform(D) — возвращает функцию $\text{unif}: k \to 1$, но она ограничена множеством распределения D и равна 0 в других точках.
  • poisson(lambda) — возвращает распределение Пуассона параметра lambda ($\lambda$ в литературе).
  • exponential(lambda) — возвращает экспоненциальное распределение параметра lambda ($\lambda$ в литературе).
  • negativebinomial(mu, sigma) — возвращает отрицательное биномиальное распределение среднего значения mu и стандартного отклонения sigma. Если стандартное отклонение меньше среднего значения, то функция возвращает вместо него распределение Пуассона среднего mu.
  • ranvar.uniform(n) — возвращает распределение, представленное функцией $k \to \frac{1}{|n| + 1}$ по сегменту [0;n] (if $n \geq 0$) или [n;0] (if $n < 0$), и 0 в остальных случаях.
  • ranvar.uniform(m, n) — возвращает распределение, представленное функцией $k \to \frac{1}{n + 1 - m}$ по сегменту [m;n] и 0 в остальных случаях. Мы предполагаем, что $m < n$. При $m > n$ система выдаст ошибку.

Непараметрические функции распределения

  • distrib(Id, G.Probability, G.Min, G.Max) — данная функция возвращает распределение, заданное списком групп, каждая из которых имеет ограничения и собственное значение.
  • ranvar(T.X) — этот агрегатор возвращает эмпирическое распределение, рассчитанное по данным вектора T.X.
  • ranvar.segment(...) — сложная функция для создания эмпирического распределения на основе плавающего временного периода (подробнее далее).

Показатели функций распределения

С помощью распределения также можно получить числовые показатели.

  • crps(X, A), гдеA — целое число, возвращает FORMATTER ERROR (Malformed Image Tag), под которой понимается обобщение показателей непрерывной приоритетной вероятности до пары распределений.
  • mean(X) — возвращает статистическое среднее значение.
  • variance(X) — возвращает статистическое отклонение.
  • int(X, A, B), где A и B являются целыми числами, возвращает целое значение X для сегмента [A;B].
  • quantile(X, tau) — возвращает квантиль распределения; наименьшее значение $x$, например $\mathbf{P}[X \leq x] \geq \tau$.
  • spark(X) — возвращает текст, содержащий компактное представление распределения в кодировке ASCII.
  • support.max(X) — возвращает верхнюю границу несущего множества распределения.
  • support.min(X) — возвращает нижнюю границу несущего множества распределения.

Трансформация распределения

Функции распределения могут трансформироваться в другие функции распределения.

  • reflect(X) — возвращает отраженную функцию распределения $k \to f(-k)$.
  • transform(X, a) — возвращает функцию распределения, которая получена через интерполяцию $k \to f(k / a)$.
  • fillrate(X) — возвращает предельное значение уровня пополнения запасов. Необходимо указать случайную переменную, возвращает случайную переменную.
  • truncate(X, a, b) — возвращает ограниченное распределение $k \to f(k) \text{ if } k \in [a;b] \text{ else } 0$. Границы A и B включаются в диапазон результатов.
  • maxr(X, a) or maxr(a, X) — возвращает распределение $k \to f(k) \text{ if } k \in [a + 1; \infty[ \text{ or } \sum_{i=-\infty}^a f(i) \text{ if } k = a \text{ else } 0$.
  • minr(X, a) or minr(a, X) — возвращает распределение $k \to f(k) \text{ if } k \in ]-\infty; a - 1] \text{ or } \sum_{i=a}^\infty f(i) \text{ if } k = a \text{ else } 0$.
  • mixture(X1, p, X2) — возвращает смесь двух распределений и вес: $k \to p \times f_1(k) + (1 - p) \times f_2(k)$.
  • mixture(X1, p1, X2, p2, X3) — возвращает смесь трех распределений и два веса: $k \to p_1 \times f_1(k) + p_2 \times f_2(k) + (1 - p_1 - p_2) \times f_3(k)$.
  • mixture(X1, p1, X2, p2, X3, p3, X4) — возвращает смесь четырех распределений и три веса: $k \to p_1 \times f_1(k) + p_2 \times f_2(k) + p_3 \times f_3(k) + (1 - p_1 - p_2 - p_3) \times f_4(k)$.
  • zoz(X) (ноль на ноль) — возвращает распределение, где $k \to f(k) \text{ if } k \neq 0 \text{ else } 0$.

Функции создания таблиц

См. статью о создании таблиц

  • extend.range(T.N) — создает N строк для каждой строки из таблицы T, где N — целое число. Например:

    table T = extend.range(Orders.42)
    T.Quantity = Orders.Quantity // подразумеваемое расширение
    show table "T" with T.N, T.Quantity
  • extend.distrib(distribution, gap, multiplier, reach) — раскладывает распределение в таблице. См. также extend.distrib().
  • extend.billOfMaterials(...) — преобразует историю спроса на наименования в историю спроса на запчасти. См. также спецификацию().

Расширенные функции

cumsub(G.Item, G.Stock, G.Quantity, G.Rank)

Принимает 4 вектора из таблицы с помощью следующих параметров:
  • G.Item — идентификатор элемента; все строки с одинаковым значением относятся к одному элементу;
  • G.Stock — изначальный запас элемента; у всех строк, относящихся к одному элементу, должно быть одинаковое значение G.Stock;
  • G.Quantity — количество единиц элемента, необходимое для закупки всей строки таблицы;
  • G.Rank — идентификатор набора; все строки с одним идентификатором набора относятся к одному набору. Строки с одинаковой парой значений (G.Item, G.Rank) запрещены, и все наборы упорядочиваются по увеличению ранга.

Функция cumsub() обрабатывает все наборы в порядке увеличения ранга, учитывая запасы всех элементов. Изначально запасы задаются вектором G.Stock. Для каждого набора данная функция определяет, достаточно ли оставшихся запасов для закупки всех строк таблицы, входящих в набор, в зависимости от того, превышает ли уровень запаса параметр G.Quantity. В таких случаях функция снижает запасы всех элементов и добавляет к каждой строке количество оставшихся единиц товара. Если запасов недостаточно для комплектации целого набора (как правило, потому что закончился один из его элементов), то функция не обновляет показатели оставшихся запасов и для каждой строки находит значение -(S+1), где S — оставшийся запас указанного товара на данный момент. Это нужно, чтобы показать, что данную строку не нужно закупать (проверить G.S < 0) и что именно из-за этой строки не закупается набор (проверить G.Quantity + G.S + 1 > 0), а также насколько (G.Missing = G.Quantity + G.S + 1).

forex(value, Origin, Destination, date)

Возвращает значение, выраженное в валюте Origin, в виде соответствующего значения в другой валюте Destination в соответствии с данными об обменном курсе для указанной даты. Валюты необходимо указывать с помощью общепринятых трехзначных кодов. Lokad поддерживает около 30 валют, используя данные, предоставленные Центральным банком Европы. Обменный курс обновляется ежедневно. См. также функцию проверки валюты isCurrency().

hash(value)

Возвращает псевдоинъективное хэш-значение от 0 до 2^24-1. Данная функция обычно используется для случайного перемешивания набора данных путем хэширования содержимого столбца, а затем для сортировки по хэшированным значениям.

isCurrency(currencyCode)

Возвращает значение true, если текст, выступающий в роли аргумента, является кодом валюты, распознаваемым функцией forex().

mkuid(X, offset)

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

Вектор X игнорируется, а в таблице, привязанной к X, создается UID (уникальный идентификатор) в виде скалярного значения. offset — это дополнительное скалярное значение, которое отражает начальный суффикс UID. Созданные строки являются числами в формате PPPPPPPAAA, где P — номер страницы (не может начинаться с 0), который всегда только увеличивается, а A — пошаговый счетчик, который запускается от начала отклонения (или от 0, если отклонение не задано). Значение P должно состоять не менее, чем из 7 цифр, а значение A — не менее, чем из 3.

Параметр UID имеет три свойства.
  1. Все UID можно считывать как числа, и эти числа неодинаковые. Обратите внимание, что UID могут состоять не менее, чем из 10 цифр, а обычно и больше, если для каждого вызова создается более 1000.
  2. Значения UID, рассчитанные во время T, должны быть меньше значений UID, созданных во время T' > T. (Используется алфавитный порядок).
  3. Если все вызовы приводят к созданию одинаковых UID (меньше 999 или от 1000 до 9999 и т. д.), то предыдущее свойство будет также истинно для порядковых номеров UID.

solve.moq(...)

Расширенный алгоритм решения для базовой проблемы MOQ (минимального объема заказа).

pricebrk(D, P, Prices.MinQ, Prices.P, Stock, StockP)

Возвращает распределение предельной закупочной цены на единицу товара. См. статью «Скидки от поставщиков»

priopack(V, MaxV, JT, B) by [Group] sort [Order]

Простой вариант алгоритма упаковки контейнеров, предназначенный для использования со списком приоритетных покупок. В отличие от классического алгоритма упаковки контейнеров мы не только оптимизируем возможности контейнеров, но и максимально сохраняем порядок единиц.
  • V — объем каждой строки.
  • MaxV — максимальный объем, значение которого однородно V, и оно должно быть постоянным во всем эквивалентном классе Group.
  • JT — изменчивый порог, значения которого однородны с V, обычно это небольшое значение, кратное Group.
  • B — дополнительный аргумент, который понимается как барьер. Когда указывается данное значение, в процессе бинарной упаковки нельзя изменять порядок строк, которые принадлежат к одному и тому же классу равенства, как определяется в B.
  • Group — класс эквивалентности поставщиков, упаковка контейнеров рассчитывается на поставщика.
  • Order содержит ранги упаковываемых строк.

ranvar.segment(...)

Данная функция вызова предназначена для преобразования временных рядов в распределения вероятности за счет сбора наблюдений за плавающими временными периодами.
D = ranvar.segment(
  start: Items.Start // первая дата для каждого элемента (включительно)
  end: Items.End // последняя дата для каждого элемента (включительно)
  step: Items.Step // число, интервал между наблюдениями в днях
  horizon: Items.Horizon // число, длительность периода в днях для каждого элемента
  date: Orders.Date  // дата каждого события
  quantity: Orders.Quantity) // количество для каждого события
Для каждого элемента данная функция рассчитывает распределение суммы объемов по периодам с горизонтами от первой до последней даты для соответствующего элемента. Например, если дата начала — 1 января, а конца — 7 января, горизонт составляет 3 дня, во время единственного события задействуется 5 единиц товара, и оно происходит 2 января, то наблюдаемые периоды будут представлены следующим образом:

  • 1 января — 3е января: Q = 5
  • 2 января — 4 января: Q = 5
  • 3 января — 5 января: Q = 5
  • 4 января — 6 января: Q = 0
  • 5 января — 7 января: Q = 0

В результате получается следующее распределение: 40% Q = 0,60% Q = 5.

smudge(values, present) by [Group] sort [Order]

Данная функция принимает неполный вектор values и логический вектор, который определяет, где находятся допустимые значения. Она возвращает полный вектор допустимых значений, который заполняется за счет распределения допустимых значений поверх недопустимых. Если говорить точнее, то конечный вектор создается путем анализа каждой строки, группа за группой (если есть аргумент Group), в порядке возрастания параметра Order и замены всех недопустимых значений последним наблюдаемым значением или значением по умолчанию, если допустимое значение для данной группы еще не было найдено.

stockrwd.m(D, AM), stockrwd.s(D), stockrwd.c(D, AC)

Функции прибыльности запасов Данные функции используются для составления программы размещения заказов на основании вероятностных прогнозов от Lokad.