SPSS Modelerの拡張ノードでPythonを利用する conda編

SPSS Modelerの拡張ノードでPythonを使ってみます。
@1000aki さんが[SPSS Modelerの拡張ノードでPythonを利用する ①セットアップと可視化](https://qiita.com/1000aki/items/72c3c9ea0fe00edd6d19)
の記事を書いていらっしゃいて、ここではPython＋pipで環境を準備されています。この組み合わせの方がミニマムでパッケージの管理ができますし、PATH設定の面倒もなく手堅いのですが、Condaによるパッケージ管理を使いたいケースもあります。

この記事ではconda環境でSPSS Modelerの拡張ノードを使いたいと思います。

■テスト環境
SPSS Modeler 18.2.2
Windows 2019
Python 3.7.7

# 1. miniconda の導入
condaはAnaconda Individual Edition(Anaconda Distribution)で導入することが多いと思いますが、今回はミニマムな環境作成を行いたいので、minicondaで導入したいと思います。

**1. miniconda Python 3.8のインストーラーのダウンロード**

以下のリンク先より、Python 3.8 Miniconda3 Windows 64-bitのインストーラーをダウンロードします。
https://docs.conda.io/en/latest/miniconda.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/505313f7-6f19-0c6b-38ec-035e4b990cf4.png)

**2. miniconda3 インストーラーの実行**

インストーラーを起動し、Nextで進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f1cc29de-a3a9-64f4-4a40-4cb4c66198b0.png)

License Agreementを確認し同意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/990cca5f-6f5c-39ff-91cc-9eee742ffc5b.png)

Install forはここでは"All Users"にしました。"Just Me"で構成することも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4bf8508f-ea33-aa25-5e07-bc24a48fe8e4.png)


Destination Folder を控えておきます。例では、C:\ProgramData\Miniconda3です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/179eb3fa-8ee6-0fbd-ecf4-25de8a4a8626.png)

Advanced Optionもそのままで進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d9c55863-388e-a68d-e7bf-1e2a2da56c82.png)

完了したらNextで進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fb0843de-b2a6-ba76-5e48-4e749f56c240.png)

チェックを外してFinishをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7b7f8301-f55a-3ccb-c9d6-19dcb80f7c56.png)


**3. conda環境の作成**
Modeler 18.2.2で使えるPythonが3.7.7ですし、他の環境と分ける方が望ましいので、専用のConda環境を作ります。
また、私が試した環境ではどうもAnaconda Public Repositoryのscipyなどがうまく動きませんでしたので、conda-forgeからパッケージを入手して環境を作りたいと思います。

modelerというenvironmentをPython 3.7.7、Conda-forgeからのパッケージで作ります。

