Ho un set di dati in cui vorrei calcolare la media delle ultime 3 osservazioni per ogni data e avere quel valore nella propria colonna e abbinato all'ultima data come mostrato di seguito.
Names Default To Here( 1 );
// Create an example data table
dt = New Table( "Date",
Add Rows( 30 ),
New Column( "Date",
Numeric,
"Continuous",
Format( "m/d/y", 10 ),
Set Values( [3713817600, 3713817600, 3713817600, 3713817600, 3713817600, 3713817600, 3713817600, 3713817600, 3713817600, 3713817600,
3715027200, 3715027200, 3715027200, 3715027200, 3715027200, 3715027200, 3715027200, 3715027200, 3715027200, 3715027200,
3716236800, 3716236800, 3716236800, 3716236800, 3716236800, 3716236800, 3716236800, 3716236800, 3716236800, 3716236800] )
),
New Column( "Data",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [2,4,6,8,10,12,14,16,18,20,2,4,6,8,10,12,14,26,28,30,2,4,6,8,10,12,14,36,38,40] )
),
New Column( "Desired Result",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [.,.,.,.,.,.,.,.,.,18,.,.,.,.,.,.,.,.,.,28,.,.,.,.,.,.,.,.,.,38] )
),
);
Mentre posso creare una tabella di riepilogo che calcola la media e quindi inserirla nuovamente nella tabella dati originale, sto cercando un suggerimento per un metodo più elegante e meno intensivo.Qualsiasi suggerimento su come eseguire questa operazione sarebbe apprezzato, sia come formula di colonna, sia tramite JSL (preferito).
Grazie per il suggerimento, specialmente uno che potrei facilmente avvolgere la mia testa.Dovrò approfondire il suggerimento di jthi poiché la soluzione non è intuitiva per me come la tua.
Posso anche aprire un po' la mia soluzione poiché le funzioni Col possono essere abbastanza potenti. Dai un'occhiata alla spiegazione quando hai tempo:
- Usa Col Max(Row(), :Date) per ottenere l'ultima riga per ogni data
- Controlla con l'istruzione if con Row() per l'ultima riga per la data
- Usa Media per calcolare la media delle ultime tre righe per una data. Index(Row() - 2, Col Max(Row(), :Date) crea una matrice di numeri di riga. E poi con: Data[Index] possiamo ottenere i valori per quei numeri di riga
Ho allegato datatable in cui la formula è divisa in parti

Altra opzione con una formula:
If(Row() == Col Max(Row(), :Date),
Mean(:Data[Index(Row() - 2, Col Max(Row(), :Date))])
)
Ecco un modo per scrivere la formula per farlo
If( :Date != :Date[Row() + 1] | Row() == N Rows( Current Data Table() ),
Mean( :Data[Row()], :Data[Row() - 1], :Data[Row() - 2] )
)