JSL Ajout de la condition « Et » au filtre de donnéesBonjour la communauté JMP
Je me demandais s'il existait un moyen d'ajouter une condition « et » à un filtre de données dans JSL.
à titre d'exemple, j'ai créé un ensemble de données

Si nous créons un modèle simple uniquement sur la moyenne,
model = Fit Model( Y( :Data ), Run);
Nous pouvons restreindre le modèle à un seul groupe avec un filtre de données
dtf = model << Local Data Filter(Columns(:Group), where(:Group == "A"));

Cependant, maintenant, si je veux ajouter un autre filtre, les seules options JSL que j'ai pu trouver (« Ajouter un filtre », « Filtrer les colonnes » et similaires) semblent uniquement s'ajouter comme condition « Ou ».
dtf << Add Filter(columns(:Outlier), where(:outlier == 0));
dtf << Filter Columns(:Outlier);

La seule option semble être de supprimer le filtre de données, puis d'ajouter un nouveau filtre avec toutes les conditions
model << Remove Local Data Filter;
dtf = model << Local Data Filter(Columns(:Group, :Outlier), where(:Group == "A"), where(Outlier == 0));

Est-ce qu'il me manque un moyen d'ajouter des conditions « Et » ou est-ce tout simplement impossible ?
fr.
Kasper Schlosser
Automatisation et scriptsRe: Ajout de la condition « Et » au filtre de données JSLCréez le filtre dans JMP et copiez le script
Fit Model(
Y(:Data),
Effects,
Personality("Standard Least Squares"),
Emphasis("Effect Leverage"),
Run(
:Data << {Summary of Fit(1), Analysis of Variance(1), Parameter Estimates(1),
Lack of Fit(0), Plot Actual by Predicted(1), Plot Regression(0),
Plot Residual by Predicted(1), Plot Studentized Residuals(0),
Plot Effect Leverage(1), Plot Residual by Normal Quantiles(0),
Box Cox Y Transformation(0)}
),
Local Data Filter(
Add Filter(
columns(:Group, :Outlier),
Where(:Group == "A"),
Where(:Outlier == 1)
)
)
);
Cela donne généralement une bonne idée de ce que vous pouvez ensuite écrire.
dt = Current Data Table();
model = Fit Model(Y(:Data), Run);
dtf = model << Local Data Filter(
Columns(:Group, :Outlier),
Where(:Group == "A"),
Where(:Outlier == 1)
);
Re: Ajout de la condition « Et » au filtre de données JSLOui, ou l'index de script donne également un aperçu des messages qu'un filtre de données accepte (mais pas toujours tous).
Ces deux éléments semblent indiquer que non, il n'existe aucun moyen d'ajouter une condition « et » à un filtre de données via jsl.
Cela signifierait que la seule façon d'ajouter une condition « et » dans jsl est d'extraire le code du filtre, de modifier le code, puis d'analyser et d'évaluer. ce qui est compliqué et sujet aux erreurs.
Re: Ajout de la condition « Et » au filtre de données JSLAssurez-vous d'ajouter à la liste de souhaits JMP cette limitation exposée.
De plus, je suppose que j'ai une vision différente de ce que vous avez mentionné comme analyse et évaluation. Cela me rassure de savoir que si je me heurte à une limitation, JMP fournit cette capacité de base qui me permet la plupart du temps de trouver une solution.
Re: Ajout de la condition « Et » au filtre de données JSLLorsque vous ajoutez de nouvelles colonnes aux filtres, vous créez en fait de nouveaux groupes de filtrage et, par défaut, ceux-ci sont séparés par un OU. Selon le cas d'utilisation, vous pourrez parfois utiliser Groupé par Et
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Cities.jmp");
obj = dt << Data Filter(
Add Filter(columns(:Region, :POP), Where(:Region == {"C", "N"})),
Mode(Select(0), Show(0), Include(1))
);
obj << Add Filter Columns(:State);
obj << Grouped by AND(1);
Sur l'interface utilisateur, nous avons Ajouter au groupe sélectionné lorsque vous appuyez sur ET, mais nous n'avons pas d'option de script simple pour cela.
Re: Ajout de la condition « Et » au filtre de données JSL
@jthi a écrit :
mais nous n'avons pas d'option de script simple pour cela.
Je pense que nous avons :
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
gb = dt << Graph builder();
dtf = gb << Local Data Filter(
Columns(:sex),
Where(:sex == "F")
);
dtf << (Filter Column(:age) << Where(:age == 14));
Re: Ajout de la condition « Et » au filtre de données JSLCela semble fonctionner
Des tests rapides indiquent que cette méthode affecte le premier filtre. c'est-à-dire que si nous avons 2 conditions « ou », nous ne pouvons affecter que la première.
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
gb = dt << Graph builder();
dtf = gb << Local Data Filter(
Columns(:sex),
Where(:sex == "F")
);
// adds or condition
dtf << Add Filter(Columns(:sex), Where(:sex == "M"))
// Only affects the female filter
dtf << (Filter Column(:age) << Where(:age == 14));
mais pour mon cas d'utilisation, c'est parfait.
Re: Ajout de la condition « Et » au filtre de données JSLBelle trouvaille !
Cela ne semble fonctionner que si vous envoyez également le message where avec la colonne filter. Cela peut être involontaire / être dû à un bug ou autre chose, mais nous avons de la chance de l'avoir (il peut simplement se casser à tout moment lorsque JMP est mis à jour).
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Cities.jmp");
obj = dt << Data Filter(
Add Filter(
columns(:Region, :POP),
Where(:Region == {"C", "N"})
),
Mode(Select(0), Show(0), Include(1))
);
obj << Filter Column(:State); // creates OR group
obj << (Filter Column(:State) << Where()); // Adds AND filter to first filter group
obj << (Filter Column(:CO) << Where()); // Adds AND filter to first filter group
Il serait probablement bien mieux si nous pouvions d'une manière ou d'une autre simplement ajouter ET filtrer au sein des groupes existants et pas seulement de nouveaux filtres OU groupes.
@Craige_Hales , une idée de pourquoi cela se produit / une idée de qui taguer du côté de JMP ?
Re: Ajout de la condition « Et » au filtre de données JSLComme @jthi l'a souligné plus tôt, les filtres sont composés de « groupes » et d'« éléments », et le groupe de filtres n'est pas directement exposé à JSL en tant qu'objet scriptable. La syntaxe df << (Filter Column(:col) << Msg()) était la manière originale de « transférer » des messages à un groupe, bien qu'elle ne soit pas bien documentée. Je soulignerai que cette syntaxe est un chemin très différent du simple message df << Filter Column(:col), qui est documenté dans l'index des scripts. L'ancienne syntaxe n'a pas de règles JSL intégrées pour le traitement, bien qu'elle soit utilisée de manière similaire dans d'autres objets, comme Bivariate. Essentiellement, le message envoyé au filtre est une expression, et la syntaxe prise en charge est personnalisée pour le filtre.
Quelques précisions sur la syntaxe spéciale de transmission des messages. Il existe un second argument facultatif permettant de spécifier l'index du groupe de filtres qui doit recevoir le message. Cela peut être important lorsque vous avez plusieurs groupes, qui peuvent même contenir les mêmes colonnes. Sans cela, la commande sera envoyée à la première colonne correspondante ou ajoutée au premier groupe.
Vous pouvez également constater que le Msg() envoyé à l'élément de filtre ne peut être qu'un simple message. Le traitement ici ne prend pas en charge l'envoi d'une liste de commandes à traiter. Cela est encore dû au fait que le << interne est une exécution personnalisée et n'utilise pas directement les règles JSL de base.
dt = Open( "$SAMPLE_DATA/Cities.jmp" );
df = dt << Data Filter(
Location( {1001, 218} ),
Add Filter( columns( :POP ), Where( :POP >= 4461 ) ),
Add Filter( columns( :OZONE ), Where( :OZONE <= 0.12581 ) )
);
// add a filter item to the first group
df << (Filter Column(:Region, 1) << Check Box Display);
// add a filter item to the second group
df << (Filter Column(:NO, 2) << Where(:NO <= 0.05));