Cyrille Rossant :IPython データサイエンスクックブック

いろいろ難しい Python

作成日:2020-08-20
最終更新日:

概要

副題は「対話型コンピューティングと可視化のためのレシピ集」。 原題は "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, などなどである。モジュールに関しては次の通り。

1章 IPython による対話的コンピューティング入門

本書の 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 の動画は削除されているのだった。

4章 プロファイリングと最適化

実行時間計測

仕様が少し変更された。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)

5章 ハイパフォーマンスコンピューティング

Numba と Just-In-Timeコンパイル

純粋 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 倍以上の高速化は、私の実験でも確かめられた。

6 章 先進的ビジュアライゼーション

prettyplotweb

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 でアンインストールした。ごめんなさい。

seaborn

p.199 で、 seaborn による美しい統計グラフの作成で、ペアワイズ相関を表示するスクリプトがある。 ここでは、pandas を使っているので、まず import pandas as pd が必要である。 また、この処理をしたうえで sns.corrplot(df)を起動すると、次のエラーが出る。

AttributeError: module 'seaborn' has no attribute 'corrplot'

このエラーを解消して、なおかつ本書と同様の図を得る方法は見いだせていない。

7 章 統計データ解析

PyMC

p.245 からの 7.7 は、PyMC パッケージの利用例である。p.246の本文では、 新しいバージョン (PyMC3)が開発途上であるとのことだった。 しかし、2021-02-17 現在は PyMC3 を使うのが通常であるらしい。 したがって、PyMC3 を使うことにした。そうなると、インターフェースが変わるはずだ。 この本の第2版に基づいた Jupyter Notebook が Github で公開されている。 これによると、こちらは PyMC3 を使っていてインターフェースも変わっている。 なので、第2版に基づいて試してみるのがよさそうだ。時間があればやってみたい。

9 章 数値最適化

焼きなまし法

p.311 では、大域的最小点を見つけるために、 SciPy では method='Anneal' が指定されているが、現在はこのメソッドはない。 大域的最適化のためには、代わりに basinhopping 法が勧められているが、 この方法を適用するメソッドがわからない。

10章 信号処理

スライスの添字

レシピ 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 章 画像処理と音声処理

レナの画像

レシピ 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/

14 章 グラフ、幾何学、地理情報システム

NetworkX

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)]

15 章 記号処理と数値解析

Sympy

Sympy は記号処理を行うパッケージである。 少し試した限りではうまくいっている。

誤植

p.145 上から5行目「Number を使うことで、100 倍以上も高速化された。」 とあるが、正しくは「Numba を使うことで、100 倍以上も高速化された。」である。

Python の本

書誌情報

書 名IPython データサイエンスクックブック
著 者Cyrille Rossant
訳 者黒川 利明
技術監修石本 敦夫
発行日2018 年 3 月 22 日 初版第1刷
発行所オライリー・ジャパン
発売元オーム社
定 価3200 円(税別)
サイズ
ISBN978-4-87311-756-0
その他越谷市南部図書室で借りて読む
NDC

まりんきょ学問所コンピュータの部屋コンピュータの本Python > Cyrille Rossant:IPython データサイエンスクックブック


MARUYAMA Satosi