La 1ère chose que j'aurais aimé savoir quand j'ai commencé à écrire des scripts : il existe différents types de scriptsEncore une fois à la brèche !
Je parlais avec mon père il y a quelques semaines. Pas avec lui, mais il utilise JMP depuis la version 1.0. Je me souviens avoir vu les disques de 3,5 pouces posés à côté de notre Mac II-se lorsque j'ai appris à utiliser une souris pour la première fois. La même machine était exposée lors de la conférence Discovery Summit 2019 à Tucson, en Arizona. En voici une photo :

Quoi qu'il en soit, mon père et moi discutions ma première série de blogs Five Things . Il a mentionné qu'il souhaitait que quelqu'un écrive une série sur la façon de démarrer avec les scripts dans JMP. À l'époque, j'étais déjà en train d'écrire d'autres articles, alors je l'ai mis de côté pour un futur projet. La vie, cependant, avait d'autres plans. Une semaine plus tard, on m'a demandé d'aider à une présentation client et, à ma grande surprise, l'un des sujets qu'ils voulaient que je couvre était une introduction au scripting ! L'univers aime les blagues, apparemment.
Quoi qu'il en soit, c'est reparti ! Suivant le format de ma première série Five Things, voici les cinq (plutôt) choses que je pense que tout le monde devrait savoir quand ils commencent à scénariser. Tout d'abord, une pensée conceptuelle.
Voir un besoin, combler un besoin
Avant de commencer à écrire des scripts, vous devez considérer le besoin. Il y a de fortes chances que si vous voulez écrire un script, il y a une raison. Peut-être que vous le faites pour être plus efficace au travail. Peut-être cherchez-vous à standardiser les méthodes d'analyse pour un groupe. Ou peut-être êtes-vous, en fait, l'une de ces rares personnes qui ont décidé de le prendre pour les sourires et les rires. Aucune de ces raisons n'est mauvaise, bien que la dernière puisse rendre les choses un peu plus difficiles (j'expliquerai pourquoi dans un instant). Le fait est que vous devriez avoir une raison dans votre tête et un objectif précis pour votre premier script.
Il y a des scripts, et puis il y a des scripts
Il existe, dans mon esprit en tout cas, deux types de scripts différents : ceux qui agissent sur des données existantes, et ceux qui créent des données. Les scripts qui fonctionnent sur des données existantes interagissent avec une table de données et des plates-formes existantes dans JMP pour créer une nouvelle sortie définie par l'utilisateur. Il peut s'agir de choses aussi simples que d'envelopper une fenêtre autour de plusieurs rapports ou aussi complexes qu'un rapport personnalisé dans Application Builder. Le principal point commun est que des scripts comme celui-ci sont modification du contenu existant .
Le deuxième groupe sont des scripts qui créent des données. Les scripts qui créent des données peuvent être des outils de simulation, des graphiques personnalisés, des outils de gestion des métadonnées dans un fichier JMP, etc. Ce groupe est un peu plus nébuleux, mais le thème commun est que les scripts étendent JMP au-delà de l'enrichissement des données ou des analyses existantes. La plupart du temps, ces scripts vont créer un nouveau contenu de zéro.
Les scripts qui modifient le contenu existant sont généralement le point de départ des personnes qui envisagent d'apprendre le langage de script JMP (JSL). C'est aussi là que nous allons commencer notre discussion. Alors, prenons du recul et réfléchissons à la raison pour laquelle vous souhaitez apprendre JSL.
Donnez-moi une phrase, Vasily. Une seule phrase, s'il vous plaît.
Prenez un moment et réfléchissez à votre besoin . Quel problème espérez-vous résoudre avec JSL ? Voyez-vous maintenant pourquoi les scripts pour les sourires et les rires (au moins au début) peuvent être délicats ? Vous êtes beaucoup plus susceptible de lutter contre la courbe d'apprentissage si vous avez une raison d'atteindre le sommet. Je ne dis pas que vous ne pouvez pas prendre JSL pour le plaisir, juste que le combat est plus difficile sans la motivation supplémentaire.
La prochaine étape, et la dernière que nous allons couvrir dans cet épisode, est ce que vous faites avec ce besoin. La réponse simple est que vous allez faire deux choses. Tout d'abord, vous allez écrire cette idée (éventuellement nébuleuse) qui vous pousse à apprendre JSL en une seule phrase - un énoncé de problème. Et, je ne veux dire qu'une seule phrase. Assurez-vous que vous êtes capable de cristalliser l'idée en quelque chose de tangible sur lequel vous pouvez vous appuyer. Cela aidera également à limiter le fluage de la portée. Voici quelques exemples:
- Je souhaite automatiser toute la génération de graphiques pour mon rapport hebdomadaire dans un seul script.
- Je souhaite automatiser le travail de formatage d'un tableau de données fourni par le client.
- Je souhaite générer un ensemble de cartes de contrôle à partir d'un fichier de données fourni par mon système informatique d'usine.
Notez que je ne parle pas de détails; J'énonce simplement le point douloureux qui me fait regarder JSL. Et puis j'ai arrêté d'écrire.
Faites votre liste de punch
Vous avez votre énoncé de problème ? Bien! Nous allons maintenant écrire une série de livrables spécifiques pour votre script. Ce sera notre liste de pointage pour nous aider à localiser les ressources que SAS fournit pour apprendre JSL. Ne répertoriez aucune interface utilisateur graphique (GUI) ou interface utilisateur (UI) en particulier. Répertoriez les actions que le script doit effectuer. Voici des exemples pour les énoncés de problème ci-dessus :
Énoncé du problème 1 : Je souhaite automatiser toute la génération de graphiques pour mon rapport hebdomadaire dans un seul script.
Liste de punch :
- Extrayez un ensemble de données de notre base de données de production contenant les trois dernières semaines de données.
- Faire un graphique du temps par rapport à la température pour mon produit.
- Exécutez une analyse du temps par rapport à la température à l'aide d'un modèle polynomial.
- Exportez les graphiques et les rapports dans un fichier PowerPoint.
Énoncé du problème 2 : Je souhaite automatiser le travail de formatage d'un tableau de données fourni par le client.
Liste de punch :
- Renommez les colonnes en fonction des normes internes (en utilisant le tableau des spécifications).
- Attribuez des unités aux colonnes nécessaires (en utilisant le tableau des spécifications).
- Convertir Lat et Long en coordonnées géographiques.
- Changement unités défectueuses colonne de continu pour ordinal .
Énoncé du problème 3 : Je souhaite générer un ensemble de cartes de contrôle à partir d'un fichier de données fourni par mon système informatique d'usine.
Liste de punch :
- Importer des données à partir d'un emplacement réseau.
- Attribuez des limites de spécifications.
- Construire des cartes de contrôle.
Notez ici que je ne m'enferme pas trop. Je suis juste en train de construire une liste de choses que j'ai besoin que le script fasse. Puisque je suppose que vous n'avez jamais travaillé avec JSL auparavant, je suppose également que vous ne savez pas comment vous allez vous attaquer à ces problèmes. En les écrivant, vous savez ce que vous devez rechercher dans l'aide et les ressources. C'est là que je vais reprendre dans le prochain épisode de cette série.
Pensée finale pour cette semaine
Étant donné que cette série va s'étendre sur quelques semaines, j'ai décidé d'en faire plus une série de travail que quelque chose que vous venez de lire. Alors, prenez ces derniers points que j'ai faits comme devoirs. Si vous voulez une responsabilité ou des commentaires, mettez-les dans les commentaires ci-dessous. Je vais sonner si je peux vous aider ou vous faire savoir si vous pourriez avoir des problèmes sur la route.
Pour obtenir des points bonus, ouvrez une fenêtre de script dans JMP ( Fichier > Nouveau > Script ) et placez votre énoncé de problème et vos puces dans la fenêtre de script, une par ligne avec une double barre oblique ("//") au début de la ligne. Vous pouvez voir la couleur du texte passer au vert pour ces lignes dans l'éditeur de script JSL. Nous couvrirons ce que vous venez de faire dans un prochain épisode.
Oh, et si vous vous demandez qui est Vasily et pourquoi il devrait vous donner une phrase au singulier, jetez un œil ici .

