Ho un set di dati in cui vorrei calcolare la media delle ultime 3 osservazioni per ciascuna data e avere quel valore nella propria colonna e accoppiato con l'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] )
),
);
Sebbene sia possibile creare una tabella di riepilogo che calcoli la media e quindi reinserirla nella tabella dati originale, sto cercando un suggerimento per un metodo più elegante e meno intensivo di processo.Qualsiasi suggerimento su come raggiungere questo obiettivo sarebbe apprezzato, come formula di colonna o tramite JSL (preferito).
Posso anche aprire un po' la mia soluzione poiché le funzioni Col possono essere abbastanza potenti. Quando hai tempo, dai un'occhiata alla spiegazione:
- Utilizzare 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
- Utilizzare Media per calcolare la media delle ultime tre righe di una data. Index(Row() - 2, Col Max(Row(), :Date) crea una matrice di numeri di riga. E poi con:Data[Index] possiamo ottenere valori per quei numeri di riga
Ho allegato datatable in cui la formula è divisa in parti

Grazie per il suggerimento, soprattutto uno su cui potrei facilmente avvolgere la testa.Dovrò approfondire il suggerimento di jthi poiché la soluzione non è così intuitiva per me come la tua.
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] )
)