Lista de funciones




La principal finalidad de las funciones es extender las capacidades de Envision allí donde la sintaxis de lenguaje básico no sería suficiente. A continuación, enumeramos las funciones que admite Envision.


Sintaxis de función

La sintaxis general para funciones es:
x = fun(arg1, arg2, arg3, ..., argN) by [Group] sort [Order]
fun se reemplazará por el nombre de la función y arg1, arg2, arg3, ..., argN se reemplazará por los argumentos pasados a la función. Todas las funciones operan en vectores.

Solo determinadas funciones admiten las opciones adicionales by y sort. Si bien la sintaxis es similar a la sintaxis de los agregadores, esas funciones no son agregadores. La opción by es opcional y, cuando se omite, equivale a by 1. Tanto Group como Order admiten support tuplas de vectores, es decir, varios vectores separados por comas. Por ejemplo:
R = rank() by [A, B] sort [1]

Funciones matemáticas

  • abs(number): Similar a la función ABS de Excel.
  • ceiling(number): Similar a la función MÚLTIPLO SUPERIOR de Excel.
  • exp(number): Similar a la función EXP de Excel.
  • floor(number): Similar a la función FLOOR de Excel.
  • log(number, base): Similar a la función LOG de Excel. El argumento base es opcional; cuando se omite, se supone que es 10.
  • max(num1, num2, num3, ..., numN): Similar a la función MAX de Excel.
  • min(num1, num2, num3, ..., numN): Similar a la función MIN de Excel.
  • percent(N) by [Group]: Devuelve el valor N dividido por la suma de todos los valores dentro del Group.
  • norminv(number): Similar a la función DISTR.NORM.INV de Excel con una media de 0 y una desviación estándar de 1.
  • pow(number, exponent): Similar a la función POWER de Excel. Envision también es compatible con el operador de potencia number ^ exponent que realiza el mismo cálculo.
  • round(number, digits): Simlar a la función REDONDEAR de Excel. El segundo argumento es opcional y representa el número de dígitos que se desea mantener.
  • sqrt(number): Similar a la función RAÍZ de Excel.

Funciones de texto

  • concat(text1, text2, ..., textN): Concatena valores de texto de text1 a textN.
  • contains(text, pattern): Devuelve true si el texto contiene una ocurrencia del patrón.
  • endswith(text, pattern): Devuelve true si el texto termina con una ocurrencia del patrón.
  • field(text, separator, index): Devuelve el número de campo (indexado cero) en un valor de texto que contiene múltiples subcadenas separadas por un separador especificado. Ej.: field("a-b-c-d-", "-", 2) == "c". Esta función está pensada para facilitar los valores de análisis que se han concatenado en una sola columna de tabla.
  • field.r(text, separator, index): Similar a la función field(), pero cuenta las ocurrencias de separador desde la derecha. Ej.: field.r("a-b-c-d-", "-", 0) == "c".
  • indexof(text, pattern): Devuelve el índice de la primera ocurrencia del patrón dentro del texto, o -1 si no se puede encontrar esa ocurrencia.
  • lowercase(text): Devuelve la variante del texto en minúscula.
  • parsedate(text, format): Convierte el texto en una fecha utilizando el formato especificado. El formato es opcional. Cuando se omite el formato, la fecha se analiza de acuerdo con el comportamiento de autodetección de formato de fecha de Envision. Cuando se proporciona el formato, la fecha se analiza con respecto a la expectativa de formato. Vea el artículo sobre cadena de formato de fecha personalizado para más detalles sobre la sintaxis de formato. Si no es posible analizar una fecha, se devuelve la fecha 2001-01-01.
  • parsenumber(text): Convierte el texto en un número. El analizador aprovecha el comportamiento de autodetección de formato de número de Envision. Si no es posible analizar el número, se devuelve el valor cero.
  • parsetime(text, format): Convierte una hora del día en una fracción entre 0 y 1 que representa un día fraccionario. El formato es opcional. Cuando el formato no se especifica, se utiliza el valor predeterminado yyyy-MM-dd HH:mm:ss. Envision utiliza el formato de hora personalizado .NET.
  • replace(text, pattern, replacement): Reemplaza en el texto todas las ocurrencias del patrón por el reemplazo. Esta función es similar a la función SUSTITUIR de Excel, omitiendo el argumento instance_num.
  • startswith(text, pattern): Devuelve true si el texto comienza con una ocurrencia del patrón.
  • strlen(text): Devuelve la longitud del argumento de texto.
  • substr(text, start, count): start define la posición de inicio. Si es negativa, es un desfase del final de la cadena; si no, es un desfase del inicio de la cadena. La longitud de la subcadena devuelta es definida por count, tratada como 0 si count < 0. Si el inicio o la longitud del segmento lo colocan parcial o completamente fuera de la cadena, ej.: substr("A", 2, 1), se acorta el segmento para adaptarlo. La función substr(text, start) se define como substr(text, start, <infinity>).
  • uppercase(text): Devuelve la variante del texto en mayúscula.

