运行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 代码生成,禁区外得分和分享终极恩惠。