```console
conda config --append channels conda-forge
conda create -c conda-forge -n modeler python=3.7.7 conda
conda activate modeler
```
```:実行例
(base) C:\Users\dsuser01>conda config --append channels conda-forge

(base) C:\Users\dsuser01>conda create -c conda-forge -n modeler python=3.7.7 conda
Collecting package metadata (current_repodata.json): done
Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source.
Collecting package metadata (repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: C:\Users\dsuser01\.conda\envs\modeler

  added / updated specs:
    - conda
    - python=3.7.7


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    brotlipy-0.7.0             |py37hcc03f2d_1001         368 KB  conda-forge
    ca-certificates-2020.12.5  |       h5b45459_0         173 KB  conda-forge
    certifi-2020.12.5          |   py37h03978a9_1         143 KB  conda-forge
    cffi-1.14.5                |   py37hd8e9650_0         226 KB  conda-forge
    chardet-4.0.0              |   py37h03978a9_1         215 KB  conda-forge
    conda-4.9.2                |   py37h03978a9_0         3.0 MB  conda-forge
    conda-package-handling-1.7.2|   py37h6dbccfb_0         710 KB  conda-forge
    cryptography-3.4.6         |   py37h20c650d_0         709 KB  conda-forge
    idna-2.10                  |     pyh9f0ad1d_0          52 KB  conda-forge
    menuinst-1.4.16            |   py37hc8dfbb8_1          95 KB  conda-forge
    openssl-1.1.1j             |       h8ffe710_0         5.8 MB  conda-forge
    pip-21.0.1                 |     pyhd8ed1ab_0         1.1 MB  conda-forge
    pycosat-0.6.3              |py37hcc03f2d_1006         102 KB  conda-forge
    pycparser-2.20             |     pyh9f0ad1d_2          94 KB  conda-forge
    pyopenssl-20.0.1           |     pyhd8ed1ab_0          48 KB  conda-forge
    pysocks-1.7.1              |   py37h03978a9_3          28 KB  conda-forge
    python-3.7.7               |       h81c818b_4        14.3 MB
    python_abi-3.7             |          1_cp37m           4 KB  conda-forge
    pywin32-300                |   py37hcc03f2d_0         6.9 MB  conda-forge
    requests-2.25.1            |     pyhd3deb0d_0          51 KB  conda-forge
    ruamel_yaml-0.15.80        |py37hcc03f2d_1004         277 KB  conda-forge
    setuptools-49.6.0          |   py37h03978a9_3         931 KB  conda-forge
    six-1.15.0                 |     pyh9f0ad1d_0          14 KB  conda-forge
    sqlite-3.35.2              |       h8ffe710_0         1.2 MB  conda-forge
    tqdm-4.59.0                |     pyhd8ed1ab_0          77 KB  conda-forge
    urllib3-1.26.4             |     pyhd8ed1ab_0          99 KB  conda-forge
    vc-14.2                    |       hb210afc_4          13 KB  conda-forge
    vs2015_runtime-14.28.29325 |       h5e1d092_4         2.3 MB  conda-forge
    wheel-0.36.2               |     pyhd3deb0d_0          31 KB  conda-forge
    win_inet_pton-1.1.0        |   py37h03978a9_2           8 KB  conda-forge
    wincertstore-0.2           |py37h03978a9_1006          15 KB  conda-forge
    yaml-0.2.5                 |       he774522_0          61 KB  conda-forge
    ------------------------------------------------------------
                                           Total:        39.0 MB

The following NEW packages will be INSTALLED:

  brotlipy           conda-forge/win-64::brotlipy-0.7.0-py37hcc03f2d_1001
  ca-certificates    conda-forge/win-64::ca-certificates-2020.12.5-h5b45459_0
  certifi            conda-forge/win-64::certifi-2020.12.5-py37h03978a9_1
  cffi               conda-forge/win-64::cffi-1.14.5-py37hd8e9650_0
  chardet            conda-forge/win-64::chardet-4.0.0-py37h03978a9_1
  conda              conda-forge/win-64::conda-4.9.2-py37h03978a9_0
  conda-package-han~ conda-forge/win-64::conda-package-handling-1.7.2-py37h6dbccfb_0
  cryptography       conda-forge/win-64::cryptography-3.4.6-py37h20c650d_0
  idna               conda-forge/noarch::idna-2.10-pyh9f0ad1d_0
  menuinst           conda-forge/win-64::menuinst-1.4.16-py37hc8dfbb8_1
  openssl            conda-forge/win-64::openssl-1.1.1j-h8ffe710_0
  pip                conda-forge/noarch::pip-21.0.1-pyhd8ed1ab_0
  pycosat            conda-forge/win-64::pycosat-0.6.3-py37hcc03f2d_1006
  pycparser          conda-forge/noarch::pycparser-2.20-pyh9f0ad1d_2
  pyopenssl          conda-forge/noarch::pyopenssl-20.0.1-pyhd8ed1ab_0
  pysocks            conda-forge/win-64::pysocks-1.7.1-py37h03978a9_3
  python             pkgs/main/win-64::python-3.7.7-h81c818b_4
  python_abi         conda-forge/win-64::python_abi-3.7-1_cp37m
  pywin32            conda-forge/win-64::pywin32-300-py37hcc03f2d_0
  requests           conda-forge/noarch::requests-2.25.1-pyhd3deb0d_0
  ruamel_yaml        conda-forge/win-64::ruamel_yaml-0.15.80-py37hcc03f2d_1004
  setuptools         conda-forge/win-64::setuptools-49.6.0-py37h03978a9_3
  six                conda-forge/noarch::six-1.15.0-pyh9f0ad1d_0
  sqlite             conda-forge/win-64::sqlite-3.35.2-h8ffe710_0
  tqdm               conda-forge/noarch::tqdm-4.59.0-pyhd8ed1ab_0
  urllib3            conda-forge/noarch::urllib3-1.26.4-pyhd8ed1ab_0
  vc                 conda-forge/win-64::vc-14.2-hb210afc_4
  vs2015_runtime     conda-forge/win-64::vs2015_runtime-14.28.29325-h5e1d092_4
  wheel              conda-forge/noarch::wheel-0.36.2-pyhd3deb0d_0
  win_inet_pton      conda-forge/win-64::win_inet_pton-1.1.0-py37h03978a9_2
  wincertstore       conda-forge/win-64::wincertstore-0.2-py37h03978a9_1006
  yaml               conda-forge/win-64::yaml-0.2.5-he774522_0


Proceed ([y]/n)?

-------中略-----------
done
#
# To activate this environment, use
#
#     $ conda activate modeler
#
# To deactivate an active environment, use
#
#     $ conda deactivate


(base) C:\Users\dsuser01>

```