Funciones de calendario

  • "\{myDate:yyyy-MM-dd}": Formato de fecha personalizado a través de la interpolación de cadena. El formato de fecha es especificado por el token que se encuentra después del punto y coma. Más detalles sobre cadenas de formato de fecha personalizado.
  • chineseYear(date): Devuelve el año actual en el calendario chino.
  • chineseYearEnd(date): Devuelve el última día del año chino actual.
  • chineseYearStart(date): Devuelve el primer día del año chino actual.
  • date(y, m, d): Devuelve una fecha creada a partir del año, el mes y el día pasados como argumentos. Se espera que los argumentos y, m y d sean números.
  • monday(date): Devuelve el primer lunes que precede a la fecha (inclusivo).
  • month(date): Devuelve el índice del mes asociado a la fecha, contando el número de meses desde el 1 de enero de 2001.
  • monthnum(date): Devuelve el mes aplicable (1-12) para la fecha pasada como argumento.
  • today(timezone): Devuelve la fecha fecha de tiempo real con el huso horario pasado como argumento y expresado como la diferencia en horas con respecto al UTC.
  • year(date): Devuelve el mes aplicable para la fecha pasada como argumento. Similar a la función AÑO de Excel.
  • yearStart(date): Devuelve el primer día del año del año actual.
  • yearEnd(date): Devuelve el último día del año del año actual.
  • weeknum(date): Similar a la función NUM.DE.SEMANA (sistema 2) de Excel.

Funciones de jerarquía

  • argfirst() by [Group] sort [Order]: Devuelve true para el primer valor del grupo de acuerdo con los valores pedidos (el pedido). El grupo es opcional. Cuando se proporciona el grupo, la función devuelve true una vez por grupo. También se proporciona una sobrecarga argfirst() by [Group] sort [Order] where condition para mayor conveniencia. Cuando se utiliza la opción where, puede dar como resultado grupos en los que no haya un valor true, porque la condición es false para todo el grupo.
  • arglast() by [Group] sort [Order]: Igual que argfirst(), pero devuelve true para el último valor.
  • cumsum(N) by [Group] sort [Order]: Devuelve la suma acumulativa de los números N de acuerdo con las jerarquías ascendentes. El grupo es opcional. Cuando se especifica el grupo, se utiliza para realizar una suma acumulativa local para cada grupo.
  • fifo(V, T.D, T.Q): Ayudante para análisis de inventario FIFO. Devuelve la cantidad de inventario no vendido como un vector de T. El vector V contiene el stock total. La tabla T contiene los pedidos de compra. T.D contiene las fechas, y T.Q contiene las cantidades de compra. La función calcula las cantidades no vendidas ejecutando las órdenes de compra hacia atrás en el tiempo. Vea también Método de inventario FIFO.
  • rank() by [Group] sort [Order]: Devuelve las jerarquías de los números sin empate. Similar a la función JERARQUÍA de Excel, con la excepción que cada número obtiene una clasificación distinta (la rupturas de empates empates son arbitrarias). El grupo es opcional. Cuando se especifica el grupo, se utiliza para realizar jerarquías locales para cada grupo.
  • rank(N, Group, S): Una función más avanzada que es bastante diferente de las demás sobrecargas rank(). La función específica de esta sobrecarga es respaldar la generación de una lista de compra priorizada. En particular, rank(N, Group, S) no puede volver a expresarse como expresión simple de clasificación y agrupación. Este es un algoritmo imperativo de dos fases. En la primera fase, los algoritmos son agrupados por Group en stacks, cada uno de los cuales se ordena por S ascendente. En la segunda fase, el algoritmo selecciona el mayor nivel de N entre los principales elementos de todos los stacks, separa ese elemento, le asigna una clasificación (comenzando por 1) y repite la secuencia hasta que todos los stacks quedan vacíos.
  • rankd(N) by [Group]: Devuelve las jerarquías de los números N: números iguales obtienen jerarquías iguales. Similar a la función JERARQUÍA de Excel.

