副題は「対話型コンピューティングと可視化のためのレシピ集」。 原題は "IPython Interactive Computing and Visualization Cookbook"。本書のホームページと GitHub リポジトリは次の通り:
2020 年 9 月現在、翻訳も第2版が出ている。
さて、この初版本だが、私には難しい。 なお、この本の出版時点では $ ipython notebook だったのが、 訳注にもある通り今では $ jupyter notebook である。以下、jupyter として説明する
私の環境は、Windows Subsystem for Linux 2 (WSL2) の Ubuntu 20.04 、 Python 3.8.5, IPython 7.20.0, などなどである。モジュールに関しては次の通り。
本書の p.11 によれば、YouTube を notebook に出すコマンドは次の通りであるが、 私の環境ではエラーとなる。
YouTubeVideo('jpYpkSX7NNM') --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-5-2dd06fabbaf2> in <module> ----> 1 YouTubeVideo('jpYpkSX7NNM') NameError: name 'YouTubeVideo' is not defined
これを防ぐには、IPython.dsplayモジュールからYouTubeVideoクラスをインポートすればよい。
from IPython.display import YouTubeVideo YouTubeVideo('jpYpkSX7NNM')
もっとも、上記を指定してもすでに YouTube の動画は削除されているのだった。
仕様が少し変更された。p.106 のコードは次のようになる。
In [1]:n = 100000
In [2]:%timeit sum([1. / 1**2 for i in range(1,n)])
6.91 ms ± 197 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [3]:%%timeit s = 0.
for i in range(1, n):
s+= 1. / i**2
99.3 ms ± 3.13 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [4]:import numpy as np
In [5]:%timeit np.sum(1. /np.arange(1.,n)**2)
3.04 ms ± 435 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
純粋 Python コードは次の通りである。
7.01 s ± 2 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
32 ms ± 4.94 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
本文の例とは多少違うが、本文の結論である、100 倍以上の高速化は、私の実験でも確かめられた。
p.194 で、レシピ 6.1 prettyplotlib を使った、matplotlib 描画の見栄え改善、 というページがある。$ pip3 install prettyplotlib でインストールして本の通り実行したが、 次のエラーが出てきて描画できない。
KeyError: 'axes.color_cycle is not a valid rc parameter (see rcParams.keys() for a list of valid parameters)'
prettyplotlib の Github の最終更新は 6 年前である。これは使えないと思い、 $ pip3 uninstall prettyplotlib でアンインストールした。ごめんなさい。
p.199 で、 seaborn による美しい統計グラフの作成で、ペアワイズ相関を表示するスクリプトがある。 ここでは、pandas を使っているので、まず import pandas as pd が必要である。 また、この処理をしたうえで sns.corrplot(df)を起動すると、次のエラーが出る。
AttributeError: module 'seaborn' has no attribute 'corrplot'
このエラーを解消して、なおかつ本書と同様の図を得る方法は見いだせていない。
p.245 からの 7.7 は、PyMC パッケージの利用例である。p.246の本文では、 新しいバージョン (PyMC3)が開発途上であるとのことだった。 しかし、2021-02-17 現在は PyMC3 を使うのが通常であるらしい。 したがって、PyMC3 を使うことにした。そうなると、インターフェースが変わるはずだ。 この本の第2版に基づいた Jupyter Notebook が Github で公開されている。 これによると、こちらは PyMC3 を使っていてインターフェースも変わっている。 なので、第2版に基づいて試してみるのがよさそうだ。時間があればやってみたい。
p.311 では、大域的最小点を見つけるために、 SciPy では method='Anneal' が指定されているが、現在はこのメソッドはない。 大域的最適化のためには、代わりに basinhopping 法が勧められているが、 この方法を適用するメソッドがわからない。
レシピ 10.3 は時系列の自己相関である。 pp.339-341 にかけて、その処理を追っていったら、エラーが生じた。
in autocorr(x) 1 def autocorr(x): 2 result = np.correlate(x, x, mode='full') ----> 3 return result[result.size/2:] TypeError: slice indices must be integers or None or have an __index__ method
スライスの添字は、整数か、なしか、__index__ メソッド(で得られる値)に限られる、 といっている。なるほど。仮に result.size が奇数であれば小数点が出てしまうから、 理由はわかる。ではどうするか。演算子 / の代わりに // を使えばいいのか。
さあどうだろう。本と同じグラフが2種類表示された。まずはめでたい。しかし、 注意書きも一緒に表示された。
MatplotlibDeprecationWarning: Adding an axes using the same arguments
as a previous axes currently reuses the earlier instance.
In a future version, a new instance will always be created and returned.
Meanwhile, this warning can be suppressed, and the future behavior ensured,
by passing a unique label to each axes instance.
plt.subplot(121)
同じメッセージが plt.subplot(122) に対しても表示されている。
このメッセージを消す方法がわからない。このままにしておく。
レシピ 11.2 画像のフィルタ処理では、画像処理によく用いられているレナの画像をサンプルとして、 フィルタが説明されている。しかし、この画像を本書の通り使おうとしても、 データがないと言われる。
In[6] img = skimage.img_as_float(skid.lena())[...,0] --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-6-0b5b5763d10d> in <module> ----> 1 img = skimage.img_as_float(skid.lena())[...,0] AttributeError: module 'skimage.data' has no attribute 'lena'
きっと削除されたのだろう。 そのあたりの事情は下記にある。 https://blog.integrityworks.co.jp/2019/12/10/python-scikit-image-lena/
p.409 で、NetworkX を使ったグラフ操作について手順が掲載されている。 その隣接行列の表示が、本書とは異なっている。 In [6]: print(nx.adjacency_matrix(g)) に関する出力は、本書は次の通り。
[[ 0. 1. 1. 0. 0. 0. 0. 0. 1. 1.] [ 1. 0. 1. 1. 0. 0. 0. 0. 0. 1.] ... [ 1. 0. 0. 0. 0. 0. 1. 1. 0. 1.] [ 1. 1. 0. 0. 0. 0. 0. 1. 1. 0.]]
私の環境(networkx 2.4)では次の通り。
(0, 1) 1 (0, 2) 1 (0, 8) 1 (0, 9) 1 (1, 0) 1 (1, 2) 1 (1, 3) 1 (1, 9) 1 ... (8, 0) 1 (8, 6) 1 (8, 7) 1 (8, 9) 1 (9, 0) 1 (9, 1) 1 (9, 7) 1 (9, 8) 1
また、p.410 In[9] の、color を指定する文は、本書は次の通りである。
color = [g.node[i].get('color', '#88b0f3') for i in range(n+1)]
この文を実行すると、次のエラーとなる。
'Graph' object has no attribute 'node'
networkx 2.4 では、node[i] ではなく、nodes[i] である。
color = [g.nodes[i].get('color', '#88b0f3') for i in range(n+1)]
Sympy は記号処理を行うパッケージである。 少し試した限りではうまくいっている。
p.145 上から5行目「Number を使うことで、100 倍以上も高速化された。」 とあるが、正しくは「Numba を使うことで、100 倍以上も高速化された。」である。
書名 | IPython データサイエンスクックブック |
著者 | Cyrille Rossant |
訳者 | 黒川 利明 |
技術監修 | 石本 敦夫 |
発行日 | 2018 年 3 月 22 日 初版第1刷 |
発行所 | オライリー・ジャパン |
発売元 | オーム社 |
定価 | 3200 円(税別) |
サイズ | 版 |
ISBN | 978-4-87311-756-0 |
その他 | 越谷市立図書館で借りて読む |
NDC |
まりんきょ学問所 > コンピュータの部屋 > コンピュータの本 > Python > Cyrille Rossant:IPython データサイエンスクックブック