作成したmodelerの環境に切り替えます。
プロンプト頭に(modeler) が入ります。

```console
conda info -e
conda activate modeler
```
```:実行例
(C:\ProgramData\Miniconda3) C:\Users\dsuser01>conda info -e
# conda environments:
#
base                  *  C:\ProgramData\Miniconda3
modeler                  C:\Users\dsuser01\.conda\envs\modeler


(C:\ProgramData\Miniconda3) C:\Users\dsuser01>conda activate modeler

(modeler) C:\Users\dsuser01>
```

numpyを試しに導入してみます。

```console
conda install -c conda-forge numpy

```
```:実行例
(modeler) C:\Users\dsuser01>conda install -c conda-forge numpy
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: C:\Users\dsuser01\.conda\envs\modeler

  added / updated specs:
    - numpy


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    intel-openmp-2020.3        |     h57928b3_311         2.0 MB  conda-forge
    libblas-3.9.0              |            8_mkl         3.9 MB  conda-forge
    libcblas-3.9.0             |            8_mkl         3.9 MB  conda-forge
    liblapack-3.9.0            |            8_mkl         3.9 MB  conda-forge
    mkl-2020.4                 |     hb70f87d_311       172.4 MB  conda-forge
    numpy-1.20.1               |   py37hd20adf4_0         5.2 MB  conda-forge
    ------------------------------------------------------------
                                           Total:       191.3 MB

The following NEW packages will be INSTALLED:

  intel-openmp       conda-forge/win-64::intel-openmp-2020.3-h57928b3_311
  libblas            conda-forge/win-64::libblas-3.9.0-8_mkl
  libcblas           conda-forge/win-64::libcblas-3.9.0-8_mkl
  liblapack          conda-forge/win-64::liblapack-3.9.0-8_mkl
  mkl                conda-forge/win-64::mkl-2020.4-hb70f87d_311
  numpy              conda-forge/win-64::numpy-1.20.1-py37hd20adf4_0


Proceed ([y]/n)?
Downloading and Extracting Packages
numpy-1.20.1         | 5.2 MB    | ############################################################################ | 100%
liblapack-3.9.0      | 3.9 MB    | ############################################################################ | 100%
intel-openmp-2020.3  | 2.0 MB    | ############################################################################ | 100%
libcblas-3.9.0       | 3.9 MB    | ############################################################################ | 100%
libblas-3.9.0        | 3.9 MB    | ############################################################################ | 100%
mkl-2020.4           | 172.4 MB  | ############################################################################ | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done

(modeler) C:\Users\dsuser01>
```

