CADSリアルタイムスコアリングをRESTAPIで実行する

SPSS Collaboration And Deployment Services（以下CADS）ではSPSS Modelerで作ったストリームをREST API化してリアルタイム実行することができます。これをリアルタイム・スコアリングといいます。
今回はPythonプログラムからREST APIでのリアルタイム・スコアリングを実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0939da34-9591-7703-3c76-ca5a9c2ac821.png)

# 1. ストリームの確認

以下のストリームを使います。
[機械ID]と[温度]を入力すると、予測結果である[\$R-不良]と[\$RC-不良]を付与して戻すストリームです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b3d6bec7-7db6-692f-1486-98c09d9b228b.png)


# 2. スコアリング構成
確認したストリームをCADSのレポジトリに登録し、右クリックで[スコアリングの構成]でスコアリング構成のウィザードを立ち上げます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d3eedad0-3ab8-7e91-7f46-8d36d35689f5.png)

名前をつけて、後はデフォルトの設定のままで、[終了]をクリックして構成を完成させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/286d105c-210a-2fdf-8741-d8c6f503a160.png)

これでREST APIでのアクセスが可能になります。

# 3. Pythonプログラムの解説

まず以下のマニュアルに従って、httpのヘッダーを作成します。
ユーザーとパスワードをbase64でエンコーディングする必要があります。以下の例ではadminを使ってしまっていますが、本来はスコアリング専用のユーザーを作って使うことをお勧めします。

Specifying request headers - IBM Documentation

https://www.ibm.com/docs/ja/sc-and-ds/8.3.0?topic=client-specifying-request-headers#rest_scoring_specifying_headers

```python:ヘッダー作成
import base64
userpass_enc=str(base64.b64encode('admin:password'.encode()).decode("ascii"))

headers = {'Content-Type':'application/json;charset=utf-8',
           'Authorization': 'Basic {}'.format(userpass_enc),
          'Client-Accept-Language': 'ja-JP',
          'Accept-Language':'ja-JP'}

```
以下のマニュアルに従ってスコアリングリクエストのボディを作成します。

The scoreRequest object - IBM Documentation

https://www.ibm.com/docs/ja/sc-and-ds/8.3.0?topic=service-scorerequest-object

id：スコアリング構成で指定した名前
name: スコアリング枝の入力ノード名。以下の例だと「スコアリングデータ」です
input：説明変数名と値を指定します。リストオブジェクトなので、複数行を一度に渡すこともできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/05f2e5bd-0d21-318c-e6d5-ed10b4a3c08f.png)

```python:リクエスト・ボディ作成
input={
  "id":"FailPredict",
  "requestInputTable":[
    {
      "name":"スコアリングデータ",
      "requestInputRow":[
        {"input":[
           {"name":"機械ID","value":"1036"},
           {"name":"温度","value":"911.726"}
         ]}
      ]}
  ]}
```

以下のマニュアルに従ってURLを指定してPOSTします。

Specifying a request URL - IBM Documentation

https://www.ibm.com/docs/ja/sc-and-ds/8.3.0?topic=client-specifying-request-url#rest_scoring_specifying_url

requestをつかってpostします。
status_codeに200が戻れば成功です。

```python:リクエスト発行
import json
import requests
url="http://ms183-win19:9080/scoring/rest/configuration/FailPredict/score"
r_rts = requests.post(url, data=json.dumps(input),headers=headers)
print(r_rts.status_code)
```

post結果に対するjson()メソッドでスコア結果を得ることができます。
各エレメントは以下にマニュアルで解説されています。

The scoreResult object - IBM Documentation

https://www.ibm.com/docs/ja/sc-and-ds/8.3.0?topic=service-scoreresult-object

columnNames:出力列名のリスト
rowValues：出力結果のリストです。出力列名のリストの順序どおりに出力されます。

```python:レスポンス・ボディ確認
pprint.pprint(r_rts.json())
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b9cc4067-5153-3673-0be4-220adfa2781f.png)

上の例だと\$R-不良'='F', '\$RC-不良'=0.8809523809523809が返されています。


# 4.サンプル
サンプルは以下に置きました。

ストリーム

https://github.com/hkwd/spsssample/raw/master/20210921CADSRTS/%E4%B8%8D%E8%89%AF%E5%88%A4%E5%AE%9A.str
notebook

https://github.com/hkwd/spsssample/blob/master/20210921CADSRTS/RTSpub.ipynb

データ

https://github.com/hkwd/spsssample/blob/master/20210921CADSRTS/sensor_1036.csv

https://github.com/hkwd/spsssample/blob/master/20210921CADSRTS/sensor_summary.csv

■テスト環境
Modeler 18.3
Python 3.8.5
Windows 10 64bit

Collaboration and Deployment Services 8.3
Windows Server 2019


# 5.参考
Score POST - IBM Documentation 

https://www.ibm.com/docs/ja/sc-and-ds/8.3.0?topic=resource-score-post