Formula per trovare la modalità dei valori giornalieriCiao,
Ho un datatable che ha più campioni che tracciano diversi parametri per una collezione di sistemi diversi all'interno di quei campioni (1 campione avrà 1 sistema, ma un altro campione può anche avere lo stesso sistema). Ogni campione ha uno stato diverso mentre si avvicina alla fine. Questi stati sono ciò che sto cercando di prevedere. Ho creato un algoritmo di albero decisionale utilizzando alcuni campioni diversi in un datatable separato che ho poi aggiunto a questo datatable. Ciò che questo albero decisionale sta cercando di fare è predire lo stato del sistema in diversi momenti nel tempo. Misurerò quindi questi stati previsti rispetto agli stati noti del sistema in questi momenti nel tempo (l'algoritmo è stato creato con diversi campioni, quindi si tratta di dati "freschi")
Ora come puoi immaginare nel corso di una giornata questa formula può inviare centinaia o migliaia di previsioni diverse e non tutte sono corrette, quindi voglio una formula di colonna che possa guardare a tutte queste previsioni, per numero di campione e per giorno ed emette quello che è lo stato più comunemente previsto dell'apparecchiatura (modalità)
In altre parole, mi piacerebbe una colonna che calcoli la valutazione di avviso di modalità per ogni giorno di ciascun campione di dati e produca il rating di avviso previsto per ciascuna di queste righe
Nell'esempio datatable che ho allegato vorrei una formula che potesse automatizzare la colonna intitolata "Alert Prediction for the day" e non mi interessa usare la colonna LogTime o il tempo trascorso dalla colonna start per crearne le previsioni giornaliere.
Grazie per l'aiuto
Ri: Formula per trovare la modalità dei valori giornalieriGrazie mille, ho faticato a capire come farlo per un po 'di tempo.
Imparerò di più su come funziona in modo che possa adattarlo ad altri progetti che ho. Ho dovuto farlo un po 'per farlo funzionare sul mio set di dati, quindi sto già iniziando a capire che è buono. Ma ancora di più da imparare
Grazie ancora per il vostro aiuto
Ri: Formula per trovare la modalità dei valori giornalieriTenendo presente che è piuttosto specifico per il tuo caso, questo dovrebbe farlo. Puoi utilizzare 'Aiuto> Indice di scripting' e le descrizioni dei comandi dell'editor per aiutarti a capire come funziona.
NamesDefaultToHere(1);
// Starting table
dt = DataTable("Example Datatable for Summarising Alert Ratings.jmp");
// Add required columns
dt << NewColumn("Date", Character, Formula(Short Date( :Logtime )));
dt << NewColumn("Group", Character, Formula((:System || " ") || :Date));
// Find the mode of :Decision Tree Prediction for each level in :Group, and fill in 'modeVals'
vals = Column(dt, "Decision Tree Prediction") << getValues;
gVals = Column(dt, "Group") << getValues;
levs = AssociativeArray(gVals) << getKeys;
modes = J(NItems(levs), 1, .);
modeVals = J(NRow(dt), 1, .);
for(i=1, i<=NItems(levs), i++,
rows = Loc(AsList(gVals), levels[i]);
modes[i] = Mode(vals[rows]);
modeVals[rows] = modes[i];
);
// Build the final column in dt using 'modeVals'
vl = Column(dt, "Decision Tree Prediction") << getProperty("Value Labels");
nc = dt << NewColumn("Modes for Decision Tree Prediction", Numeric, Nominal, Values(modeVals));
nc << valueLabels(Arg(vl, 1));
Ri: Formula per trovare la modalità dei valori giornalierishortdate * sorry, not shortcode
Ri: Formula per trovare la modalità dei valori giornalieriCosì efficacemente la logica si presenta così:
per ogni campione -> dividerli in giorni (potrebbe utilizzare la colonna datetime o la colonna che ho già creato che ha per ogni riga il numero di giorni dall'inizio di questo particolare campione. Sì, grazie, usare lo shortcode potrebbe essere un modo per rendere più facile il raggruppamento dei giorni)
Quindi, per ogni esempio, esaminare la colonna che prevede lo stato di avviso e quindi, per ogni giorno di quel campione, esaminare ogni previsione effettuata e trovare il valore della modalità per esso (che è ordinale). Quindi prendi il valore della modalità di output e reinseriscilo nel datatable su ogni riga di una nuova colonna (quindi perché inizialmente lo volevo come formula) per quel giorno di quel campione. Penso che sia più chiaro quando leggi questo guardando il datatable
Questo aiuta a dare un po 'più senso?
Ri: Formula per trovare la modalità dei valori giornalieriSe ho capito bene, vuoi definire un gruppo per ogni valore di "Sistema" combinato con la "parte della data" di "Logtime" (forse usa la funzione "ShortDate ()" per ottenere questo in una nuova colonna).
In questo caso, è possibile generalizzare il codice sopra per lavorare con più di una variabile 'by', altrimenti (forse più semplice) è sufficiente concatenare due colonne di caratteri e usarle per definire i gruppi. Infine, come fai notare, dovresti adattare il codice affinché funzioni quando "gVals" è un carattere. Può essere:
NamesDefaultToHere(1);
ClearLog();
// Given a set of values ('vals') and group membership ('gVals'),
// returns the distinct levels in 'gVals' and the mode of each group
modeWithBy =
Function({vals, gVals}, {Default Local},
levs = AssociativeArray(gVals) << getKeys;
modes = {};
for(i=1, i<=NItems(levs), i++, InsertInto(modes, Mode(vals[Loc(AsList(gVals), levs[i])])));
EvalList({levs, modes});
);
l = [1, 2, 1, 1, 2, 2, 3];
g = {"1", "1", "1", "1", "2", "2", "2"};
Print(modeWithBy(l, g));
Ri: Formula per trovare la modalità dei valori giornalieri
@ian_jmp ha scritto:
Se entrambe le colonne sono numeriche, puoi farlo in questo modo:
NamesDefaultToHere(1);
ClearLog();
// Given a set of values ('vals') and group membership ('gVals'),
// returns the distinct levels in 'gVals' and the mode of each group
modeWithBy =
Function({vals, gVals}, {Default Local},
levs = AssociativeArray(gVals) << getKeys;
modes = J(NItems(levs), 1, .);
for(i=1, i<=NItems(levs), i++, modes[i] = Mode(vals[Loc(AsList(gVals), levs[i])]));
EvalList({levs, modes});
);
l = [1, 2, 1, 1, 2, 2, 3];
g = [1, 1, 1, 1, 2, 2, 2];
Print(modeWithBy(l, g));
Il gruppo "Sample" può essere fatto per essere continuo, ma è sicuramente un set di dati nominale. Il sistema di gruppo non può essere reso continuo senza l'uso di etichette di valore ed è anche un set di dati nominale. In che modo questo si relaziona con l'organizzazione per trovare la modalità su tutti i gruppi (Sistema e Campione) seguiti dall'organizzazione dei dati in un giorno per giorno per ciascuna combinazione di essi Inoltre vorrei che questi valori venissero riuniti nel datatable in modo da poter vedere quale sia l'avviso previsto su base giornaliera Grazie per l'aiuto
Ri: Formula per trovare la modalità dei valori giornalieriIl gruppo "Sample" può essere fatto per essere continuo, ma è sicuramente un set di dati nominale. Il sistema di gruppo non può essere reso continuo senza l'uso di etichette di valore ed è anche un set di dati nominale. In che modo questo si relaziona con l'organizzazione per trovare la modalità su tutti i gruppi (Sistema e Campione) seguiti dall'organizzazione dei dati in un giorno per giorno per ciascuna combinazione di essi
Inoltre vorrei che questi valori venissero riuniti nel datatable in modo da poter vedere quale sia l'avviso previsto su base giornaliera
Grazie per l'aiuto
Ri: Formula per trovare la modalità dei valori giornalieriSe entrambe le colonne sono numeriche, puoi farlo in questo modo:
NamesDefaultToHere(1);
ClearLog();
// Given a set of values ('vals') and group membership ('gVals'),
// returns the distinct levels in 'gVals' and the mode of each group
modeWithBy =
Function({vals, gVals}, {Default Local},
levs = AssociativeArray(gVals) << getKeys;
modes = J(NItems(levs), 1, .);
for(i=1, i<=NItems(levs), i++, modes[i] = Mode(vals[Loc(AsList(gVals), levs[i])]));
EvalList({levs, modes});
);
l = [1, 2, 1, 1, 2, 2, 3];
g = [1, 1, 1, 1, 2, 2, 2];
Print(modeWithBy(l, g));Ri: Formula per trovare la modalità dei valori giornalieriAll'inizio volevo una formula, ma ho sicuramente capito il tuo punto di vista e penso che la soluzione più efficiente sarebbe sicuramente la migliore. Quindi sì, una sceneggiatura sarebbe davvero utile, grazie
Ri: Formula per trovare la modalità dei valori giornalieriLa soluzione deve essere una formula o uno script che esegue i calcoli e unisce i risultati alla tabella originale è accettabile? Il motivo per cui lo chiedo è che credo che l'uso di una formula sarebbe molte volte meno efficiente a causa di tutto il lavoro di replica che ogni riga avrebbe eseguito.