Funciones de gráfico

  • canonical(A, B): Devuelve el representante canónico para cada valor A. Desde una perspectiva práctica, esta función se utiliza para gestionar los reemplazos de código (ej.: reemplazo de código de SKU). Por ejemplo, canonical(OldSku, NewSku) devolvería las últimas unidades SKU disponibles de cada artículo, realizando los reemplazos de modo recurrente. Vea también nonCanonical().
  • nonCanonical(A, B): Devuelve true cuando no es posible calcular un representante canónico para A. Esto sucede cuando se detectan trayectorias circulares o ramificadas.
  • connected(A, B) by [Group]: Considera el gráfico no direccionado descrito por todos los arcos (A,B), luego devuelve para cada nodo A el nombre del nodo más pequeño del componente conectado de A. Aquí, el más pequeño significa el que tiene el nombre más pequeño en términos de comparación de cadena. El grupo es opcional. Cuando se especifica el grupo, el conjunto de datos se particiona primero con respecto a los grupos especificados.

Álgebra de distribuciones

Vea también el artículo sobre álgebra de distribuciones.

Distribuciones paramétricas

Las distribuciones paramétricas pueden generarse, es decir, funciones que toman un número como argumento —el parámetro— y devuelven una distribución.

  • dirac(n): Devuelve una función de valor cero en todas partes con excepción de n, donde el valor de la función es 1.
  • identity(n): Devuelve la función $\text{id}: k \to k$ pero limitada al segmento [0;n] y 0 en el resto.
  • uniform(n): Devuelve la función $\text{unif}: k \to 1$ pero limitada al segmento [0;n] y 0 en el resto.
  • uniform(m, n): Devuelve la función $\text{unif}: k \to 1$ pero limitada al segmento [m;n] y 0 en el resto. Si $m - 1 = n$, el uniform() devuelve una distribución cero.
  • uniform(D): Devuelve la función $\text{unif}: k \to 1$, pero limitada al respaldo positivo de la distribución D y 0 en el resto.
  • poisson(lambda): Devuelve la distribución de Poisson del parámetro lambda ($\lambda$ en la literatura).
  • exponential(lambda): * exponential(a) devuelve la distribución exponencial del parámetro lambda ($\lambda$ en la literatura).
  • negativebinomial(mu, sigma): Devuelve la distribución binomial negativa de la mediamu y la desviación estándar sigma. Si la desviación estándar es menor que la media, se devuelve en cambio una distribución de Poisson de la media mu.
  • ranvar.uniform(n): Devuelve la distribución representada por la función $k \to \frac{1}{|n| + 1}$ en el segmento [0;n] (if $n \geq 0$) o [n;0] (si $n < 0$) y 0 en el resto.
  • ranvar.uniform(m, n): Devuelve la distribución representada por la función $k \to \frac{1}{n + 1 - m}$ en el segmento [m;n] y 0 en el resto. Suponemos que $m < n$; presenta un error si $m > n$.

Distribuciones no paramétricas

  • distrib(Id, G.Probability, G.Min, G.Max): Función que devuelve la distribución definida por una lista de cubos, en la que cada cubo tiene límites derecho e izquierdo inclusivos y un valor para el cubo.
  • ranvar(T.X): Agregador que devuelve la distribución empírica que resulta de las observaciones obtenidas del vector T.X.
  • ranvar.segment(...): Función avanzada que genera una distribución empírica que resulta de una ventana de tiempo variable (más detalles a continuación).

Indicadores sobre distribuciones

También es posible obtener indicadores numéricos a partir de las distribuciones.

  • crps(X, A) donde A son números enteros, devuelve las puntuaciones de rango de probabilidad continuo (CRPS)
  • crps(X, Y) donde tanto X como Y son distribuciones, devuelve la mitad de la distancia de energía que puede entenderse como una generalización de las CRPS a un par de distribuciones.
  • mean(X): Devuelve la media estadística.
  • variance(X): Devuelve la varianza estadística.
  • int(X, A, B) donde A y B son números enteros, devuelve la integral de X sobre el segmento inclusivo [A;B].
  • quantile(X, tau): Devuelve el cuantil de la distribución; la $x$ más pequeña, como $\mathbf{P}[X \leq x] \geq \tau$.
  • spark(X): Devuelve un valor de texto que contiene una representación ascii-art compacta de la distribución.
  • support.max(X): Devuelve límite superior del soporte de distribución.
  • support.min(X): Devuelve límite inferior del soporte de distribución.