Il existe deux types de scripts différents : ceux qui agissent sur des données existantes et ceux qui créent des données.
Re : La première chose que j'aurais aimé savoir quand j'ai commencé à écrire des scripts : il existe différents types de scriptsGrande pensée! Jetez un œil à la partie 2 de la série pour quelques aides supplémentaires : La 2ème chose que j'aurais aimé savoir quand j'ai commencé à écrire des scripts : Obtenir de l'aide
Meilleur,
M
Re : La première chose que j'aurais aimé savoir quand j'ai commencé à écrire des scripts : il existe différents types de scriptsBonnes pensées.Pour apprendre JMP, la nouvelle édition de Sautez dans les scripts JMP , de Murphrey et Lucas m'a été utile.
Re : La première chose que j’aurais aimé savoir quand j’ai commencé à programmer : Il existe différents types de scriptsMon principal langage de programmation est SAS. J'utilise Datastep, le langage macro, PROC SQL et PROC IML ; ce n'est donc pas vraiment un seul langage. Mais j'ai vu un court cours sur JMP et cela m'a tout de suite intéressé. Pourquoi ? Au fil des années, j'ai conclu qu'il n'y a en réalité que deux choses importantes.
1. Au départ, j'avais demandé si votre logiciel vous donnait la bonne réponse, mais j'ai changé cela en : votre logiciel vous donne-t-il une réponse que vous pouvez défendre lorsqu'elle est contestée ou critiquée ?
2. En combien de temps pouvez-vous obtenir la réponse à la question 1. ?
Au départ, j'utilisais uniquement les fonctionnalités de pointer-cliquer de JMP, mais je me suis rendu compte que je devais apprendre un peu de JSL pour être plus efficace dans son utilisation.
Par exemple, je montre à mes étudiants comment utiliser l'algorithme des k plus proches voisins (k-nn) pour prédire une variable continue. Il y a 12 prédicteurs possibles (un mélange de variables continues et nominales), une variable de résultat continue et une variable de validation. Je souhaite illustrer l'évolution du R² , du RASE et de l'AAE lorsqu'on retire des prédicteurs. Cela nécessite une exécution avec 12 prédicteurs, puis avec 11, et ainsi de suite jusqu'à une dernière exécution avec deux prédicteurs. Dans votre troisième article de cette série, j'ai découvert la nouvelle fenêtre.
New Window("My Window",
// Launch platform: K Nearest Neighbors 12 Variables
Data Table( "Boston Housing Plus Validation Column" ) <<
K Nearest Neighbors(
Validation( :Validation ),
Y( :MEDV ),
X(:CRIM, :ZN, :INDUS, :CHAS, :NOX, :RM, :AGE, :DIS, :RAD, :TAX, :PTRATIO, :LSTAT),
K( 20 )
);
additional analyses with 10 predictors down to last run with 2. So, a total of 11 analyses.
);
« Nouvelle fenêtre » affiche les résultats dans une seule fenêtre, contrairement aux 11 fenêtres créées par l'algorithme k-nn avec 11 listes différentes de prédicteurs. Ensuite, je peux cliquer avec le bouton droit sur le tableau de résultats, sélectionner « Créer un tableau de données combiné » et obtenir les résultats des 11 analyses dans un seul tableau.
Il me semble évident que je dois convertir le code comportant 11 analyses différentes (en réduisant de 12 à 2 prédicteurs) en une boucle. Ce sera ma prochaine étape dans l'apprentissage de JSL.
JMP JSL débutant.
Merci pour vos messages. J'utilise JMP étudiant 19 sur un ordinateur Windows.
John
Re : La première chose que j’aurais aimé savoir quand j’ai commencé à programmer : Il existe différents types de scripts@jkeighley , merci pour vos compliments ! Je suis ravi que la série vous ait été utile. C'est un peu technique, mais jetez un œil à cet exemple… il pourrait vous donner des idées pour structurer le nouveau rapport (l'index des scripts devrait pouvoir vous aider pour certains détails techniques).
Names Default To Here( 1 );
Clear Log();
// data table goes here
dt = Open( "$Sample_Data/penguins.jmp" );
// report names go here (this is what the tabs will be named)
reportNames = {"report 1", "report 2", "report 3", "report 4", "report 5"};
// jsl for each tab's contents go here. One tab per Expr() call. They
// should be in the same order as the report names.
reportScripts = {Expr(
dt << Scatterplot 3D(
Y( :Culmen Length, :Culmen Depth, :Flipper Length ),
Coloring( :Species ),
Normal Contour Ellipsoids( 1, :Species ),
Nonpar Density Contour( 1, :Species ),
Legend( 1 ),
Frame3D(
Set Graph Size( 655, 672 ),
Legend( 1 ),
Set Grab Handles( 0 ),
Set Rotation( -72.1900689453449, -1.75327107936844, 34.4563606108469 )
),
SendToReport( Dispatch( {}, "Density Contour Controls", OutlineBox, {Close( 1 )} ) )
)
), Expr(
dt << Hierarchical Cluster(
Y( :Culmen Length, :Culmen Depth, :Flipper Length, :Body Mass, :Delta 15 N, :Delta 13 C ),
Label( :Species ),
Method( "Centroid" ),
Standardize By( "Columns" ),
Color Clusters( 1 ),
Show Dendrogram( 0 ),
Dendrogram Scale( "Distance Scale" ),
Number of Clusters( 4 ),
Constellation Plot( 1 ),
Cluster Summary( 1 )
)
), Expr(
dt << Graph Builder(
Size( 662, 560 ),
Show Control Panel( 0 ),
Variables( X( :Species ), Y( :Culmen Length ) ),
Elements( Points( X, Y, Legend( 3 ) ) )
)
), Expr(
dt << Graph Builder(
Size( 662, 552 ),
Show Control Panel( 0 ),
Variables( X( :Body Mass ), Y( :Flipper Length ), Overlay( :Species ) ),
Elements( Points( X, Y, Legend( 13 ) ), Contour( X, Y, Legend( 16 ), Contour Type 2D( "HDR" ) ) ),
SendToReport(
Dispatch( {}, "Graph Builder", FrameBox,
{DispatchSeg( Contour Seg( "Contour (Adelie penguin (Pygoscelis adeliae))" ), {Line Color( {230, 159, 0} )} ),
DispatchSeg( Contour Seg( "Contour (Chinstrap penguin (Pygoscelis antarctica))" ), {Line Color( {86, 180, 233} )} ),
DispatchSeg( Contour Seg( "Contour (Gentoo penguin (Pygoscelis papua))" ), {Line Color( {0, 158, 115} )} )}
)
)
)
), Expr(
dt << Fit Group(
Bivariate( Y( :Flipper Length ), X( :Culmen Length ), Nonpar Density( {Contour Fill( 1 ), Color Theme( "Spectral" )} ) ),
Bivariate( Y( :Flipper Length ), X( :Culmen Depth ), Nonpar Density( {Contour Fill( 1 ), Color Theme( "Spectral" )} ) ),
Bivariate( Y( :Body Mass ), X( :Culmen Length ), Nonpar Density( {Contour Fill( 1 ), Color Theme( "Spectral" )} ) ),
Bivariate( Y( :Body Mass ), X( :Culmen Depth ), Nonpar Density( {Contour Fill( 1 ), Color Theme( "Spectral" )} ) ),
<<{Arrange in Rows( 2 )}
)
)};
// I'm creatng an Associative array to manage the looping for me
reports = Associative Array( reportNames, reportScripts );
// build the window wrapper
nw = New Window( "Example Report", tb = Tab Box() );
// loop through the AA and append each tab page box to the tab box in the report
For Each( {{k, v}, i}, reports, tb << Append( Tab Page Box( Title( k ), Eval( v ) ) ) );
// set the view back to the first report.
tb << Set Selected( 1 );