Python 코드 실행 시 오류(JMP 수식 저장소를 통해 생성됨)JMP 모델은 나에게 수식을 제공하고 수식을 전달하고 Python 또는 R 프로그램에서 사용하고 싶습니다.
포뮬러 디포를 통해 파이썬 코드를 생성했고, 파이썬 코드를 복사해서 주피터 노트북을 통해 실행해보았지만 항상 에러가 납니다.
예를 들어 JMP에서 만든 테스트 파일과 Python 코드를 첨부하고 실행했습니다. 배열로 인식이 안되네요... 도와주세요. 감사해요!!! JMP에서 만든 파이썬 코드를 복사해서 문제없이 파이썬을 실행하는 것이 쉽다고 생각했습니다. 아닌듯.....
데프 점수(indata, outdata):
_temp_0 = 유""
if (indata[u"Num"] > 50):
_temp_0 = u"높음"
또 다른:
_temp_0 = u"낮음"
outdata[u"클래스"] = _temp_0
outdata[u"클래스"] 반환
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의 파이썬 코드입니다.
from __future__ 수입 부문
수학 가져오기에서 *
jmp_score를 jmp로 가져오기
""" ==================================================== ===================
Copyright(C) 2018 SAS Institute Inc.All rights reserved.
알아채다:
다음과 같은 권한이 부여됩니다.
위의 저작권과 이 고지 사항은 스코어 코드에 표시되며
관련 문서.복사, 수정 권한
를 사용하여 생성된 점수 코드를 배포합니다.
JMP(R) 소프트웨어는 SAS Institute Inc.("SAS") 고객에게만 제공됩니다.
명시적 또는 명시적 보증 없이 연속적인 제3자
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 ": 너"2018-04-05T16:10:16Z"}
def getInputMetadata():
반품 {
u"숫자": "부동"
}
def getOutputMetadata():
반품 {
u"클래스": "스트"
}
데프 점수(indata, outdata):
_temp_0 = 유""
if (indata[u"Num"] > 50):
_temp_0 = u"높음"
또 다른:
_temp_0 = u"낮음"
outdata[u"클래스"] = _temp_0
outdata[u"클래스"] 반환
데이터는 다음과 같습니다
넘버 클래스
15 낮음
17 낮음
200 높음
60 높음
72 높음
10 낮음
20 낮음
70 높음
55 높음
20 낮음
854 높음
Re: Python 코드 실행 시 오류(JMP 수식 저장소를 통해 생성됨)팬더 무언가를 bool로 변환하려고 할 때 오류를 발생시키는 numpy 규칙을 따릅니다. 이것은 부울 연산을 사용하는 if 또는 and, or, or not에서 발생합니다. 결과가 무엇인지는 명확하지 않습니다.
예
5 == pd.Series([12,2,5,10])
결과는 식의 오른쪽에 있는 pd.Series와 크기가 동일한 일련의 부울입니다. 따라서 오류가 발생합니다. 여기서 문제는 pd.Series를 값과 비교하고 있으므로 위의 경우와 같이 여러 True 및 여러 False 값을 갖게 된다는 것입니다. 물론 이것은 조건이 True 또는 False가 아니기 때문에 모호합니다. 작업에서 단일 부울 값이 나오도록 결과를 추가로 집계해야 합니다. 이를 위해 조건을 만족시키기 위해 적어도 하나의 값을 원하는지 또는 모든 값을 원하는지 여부에 따라 any 또는 all을 사용해야 합니다.
(5 == pd.Series([12,2,5,10])).all()
# False
또는
(5 == pd.Series([12,2,5,10])).any()
# True
Re: Python 코드 실행 시 오류(JMP 수식 저장소를 통해 생성됨)빠르고 자세한 답변 정말 감사합니다,
지금 잘 작동하고 있습니다
감사해요
에란
Re: Python 코드 실행 시 오류(JMP 수식 저장소를 통해 생성됨)안녕 @eranraz1 ,
게시한 코드에서 두 가지 문제를 발견했습니다.
1) DESIGN_LAYERS에 대한 입력 값으로 문자열을 제공했습니다. 채점 코드는 getInputMetadata() 메서드에 명시된 대로 float를 예상합니다. 값을 따옴표로 묶으면 안 됩니다.
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 가져오기 문을 추가한 후) 스크립트가 작동하고 결과를 반환합니다.
***************************
569.3520768491067
[Finished in 0.3s]
업데이트된 전체 스크립트는 첨부된 내용을 참조하십시오.
추신: 다음 번에는 새로운 토론을 열고 이 2년 된 게시물을 다시 참조하여 맥락을 파악하는 것이 좋습니다.
Re: Python 코드 실행 시 오류(JMP 수식 저장소를 통해 생성됨)안녕 ,
2개의 매개변수가 있는 'Dict'를 사용하여 동일한 방법을 구현하려고 시도했는데 오류가 발생했습니다.
"TypeError: '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, {}))감사해요
에란
Re: Python 코드 실행 시 오류(JMP 수식 저장소를 통해 생성됨)도움이 되었다니 다행입니다, 루시!Re: Python 코드 실행 시 오류(JMP 수식 저장소를 통해 생성됨)나시프, https://community.jmp.com/t5/Discovery-Summit-2016/Scoring-Outside-the-Box/ta-p/22381 이 프레젠테이션의 예는 저에게 정말 많은 도움이 됩니다. 훌륭한 프리젠테이션이며 예제와 코드를 공유해 주셔서 감사합니다.Re: 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
Re: Python 코드 실행 시 오류(JMP 수식 저장소를 통해 생성됨)JMP가 R 코드를 추가할 수 있다면 좋을 것입니다. 특히 업계에서 사용하는 Spotfire 및 R 코드는 Spotfire에 쉽게 포함됩니다.
감사해요!
Re: Python 코드 실행 시 오류(JMP 수식 저장소를 통해 생성됨)네 정말 좋은 제안입니다!!! 저는 20년 동안 SAS 코드를 작성해왔기 때문에 파이썬을 잘하지 못합니다.
Re: Python 코드 실행 시 오류(JMP 수식 저장소를 통해 생성됨)안녕하세요.
R 언어 코드 생성에 대한 요청이 있었지만 안타깝게도 아직 제품이나 로드맵에 없습니다.
에 항목을 추가하는 것이 좋습니다. JMP 위시리스트 이 기능에 대한 일반적인 관심을 추적할 수 있습니다.
Re: Python 코드 실행 시 오류(JMP 수식 저장소를 통해 생성됨)도움이 되셨다니 다행입니다! JMP 코드를 복사하여 노트북에 붙여넣지 않는 것이 좋습니다. 이 코드는 매우 작은 모델에서만 작동하며 언급한 두 모델은 상당히 클 수 있습니다. 대신 내가 언급한 Discovery 노트북 예제에서와 같이 생성된 파일을 가져오십시오.
다음은 팁입니다. JMP에서 생성된 Python 코드와 제품과 함께 제공되는 도우미 파일 jmp_score.py 파일의 복사본을 저장한 동일한 디렉터리에서 노트북을 시작하면 Python에서 더 쉽게 찾을 수 있습니다. 이것 좀 봐 논의 상세 사항은.
Re: Python 코드 실행 시 오류(JMP 수식 저장소를 통해 생성됨)나시프,
질문이 하나 더 있습니다. 최신 버전에서는 Formular Depot이 R 코드를 생성합니까? 감사해요!
Re: Python 코드 실행 시 오류(JMP 수식 저장소를 통해 생성됨)나시프,
친절하고 빠른 답변 정말 감사합니다.이를 위해 매우 잘 작동합니다. JMP(부스트 트리/랜덤 포레스트 공식, jupyter 노트북을 복사하여 붙여넣는 데 시간이 오래 걸리는 것처럼 보이지만)으로 만든 더 복잡한 파이썬 코드를 시도해 보겠습니다.
Re: 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)
전체 예제는 첨부 파일을 참조하십시오. 또한 Formula Depot 코드 생성이 다루어진 Discovery 프레젠테이션에 첨부된 예제 코드를 살펴보십시오. 상자 밖에서 득점 그리고 궁극의 혜택 공유 .