作成した環境のパッケージを確認します。
作成した2021/2/26の時点では以下のバージョンでパッケージがそろえられました。Python3.7.7だけはconda-forgeになかったようでAnaconda Public Repositoryから取得し、それ以外はconda-forgeから取得できていました。

```console
conda list --show-channel-urls
```
```:実行例
(modeler) C:\Users\dsuser01>conda list --show-channel-urls
# packages in environment at C:\Users\dsuser01\.conda\envs\modeler:
#
# Name                    Version                   Build  Channel
brotlipy                  0.7.0           py37hcc03f2d_1001    conda-forge
ca-certificates           2020.12.5            h5b45459_0    conda-forge
certifi                   2020.12.5        py37h03978a9_1    conda-forge
cffi                      1.14.5           py37hd8e9650_0    conda-forge
chardet                   4.0.0            py37h03978a9_1    conda-forge
conda                     4.9.2            py37h03978a9_0    conda-forge
conda-package-handling    1.7.2            py37h6dbccfb_0    conda-forge
cryptography              3.4.6            py37h20c650d_0    conda-forge
idna                      2.10               pyh9f0ad1d_0    conda-forge
intel-openmp              2020.3             h57928b3_311    conda-forge
libblas                   3.9.0                     8_mkl    conda-forge
libcblas                  3.9.0                     8_mkl    conda-forge
liblapack                 3.9.0                     8_mkl    conda-forge
menuinst                  1.4.16           py37hc8dfbb8_1    conda-forge
mkl                       2020.4             hb70f87d_311    conda-forge
numpy                     1.20.1           py37hd20adf4_0    conda-forge
openssl                   1.1.1j               h8ffe710_0    conda-forge
pip                       21.0.1             pyhd8ed1ab_0    conda-forge
pycosat                   0.6.3           py37hcc03f2d_1006    conda-forge
pycparser                 2.20               pyh9f0ad1d_2    conda-forge
pyopenssl                 20.0.1             pyhd8ed1ab_0    conda-forge
pysocks                   1.7.1            py37h03978a9_3    conda-forge
python                    3.7.7                h81c818b_4    defaults
python_abi                3.7                     1_cp37m    conda-forge
pywin32                   300              py37hcc03f2d_0    conda-forge
requests                  2.25.1             pyhd3deb0d_0    conda-forge
ruamel_yaml               0.15.80         py37hcc03f2d_1004    conda-forge
setuptools                49.6.0           py37h03978a9_3    conda-forge
six                       1.15.0             pyh9f0ad1d_0    conda-forge
sqlite                    3.35.2               h8ffe710_0    conda-forge
tqdm                      4.59.0             pyhd8ed1ab_0    conda-forge
urllib3                   1.26.4             pyhd8ed1ab_0    conda-forge
vc                        14.2                 hb210afc_4    conda-forge
vs2015_runtime            14.28.29325          h5e1d092_4    conda-forge
wheel                     0.36.2             pyhd3deb0d_0    conda-forge
win_inet_pton             1.1.0            py37h03978a9_2    conda-forge
wincertstore              0.2             py37h03978a9_1006    conda-forge
yaml                      0.2.5                he774522_0    conda-forge

(modeler) C:\Users\dsuser01>
```

このmodeler環境のPATHを確認します。

