Fehler beim Ausführen von Python-Code (erstellt über das JMP-Formeldepot)Das JMP-Modell würde mir eine Formel geben, und ich möchte die Formel übergeben und sie in einem Python- oder R-Programm verwenden.
Über das Formeldepot wurde Python-Code generiert, und ich habe versucht, den Python-Code zu kopieren und über Jupiter Notebook auszuführen, aber es wurde immer folgende Fehlermeldung angezeigt:
Beispielsweise habe ich die aus JMP erstellte Testdatei und den Python-Code angehängt und ausgeführt. Es wurde nicht als Array erkannt ... bitte helfen Sie. Danke!!! Ich dachte, es sei einfach, den von JMP erstellten Python-Code zu kopieren und Python ohne Probleme auszuführen. sieht so aus, als wäre es das nicht.....
Def-Score(Indata, Outdata):
_temp_0 = u""
if (indata[u"Num"] > 50):
_temp_0 = u"Hoch"
anders:
_temp_0 = u"Niedrig"
outdata[u"class"] = _temp_0
outdata[u"class"] zurückgeben
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
Das Folgende ist Python-Code von JMP
von der Importabteilung von __future__
aus Mathe-Import *
jmp_score als jmp importieren
""" ============================================= ===================
Copyright(C) 2018 SAS Institute Inc. Alle Rechte vorbehalten.
Notiz:
Die folgenden Berechtigungen werden erteilt, sofern die
Das oben genannte Urheberrecht und dieser Hinweis erscheinen im Partiturcode und
jegliche zugehörige Dokumentation. Erlaubnis zum Kopieren und Ändern
und verteilen Sie den mit generierten Score-Code
JMP(R)-Software ist auf Kunden von SAS Institute Inc. („SAS“) beschränkt.
und nachfolgende Dritte, alles ohne jegliche Gewährleistung, ausdrücklich oder
stillschweigende oder sonstige Verpflichtungen von SAS.SAS und allen anderen SAS
Die Produkt- und Servicenamen von Institute.Inc. sind registriert
Warenzeichen oder Warenzeichen von SAS Institute Inc. in den USA
und anderen Ländern. Sofern in dieser Mitteilung nichts anderes bestimmt ist,
Der Name des SAS Institute Inc. und JMP darf nicht verwendet werden
die Werbung oder Verkaufsförderung für Produkte oder Dienstleistungen ohne
vorherige schriftliche Genehmigung von SAS Institute Inc.
=============================================== ================ ""
„““ Von JMP v13.2.1 generierter Python-Code „““
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():
zurückkehren {
u"Num": "float"
}
def getOutputMetadata():
zurückkehren {
u"class": "str"
}
Def-Score(Indata, Outdata):
_temp_0 = u""
if (indata[u"Num"] > 50):
_temp_0 = u"Hoch"
anders:
_temp_0 = u"Niedrig"
outdata[u"class"] = _temp_0
outdata[u"class"] zurückgeben
Die Daten sehen so aus
Num-Klasse
15 Niedrig
17 Niedrig
200 hoch
60 hoch
72 hoch
10 Niedrig
20 Niedrig
70 hoch
55 hoch
20 Niedrig
854 Hoch
Betreff: Fehler beim Ausführen von Python-Code (erstellt über das JMP-Formeldepot)Pandas folgt der Numpy-Konvention und löst einen Fehler aus, wenn Sie versuchen, etwas in einen Bool-Wert umzuwandeln. Dies geschieht in einem if oder bei Verwendung der booleschen Operationen und, oder, oder nicht. Es ist nicht klar, was das Ergebnis ist.
Beispiel
5 == pd.Series([12,2,5,10])
Das Ergebnis ist eine Reihe boolescher Werte, deren Größe der pd.Series auf der rechten Seite des Ausdrucks entspricht. Sie erhalten also eine Fehlermeldung. Das Problem hierbei ist, dass Sie eine pd.Series mit einem Wert vergleichen, sodass Sie mehrere True- und mehrere False-Werte haben, wie im obigen Fall. Dies ist natürlich mehrdeutig, da die Bedingung weder wahr noch falsch ist. Sie müssen das Ergebnis weiter aggregieren, sodass sich aus der Operation ein einzelner boolescher Wert ergibt. Dazu müssen Sie entweder „any“ oder „all“ verwenden, je nachdem, ob mindestens ein (beliebiger) oder alle Werte die Bedingung erfüllen sollen.
(5 == pd.Series([12,2,5,10])).all()
# False
oder
(5 == pd.Series([12,2,5,10])).any()
# True
Betreff: Fehler beim Ausführen von Python-Code (erstellt über das JMP-Formeldepot)Vielen Dank für die schnelle und ausführliche Antwort,
es funktioniert jetzt großartig
Danke
Eran
Betreff: Fehler beim Ausführen von Python-Code (erstellt über das JMP-Formeldepot)Hallo @eranraz1 ,
Ich habe zwei Probleme mit dem von Ihnen geposteten Code festgestellt:
1) Sie haben eine Zeichenfolge als Eingabewert für DESIGN_LAYERS angegeben. Der Scoring-Code erwartet einen Float, wie in der Methode getInputMetadata() angegeben; Der Wert sollte nicht angegeben werden.
indata_aa = {'DESIGN_LAYERS': '3','EXISTS_LASER_DRILL' : 'YES' }
sollte stattdessen lauten:
indata_aa = {'DESIGN_LAYERS': 3,'EXISTS_LASER_DRILL' : 'YES' }
2) In der Rückgabezeile am Ende der Bewertungsmethode fehlt ein Abonnement, sodass der Wert einem Wörterbuchelement und nicht dem (Ausgabe-)Wörterbuch selbst hinzugefügt wird. Wenn es sich um den ursprünglich generierten Code handelt, handelt es sich um einen Fehler. Möglicherweise handelt es sich um eine versehentlich beim Erstellen des Testskripts eingeführte Änderung.
outdata = 358.593374276362 + 26.8517927560789 * indata[u"DESIGN_LAYERS"] + _temp_0
sollte sein
outdata[u"Add"] = 358.593374276362 + 26.8517927560789 * indata[u"DESIGN_LAYERS"] + _temp_0
Mit diesen Änderungen (und nach dem Hinzufügen einer Numpy-Importanweisung) funktioniert das Skript und gibt ein Ergebnis zurück:
***************************
569.3520768491067
[Finished in 0.3s]
Das vollständige, aktualisierte Skript finden Sie im Anhang.
PS: Das nächste Mal wäre es besser, eine neue Diskussion zu eröffnen und für den Kontext auf diesen zwei Jahre alten Beitrag zurückzugreifen.
Betreff: Fehler beim Ausführen von Python-Code (erstellt über das JMP-Formeldepot)Hallo ,
Ich habe versucht, dieselbe Methode mithilfe eines „Dict“ mit zwei Parametern zu implementieren, und habe die Fehlermeldung erhalten:
„TypeError: Sequenz kann nicht mit Nicht-Int vom Typ ‚float‘ multipliziert werden.“
bitte helfen
Anbei der PY-Code:
#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, {}))Danke
Eran
Betreff: Fehler beim Ausführen von Python-Code (erstellt über das JMP-Formeldepot)Ich bin so froh, dass es geholfen hat, Lucy!Betreff: Fehler beim Ausführen von Python-Code (erstellt über das JMP-Formeldepot)Nascif, https://community.jmp.com/t5/Discovery-Summit-2016/Scoring-Outside-the-Box/ta-p/22381 Das Beispiel in dieser Präsentation hat mir wirklich sehr geholfen. Tolle Präsentation und vielen Dank für die Weitergabe des Beispiels und des Codes.Betreff: Fehler beim Ausführen von Python-Code (erstellt über das JMP-Formeldepot)Ich habe keinen Zugriff auf Spotfire und kann es daher nicht ausprobieren, aber anscheinend ist es auch möglich, Python-Code in SpotFire auszuführen.
Bitte werfen Sie einen Blick auf diese Links, sie könnten helfen:
* https://community.tibco.com/wiki/how-deploy-custom-python-modules-use-tibco-spotfirer-clients
* https://community.tibco.com/questions/call-local-python-spotfire
Betreff: Fehler beim Ausführen von Python-Code (erstellt über das JMP-Formeldepot)Das wäre gut, wenn JMP R-Code hinzufügen könnte. Insbesondere unsere branchenweit genutzten Spotfire- und R-Codes lassen sich problemlos in Spotfire einbetten.
Danke!
Betreff: Fehler beim Ausführen von Python-Code (erstellt über das JMP-Formeldepot)ja, das ist wirklich ein guter Vorschlag!!! Ich bin nicht gut in Python, da ich seit 20 Jahren SAS-Codes schreibe.
Betreff: Fehler beim Ausführen von Python-Code (erstellt über das JMP-Formeldepot)Hallo nochmal,
Wir haben Anfragen zur Generierung von R-Sprachcode erhalten, aber leider ist dieser noch nicht im Produkt oder auf der Roadmap enthalten.
Ich würde vorschlagen, einen Eintrag hinzuzufügen JMP-Wunschliste damit wir das allgemeine Interesse an dieser Funktion verfolgen können.
Betreff: Fehler beim Ausführen von Python-Code (erstellt über das JMP-Formeldepot)Ich freue mich, dass Sie es hilfreich finden! Ich würde vorschlagen, dass Sie den JMP-Code nicht kopieren und in das Notebook einfügen – das funktioniert nur bei sehr kleinen Modellen und die beiden von Ihnen genannten können recht groß sein. Importieren Sie stattdessen einfach die generierte Datei wie in den von mir erwähnten Discovery-Notebook-Beispielen.
Hier ist ein Tipp: Starten Sie Ihr Notebook in demselben Verzeichnis, in dem Sie den von JMP generierten Python-Code sowie eine Kopie der mit dem Produkt gelieferten Hilfsdatei jmp_score.py gespeichert haben, damit Python sie leichter finden kann. Sieh dir das an Diskussion für mehr Details.
Betreff: Fehler beim Ausführen von Python-Code (erstellt über das JMP-Formeldepot)Nasif,
Noch eine Frage: Wird Formular Depot in der neueren Version R-Code generieren? Danke!
Betreff: Fehler beim Ausführen von Python-Code (erstellt über das JMP-Formeldepot)Nasif,
Vielen Dank für Ihre kompetente und schnelle Antwort.Dafür funktioniert es sehr gut. Ich werde komplizierteren Python-Code ausprobieren, der von JMP erstellt wurde (Boosted Tree/Random Forest-Formel, obwohl es so aussieht, als würde selbst das Kopieren und Einfügen des Jupyter-Notebooks lange dauern)
Betreff: Fehler beim Ausführen von Python-Code (erstellt über das JMP-Formeldepot)Hallo Lucy,
Die kurze Antwort lautet: Sie müssen eine Datenstruktur verwenden, um Ihre Daten zu speichern, die mit dem von JMP generierten Code kompatibel ist. Es wird erwartet, dass die Eingabe- und Ausgabeargumente einen wörterbuchähnlichen Typ haben, bei dem Werte per Schlüssel aufgerufen und geschrieben werden können. Die ideale Datenstruktur für eine Tabelle ist ein Pandas DataFrame. So würden Sie mithilfe der JMP-Score-Funktion aus Ihrem Beispiel eine neue Spalte zu einem DataFrame hinzufügen:
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)
Ein vollständiges Beispiel finden Sie in den angehängten Dateien. Schauen Sie sich auch den Beispielcode an, der den Discovery-Präsentationen beigefügt ist, in denen die Codegenerierung von Formula Depot behandelt wurde. Über den Tellerrand hinaus punkten Und Den ultimativen Segen teilen .