Le funzioni in Envision - Software di ottimizzazione delle scorte

Le funzioni in Envision












Home » Risorse » Qui

In questa pagina sono descritte tutte le funzioni supportate da Envision. Scopo principale delle funzioni è quello di estendere le capacità di Envision quando la sintassi di base non è sufficiente.


Sintassi delle funzioni

La sintassi generale per le funzioni è:
x = fun(arg1, arg2, arg3) by [Group] sort [Order]
Dove fun va sostituito con il nome della funzione e argN con la lista di argomenti separati da una virgola. Tutte le funzioni operano con dei vettori.

Le opzioni aggiuntive by e sort sono supportate solo da alcune funzioni. Anche se la sintassi è simile a quella degli aggregatori, queste funzioni non sono aggregatori. L'opzione by è facoltativa e, se omessa, equivale a by 1. Sia Group, sia Order supportano tuple di vettori, ossia più vettori separati da una virgola, come nell'esempio qui sotto:
R = rank() by [A, B] sort [1]

Funzioni matematiche

  • abs(V): è simile alla funzione di Excel ASS.
  • ceiling(V): è simile alla funzione di Excel ARROTONDA.ECCESSO.
  • exp(V): è simile alla funzione di Excel Funzione EXP.
  • floor(V): è simile alla funzione di Excel ARROTONDA.DIFETTO.
  • log(V, [, B]): è simile alla funzione di Excel LOG.
  • max(A1, A2 [, A3, .., An]: è simile alla funzione di Excel Funzione MAX.
  • min(A1, A2 [, A3, .., An]: è simile alla funzione di Excel Funzione MIN.
  • percent(N) by [Group]: restituisce il valore N diviso per la somma di tutti i valori all'interno di Group.
  • norminv(V): è simile alla funzione di Excel Funzione INV.NORM.
  • pow(U, V): è simile alla funzione di Excel POTENZA. Envision supporta anche l'operatore di potenza U ^ V, che esegue lo stesso tipo di calcolo.
  • round(U, V): è simile alla funzione di Excel ARROTONDA. Il secondo argomento è facoltativo.
  • sqrt(V): è simile alla funzione di Excel Funzione RADQ.

Funzioni di testo

  • concat(S1, S2, S3, ..., Sn): valori di testo concatenati da S1 a Sn.
  • contains(S, M): restituisce true (vero) se il testo S contiene un'occorrenza del testo M.
  • endswith(S, M): restituisce true (vero) se il testo S termina con un'occorrenza del testo M.
  • field(text, separator, index): restituisce l'Nesimo campo (indicizzato a partire da zero) in un valore di testo che contiene più sottostringhe, separate da un separatore specifico. Un esempio è: field("a-b-c-d-", "-", 2) == "c". Questa funzione mira a facilitare la lettura dei valori di parsing che sono stati concatenati all'interno di una singola colonna di una tabella.
  • indexof(S, M): restituisce l'indice della prima occorrenza di M all'interno del testo S, o -1, se non viene trovata nessuna occorrenza.
  • lowercase(S): restituisce il testo S in lettere minuscole.
  • parsedate(S[, L]): converte il testo S in data. Quando il formato F è omesso, la data è analizzata sulla base della funzionalità di riconoscimento automatico del formato di data da parte di Envision. Se invece il formato F è specificato, la data è analizzata sulla base del formato atteso. Vedi come personalizzare la stringa formato data per la sintassi dettagliata. Se la data non può essere analizzata, verrà invece restituita la data 2001-01-01.
  • parsenumber(S): converte il testo S in un numero. L'analisi sfrutta la funzionalità di riconoscimento automatico del formato di data da parte di Envision. Se il numero non può essere analizzato, viene restituito il valore zero.
  • parsetime(text, format): converte un'ora del giorno in una frazione compresa tra 0 e 1, che rappresenta un giorno frazionario. Il formato è facoltativo: se non è specificato, verrà utilizzato il formato predefinito yyyy-MM-dd HH:mm:ss. Envision usa il formato di ora personalizzato .NET.
  • replace(S, M, N): restituisce il testo S dove tutte le occorrenze di M sono state sostituite con N. La funzione è simile alla funzione di Excel SOSTITUISCI, senza l'argomento instance_num.
  • startswith(S, M): restituisce true (vero) se il testo S inizia con un'occorrenza del testo M.
  • strlen(S): restituisce la lunghezza dell'argomento stringa.
  • substr(S, I [, L]): la posizione iniziale è definita da I. Se negativa, controbilancia la fine della stringa; in caso contrario, controbilancia l'inizio della stringa.
    La lunghezza della sottostringa restituita è definita da L, trattata come 0 se L < 0. Se l'inizio del segmento o la lunghezza la spostano parzialmente o totalmente al di fuori della stringa (es. substr("A", 2, 1)), il segmento è regolato in modo da adattarsi. La funzione substr(S,I) è definita come substr(S,I,<infinity>).
  • uppercase(S): restituisce il testo S in lettere maiuscole.

Funzioni calendario

  • "\{myDate:yyyy-MM-dd}": personalizza il formato delle date tramite interpolazione delle stringhe. Il formato della data è specificato dal token dopo i due punti.
  • chineseYear(date): restituisce l'anno corrente nel calendario cinese.
  • chineseYearEnd(date): restituisce l'ultimo giorno dell'anno cinese corrente.
  • chineseYearStart(date): restituisce il primo giorno dell'anno cinese corrente.
  • date(y,m,d): restituisce una data costruita a partire da anno, mese e giorno passati come argomenti.
  • monday(date): restituisce il primo lunedì che precede la data D (compresa).
  • month(date): restituisce l'indice del mese associato alla data D, contando il numero dei mesi a partire dal 1° gennaio 2001.
  • monthnum(date): restituisce il mese applicabile (1-12) per la data passata come argomento.
  • today(timezone): restituisce la data corrente nel fuso orario passato come argomento ed esprime la differenza in ore rispetto al tempo coordinato universale (UTC).
  • year(date): restituisce l'anno applicabile alla data passata come argomento. Simile alla funzione di Excel ANNO.
  • yearStart(date): restituisce il primo giorno dell'anno per l'anno corrente.
  • yearEnd(date): restituisce l'ultimo giorno dell'anno per l'anno corrente.
  • weeknum(date): è simile alla funzione di Excel NUM.SETTIMANA (Sistema 2).

Funzioni di ordine

  • argfirst() by [Group] sort [Order]: restituisce true (vero) per il primo valore del gruppo secondo i valori ordinati (ordering). L'argomento gruppo (group) è facoltativo: quando è fornito, la funzione restituisce true (vero) una volta per ogni gruppo. Per maggiore comodità, è inoltre fornito un sovraccarico argfirst() by [Group] sort [Order] where condition. Quando è usata l'opzione where (dove), è possibile che nei gruppi non risulti alcun valore true (vero), poiché la condizione si rivela false (falsa) per l'intero gruppo.
  • arglast() by [Group] sort [Order]: come argfirst(), ma restituisce true (vero) per l'ultimo valore.
  • cumsum(N) by [Group] sort [Order]: restituisce la somma cumulativa dei valori N secondo i ranghi crescenti specificati. L'argomento gruppo (group), facoltativo, è usato per ottenere una somma cumulativa locale per ogni gruppo.
  • fifo(V, T.D, T.Q): aiuta l'analisi delle scorte con il metodo FIFO. Restituisce la quantità di scorte invendute come vettore di T. Il vettore V contiene le scorte totali. La tabella T contiene gli ordini di acquisto. T.D contiene le date, mentre T.Q contiene le quantità acquistate. La funzione calcola le quantità invendute ripercorrendo all'indietro nel tempo gli ordini di acquisto. Vedi anche il metodo di gestione del magazzino FIFO.
  • rank() by [Group] sort [Order]: è simile alla funzione di Excel EQ.RANGO, con la differenza che tutti i numeri hanno un rango distinto (in caso di parità, il rango è arbitrario). L'argomento gruppo (group) è facoltativo e viene usato per ottenere un rango locale per ogni gruppo.
  • rank(N, Group, S): è una funzione di ordine più avanzata, piuttosto diversa dagli altri sovraccarichi di tipo rank(). Scopo di questo sovraccarico è supportare la creazione di una lista di acquisti elencati per ordine di priorità. In particolare, rank(N, Group, S) non può essere riespressa come singola espressione di ordine e raggruppamento. Si tratta di un algoritmo imperativo in due fasi: nella prima fase, i valori sono raggruppati da Group in stack (pile), ognuna delle quali è ordinata per S ascendente; nella seconda fase, l'algoritmo seleziona il valore più elevato di N tra gli elementi più in alto tra tutte le stack, lo evidenzia, gli assegna un rango (partendo da 1) e ripete l'operazione fino a svuotare tutte le stack.
  • rankd() by [Group]: restituisce i ranghi dei numeri N; a numeri uguali corrispondono ranghi uguali. È simile alla funzione di Excel RANGO.UG.

Funzioni per grafi

  • canonical(A, B): restituisce il rappresentante canonico per ogni valore di A. Da un punto di vista pratico, la funzione è usata per la sostituzione di codici (ad esempio, i codici delle SKU). Se per esempio abbiamo canonical(OldSku, NewSku), la funzione restituirà l'ultima SKU disponibile per ogni articolo, sostituendo ogni volta il codice vecchio con quello nuovo. Vedi anche nonCanonical().
  • nonCanonical(A, B): restituisce true (vero) quando non è possibile calcolare un rappresentante canonico per A, ossia quando sono rilevati percorsi circolari o salti condizionati.
  • connected(A, B, group): considera il grafo non orientato descritto da tutti i bordi (A,B), quindi restituisce per ogni nodo A il nome del più piccolo nodo del componente connesso ad A (per più piccolo intendiamo quello dal nome più breve confrontando le stringhe). La variante a 3 argomenti si comporta in modo simile, ma prima suddivide il set di dati in grafi separati e indipendenti l'uno dall'altro, usando i valori di G.

Funzioni di distribuzione

Vedi l'algebra delle distribuzioni.

Distribuzioni parametriche

Possono essere generate distribuzioni parametriche, ossia funzioni che sfruttano un numero come argomento (il parametro) e restituiscono una distribuzione.

  • dirac(n) restituisce una funzione a valore zero ovunque, eccetto che per n, dove il valore della funzione è 1.
  • identity(n) restituisce la funzione $\text{id}: k \to k$ limitatamente al segmento [0;n] e 0 altrove.
  • uniform(n) restituisce la funzione $\text{unif}: k \to 1$ limitatamente al segmento [0;n] e 0 altrove.
  • uniform(m, n) restituisce la funzione $\text{unif}: k \to 1$ limitatamente al segmento [m;n] e 0 altrove. Se $m - 1 = n$, la distribuzione uniform() restituisce una distribuzione zero.
  • uniform(D) restituisce la funzione $\text{unif}: k \to 1$ limitatamente al supporto positivo della distribuzione D e 0 altrove.
  • poisson(a) restituisce la distribuzione di Poisson del parametro a ($\lambda$ in letteratura).
  • exponential(a) restituisce la distribuzione esponenziale del parametro a ($\lambda$ in letteratura).

Distribuzioni non parametriche

  • distrib(Id, G.Probability, G.Min, G.Max) è una funzione che restituisce la distribuzione definita da una lista di bucket, in cui ogni bucket ha limiti inclusivi a destra e a sinistra e a ogni bucket corrisponde un valore.
  • ranvar(T.X) è un aggregatore che restituisce la distribuzione empirica che risulta dalle osservazioni ottenute dal vettore T.X.

Indicatori su distribuzioni

Dalle distribuzioni è anche possibile ottenere indicatori numerici.

  • crps(X, A), dove A sono numeri interi, restituisce il Continuous Ranked Probability Score (CRPS).
  • crps(X, Y), dove sia X sia Y sono distribuzioni, restituisce la metà della distanza energetica, che può essere considerata come una generalizzazione del CRPS per una coppia di distribuzioni.
  • mean(X) restituisce la media statistica.
  • variance(X) restituisce la varianza statistica.
  • mass(X) restituisce la massa di distribuzione, ossia $\sum_{k=-\infty}^{\infty}f(k)$.
  • isranvar(X) restituisce un valore booleano (true, vero, se la distribuzione è una variabile casuale).
  • int(X, A, B) dove A e B sono numeri interi, restituisce il valore intero di X per il segmento inclusivo [A;B].
  • quantile(X, tau) restituisce il quantile della distribuzione, il più piccolo valore di $x$, come $\mathbf{P}[X \leq x] \geq \tau$.
  • spark(X) restituisce un valore di testo che contiene una rappresentazione compatta della distribuzione in codifica ASCII.

Trasformazioni di distribuzioni

Una distribuzione, infine, può essere trasformata in un'altra distribuzione.

  • reflect(X) restituisce la distribuzione riflessa $k \to f(-k)$.
  • transform(X,a) restituisce una distribuzione che approssima per interpolazione $k \to f(k / a)$.
  • fillrate(X) restituisce il fill rate marginale. Necessita di una variabile casuale come input e restituisce una variabile casuale.
  • truncate(X, a, b) restituisce la distribuzione troncata $k \to f(k) \text{ se } k \in [a; b] \text{ diverso da } 0$. I limiti A e B sono inclusivi.
  • maxr(X, a) restituisce la distribuzione $k \to f(k) \text{ se } k \in ]-\infty; a - 1] \text{ oppure } \sum_{i=a}^\infty f(i) \text{ se } k = a \text{ diverso da } 0$.
  • minr(X, a) restituisce la distribuzione $k \to f(k) \text{ se } k \in [a + 1; \infty[ \text{ oppure } \sum_{i=-\infty}^a f(i) \text{ se } k = a \text{ diverso da } 0$.
  • zoz(X) (zero on zero) restituisce la distribuzione dove $k \to f(k) \text{ se } k \neq 0 \text{ diverso da } 0$.

Funzioni per la creazione di tabelle

Vedi anche come creare tabelle per maggiori informazioni.

  • extend.range(N): crea N righe per ogni riga della tabella T, dove ci si aspetta che N sia un numero intero. Per esempio:

    table T = extend.range(Orders.42)
    T.Quantity = Orders.Quantity // estensione implicita
    show table "T" with T.N, T.Quantity
  • extend.distrib(D[, S, M]): espande una distribuzione D in una tabella. Vedi anche extend.distrib().
  • extend.billOfMaterials(...): traduce una domanda storica per articoli in una domanda storica per componenti. Vedi anche extend.billOfMaterials().

Funzioni avanzate

  • cumsub(G.Item, G.Stock, G.Quantity, G.Rank): considera 4 vettori appartenenti a una tabella a griglia. In particolare, G.Item è l'identificatore dell'articolo (tutte le righe che condividono lo stesso valore appartengono allo stesso articolo); G.Stock indica le scorte iniziali dell'articolo (tutte le righe che appartengono allo stesso articolo dovranno avere lo stesso valore di G.Stock); G.Quantity è la quantità di articolo richiesta per l'acquisto della riga della griglia; G.Rank è un identificatore di assemblaggio (tutte le righe che condividono lo stesso identificatore di assemblaggio appartengono allo stesso assemblaggio; non è possibile avere due righe con la stessa coppia (G.Item, G.Rank), e tutti gli assemblaggi sono ordinati per rango crescente). La funzione cumsub() esplora tutti gli assemblaggi per rango crescente, tenendo traccia delle scorte rimanenti per ognuno di essi. Tali scorte sono definite dapprima attraverso il vettore G.Stock. Per ogni assemblaggio, la funzione determina se le scorte rimanenti sono sufficienti per acquistare tutte le righe della griglia corrispondenti all'assemblaggio, a seconda che le scorte superino o meno G.Quantity. Se le scorte superano G.Quantity, allora la funzione riduce le scorte per ogni articolo e scrive in ogni riga della griglia le scorte rimanenti corrispondenti. Se non vi sono abbastanza scorte per servire l'intero assemblaggio (di solito perché uno degli articoli è esaurito), allora la funzione non aggiorna le scorte rimanenti e assegna a ogni riga il valore -(S+1) (dove S rappresenta le scorte rimanenti per l'articolo in quel preciso momento), per indicare sia che la riga della griglia non è acquistata (verifica se G.S < 0), sia se è stata proprio quella riga a fare in modo che l'assemblaggio non venisse acquistato (verifica se G.Quantity + G.S + 1 > 0 e di quanto (G.Missing = G.Quantity + G.S + 1).
  • forex(V, Orig, Dest, D): restituisce l'importo V, espresso in valuta Orig, nell'importo equivalente in valuta Dest secondo i tassi storici in data D. Le valute vanno indicate con il corrispondente codice di tre lettere internazionale. Lokad supporta circa 30 valute, sulla base dei dati forniti dalla Banca Centrale Europea. I tassi di cambio vengono aggiornati quotidianamente. Vedi anche isCurrency() per verificare che il codice inserito sia corretto.
  • hash(V): restituisce un valore hash pseudo-iniettivo tra 0 e 2^24-1. Questa funzione è usata per mescolare in modo casuale un set di dati, applicando un algoritmo di hash al contenuto di una colonna e riordinando poi i dati secondo i valori hash corrispondenti.
  • isCurrency(V): restituisce true (vero) se il testo passato come argomento è un codice valuta riconosciuto dalla funzione forex().
  • mkuid(X, offset): restituisce un numero unico, mantenuto per tutte le esecuzioni di Envision. Questa funzione mira a identificare in modo univoco i risultati calcolati da Lokad. Ad esempio, può essere usata per generare un numero di ordine d'acquisto univoco, da incrementare ogni volta che lo script Envision viene eseguito di nuovo. Il vettore X è ignorato, ma l'UID (identificatore univoco) è generato come scalare nella tabella associata a X. Il valore offset è uno scalare facoltativo, che rappresenta il suffisso di partenza per l'UID. Le stringhe generate sono numeri in formato PPPPPPPAAA, dove P è un numero di pagina (non comincia quindi per 0) ed è tassativamente incrementale, mentre A è un contatore incrementale che parte dal valore offset (o da 0, se non è specificato alcun parametro offset). P ha almeno 7 cifre, mentre A ne ha almeno 3. L'UID ha tre proprietà: (1) tutti gli UID possono essere analizzati come numeri, ognuno dei quali sarà diverso dagli altri. Occorre sottolineare, però, che gli UID contano almeno 10 cifre o anche più, se ogni chiamata deve generarne più di 1000; (2) un UID generato nel momento T è rigorosamente inferiore (in ordine alfabetico) rispetto a un UID generato nel momento T' > T; (3) se tutte le chiamate generano numeri simili di UID (meno di 999, oppure tra 1000 e 9999, ecc.), allora la proprietà precedente è vera anche per l'ordine numerico tra i vari UID.
  • solve.moq( ... ): è un solutore numerico avanzato per il problema generale del quantitativo minimo d'ordine (o MOQ, dall'inglese Minimal Order Quantities).
  • priopack(V, MaxV, JT, B) by [Group] sort [Order]: è una semplice variante del problema bin packing, da usare nelle liste di priorità degli acquisti. A differenza dell'algoritmo bin packing tradizionale, con questa funzione cerchiamo non solo di ottimizzare le capacità del contenitore, ma anche di preservare il più possibile l'ordine delle unità. Order contiene i ranghi delle righe da inserire all'interno di un contenitore. V è il volume di ogni riga. Group è la classe di equivalenza dei fornitori, dove il bin packing è calcolato per fornitore. MaxV è il volume massimo contenibile, il cui valore è omogeneo rispetto a V e si presuppone costante in tutta la classe Group. JT è la soglia di salto, il cui valore è omogeneo rispetto a V e si presuppone sia un multiplo minore del valore Group. B è un argomento facoltativo interpretato come barriera; se questo valore viene specificato, l'algoritmo bin packing non è autorizzato a riordinare le righe al di sotto della classe definita da B.
  • smudge(values, present) by [Group] sort [Order]: prende un vettore incompleto di valori (values) e un vettore booleano che determina dove sono presenti i valori validi. Restituisce un vettore completo di valori validi, completato distribuendo i valori validi in quelli non validi. Più precisamente, il vettore risultante viene costituito passando in rassegna ogni riga, gruppo per gruppo (se è presente un argomento Group), seguendo un ordine (Order) crescente e sostituendo ogni valore non valido con l'ultimo valore osservato, oppure con un valore predefinito se nel gruppo non è stato ancora osservato un valore valido.
  • stockrwd.m (Demand, AM), stockrwd.s(Demand), stockrwd.c(Demand, AC): sono le funzioni di rendimento delle scorte, usate per creare una politica di riordino per priorità a partire dalle previsioni probabilistiche prodotte da Lokad.