```console
echo %PATH%
```
```:実行例
(modeler) C:\Users\dsuser01>echo %PATH%
C:\Users\dsuser01\.conda\envs\modeler;C:\Users\dsuser01\.conda\envs\modeler\Library\mingw-w64\bin;C:\Users\dsuser01\.conda\envs\modeler\Library\usr\bin;C:\Users\dsuser01\.conda\envs\modeler\Library\bin;C:\Users\dsuser01\.conda\envs\modeler\Scripts;C:\Users\dsuser01\.conda\envs\modeler\bin;C:\ProgramData\Miniconda3\condabin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\Program Files\ibm\gsk8\lib64;C:\Program Files (x86)\ibm\gsk8\lib;C:\PROGRA~1\IBM\SQLLIB\BIN;C:\PROGRA~1\IBM\SQLLIB\FUNCTION;C:\PROGRA~1\IBM\SQLLIB\SAMPLES\REPL;C:\Program Files\Amazon\AWSCLIV2;C:\Users\dsuser01\AppData\Local\Microsoft\WindowsApps;.
```

このPATHからminiconda関係のPATHが必要になります。システムやユーザーのPATHに加えることもできますが、なるべく環境に影響を与えないために、これらのPATHをセットしてからModelerを起動するバッチを作っておきます。

```bat:modeler1822conda.bat
set Path=C:\Users\dsuser01\.conda\envs\modeler;C:\Users\dsuser01\.conda\envs\modeler\Library\mingw-w64\bin;C:\Users\dsuser01\.conda\envs\modeler\Library\usr\bin;C:\Users\dsuser01\.conda\envs\modeler\Library\bin;C:\Users\dsuser01\.conda\envs\modeler\Scripts;C:\Users\dsuser01\.conda\envs\modeler\bin;C:\ProgramData\Miniconda3\condabin;%PATH%
start "" "C:\Program Files\IBM\SPSS\Modeler\18.2.2\bin\modelerclient.exe"
```

# 2. SPSS Modeler用に 独自の Python インストール済み環境を指定

メモ帳などで options.cfg を開きます。options.cfgの更新にはOSの管理者権限が必要です。

options.cfg のデフォルトのパスは下記です。
C:\Program Files\IBM\SPSS\Modeler\18.2.2\config\options.cfg

eas_pyspark_python_path にconda info -eで得られた                  C:\Users\dsuser01\.conda\envs\modelerの python.exe のパスを指定し、上書き保存します。パスの区切り文字はバックスラッシュ（円マーク）を重ねるか、スラッシュに変更します。

```:options.cfg
# Set to the full path to the python executable (including the executable name) to enable use of PySpark.
eas_pyspark_python_path, "C:<python_install_location>/python.exe"
```
```:記載例
# Set to the full path to the python executable (including the executable name) to enable use of PySpark.
eas_pyspark_python_path, "C:/Users/dsuser01/.conda/envs/modeler/python.exe"
```



# 3. SPSS Modelerでの動作確認
作成しておいたmodeler1822conda.batでModelerを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/89e10f2f-7e6a-908a-0d2e-a507466c1bf2.png)

以下の[サンプルストリーム](
https://github.com/hkwd/210224PythonExtension/raw/master/pythontest/pythontest.str)を実行してみます。
特に

* Pythonのバージョン
* python.exeのパス
* numpyのバージョン

が作成したmodelerのconda環境のものと一致するかを確認してください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c49f9c49-eed7-28b6-f58d-48fcea099c00.png)

# 4. Modeler Serverでの設定
Modelerクライアントであれば上記のバッチで起動することができますが、Modeler Serverはそうはいきません。システムの環境変数にバッチの中に書いたPATHを設定する必要があります。他にPythonの環境があるとその優先順位によって参照先が変わりうるので、注意してください。

# 5. サンプルファイル

[options.cfg](https://github.com/hkwd/210224PythonExtension/blob/master/pythontest/options.cfg)
conda環境のpython.exeをeas_pyspark_python_pathに設定したoptions.cfgです。

[modeler1822conda.bat](https://github.com/hkwd/210224PythonExtension/blob/master/pythontest/modeler1822conda.bat)
conda環境へのPATHを通してからModelerクライアント起動するbatファイルです。

[pythontest.str](
https://github.com/hkwd/210224PythonExtension/raw/master/pythontest/pythontest.str)
pythonやnumpyのバージョンを出力するテスト用のストリームです。