Pythonコードを実行するとエラーが発生します(JMP式デポを通じて作成)JMP モデルは私に数式を与えてくれるので、その数式を渡して Python または R プログラムで使用したいと考えています。
式デポを通じて Python コードが生成され、その Python コードをコピーして Jupiter Notebook で実行しようとしましたが、常にエラーが発生します。
たとえば、JMP から作成したテスト ファイルと Python コードを添付して実行します。配列として認識されませんでした...助けてください。ありがとう!!! JMP で作成した Python コードをコピーして問題なく Python を実行するのは簡単だと思いました。そうではないようです....
def スコア(indata、outdata):
_temp_0 = う""
if (indata[u"Num"] > 50):
_temp_0 = u「高」
それ以外:
_temp_0 = u「低」
outdata[u"クラス"] = _temp_0
outdata[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 としてインポート
"" ============================================= ===================
Copyright(C) 2018 SAS Institute Inc.All Rights Reserved.
知らせ:
次の権限が付与されます。
上記の著作権とこの通知がスコアコードに表示され、
関連ドキュメント。コピー、変更の許可
を使用して生成されたスコアコードを配布します。
JMP(R) ソフトウェアは、SAS Institute Inc. (「SAS」) の顧客に限定されています。
および後続の第三者。明示的または明示的を問わず、いかなる保証もありません。
SAS.SAS およびその他すべての SAS による暗黙の義務、またはその他の義務
株式会社インスティチュートの製品・サービス名が登録されています
米国SAS Institute Inc.の商標または商標
この通知に含まれる場合を除き、
SAS Institute Inc. および JMP の名前は、
を伴わない製品またはサービスの広告または宣伝。
SAS Institute Inc. からの事前の書面による許可。
================================================= ================ 「」
""" JMP v13.2.1 によって生成された Python コード """
def getModelMetadata():
return {"作成者": u"列クラス"、"モデル名": u""、"予測": u""、"テーブル": u"Sheet2"、"バージョン": u"13.2.1"、"タイムスタンプ" ":u"2018-04-05T16:10:16Z"}
def getInputMetadata():
戻る {
u"数値": "浮動小数点数"
}
def getOutputMetadata():
戻る {
u"クラス": "str"
}
def スコア(indata、outdata):
_temp_0 = う""
if (indata[u"Num"] > 50):
_temp_0 = u「高」
それ以外:
_temp_0 = u「低」
outdata[u"クラス"] = _temp_0
outdata[u"class"] を返す
データは次のようになります
数値クラス
15 低
17 ロー
200高
60高
72 高
10 低
20 低
70 高
55高
20 低
854高
Re: Python コードを実行するとエラーが発生します (JMP 式デポで作成)パンダ何かを bool に変換しようとするとエラーが発生する numpy の規則に従います。 これは、ブール演算を使用する場合、または、and、or、または not で発生します。 結果がどうなったかは不明です。
例
5 == pd.Series([12,2,5,10])
得られる結果は、式の右側の pd.Series と同じサイズのブール値のシリーズです。 したがって、エラーが発生します。 ここでの問題は、pd.Series と値を比較しているため、上記の場合のように複数の True 値と複数の False 値が存在することです。 この条件は True または False ではないため、これはもちろんあいまいです。 操作の結果として単一のブール値が得られるように、結果をさらに集計する必要があります。 そのためには、条件を満たすために少なくとも 1 つ (任意の) 値が必要か、すべての値が必要かに応じて、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 、
投稿したコードに 2 つの問題が見つかりました。
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: 次回は、新しいディスカッションを開いて、文脈を知るためにこの 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 コードを書いているため、Python は苦手です。
Re: Python コードを実行するとエラーが発生します (JMP 式デポで作成)また会ったね、
R 言語のコード生成に関するリクエストがありましたが、残念ながら、まだ製品にもロードマップにも載っていません。
にエントリを追加することをお勧めしますJMPウィッシュリストこれにより、この機能に対する一般的な関心を追跡できるようになります。
Re: Python コードを実行するとエラーが発生します (JMP 式デポで作成)お役に立ててうれしいです! JMP コードをコピーしてノートブックに貼り付けないことをお勧めします。これは非常に小さなモデルでのみ機能し、あなたが言及した 2 つのモデルは非常に大きくなる可能性があります。 代わりに、前述した Discovery ノートブックの例のように、生成されたファイルをインポートするだけです。
ヒントは次のとおりです。JMP で生成された Python コードと、製品に付属のヘルパー ファイル jmp_score.py ファイルのコピーを保存したのと同じディレクトリでノートブックを起動すると、Python がコードをより簡単に見つけられるようになります。 これを参照してください議論詳細については。
Re: Python コードを実行するとエラーが発生します (JMP 式デポで作成)ナシフ
もう 1 つの質問ですが、新しいバージョンでは、Formular Depot は R コードを生成しますか?ありがとう!
Re: Python コードを実行するとエラーが発生します (JMP 式デポで作成)ナシフ
知識が豊富で素早いご回答をありがとうございました。これには非常にうまく機能します。 JMPで作成したより複雑なPythonコードを試してみます(ブーストツリー/ランダムフォレスト式。ただし、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 プレゼンテーションに添付されているコード例もご覧ください。ボックス外での得点と究極の恩恵を共有する。