Carissimi,
Ho qualche problema nel provare a creare una nuova colonna che sia una formula e a inviarle una variabile all'interno del mio script JSL.
Ho una tabella di date in cui sto cercando di calcolare il ritardo medio di una colonna. La colonna di interesse non è necessariamente sempre distanziata in modo uniforme tra le righe, i ritardi a volte possono cambiare. Tuttavia, ai fini del mio script, è corretto osservare semplicemente il ritardo medio per l'intera colonna.
Il modo in cui avrei fatto questo (e posso farlo manualmente, ma preferirei automatizzarlo con lo script) è creare una colonna Lag di :X e poi prendere la differenza di :X-:Lag(X), quindi prendere il Col. Me ne intendo. Dal punto di vista della formula (matematica) dovrebbe assomigliare a:
ave_lag = Col Media(:X-:Lag(X))
Il problema che sto riscontrando è creare la nuova colonna con la formula Lag al suo interno. Ogni volta che provo a valutare lo script, inserisce il testo letterale di ciò che scrivo nella formula e non il nome della colonna prevista. Ho provato il comando dt<
Ho anche provato Eval(Substitute(Expr())), ma inserisce letteralmente la stringa tra virgolette, non la colonna come riferimento, come :X.
Ad esempio, nella tabella con cui sto lavorando, ho provato questo codice:
Eval(
Substitute(
Expr(
dt << New Column( "temp", Formula( Lag( __tcols__ ) ) )
),
Expr( __tcols__ ), xcols[1]
)
);Che produce una colonna "temp", ma la formula è la seguente:

Il nome della colonna è t e la variabile xcols={"t"}. La formula dovrebbe assomigliare a Lag(:t), un riferimento alla colonna, non al nome della colonna.
Ho anche provato quest'altro codice per estrarre il numero di colonna di :t (può cambiare all'interno della tabella dati) e quindi inserire Colonna(#) nella formula, ma anche questo non funziona.
collist = dt << Get Column Names( string ); //creates a list of the column names
colnum = Loc( collist, xcols[1] )[1]; //locates the position in the list of the script variable xcols[1].
//This previous part basically gets the column number of the local variable xcol in the data table (it can change).
//This is the script where I'd like it to substitute
Eval(
Substitute(
Expr(
dt << New Column( "temp", Formula( Lag( Column( __tcols__ ) ) ) )
),
Expr( __tcols__ ), colnum
)
);Che produce anche una colonna "temp", ma la formula è la seguente:

Pensavo che dovrebbe essere più facile di quanto sto scoprendo, ma devo fare qualcosa di sbagliato/strano perché non ottengo i risultati che mi aspetterei.
Qualsiasi suggerimento su come calcolare il ritardo medio di una colonna è molto apprezzato. Ho bisogno di un solo numero, in definitiva, non ho bisogno delle colonne extra.
Grazie!,
DS
Tentativo:
Eval( Eval Expr(
dt << New Column( "TEMP", "Numeric", <<SET each="" value=""></SET>
Devi dire a JSL che la stringa è in realtà un nome (perché possa considerarla come una variabile), quindi il file Come nome() funzione
CIAO @ErraticAttack ,
Grazie per il tuo contributo e, sebbene abbia svolto il compito di inserire correttamente il nome della colonna nella formula della colonna, quel particolare pezzo di codice all'interno dell'altro mio codice esistente ha finito per causare problemi con i riferimenti ad alcune caselle di visualizzazione che devono essere aggiornate in base sull'input dell'utente. Sfortunatamente, per questo motivo ho causato troppi problemi nel seguire questa strada, quindi ho finito per modificare il codice e lavorare solo con i valori della colonna di interesse: prima creando una matrice e poi semplicemente calcolando la riga (n+1) -row(n) differenza della colonna e media della matrice.
n = Matrix( N Rows( dt ), 1 );
For( i = 1, i <= N Items( n ) - 1, i++,
n[i] = (dt:xcols[i + 1] - dt:xcols[i]) / timefactor
);
deltat = Round( Mean( n ), 3 );
Dove "timefactor" è una variabile che dipende dal fatto che la colonna sia espressa o meno in unità di giorni, minuti, ore, ecc.
Quindi, grazie per la tua soluzione al problema originale di come inviare una variabile a una nuova funzione di colonna, ma sfortunatamente ho dovuto seguire un'altra strada per risolvere la funzionalità del codice nel suo complesso.
Grazie!,
DS