公開しつつ書き足し書き足し、、、
#Pythonデータサイエンスハンドブック
(Python Data Science Handbook)
##1. IPython:Pythonより優れた Python
(IPython: Beyond Normal Python)
Pythonの開発環境には多くの選択肢があり、自分の仕事でどれを使うか私もよく悩む。
それに対する私の答えはときどき人々を驚かせる。
私の好む環境はIpythonとテキストエディタを併せて使うことだ。
(私の場合、EmacsとAtomを気分によって使い分けている)
Ipython(Interactive Python の略)は2001年にFernando Perezによって拡張pythonインタプリタとして開発され、「リサーチコンピューティングのライフサイクル全体のためのツール」を産み出すことに焦点をあてたプロジェクトへ成長してきた。
pythonが我々のデータサイエンスのタスクのためのエンジンであるならば、
Ipythonはインタラクティブなコントロールパネルであると捉えることができる。
Ipythonは、有用なpythonのインタラクティブインターフェースであると同時に、多くの有用な(文法的)(拡張)機能をもたらしている。(そのなかでも特に有用なものが以下である。)
加えて、Ipythonは我々の開発、共同作業、共有、データサイエンスの結果の発表に役立つブラウザベースのノートブックを開発しているJupyterProjectと密接なかかわりがある。
IpythonノートブックはJuliaやRやその他のプログラミング言語用のノートブックを含む、数あるJupyter notebook群のなかでも特殊なケースである。
ノートブック形式の便利さを示す例として、いまあなたが読んでいるページ以外になにも見る必要がないことが挙げられる。この本の原稿のすべてが1組のIpythonノートブックで構成されているからである。
IPythonは対話的な科学的、データ集約型コンピューティング(data-intensive computing)のための効果的なpythonの使い方である。まずこの章は、データサイエンスに有用ないくつかのIpythonの機能(特にIpythonがpythonの基本的な機能の範囲を超えて提供する文法)に足を踏み入れることからはじまる。次に、私たちはさらに有用な、データサイエンスのプログラムを作ったり使ったりする日常のタスクを加速させることのできる"マジックコマンド"のいくつかの世界へと踏み込みます。最後に、データを理解し、結果を共有するのに役立つノートブックの特徴のいくつかに触れていく。
####シェルかノートブックか?
この章で議論するIpythonの使い道には2つある。IpythonのシェルとIpythonのノートブックだ。この章で扱う内容の大半はこの両方に関連があり、提示する例はどちらが便利かによって切り替えられるだろう。わずかに、どちらかにしか関連のない部分もあるが、そのときは明示的にそのことを述べる。はじめるまえに、IpythonシェルとIpythonノートブックの起動のしかたについて述べる。
####Ipythonシェルの起動
この章は、(この本の大半がそうだが、)受動的に身につくようにはできていない。この章を読みながら、自分でも文法やツールを使って体験してみることをおすすめする。これによって得られるマッスルメモリーは、単にこの章を読んで得られるものよりもはるかに有用である。
コマンドラインでipython
と打ち込み、Ipythonを起動することからはじめよう。AnacondaやEPDをインストールしている場合はそれに適したランチャーがあるはずだ。
打ち込むと、以下のようにプロンプトに表示されるはずだ。
IPython 4.0.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]:
これで、次へすすむための準備ができた。
####JupyterNotebookの起動
JupyterNotebookはブラウザベースのIPythonのGUIであり、さらに動的に表示する機能の豊富なセットを持っている。Python/IPythonの構文を実行できるのに加え、ユーザーはノートブックの中に、フォーマット済みテキスト、静的or動的視覚効果、数式、JavaScriptウィジェット、などを含めることができる。そのうえ、これらのドキュメントは、他の人が自身で実行できる形式で保存することができる。
webブラウザウィンドウでIPythonノートブックの閲覧・編集ができるが、pythonのコードを実行するためにwebブラウザをpythonプロセスと接続する必要がある。このプロセス(カーネルとも呼ばれている)はシェルで以下のコードを実行することで起動できる。
$ jupyter notebook
このコマンドは、自身のブラウザで見れるローカルwebサーバを起動する。このサーバがなにをしているかのログがすぐに吐き出される。以下のように。
$ jupyter notebook
[NotebookApp] Serving notebooks from local directory: /Users/jakevdp/PythonDataScienceHandbook
[NotebookApp] 0 active kernels
[NotebookApp] The IPython Notebook is running at: http://localhost:8888/
[NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
このコマンドの実行後、デフォルトに設定されているブラウザが自動的にローカルURLを開き誘導してくれるはずだ。(実際のアドレスは環境によって異なる。)
もし自動的にブラウザが開かない場合、手動で以下のアドレスに飛ぶことでウィンドウを開いてもよい。(今回の例ではhttp://localhost:8888/)
###IPythonのヘルプとドキュメント
もしこの章で他の節を読まないつもりでも、この節だけは読んでほしい。
なぜならここで議論するツールが私のワークフローに対するIPythonの改善に最も貢献したことに気づいたからである。
技術志向の人が、コンピューターの困りごとについて友達・家族・同僚に助けを求められたとき、ほとんどの場合、その問題に対する答えを知っていることと同じくらい、素早く答えにたどり着く方法を知っていることが重要である。データサイエンスの世界でも同じである。オンラインの文書やメーリングリストのスレッド、StackOverflowの回答など、検索可能なwebリソースは豊富な情報を含んでいる。それがたとえ(あるいは特に)あなたが過去に検索したことのある話題だったとしても。ほんとうの専門家になることとは、あらゆる状況で使えるツールやコマンドをどれだけ覚えることよりむしろ、web検索エンジンでも、どれだけ効果的に自分の知らない情報を探し当てることができるかである。
IPython/Jupyterの最も有用な機能のひとつは、ユーザーとドキュメントの種類と作業を効率的に行うための検索の間のギャップを縮めることである。web検索がいまだに複雑な問題に対して答えを提示する役割を果たしていると同時に、IPythonのみを通して驚くべき量の情報を得ることができる。Ipythonが少ないキーストロークで答えることのできる質問の例が以下である。
・この関数はどうやって呼び出せばいいの?引数やオプションにはどんなものがあるの?
・このpythonオブジェクトのソースコードはどうなってるの?
・インポートしたこのパッケージには何が入っているの?どんな属性やメソッドをもっているの?
ここからは、こんな情報に素早くアクセスすることのできるIpythonのツールについて議論していく。つまりは、ドキュメントを探すための"?"やソースコードを探すための"??"、そして自動補完のためのタブキーについてである。
####?を用いたドキュメントへのアクセス
pythonという言語やそのデータサイエンスエコシステムはユーザーを念頭に置いてつくられており、その心遣いのうち大きな1つがドキュメントへのアクセスである。pythonのオブジェクトはすべてdocstring(ドキュメンテーション文字列)と呼ばれる文字列への参照を含んでいる。これらはほとんどの場合そのオブジェクトの使用法の簡潔な要約である。pythonはhelp()
という情報にアクセスし表示させるビルトイン関数を持っている。例えば、len
というビルトイン関数のドキュメントを見たいときは、以下のようにすればよい。
In [1]: help(len)
Help on built-in function len in module builtins:
len(...)
len(object) -> integer
Return the number of items of a sequence or mapping.
インタプリタによっては、この情報はインラインテキストとして表示されるか、分離したポップアップウィンドウとして表示されるかもしれない。
オブジェクトにに関するヘルプを探すことが一般的で便利なため、Ipythonは短い"?"によってこのドキュメントや関連した情報へのアクセスをもたらしている。
In [2]: len?
Type: builtin_function_or_method
String form: <built-in function len>
Namespace: Python builtin
Docstring:
len(object) -> integer
Return the number of items of a sequence or mapping.
この書き方はオブジェクトのメソッドを含むあらゆるものに対して有効である。
In [3]: L = [1, 2, 3]
In [4]: L.insert?
Type: builtin_function_or_method
String form: <built-in method insert of list object at 0x1024b8ea8>
Docstring: L.insert(index, object) -- insert object before index
あるいはオブジェクト自身でさえも、型情報からはじまるドキュメントを持っている。
In [5]: L?
Type: list
String form: [1, 2, 3]
Length: 3
Docstring:
list() -> new empty list
list(iterable) -> new list initialized from iterable's items
重要なことは、これが関数や自分で作ったオブジェクトにも有効なことだ!ちいさな関数にこんなふうにdocstringを定義したとしよう。
In [6]: def square(a):
....: """Return the square of a."""
....: return a ** 2
....:
この関数にdocstringを作成するにあたって、今回は簡単に1列の文字列リテラルを書いただけであることに気を付けてほしい。pythonの"""は複数行にまたがって使われるしきたりがあり、ふつうdocstringとは複数行にわたるものであるからだ。
さあ、このdocstringを探すために、"?"を使ってみよう。
In [7]: square?
Type: function
String form: <function square at 0x103713cb0>
Definition: square(a)
Docstring: Return the square of a.