erreur lors de l'exécution du code python (créé via le dépôt de formules JMP)Le modèle JMP me donnerait une formule et je veux transmettre la formule et l'utiliser dans un programme python ou R.
Grâce au dépôt de formules, il a généré du code Python, et j'ai essayé de copier le code python et de l'exécuter via Jupiter Notebook, mais me donne toujours une erreur :
par exemple, j'ai joint le fichier de test et le code python créé à partir de JMP et exécuté. il n'a pas reconnu comme tableau ... aidez-moi s'il vous plaît. merci!!! Je pensais qu'il était facile de copier le code python créé par JMP et d'exécuter python sans problème. il parait que non.....
def score(indata, outdata):
_temp_0 = u""
si (indata[u"Num"] > 50) :
_temp_0 = u"Haut"
autre:
_temp_0 = u"Bas"
outdata[u"classe"] = _temp_0
renvoie des données en sortie[u"classe"]
890 raise ValueError("The truth value of a {0} is ambiguous. "
891 "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
--> 892 .format(self.__class__.__name__)) 893
ce qui suit est le code python de JMP
de la division d'importation __future__
de l'import mathématique *
importer jmp_score en tant que jmp
""" ============================================== ===================
Copyright(C) 2018 SAS Institute Inc.Tous droits réservés.
Avis:
Les autorisations suivantes sont accordées à condition que le
ci-dessus le droit d'auteur et cet avis apparaissent dans le code de partition et
toute documentation connexe. Autorisation de copier, modifier
et distribuer le code de score généré à l'aide
Le logiciel JMP(R) est limité aux clients de SAS Institute Inc. ("SAS")
et tiers successifs, le tout sans aucune garantie, expresse ou
implicite, ou toute autre obligation par SAS. SAS et tous les autres SAS
Les noms de produits et de services Institute.Inc. sont enregistrés
marques commerciales ou marques commerciales de SAS Institute Inc. aux États-Unis
et d'autres pays. Sauf indication contraire dans cet avis,
le nom de SAS Institute Inc. et de JMP ne doit pas être utilisé dans
la publicité ou la promotion de produits ou de services sans
autorisation écrite préalable de SAS Institute Inc.
================================================= ================ """
""" Code Python généré par JMP v13.2.1 """
def getModelMetadata() :
return {"creator": u"Column class", "modelName": u"", "predicted": u"", "table": u"Sheet2", "version": u"13.2.1", "timestamp" " : u"2018-04-05T16:10:16Z"}
def getInputMetadata() :
retour {
u"Num": "flottant"
}
def getOutputMetadata() :
retour {
u"class": "str"
}
def score(indata, outdata):
_temp_0 = u""
si (indata[u"Num"] > 50) :
_temp_0 = u"Haut"
autre:
_temp_0 = u"Bas"
outdata[u"classe"] = _temp_0
renvoie des données en sortie[u"classe"]
les données ressemblent à
Classe numérique
15 Bas
17 Bas
200 haut
60 haut
72 haut
10 Bas
20 Bas
70 Élevé
55 haut
20 Bas
854 haut
Re : erreur lors de l'exécution du code python (créé via le dépôt de formules JMP)Pandas suit la convention numpy de générer une erreur lorsque vous essayez de convertir quelque chose en booléen. Cela se produit dans un si ou lors de l'utilisation des opérations booléennes, et, ou, ou non. Le résultat n'est pas clair.
exemple
5 == pd.Series([12,2,5,10])
Le résultat que vous obtenez est une série de booléens, de taille égale à la pd.Series dans la partie droite de l'expression. Donc, vous obtenez une erreur. Le problème ici est que vous comparez un pd.Series avec une valeur, vous aurez donc plusieurs valeurs True et False, comme dans le cas ci-dessus. Ceci est bien sûr ambigu, puisque la condition n'est ni vraie ni fausse. Vous devez agréger davantage le résultat afin qu'une seule valeur booléenne résulte de l'opération. Pour cela, vous devrez utiliser tout ou partie selon que vous souhaitez qu'au moins une (toute) ou toutes les valeurs satisfassent la condition.
(5 == pd.Series([12,2,5,10])).all()
# False
ou
(5 == pd.Series([12,2,5,10])).any()
# True
Re : erreur lors de l'exécution du code python (créé via le dépôt de formules JMP)Merci beaucoup pour la réponse rapide et détaillée,
ça marche très bien maintenant
merci
Éran
Re : erreur lors de l'exécution du code python (créé via le dépôt de formules JMP)Salut @eranraz1 ,
J'ai trouvé deux problèmes avec le code que vous avez posté:
1) Vous avez fourni une chaîne comme valeur d'entrée pour DESIGN_LAYERS. Le code de scoring attend un float, comme indiqué dans la méthode getInputMetadata() ; la valeur ne doit pas être citée.
indata_aa = {'DESIGN_LAYERS': '3','EXISTS_LASER_DRILL' : 'YES' }
devrait être à la place :
indata_aa = {'DESIGN_LAYERS': 3,'EXISTS_LASER_DRILL' : 'YES' }
2) Il manque un abonnement à la ligne de retour à la fin de la méthode de notation, de sorte que la valeur est ajoutée à un élément du dictionnaire, et non au dictionnaire (de sortie) lui-même. S'il s'agit du code généré d'origine, il s'agit d'un bogue. Il s'agit peut-être d'un changement introduit par erreur lors de la création du script de test.
outdata = 358.593374276362 + 26.8517927560789 * indata[u"DESIGN_LAYERS"] + _temp_0
devrait être
outdata[u"Add"] = 358.593374276362 + 26.8517927560789 * indata[u"DESIGN_LAYERS"] + _temp_0
Avec ces modifications (et après avoir ajouté une instruction d'importation Numpy), le script fonctionne et renvoie un résultat :
***************************
569.3520768491067
[Finished in 0.3s]
Voir ci-joint le script complet et mis à jour.
PS : La prochaine fois, il serait préférable d'ouvrir une nouvelle discussion et de se référer à ce post vieux de 2 ans pour le contexte.
Re : erreur lors de l'exécution du code python (créé via le dépôt de formules JMP)Salut ,
essayait d'implémenter la même méthode en utilisant un 'Dict' avec 2 paramètres, et a obtenu l'erreur :
"TypeError : impossible de multiplier la séquence par un non-entier de type 'float'"
veuillez aider
ci-joint le code PY :
#set parameters
indata_aa = {'DESIGN_LAYERS': '3','EXISTS_LASER_DRILL' : 'YES' }
def getModelMetadata():
return {"creator": u"Formula Editor", "modelName": u"", "predicted": u"", "table": u"NEW JMP Pricing 30 RIGID SHORT", "version": u"15.0.0", "timestamp": u"2020-08-30T10:46:03Z"}
def getInputMetadata():
return {
u"DESIGN_LAYERS": "float",
u"EXISTS_LASER_DRILL": "str"
}
def getOutputMetadata():
return {
u"Add": "float"
}
def score(indata, outdata):
_temp_0 = np.nan
if (indata[u"EXISTS_LASER_DRILL"] == u"NO"):
_temp_0 = -130.203324304508
elif (indata[u"EXISTS_LASER_DRILL"] == u"YES"):
_temp_0 = 130.203324304508
else:
_temp_0 = np.nan
print (_temp_0)
outdata = 358.593374276362 + 26.8517927560789 * indata[u"DESIGN_LAYERS"] + _temp_0
return outdata["Add"]
print('***************************')
print(score(indata_aa, {}))merci
Éran
Re : erreur lors de l'exécution du code python (créé via le dépôt de formules JMP)Je suis tellement content que cela ait aidé, Lucy !Re : erreur lors de l'exécution du code python (créé via le dépôt de formules JMP)Nascif, https://community.jmp.com/t5/Discovery-Summit-2016/Scoring-Outside-the-Box/ta-p/22381 l'exemple de cette présentation m'aide vraiment beaucoup. Excellente présentation et merci beaucoup pour le partage de l'exemple et du code.Re : erreur lors de l'exécution du code python (créé via le dépôt de formules JMP)Je n'ai pas accès à Spotfire, il ne m'est donc pas possible de l'essayer, mais apparemment, il est également possible d'exécuter du code Python dans SpotFire.
N'hésitez pas à consulter ces liens, ils pourraient vous aider :
* https://community.tibco.com/wiki/how-deploy-custom-python-modules-use-tibco-spotfirer-clients
* https://community.tibco.com/questions/call-local-python-spotfire
Re : erreur lors de l'exécution du code python (créé via le dépôt de formules JMP)ce serait bien si JMP pouvait ajouter du code R. en particulier dans notre industrie, les codes Spotfire et R seront facilement intégrés à Spotfire.
Merci!
Re : erreur lors de l'exécution du code python (créé via le dépôt de formules JMP)oui c'est vraiment une bonne suggestion !!! Je ne suis pas bon en python puisque j'écris des codes SAS depuis 20 ans.
Re : erreur lors de l'exécution du code python (créé via le dépôt de formules JMP)Re-bonjour,
Nous avons eu des demandes de génération de code en langage R mais malheureusement, ce n'est pas encore sur le produit ou sur la feuille de route.
Je suggérerais d'ajouter une entrée au Liste de souhaits JMP afin que nous puissions suivre l'intérêt général pour cette fonctionnalité.
Re : erreur lors de l'exécution du code python (créé via le dépôt de formules JMP)Heureux que vous le trouviez utile ! Je vous suggère de ne pas copier et coller le code JMP dans le cahier - cela ne fonctionne que pour les très petits modèles et les deux que vous avez mentionnés peuvent être assez volumineux. Au lieu de cela, importez simplement le fichier généré comme dans les exemples de bloc-notes Discovery que j'ai mentionnés.
Voici une astuce : démarrez votre notebook dans le même répertoire que celui dans lequel vous avez enregistré le code python généré par JMP, ainsi qu'une copie du fichier d'assistance jmp_score.py fourni avec le produit, afin que Python puisse les trouver plus facilement. Regarde ça discussion pour plus de détails.
Re : erreur lors de l'exécution du code python (créé via le dépôt de formules JMP)Nasif,
une autre question, dans la nouvelle version, Formular Depot générera du code R ? merci!
Re : erreur lors de l'exécution du code python (créé via le dépôt de formules JMP)Nasif,
Merci beaucoup pour votre réponse avisée et rapide.Cela fonctionne très bien pour cela. Je vais essayer un code python plus compliqué créé par JMP (formule arbre boosté / forêt aléatoire, bien que cela semble prendre beaucoup de temps, même copier et coller le cahier jupyter)
Re : erreur lors de l'exécution du code python (créé via le dépôt de formules JMP)Salut Lucy,
La réponse courte est que vous devez utiliser une structure de données pour stocker vos données qui est compatible avec le code généré par JMP. Il s'attend à ce que les arguments d'entrée et de sortie soient d'un type semblable à un dictionnaire, où les valeurs peuvent être accédées et écrites par clé. La structure de données idéale à utiliser pour une table est un Pandas DataFrame. Voici comment ajouter une nouvelle colonne à un DataFrame à l'aide de la fonction de score JMP de votre exemple :
import pandas as pd<BR /><BR />indata_df = pd.read_table(testdata, sep = ',')
indata_df['predicted_class'] = indata_df.apply(lambda s: score(s, {}), axis=1)
Veuillez consulter les fichiers joints pour un exemple complet. Veuillez également consulter l'exemple de code joint aux présentations Discovery où la génération de code Formula Depot a été couverte, Marquer en dehors de la boîte et Partager l'avantage ultime .