Transformaciones de distribuciones

Una distribución también puede ser transformada en otra distribución.

  • reflect(X): Devuelve la distribución reflejada $k \to f(-k)$.
  • transform(X, a): Devuelve una distribución que aproxima a través de la interpolación $k \to f(k / a)$..
  • fillrate(X): Devuelve la tasa de llenado marginal. Espera una variable aleatoria como dato de entrada y devuelve una variable aleatoria.
  • truncate(X, a, b): Devuelve la distribución truncada $k \to f(k) \text{ if } k \in [a; b] \text{ else } 0$. Los límites A y B son inclusivos.
  • maxr(X, a) o maxr(a, X): Devuelve la distribución $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) o minr(a, X): Devuelve la distribución $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): Devuelve una combinación de dos distribuciones y un peso. $k \to p \times f_1(k) + (1 - p) \times f_2(k)$.
  • mixture(X1, p1, X2, p2, X3): Devuelve una combinación de tres distribuciones y dos pesos. $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): Devuelve una combinación de cuatro distribuciones y tres pesos. $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) (zero on zero): Devuelve la distribución donde $k \to f(k) \text{ if } k \neq 0 \text{ else } 0$.

Funciones de creación de tabla

Vea el artículo sobre creación de tablas para más detalles.

  • extend.range(T.N): Crea N líneas para cada línea de la tabla T donde se espera que N sea un entero. Por ejemplo:

    table T = extend.range(Orders.42)
    T.Quantity = Orders.Quantity // extensión implícita
    show table "T" with T.N, T.Quantity
  • extend.distrib(distribution, gap, multiplier, reach): Amplía una distribución en una tabla. Vea también el artículo sobre extend.distrib().
  • extend.billOfMaterials(...): Traduce un historial de demanda de artículos en un historial de demanda de piezas. Vea también el artículo sobre extend.billOfMaterials().

Funciones avanzadas

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

Toma 4 vectores que pertenecen a una tabla de cuadrícula con:
  • G.Item identificador del artículo, todas las líneas que comparten el mismo valor pertenecen al mismo artículo;
  • G.Stock el stock inicial del artículo, todas las líneas que pertenecen al mismo artículo deben tener el mismo valor G.Stock;
  • G.Quantity la cantidad del artículo necesaria para la compra de la línea de la grilla;
  • G.Rank identificador de un paquete todas las líneas que comparten el mismo identificador de paquete pertenecen al mismo paquete; está prohibido que haya dos líneas con el mismo par (G.Item, G.Rank), y todos los paquetes se ordenan por jerarquía ascendente.

La función cumsub() explora todos los paquetes por jerarquía ascendente, haciendo el seguimiento del stock remanente de cada artículo. Inicialmente, este stock es definido por el vector G.Stock. Para cada paquete, la función determina si hay suficiente stock remanente para comprar todas las líneas de la grilla de ese paquete, dependiendo de si el stock supera G.Quantity. Si fuera así, la función reduce el stock de cada artículo y escribe en cada línea de la grilla el stock remanente de este artículo. Si no hay suficiente stock para servir al paquete completo —generalmente porque uno de los artículos se ha agotado—, la función no actualiza los stocks remanentes y almacena para cada línea de la grilla el valor -(S+1) (donde S es el stock remanente de ese artículo en ese momento), para indicar que la línea de la grilla no se compra (probar si G.S < 0) y si fue esa línea en particular la que hizo que no se comprara el paquete (probar si G.Quantity + G.S + 1 > 0) y por cuánto (G.Missing = G.Quantity + G.S + 1).

forex(value, Origin, Destination, date)

Devuelve la cantidad expresada en la moneda Origin en la cantidad equivalente en la moneda Destination de acuerdo con las tasas históricas en la fecha especificada. Las monedas deberían codificarse con sus códigos de tres letras canónicos. Lokad admite alrededor de 30 monedas aprovechando los datos proporcionados por el Banco Central Europeo. Las tasas se actualizan a diario. Vea también isCurrency() para probar la validez de su código moneda.

hash(value)

Devuelve un valor hash pseudo-inyectivo entre 0 y 2^24-1. Esta función generalmente se utiliza para mezclar en forma aleatoria un conjunto de datos mediante el hashing del contenido de una columna y luego ordenándolo comparado con los valores obtenidos por hash.

isCurrency(currencyCode)

Devuelve true si la entrada de texto pasada como argumento es un código de moneda reconocido por la función forex().

mkuid(X, offset)

