運行python代碼時出錯(通過JMP公式庫創建)JMP 模型會給我一個公式,我想傳遞該公式並在 python 或 R 程序中使用它。
通過公式庫,它生成了Python代碼,我嘗試複製Python代碼並通過Jupiter Notebook運行它,但總是給我錯誤:
例如,我附加了從 JMP 創建並運行的測試文件和 python 代碼。它無法識別為數組...請幫助。謝謝!!! 我認為複制 JMP 創建的 python 代碼並毫無問題地運行 python 很容易。看起來不是......
def 分數(輸入數據,輸出數據):
_temp_0 = u""
if (indata[u"Num"] > 50):
_temp_0 = u“高”
別的:
_temp_0 = u“低”
輸出數據[u“類”] = _temp_0
返回輸出數據[u"class"]
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
以下是來自 JMP 的 python 代碼
來自 __future__ 進口部門
從數學導入*
將 jmp_score 導入為 jmp
""" =============================================== == ===================
版權所有(C) 2018 SAS Institute Inc.保留所有權利。
注意:
授予以下權限的前提是
上述版權和本聲明出現在分數代碼中並且
任何相關文檔。複製、修改的權限
並分發使用生成的分數代碼
JMP(R) 軟件僅限 SAS Institute Inc.(“SAS”)的客戶使用
以及連續的第三方,均不提供任何明示或保證
暗示的或 SAS 的任何其他義務。SAS 和所有其他 SAS
Institute.Inc.產品和服務名稱已註冊
SAS Institute Inc. 在美國的商標或商標
和其他國家。除本通知中包含的內容外,
不得使用 SAS Institute Inc. 和 JMP 的名稱
產品或服務的廣告或促銷,未經
事先獲得 SAS Institute Inc. 的書面授權
================================================== = ===============“”“
""" JMP v13.2.1 生成的 Python 代碼 """
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():
返回 {
u“Num”:“浮動”
}
def getOutputMetadata():
返回 {
u“類”:“str”
}
def 分數(輸入數據,輸出數據):
_temp_0 = u""
if (indata[u"Num"] > 50):
_temp_0 = u“高”
別的:
_temp_0 = u“低”
輸出數據[u“類”] = _temp_0
返回輸出數據[u"class"]
數據看起來像
班級數
15 低
17 低
200高
60高
72 高
10 低
20 低
70高
55高
20 低
854 高
回复:運行 python 代碼時出錯(通過 JMP 公式庫創建)熊貓遵循 numpy 約定,當您嘗試將某些內容轉換為 bool 時會引發錯誤。 這種情況發生在 if 或使用布爾運算、and、or、or not 時。 目前尚不清楚結果如何。
例子
5 == pd.Series([12,2,5,10])
您得到的結果是一系列布爾值,其大小等於表達式右側的 pd.Series。 所以,你會得到一個錯誤。 這裡的問題是您正在將 pd.Series 與一個值進行比較,因此您將有多個 True 和多個 False 值,如上面的情況所示。 這當然是不明確的,因為條件既不是 True 也不是 False。 您需要進一步聚合結果,以便運算產生單個布爾值。 為此,您必須使用任何或全部,具體取決於您是否需要至少一個(任何)或所有值來滿足條件。
(5 == pd.Series([12,2,5,10])).all()
# False
或者
(5 == pd.Series([12,2,5,10])).any()
# True
回复:運行 python 代碼時出錯(通過 JMP 公式庫創建)非常感謝您快速而詳細的回复,
現在效果很好
謝謝
埃蘭
回复:運行 python 代碼時出錯(通過 JMP 公式庫創建)你好@eranraz1 ,
我發現您發布的代碼有兩個問題:
1) 您提供了一個字符串作為 DESIGN_LAYERS 的輸入值。 評分代碼需要一個浮點數,如 getInputMetadata() 方法中所述;該值不應被引用。
indata_aa = {'DESIGN_LAYERS': '3','EXISTS_LASER_DRILL' : 'YES' }
應該是:
indata_aa = {'DESIGN_LAYERS': 3,'EXISTS_LASER_DRILL' : 'YES' }
2) 評分方法末尾的返回行缺少訂閱,因此該值將添加到字典元素,而不是添加到(輸出)字典本身。 如果這是原始生成的代碼,那麼它就是一個錯誤。 也許這是創建測試腳本時錯誤引入的更改。
outdata = 358.593374276362 + 26.8517927560789 * indata[u"DESIGN_LAYERS"] + _temp_0
應該
outdata[u"Add"] = 358.593374276362 + 26.8517927560789 * indata[u"DESIGN_LAYERS"] + _temp_0
通過這些更改(並在添加 Numpy import 語句後),腳本可以工作並返回結果:
***************************
569.3520768491067
[Finished in 0.3s]
請參閱附件了解完整的更新腳本。
PS:下次,最好開一個新的討論,並參考這篇兩年前的帖子來了解背景。
回复:運行 python 代碼時出錯(通過 JMP 公式庫創建)你好 ,
嘗試使用帶有 2 個參數的“Dict”來實現相同的方法,但得到了錯誤:
“類型錯誤:無法將序列乘以‘float’類型的非 int”
請協助
附上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, {}))謝謝
埃蘭
回复:運行 python 代碼時出錯(通過 JMP 公式庫創建)很高興它有幫助,露西!回复:運行 python 代碼時出錯(通過 JMP 公式庫創建)納斯西夫, https://community.jmp.com/t5/Discovery-Summit-2016/Scoring-Outside-the-Box/ta-p/22381本演示中的示例確實對我有很大幫助。 很棒的演示,非常感謝您分享示例和代碼。回复:運行 python 代碼時出錯(通過 JMP 公式庫創建)我無法訪問 Spotfire,所以我不可能嘗試它,但顯然,也可以在 SpotFire 中運行 Python 代碼。
請查看這些鏈接,它們可能會有所幫助:
* https://community.tibco.com/wiki/how-deploy-custom-python-modules-use-tibco-spotfirer-clients
* https://community.tibco.com/questions/call-local-python-spotfire
回复:運行 python 代碼時出錯(通過 JMP 公式庫創建)如果 JMP 可以添加 R 代碼那就太好了。特別是我們行業使用的Spotfire和R代碼將很容易嵌入到Spotfire中。
謝謝!
回复:運行 python 代碼時出錯(通過 JMP 公式庫創建)是的,這確實是一個很好的建議! 我不擅長Python,因為我已經編寫SAS代碼20年了。
回复:運行 python 代碼時出錯(通過 JMP 公式庫創建)你好,我們又見面了,
我們已經收到了 R 語言代碼生成的請求,但不幸的是,它還沒有出現在產品或路線圖上。
我建議添加一個條目JMP 願望清單以便我們可以跟踪對此功能的普遍興趣。
回复:運行 python 代碼時出錯(通過 JMP 公式庫創建)很高興您發現它有幫助! 我建議您不要將 JMP 代碼複製並粘貼到筆記本中 - 這僅適用於非常小的模型,而您提到的兩個模型可能非常大。 相反,只需導入生成的文件,如我提到的 Discovery 筆記本示例中所示。
這裡有一個提示:在保存 JMP 生成的 python 代碼的同一目錄中啟動筆記本,以及產品附帶的幫助文件 jmp_score.py 文件的副本,以便 Python 可以更輕鬆地找到它們。 看到這個討論更多細節。
回复:運行 python 代碼時出錯(通過 JMP 公式庫創建)納西夫,
還有一個問題,在新版本中,Formular Depot會生成R代碼嗎?謝謝!
回复:運行 python 代碼時出錯(通過 JMP 公式庫創建)納西夫,
非常感謝您知識淵博且快速的回复。它對此非常有效。 我將嘗試由 JMP 創建的更複雜的 python 代碼(增強樹/隨機森林公式,儘管看起來甚至複製和粘貼 jupyter 筆記本也需要很長時間)
回复:運行 python 代碼時出錯(通過 JMP 公式庫創建)嗨露西,
簡而言之,您必須使用與 JMP 生成的代碼兼容的數據結構來保存數據。 它期望輸入和輸出參數是類似字典的類型,其中可以通過鍵訪問和寫入值。 用於表的理想數據結構是 Pandas DataFrame。 以下是如何使用示例中的 JMP 評分函數向 DataFrame 添加新列:
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)
請參閱附件中的完整示例。 另外,請查看 Discovery 演示文稿中附帶的示例代碼,其中介紹了 Formula Depot 代碼生成,禁區外得分和分享終極恩惠。