Somma mobile dei valori della riga precedente con condizioneI miei dati iniziano con due colonne, Lotto# e Qtà.
Ho bisogno di aiuto per creare uno script per calcolare la somma mobile (riga corrente + 2 righe precedenti) dei valori della riga precedente.
La logica è spiegata come nella tabella seguente.

Modellazione statistica avanzataAutomazione e scriptingPersonalizzazione di massaOggetto: somma mobile dei valori della riga precedente con condizioneGrazie per aver postato la tua domanda. È stato un problema divertente, ma tortuoso da risolvere.
Ho aggiunto alcune annotazioni al JSL, si spera che abbia senso e non sembri solo una gigantesca formula magica.
Onestamente, all'inizio ho pensato che sarebbe stato quasi impossibile risolverlo, ma dopo una tazza di caffè più grande, .. non così male.
Oggetto: somma mobile dei valori della riga precedente con condizioneGrazie Byron.
Oggetto: somma mobile dei valori della riga precedente con condizioneAggiungi questo script alla tua tabella di dati e provalo
dt1=current data table();
//I want to get the max quantity by lot, so I'm adding a new column to change all the lots back to their non-decimal value.
dt1<< New Column("Lot Actual", formula(If( :Qty == Col Maximum( :Qty, Char( Round( Num( :Lot# ), 0 ) ) ),
:Lot#,
.
)));<BR />//this next formula column excludes rows that aren't the max Qty by lot
dt1<< New Column( "Lot Values in One Formula",
Formula(
If( :Lot Actual == "",
Row State( row() ) = Excluded State( 1 );
Excluded( Row State( row() ) );
1;
)
)
);
dt1<<RUN formulas=""></RUN>//once all the formulas for tagging the data are added, we can use Tabulate to get a subset of just the important rows.<BR />//There are lots of other ways to do this, this just happened to be the method of the day
obj1=dt1 << Tabulate(
Add Table(
Column Table( Analysis Columns( :Qty ) ),
Row Table( Grouping Columns( :Lot# ) )
)
);
dt2=obj1 << Make Into Data Table;
column(dt2,2)<<SET name=""></SET><BR />//Finally here is the rolling sum of the last three lots<BR />//there is moving average function we could have used, it would have looked simpler but more abstract
dt2<<NEW column=""></NEW>//<BR />//This part joins the values from the separate table back to the original table<BR />
dt1 << Update(
With( dt2 ),
Match Columns( :Lot# = :Lot# )
);
close(dt2, nosave);
obj1<<CLOSE window=""></CLOSE>//I feel like this step is cheating a little. This step just repeats the missing values down to the next non-missing<BR />//row. Its some code I got from Brady Brady a ways back. Different iterations of come in handy from time to time.
<BR />dtnr=current data table();
dtcollist=dtnr<<GET column="" names=""></GET>Oggetto: somma mobile dei valori della riga precedente con condizioneSi è giusto.
Ma voglio mantenere la tabella dati originale senza escludere alcune righe per ottenere questo risultato.
Può essere fatto?
Oggetto: somma mobile dei valori della riga precedente con condizioneÈ giusto. (la colonna più a destra nella foto)?

Oggetto: somma mobile dei valori della riga precedente con condizioneCapirò come ottenerlo.
Nel caso in cui qualcuno abbia una soluzione per questo, per favore condividi anche tu.
Grazie.
Oggetto: somma mobile dei valori della riga precedente con condizioneEsatto, ora ho capito.
È necessario trovare il valore massimo per ogni lotto, quindi prendere la somma mobile dei valori del lotto massimo corrente e degli ultimi due.
Sento che c'è una soluzione in agguato, potrebbe essere necessario pensarci un po' di più.
Oggetto: somma mobile dei valori della riga precedente con condizioneGrazie per aver dimostrato l'idea di utilizzare la formula.
Il mio set di dati non è in grado di eseguire direttamente la somma mobile utilizzando la formula perché alcuni dati del lotto non vengono presi in considerazione.
Esempio,
Lotto n. 3 e Lotto n. 3.2, solo la quantità del lotto n. 3.2 viene conteggiata nella somma mobile perché è la quantità del lotto finale.
Quantità aggiuntiva aggiunta nel lotto n. Diventa Lotto#3.2.
È lo stesso per Lot# 7, 7,2, 7,3 e Lot# 10, 10.3.
Lotto # 7.3 qty e 10.3 è contato in somma mobile perché è il lotto finale qty.
Hai bisogno di una guida da parte della comunità.

Oggetto: somma mobile dei valori della riga precedente con condizioneUn modo potrebbe essere quello di utilizzare una formula come questa:

If( Row() == 1,
:Qty,
If( Row() == 2,
Lag( :Qty, 1 ) + :Qty,
:Qty + Lag( :Qty, 1 ) + Lag( :Qty, 2 )
)
)
Per la prima riga non c'è nulla da sommare, quindi usa solo la riga 1
Per la seconda riga ci sono solo due valori, l'attuale e il precedente, quindi la sua riga+lag(1)
Tutte le righe dopo la seconda prende la somma della riga corrente più le due righe precedenti: lag(1) e lag(2)