Devuelve un número único, con la unicidad mantenida en todas las ejecuciones de Envision. Esta función está pensada para identificar de modo único los resultados calculados por Lokad. Por ejemplo, puede utilizarse para generar un número de pedido de compra único que se incremente cada vez que se vuelva a ejecutar el script de Envision.

El vector X se ignora, pero el UID (identificador único) se genera como un escalar en la tabla asociada aX. El offset es un escalar opcional que representa el sufijo de inicio para el UID. Las cadenas generadas son números en formato PPPPPPPAAA, con P, un número de página (no comienza con 0) que es siempre estrictamente creciente, y A, un contador incrementado que comienza en el desfase (o 0 si no se proporciona ningún parámetro de desfase). P tiene al menos 7 dígitos, A tiene al menos 3.

Los UID ofrecen tres propiedades.
  1. Todos los UID pueden analizarse como números, y esos números serán diferentes. Tenga en cuenta, sin embargo, que los UID tienen al menos 10 dígitos, y probablemente más si cada llamada debe generar más de 1000.
  2. Un UID generado en el tiempo T es estrictamente inferior (en orden alfabético) a un UID generado en el tiempo T' > T.
  3. Si todas las llamadas generan números similares de UID (menos de 999, o entre 1000 y 9999, etc.), la propiedad anterior también es verdadera para el orden numérico entre UID.

solve.moq(...)

Un solver numérico avanzado para el problema general de MOQ (cantidades de orden mínimas).

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

Devuelve la distribución del precio de compra por unidad marginal. * Vea el artículo sobre Descuentos de precios de proveedores.

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

Una variante simple del algoritmo de bin-packing pensado para ser utilizado con listas de priorización de compras. A diferencia del algoritmo de bin-packing clásico, no solo buscamos optimizar las capacidades de ubicación, sino que el pedido de unidades también debería preservarse en la mayor medida posible.
  • V es el volumen de cada línea.
  • MaxV es la capacidad de volumen máxima, su valor es homogéneo con V y se supone que es un valor constante en la clase equivalente Group.
  • JT es el umbral cambiante, su valor es homogéneo con el de V; generalmente se espera que sea un pequeño múltiplo del valor Group.
  • B es un argumento opcional interpretado como la barrera; cuando se proporciona este valor, el proceso de bin-packing no está permitido para reorden de líneas que pertenecen a la misma clase de equivalencia definida por B.
  • Group es la clase de equivalencia de los proveedores, con el bin-packing calculado por proveedor.
  • Order contiene las clasificaciones de línea por empaquetar.

ranvar.segment(...)

Esta función de llamada está pensada para convertir series de tiempo en distribuciones de probabilidad mediante la recopilación de observaciones de ventanas móviles.
D = ranvar.segment(
start: Items.Start // primera fecha (inclusiva) para cada artículo
end: Items.End // fecha de finalización (inclusiva) para cada artículo
step: Items.Step // número, incrementos en día entre observaciones
horizon: Items.Horizon // número, la longitud del día del período para cada artículo
date: Orders.Date // fecha para cada evento
quantity: Orders.Quantity) // cantidad para cada evento
Esta función calcula, para cada artículo, la distribución de la suma de cantidades de eventos para períodos de longitud de horizonte completos entre la primera y la última fecha de ese artículo. Por ejemplo, para una fecha de inicio el 1.o de enero y fecha de finalización el 7 de enero, un horizonte de 3 días, y un solo evento de cantidad 5 el 2 de enero, los períodos observados son los siguientes:

  • 1 ene - 3 ene: Q = 5

  • 2 ene - 4 ene: Q = 5
  • 3 ene - 5 ene: Q = 5
  • 4 ene - 6 ene: Q = 0
  • 5 ene - 7 ene: Q = 0

Y, por lo tanto, la distribución resultante es 40% Q = 0, 60% Q = 5.

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

Toma un vector incompleto de values y un vector booleano que determina dónde hay valores válidos. Devuelve un vector completo de valores válidos que se ha completado extendiendo los valores válidos en los no válidos. Más precisamente, el vector resultante se construye observando cada línea, grupo por grupo (si existe un argumento Group) y siguiendo elOrder ascendente, y luego reemplazando todos los valores no válidos por el último valor que se ha visto o por un valor predeterminado si aún no se ha visto ningún valor válido en el grupo.

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

Las funciones de recompensa por existencias. Estas funciones se utilizan para elaborar una política de pedido priorizado a partir de pronósticos probabilísticos elaborados por Lokad.