formula della somma cumulativa finaleHo quello che potrebbe essere un bisogno di formula molto semplice. Ho un set di dati sulla temperatura e devo calcolare una somma cumulativa finale negli ultimi 120 giorni (nota come "settimane di riscaldamento" poiché convertirò questa somma in settimane dividendo per 7). So come ottenere una media finale e so come ottenere una somma cumulativa, ma è possibile ottenere una somma cumulativa finale di 120 giorni? In questo caso, quando la temperatura supera i 31,3°C, viene fornito un "punteggio" di 0,25 (vedere la colonna "DH-6 ore" per la formula). Fondamentalmente, voglio la somma cumulativa di questi 0,25 valori su una finestra di 120 giorni, ma so solo come partizionare per data/mese/anno, ecc. (vedi ad esempio lo script "#ACS"), non per una finestra effettiva di tempo. Sono fiducioso che questo deve essere fattibile!
AnaliticaTabella datiSceneggiaturaRe: formula somma cumulativa finaleDi seguito è riportata una nuova formula che è possibile utilizzare per il debug.Creerà la tabella di dati per qualsiasi numero di riga inserito nell'istruzione If() alla fine.Se non vuoi creare una tabella di dati, cambia semplicemente il numero di riga che stai cercando di trovare su -1.Non ci sarà mai una riga -1, quindi non verrà creata una tabella.Ad ogni modo, vedi se riesci a vedere cosa sta succedendo e dove si sta verificando un errore.
Assicurati che la tabella sia ordinata correttamente e che tutte le righe che non desideri vengano elaborate vengano eliminate dalla tabella.Lo script non rispetta le righe escluse.
If( Row() == 1,
holdMatrix = [];
dateMatrix = [];
rowMatrix = [];
);
If( Is Missing( :Name( "Date Time (UTC)" ) ) == 0,
If(
Is Missing( :Name( " Sea Surface Temperature (deg C)" ) ) == 1, holdMatrix = holdMatrix || 0,
:Name( " Sea Surface Temperature (deg C)" ) > 31.3, holdMatrix = holdMatrix || :time difference 2,
:Name( " Sea Surface Temperature (deg C)" ) <= 31.3, holdMatrix = holdMatrix || 0
);
dateMatrix = dateMatrix || Informat( :date, "m/d/y" );
rowMatrix = rowMatrix || Row();
If( N Cols( dateMatrix ) & N Cols( holdMatrix ) != 0,
While(
dateMatrix[N Cols( dateMatrix )] > dateMatrix[1] + In Days( 120 ) & N Cols( holdMatrix ) > 0 &
N Cols( dateMatrix ) > 0,
dateMatrix[1] = [];
holdMatrix[1] = [];
rowMatrix[1] = [];
);
If( N Cols( dateMatrix ) & N Cols( holdMatrix ) != 0,
x = Sum( holdMatrix ),
x = .
);
,
x = .
);
,
x = .
);
If( Row() == 22159,
New Table( "row" || Char( Row() ),
New Column( "RowNum", set values( rowMatrix ) ),
New Column( "Values", set values( holdMatrix ) ),
New Column( "dates", set values( dateMatrix ), Format( "m/d/y" ) )
)
);
(x / 24) / 7;
Re: formula somma cumulativa finaleSe aggiungi quanto segue alla formula
If( Row() == ????,
new table("row" || char(row()),new column("Values", set values(holdMatrix)),<BR /> new column("dates", set values(dateMatrix), format("m/d/y")));
);
(x / 24) / 7;
e basta sostituire il ???? con il numero di riga in cui ritieni che i dati stiano andando divertenti, vedrai quindi una tabella di dati con tutti i valori che sono stati aggiunti al valore e le date da cui sono stati raccolti i valori.Questo potrebbe darti un indizio su cosa sta succedendo.
Re: formula somma cumulativa finaleGrazie per la tua perseveranza! Sembrava davvero essere un problema e ora i dati hanno più senso. C'è ancora un problema da ottobre 2018 a giugno 2019: nonostante la temperatura non superi mai i 31,3°C, il valore non scende mai a 0, anche entro giugno 2019 (ben oltre 120 giorni). Puoi dire cosa potrebbe succedere lì?
Re: formula somma cumulativa finaleHo scoperto un problema con la formula precedente.I valori mancanti causavano un problema.Inoltre, i dati devono essere in ordine di data ascendente.Quindi per favore ordina la tabella prima di applicare la formula
If( Row() == 1,
holdMatrix = [];
dateMatrix = [];
);
If( Is Missing( :Name( "Date Time (UTC)" ) ) == 0,
If(
Is Missing( :Name( " Sea Surface Temperature (deg C)" ) ) == 1, holdMatrix = holdMatrix || 0,
:Name( " Sea Surface Temperature (deg C)" ) > 31.3, holdMatrix = holdMatrix || :time difference 2,
:Name( " Sea Surface Temperature (deg C)" ) <= 31.3, holdMatrix = holdMatrix || 0
);
dateMatrix = dateMatrix || Informat( :date, "m/d/y" );
If( N Cols( dateMatrix ) & N Cols( holdMatrix ) != 0,
While( dateMatrix[N Cols( dateMatrix )] > dateMatrix[1] + In Days( 120 ) & N Cols( holdMatrix ) > 0 & N Cols( dateMatrix ) > 0,
dateMatrix[1] = [];
holdMatrix[1] = [];
);
If( N Cols( dateMatrix ) & N Cols( holdMatrix ) != 0,
x = Sum( holdMatrix ),
x = .
);
,
x = .
);
,
x = .
);
(x / 24) / 7;
Re: formula somma cumulativa finaleC'è ancora qualcosa di strano in corso. Se guardi questa tabella di dati, troverai la tua formula (anche se leggermente modificata) nella colonna "#ACS (trailing 120 giorni)". Ci sono alcuni periodi di 4-6 mesi senza temperature superiori a 31,3°C, ma il valore non diminuisce mai (come ottobre 2014-maggio 2015). Se non ci sono temperature superiori a 31,3°C per 120 giorni, il "#ACS" dovrebbe scendere a 0. Sento che la tua formula DOVREBBE fare questo. Mi chiedo se è un problema derivante dal passare da un anno all'altro? Forse potrei semplicemente ricodificare "Day" da 1 a 20.000?
Re: formula somma cumulativa finaleSe vuoi solo la somma, non dividere la somma per niente
If( Row() == 1,
holdMatrix = [];
dateMatrix = [];
);
If( :Name( " Sea Surface Temperature (deg C)" ) > 31.3,
holdMatrix = holdMatrix || 0.25;
dateMatrix = dateMatrix || Informat( :date, "m/d/y" );
);
If( N Cols( dateMatrix ) != 0,
While( dateMatrix[N Cols( dateMatrix )] > dateMatrix[1] + In Days( 120 ),
holdMatrix[1] = [];
dateMatrix[1] = [];
);
x = Sum( holdMatrix ) ;
,
x = .
);
x;
Re: formula somma cumulativa finaleJim, grazie per aver esaminato di nuovo la mia domanda, anche se sembra che i valori risultanti dalla tua nuova formula siano troppo bassi (nonostante la formula abbia senso). Ma forse avrei dovuto esprimere la mia esigenza in modo diverso, nel qual caso potrebbe esserci una soluzione più semplice (o almeno più immediata): voglio conoscere il numero totale di ORE in un periodo di 120 giorni finali in cui la temperatura era OLTRE 31.3C. Questo di solito equivale a blocchi di 3 ore poiché la temperatura viene misurata solo ogni tre ore (nella maggior parte dei casi), quindi è fondamentalmente una serie di somme di 3 (vedi colonna "DHHs" nella tabella allegata). Pertanto, i valori potrebbero essere nell'ordine delle centinaia per i mesi più caldi. Quindi, in pratica, ho bisogno di una somma finale di 120 giorni della colonna DHH, ma è complicato dato il problema del numero diverso di misurazioni/giorno!
Re: formula somma cumulativa finaleNon sono esattamente sicuro di quale divisore stai usando, ma ho usato il numero di ore nell'intervallo della matrice di dati.Ecco la formula che mi è venuta in mente
If( Row() == 1,
holdMatrix = [];
dateMatrix = [];
);
If( :Name( " Sea Surface Temperature (deg C)" ) > 31.3,
holdMatrix = holdMatrix || 0.25;
dateMatrix = dateMatrix || Informat( :date, "m/d/y" );
);
If( N Cols( dateMatrix ) != 0,
While( dateMatrix[N Cols( dateMatrix )] > dateMatrix[1] + In Days( 120 ),
holdMatrix[1] = [];
dateMatrix[1] = [];
);
x = Sum( holdMatrix ) / ((dateMatrix[N Cols( dateMatrix )] - dateMatrix[1]) / In Hours( 1 ));
,
x = .
);
x;
Re: formula somma cumulativa finaleHo una domanda che sorge da una fastidiosa stranezza nel set di dati: ho bisogno di valutare la somma cumulativa in ore (non settimane, come ho detto prima) nel periodo di 120 giorni. Tuttavia, gli intervalli di tempo sono incoerenti (vedi tabella allegata). Nella maggior parte dei casi, ci sono 8 misurazioni al giorno, ma a volte sono meno. Fondamentalmente, ogni volta che la temperatura è> 31,3, voglio aggiungere la differenza di tempo alla colonna. Questo è abbastanza facile usando la funzione "dif". Tuttavia, dove faccio fatica è come aggiungere i "120 giorni" alla formula matrice. Quindi nella tabella allegata, voglio fare la somma cumulativa dei "DHH" nel periodo finale di 120 giorni. Invece di avere il numero di "righe" nella formula, ne ho bisogno per tenere traccia della data. È possibile?
Re: formula somma cumulativa finaleGrande! Questo ha funzionato. L'ho appena modificato per riflettere il fatto che c'erano otto volte di misurazione al giorno (cioè, ogni riga non è un giorno univoco, quindi ho moltiplicato 121 x 8 = 968 nella valutazione). I dati hanno senso perché il valore raggiunge il massimo annuale che avevo calcolato prima, prima di scendere. Grazie mille. Vorrei che ci fosse una somma cumulativa finale nell'editor delle formule che ha input simili alla media mobile della colonna (che uso TUTTO il tempo): peso e N prima. Forse lo aggiungo alla Wish list.
Re: formula somma cumulativa finaleSe sto interpretando correttamente quello che vuoi, credo che la formula seguente calcolerà una somma cumulativa finale di 120 in esecuzione
If( Row() == 1,
holdMatrix = []
);
If( :Name( " Sea Surface Temperature (deg C)" ) > 31.3,
holdMatrix = holdMatrix || Matrix( 0.25 ),
holdMatrix = holdMatrix || Matrix( . )
);
If( N Cols( holdMatrix ) == 121,
holdMatrix[1] = []
);
Sum( holdMatrix ) / 7;