HoloViewsで可視化力あげようとしたら環境構築でハマった


本記事のサマリ

pythonでグラフの可視化をするのに、holoviewsというmatplotlibやBokehなどの可視化ツールを使いやすくしたラッパ的なライブラリがあるのですが、
http://holoviews.org/#installation
を参考に、インストールして、サンプルコードを実行したところ、

import holoviews as hv

したときにエラーになってしまいました。

結論としては、「param:1.6.1-py_0」が悪さしていたので、ちゃんと動くparamをバージョンをインストールしたら動くようになりましたという話です。

対象読者

  • holoviews環境を構築していて、「ModuleNotFoundError: No module named 'param'」になってしまった方(おそらくエラーメッセージでググって、たどり着いた方)

動作確認バージョン

python --version
Python 3.6.0 :: Continuum Analytics, Inc.
conda --version
-> conda 4.3.8
jupyter --version
-> 4.3.0

経緯

よし、データ分析環境をRから、Pythonに乗り換えるぞ
-> グラフもちょっとインタラクティブなやつつかってみるか。
bokehを直接使おうと思ったけど、なんか、Holoviewsというラッパーが便利そう。
pipで環境構築 -> 動かん。。。
condaで環境構築 -> 動かん。。。
調査 -> 解決。
調べても同じように困っている人が出てこなかったので、投稿しておくか <- イマココ

最終的に動くようになったものはここ

https://github.com/yukimura1227/trainings/tree/master/jupyter_training
環境情報は、jupyter_training.yamlにexportしてあるので、

conda env create --file jupyter_training.yaml
source activate jupyter_training
jupyter notebook

としていただければ、動くことが確認出来ます。

遭遇したエラー

import holoviews as hv

holoviewsを利用するために、importすると、holoviewsが依存している、paramが無いようなErrorになりました。

ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-1-e0fc180c467c> in <module>()
      1 import numpy as np
----> 2 import holoviews as hv
      3 hv.extension('matplotlib')

~/.pyenv/versions/anaconda3-4.3.0/envs/jupyter_training/lib/python3.6/site-packages/holoviews/__init__.py in <module>()
      8 sys.path.insert(0, os.path.join(_cwd, '..', 'param'))
      9 
---> 10 import param
     11 
     12 __version__ = param.Version(release=(1,8,3), fpath=__file__,

ModuleNotFoundError: No module named 'param'

調査と解決策

調査結果

pythonをほとんど使ったことが無いので、いろいろと、調べたのですが、特に得られるものは無かったので
割愛します。
Errorになっているparamのバージョンを調べると、
param=1.6.1=py_0
担っていて、py_0??となったので、バージョンを下げました。
https://github.com/ioam/param/releases/tag/v1.6.1
を見ると、2018/06/24時点でlatest releaseになっていますが、直接 import param としてもうごかないようでした。

解決策

versionを下げて、こうなりました。
https://github.com/yukimura1227/jupyter_training/commit/d63b2a2489cd6ca4e049d2ecbccb8697613cc3e6

condaでinstallしているのですが、
以下のように、バージョンを指定して上げると、古いversionもインストールできるので、古いバージョンをインストールしました。

conda install -c <channel> <package_name>=<version>=<build_string>

具体的には、以下のように実行。
```
$ conda install -c ioam param=1.5.1=py36_0
Fetching package metadata ...........
Solving package specifications: .

Package plan for installation in environment /Users/yukimura1227/.pyenv/versions/anaconda3-4.3.0/envs/jupyter_training:

The following packages will be DOWNGRADED due to dependency conflicts:

param: 1.6.1-py_0 ioam --> 1.5.1-py36_0 ioam

Proceed ([y]/n)? y

param-1.5.1-py 100% |####################################################################################################| Time: 0:00:02 205.15 kB/s
```

これで、動くようになりましたので、めでたしめでたし