Formule pour trouver le mode des valeurs quotidiennesSalut,
J'ai une table de données qui contient plusieurs échantillons qui suivent différents paramètres pour une collection de systèmes différents au sein de ces échantillons (1 échantillon aura 1 système, mais un autre échantillon peut également avoir le même système). Chaque échantillon a un état différent à mesure qu'il approche de sa fin. Ces états sont ce que j'essaie de prédire. J'ai créé un algorithme d'arbre de décision en utilisant différents échantillons dans une table de données séparée que j'ai ensuite ajoutée à cette table de données. Ce que cet arbre de décision essaie de faire est de prédire l'état du système à différents moments. Je mesurerai ensuite ces états prédits par rapport aux états connus du système à ces moments précis (l'algorithme a été créé avec différents échantillons, il s'agit donc de données "fraîches")
Maintenant, comme vous pouvez l'imaginer au cours d'une journée, cette formule peut envoyer des centaines ou des milliers de prédictions différentes et toutes ne sont pas correctes, donc je veux une formule de colonne qui peut examiner toutes ces prédictions, par numéro d'échantillon et par jour , et sortie quel est l'état le plus couramment prédit de l'équipement (Mode)
En d'autres termes, j'aimerais une colonne qui calcule la note d'alerte du mode pour chaque jour de chaque échantillon de données et la sortie de la note d'alerte prévue pour chacune de ces lignes
Dans l'exemple de table de données que j'ai joint, je voudrais une formule qui peut automatiser la colonne intitulée "Prédiction d'alerte pour la journée" et cela ne me dérange pas d'utiliser la colonne LogTime ou la colonne de temps depuis le démarrage pour créer ses prévisions quotidiennes.
Merci pour ton aide
Re : Formule pour trouver le mode des valeurs quotidiennesMerci beaucoup, j'ai du mal à comprendre comment faire cela depuis un moment maintenant.
J'en apprendrai plus sur son fonctionnement afin de pouvoir l'adapter à d'autres projets que j'ai. J'ai déjà dû le peaufiner un peu pour le faire fonctionner sur mon jeu de données, donc je commence déjà à le comprendre, ce qui est bien. Mais encore plus à apprendre
Merci encore pour votre aide
Re : Formule pour trouver le mode des valeurs quotidiennesSachant que c'est plutôt spécifique à votre cas, cela devrait le faire. Vous pouvez utiliser 'Help > Scripting Index' et les info-bulles de l'éditeur pour vous aider à comprendre son fonctionnement.
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));
Re : Formule pour trouver le mode des valeurs quotidiennesshortdate* désolé, pas shortcode
Re : Formule pour trouver le mode des valeurs quotidiennesDonc, effectivement, la logique ressemble à ceci :
pour chaque échantillon -> Divisez-les en jours (pourriez utiliser la colonne datetime ou la colonne que j'ai déjà créée qui a pour chaque ligne le nombre de jours depuis le début de cet échantillon particulier. Oui merci, l'utilisation de shortcode pourrait être un moyen de faciliter le regroupement des jours)
Ensuite, pour chaque échantillon, regardez la colonne qui prédit l'état d'alerte, puis pour chaque jour de cet échantillon, regardez chaque prédiction qui est faite et trouvez la valeur de mode correspondante (qui est ordinale). Ensuite, prenez cette valeur de mode de sortie et réinsérez-la dans la table de données sur chaque ligne d'une nouvelle colonne (d'où la raison pour laquelle je la voulais à l'origine comme formule) pour ce jour de cet échantillon. Je pense que c'est plus clair quand vous lisez ceci en regardant le datatable
Cela aide-t-il à avoir un peu plus de sens?
Re : Formule pour trouver le mode des valeurs quotidiennesSi je comprends bien, vous souhaitez définir un groupe pour chaque valeur de 'System' combinée à la 'partie date' de 'Logtime' (peut-être utiliser la fonction 'ShortDate()' pour l'insérer dans une nouvelle colonne).
Si tel est le cas, vous pouvez soit généraliser le code ci-dessus pour travailler avec plus d'une variable 'by', sinon (peut-être plus simple) simplement concaténer deux colonnes de caractères ensemble et l'utiliser pour définir les groupes. Enfin, comme vous l'avez souligné, vous devrez adapter le code pour qu'il fonctionne lorsque 'gVals' est un caractère. Peut-être:
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));
Re : Formule pour trouver le mode des valeurs quotidiennes
@ian_jmp a écrit:
Si les deux colonnes sont numériques, vous pouvez procéder ainsi :
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));
Le groupe "Échantillon" peut être rendu continu, mais il s'agit définitivement d'un ensemble de données nominales. Le groupe System ne peut pas être rendu continu sans utiliser d'étiquettes de valeur et est également un ensemble de données nominales. Comment cela serait-il alors lié à l'organiser pour trouver le mode sur tous les groupes (système et échantillon) suivi en organisant les données au jour le jour pour chaque combinaison d'entre eux
J'aimerais également que ces valeurs soient fusionnées dans la table de données afin que vous puissiez voir quelle est l'alerte prévue au jour le jour
Merci pour ton aide
Re : Formule pour trouver le mode des valeurs quotidiennesLe groupe "Échantillon" peut être rendu continu, mais il s'agit définitivement d'un ensemble de données nominales. Le groupe System ne peut pas être rendu continu sans utiliser d'étiquettes de valeur et est également un ensemble de données nominales. Comment cela serait-il alors lié à l'organiser pour trouver le mode sur tous les groupes (système et échantillon) suivi en organisant les données au jour le jour pour chaque combinaison d'entre eux
J'aimerais également que ces valeurs soient fusionnées dans la table de données afin que vous puissiez voir quelle est l'alerte prévue au jour le jour
Merci pour ton aide
Re : Formule pour trouver le mode des valeurs quotidiennesSi les deux colonnes sont numériques, vous pouvez procéder ainsi :
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));Re : Formule pour trouver le mode des valeurs quotidiennesÀ l'origine, je cherchais une formule, mais je comprends vraiment votre point de vue et je pense que, dans l'ensemble, la solution la plus efficace serait certainement la meilleure. Alors oui un script serait vraiment utile merci
Re : Formule pour trouver le mode des valeurs quotidiennesLa solution doit-elle être une formule ou un script qui effectue les calculs et joint les résultats à la table d'origine serait-il acceptable ? La raison pour laquelle je demande, c'est que je pense que l'utilisation d'une formule serait beaucoup moins efficace en raison de tout le travail de réplication que chaque ligne ferait.