[Cloud103]#3 Jupyter Notebook再び

# AGENDA

0.はじめに
1.Pythonの思い出し
2.Jupyter Notebookとは？
3.try.jupyter.orgを使ってみよう
4.便利な使い方
5.Try環境ではできないけど・・・

# 0.はじめに

この社内勉強会シリーズでは昨年も何回かPython/Jupyter Notebookを取り上げました。

[[Cloud102]#1 Pythonを始めよう(第1部 Pythonはじめの一歩)](http://qiita.com/nagahisa/items/f378ff23d93119cb3c60)

ただ、いくら外部環境構築が簡単・無料とは言え Azure ML StudioやGCPを使ったので、本来のPython/Jupyter Notebookの説明にはあまり時間が使えませんでした。

今回は、まったく準備なしで使える環境を使って、Python/Jupyter Notebookの使い方を復習したいと思います。

# 1.Pythonの思い出し

これです。
https://www.python.org/
<img width="804" alt="00.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/e23d6aa8-c7fe-e605-759e-3b1467bf8181.jpeg">


いろいろ良い資料がネット上にたくさんあるので、ググって見てください :smile: 

## (1)まずはサンプルコード

MacなどPythonが使える環境をお持ちのかたは以下をコピペ＆実行してみましょう！

sample.py

```
import datetime, time

def main():
  for count in range(0, 10):
    print_current_time()
    time.sleep(1)

def print_current_time():
  print (datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'))

if __name__ == '__main__':
  main()
```
実行結果はこんな感じです。
<img width="509" alt="01.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/e28ead91-87a9-d133-d381-d8fabd46d1ce.jpeg">

「{}がない！」「文末に;がない！」など他言語を使ったことがある方は気持ち悪いかかもしれませんが、インデントを文法の一部に取り入れてわかりやすい表記を強制しているのがPythonの特徴です。

## (2)The Zen of Python

Pythonの精神を表しているものに "The Zen of Python" というのがあります。

MacなどPythonが使える環境をお持ちのかたはREPL(対話実行環境：引数なしのpythonで起動)で以下を入れてみましょう！

```
import this
```
実行例

<img width="606" alt="02.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/51d24c04-294a-f073-6d03-7218ea57a967.jpeg">

日本語約はこちらにあります
[プログラマが持つべき心構え (The Zen of Python)](http://qiita.com/IshitaTakeshi/items/e4145921c8dbf7ba57ef)

```
Beautiful is better than ugly.
醜いより美しいほうがいい。

Explicit is better than implicit.
暗示するより明示するほうがいい。

Simple is better than complex.
複雑であるよりは平易であるほうがいい。
```

## (3)他言語との比較

言語の好き嫌いは（エディタもそうですが:sweat:）しばしば宗教論争みたくなって来るので、それをジョークにしたこんな文章があります。僕は結構ウケました:smile:

[もしプログラミング言語が宗教だったら](http://d.hatena.ne.jp/arche_t/20081217/1229487362)

ちゃんとした内容だとこれがわかりやすいです(Rubyに厳しいけど)。

[主要なプログラミング言語8種をざっくり解説](http://d.hatena.ne.jp/shi3z/20160701/1467330446)

```
　Pythonを積極的に使っている代表的な企業はGoogleです。
　誰が書いても同じ処理がだいたい同じ感じのプログラムになってしまうのと、
「こういうことできないかなー」と思うと誰かが既にモジュールを書いたりしているので
いろいろプログラミングしなくていいのでラクです。
```
無宗教の僕としては、この「ラク」ってのが一番です。
現実問題としては、Deep Learning用のフレームワークは TensorFlow, Chainerなど、ほぼPythonで提供されていますので他の選択肢がない感じです。

# 2.Jupyter Notebookとは？

これです。
http://jupyter.org/
<img width="601" alt="03.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/81e02218-bc4f-5bbf-9ab7-7a2ba66bf9c3.jpeg">

日本語の参考サイトもいくつか

[Jupyter Notebook を使ってみよう](http://pythondatascience.plavox.info/python%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83/jupyter-notebook%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86)

```
Jupyter Notebook (読み方は「ジュパイター・ノートブック」または「ジュピター・ノートブック」) とは、
ノートブックと呼ばれる形式で作成したプログラムを実行し、実行結果を記録しながら、
データの分析作業を進めるためのツールです。

プログラムとその実行結果やその際のメモを簡単に作成、確認することができるため、自分自身の
過去の作業内容の振り返りや、チームメンバーへ作業結果を共有する際に便利なほか、
スクール形式での授業や研修などでの利用にも向いています。
```
・・・なんか良く分かりませんね:sweat:

[はじめるJupyter Notebook](http://qiita.com/icoxfog417/items/175f69d06f4e590face9)

```
保存を行うとipynb形式で保存されます。後は、これでどんどんドキュメントを作成していく形になります。
作成したBookはnbviewerで共有してもよいですが、GitHubの場合そのまま表示をしてくれます。

これで分析手法などを実行可能なPythonコードベースで、且つ解説付きで共有できるようになるので
ノウハウ共有などにとても役に立つと思います。
```
・・・ブラウザ上で、ノートブック形式=ipynb形式で、プログラムを実行・実行結果を記録できるみたいですね。
黒い画面(CLI)が苦手な人も多いので、ブラウザ上で出来るのが良いのかも。

個人で使う時は、途中で保存して後から続きやるとか、長めのソースの勉強(写経)するときにとても便利です。

ちなみに、もともとは iPythonと言っていましたが、Pythonだけでなく他言語(R, Ruby, bashなど）に対応して、jupyter notebookと呼ぶようになってます。

# 3.try.jupyter.orgを使ってみよう

jupyter notebookはMacなどPython環境があれば比較的簡単にインストールできますが、Windowsの方はPythonインストールから始める必要があるので、ちょっと面倒です。
機能制限はありますが、手軽にJupyter Notebookを試せるオフィシャルサイトがありますので、今回はそちらを利用します。

https://try.jupyter.org/

ブラウザで開くとこんな感じになります。
<img width="615" alt="04.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/1040ff8d-1bc7-3420-4974-661780464912.jpeg">

右上に出ているように、Rackspaceがホストしているようです。
サンプルもありますが、ちょっと難しいので、新規作成で簡単なところからやります。

## (1)新規作成〜ファイル保存

先ほどの [はじめるJupyter Notebook](http://qiita.com/icoxfog417/items/175f69d06f4e590face9)を参考に、以下を実行してみましょう。

```
print("Hello Jupyter")
```

NewからPython3選びます
<img width="614" alt="05.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/31adbfd4-1734-9beb-7e8e-5c56f57cab7b.jpeg">

こんな画面になります
<img width="805" alt="06.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/716aeb0d-ce62-9fd5-e7f3-b5b1d147685f.jpeg">

In[]:の右（この四角をセルと呼びます）にコード入れて実行します（実行は Shift+Enter)。

<img width="813" alt="07.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/5709599a-cee2-82ef-f95c-ea96f520c342.jpeg">

上の"Untitled"ってなっているところをクリックして名前をつけます。
<img width="809" alt="08.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/86e7aa81-b1f4-3896-abf4-d93f3be2b3ac.jpeg">

Notebook形式でダウンドードします。
<img width="807" alt="09.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/75a4c285-82c1-3fbd-d377-fbf45d67d832.jpeg">

Close & Haltします。
<img width="810" alt="10.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/f7ca7ee0-c8f0-40d4-1b11-080865df75af.jpeg">

ここで"Open"を再度選ぶと、元の画面に戻ります。

## (2)保存したファイルから続きを実行

・保存したファイルをリネームしておきます。(ここでは、20170904_Sample2.ipynb )

・"Upload"で、ローカルのファイル画面になるので、先ほどダウンロード＆リネームしたファイルを指定します。
<img width="806" alt="11.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/dbccd381-2479-07d5-0431-d792c4370edb.jpeg">

・こんな画面になるので"Upload"押します
<img width="807" alt="12.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/8732906f-9984-d31d-0c0d-655d5d9bf08f.jpeg">

・Uploadできました。
<img width="799" alt="13.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/a757a8bf-0d98-27cc-2029-85febf539b17.jpeg">

・ダブルクリックで開きます
<img width="797" alt="14.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/2c4803f6-0f9f-7b3c-3545-4200fe419d3c.jpeg">

・Kernelを "Restart & Clear Output"します。
<img width="577" alt="15-2.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/e8c22a3e-7230-d294-8ca0-ad4ff45125ab.jpeg">

<img width="709" alt="16-2.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/79389/6abf8cba-ac99-9458-f9dd-e2b5f9f7b60d.jpeg">

・これで再実行できます:smile:
<img width="533" alt="17.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/1e8a7185-c0ca-423f-f232-7da1cb3066c0.jpeg">

## (3)Markdownを書いてコメントを入れる

・せっかくUploadしましたが、以前のセルは上の「ハサミマーク」で消してしまいましょう。
<img width="583" alt="18.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/18b91f39-541e-6e19-bdb6-125c264611ab.jpeg">

・残ったセルを「Markdown」に設定します。
<img width="545" alt="19.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/241889c6-9623-a904-c5f4-93bb9d162922.jpeg">

・以下を入力します

```
### はじめてのJupyter Notebook
```

<img width="540" alt="20.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/ffdc8dd6-426e-d466-43ca-df3b761662e8.jpeg">

・Sift+Enterで実行するとコメントが入力できました。
<img width="456" alt="21.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/05b81e62-a06e-40c0-dbe4-b41d231a6400.jpeg">

・一番最初にやったCLIのSample.pyを４つに分けて入力してみましょう。

```
import datetime, time

def main():
  for count in range(0, 10):
    print_current_time()
    time.sleep(1)

def print_current_time():
  print (datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'))

if __name__ == '__main__':
  main()
```

・セルを追加するのは上の「＋」ボタンでできます。
<img width="705" alt="22.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/908ae2bd-d937-d63e-9d7e-306430d36126.jpeg">

・コードの一番上のセルをポイントして、Shfit+Enterを押して、セルを１つづつ実行します。
<img width="556" alt="23.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/98cfda29-b4b4-f9e0-1214-c6a4c0f2abd9.jpeg">

## (4)どこかで見たPythonサンプルをやってみる

以下を写経してやって見ましょう！

・Python超入門

```
print('Hello World!')
```
・Pythonの特徴的なところ

```
total = 0
while total < 10:
    a = input('数字を入力してください： ')
    if a == '1':
        print('1本でもにんじん')
        total +=1
    elif a == '2':
        print('2足でもサンダル')
        total += 2
    else:
            print('強制終了')
            break
else:
    print('10個でもイチゴ')
    total = 1
print(total)
```

・制御構文（２つはバラバラです）

```
words = ['cat', 'dog', 'tiger', 'lion']
for s in words:
    print(s)
```

```
for n in range(5):
    print(n**2)
```

・もう入門は終わり(3つでセットです）

```
SUFFIXES = { 1000: ['KB','MB','GB','TB','PB','EB','ZB','YB'],
                     1024: ['KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB']}
```

```
def approx_size(size, use_1024=True):
    if size < 0:
            raise ValueError('numberは負であってはいけません')
            
    base = 1024 if use_1024 else 1000
    for suffix  in SUFFIXES[base]:
        size /= base
        if size < base:
                return '{0: .1f} {1}'.format(size, suffix)
    raise ValueError('numberが大きすぎます')
```

```
print(approx_size(1000000000000), False)
```
<img width="558" alt="28.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/a3e89dfb-2cd7-8080-fba2-f7805e286d1c.jpeg">



# 4.便利な使い方

## (1)グラフを書いてみる1

参考記事：
[機械学習の現場で重宝する多機能WebエディタJupyter Notebookの基本的な使い方 (1/2)](http://www.atmarkit.co.jp/ait/articles/1701/11/news013.html)



・以下を写経して実行してみましょう

```
import numpy as np
import pandas as pd
df = pd.DataFrame(np.arange(20).reshape(5,4), columns=list("abcd"))
df  
```

<img width="615" alt="24.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/801853b8-d731-b0d9-aa35-c13d529b231d.jpeg">

・以下を写経して実行してみましょう

```
%matplotlib inline
import matplotlib.pyplot as plt
x = np.linspace(-5,5, 300)
y = np.sin(x)
plt.plot(x,y)
```
<img width="504" alt="25.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/a3732b83-bed3-5b4d-3684-d21c4c0b6d45.jpeg">


## (2)こんな注意事項の確認も

プログラム言語はどれでもそうですが、中身が二進数なので精度などにはちょっと注意が必要です。
以前の勉強会でやった例題をもう一度やってみましょう。

[[Cloud102]#3-1 AML Studio NOTEBOOKのおまけ](http://qiita.com/nagahisa/items/7722252eef7c446bcbdd)

## (3)グラフを書いてみる2

続けて同じ資料にある「回転できる3Dプロット表示」を試してみてください。

```
%matplotlib inline
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-3, 3, 0.25)
y = np.arange(-3, 3, 0.25)
X, Y = np.meshgrid(x, y)
Z = np.sin(X)+ np.cos(Y)

fig = plt.figure()
ax = Axes3D(fig)
ax.plot_wireframe(X,Y,Z)

plt.show()
```
<img width="555" alt="26.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/a6af2408-583e-18ce-5917-17ad426e870c.jpeg">

・上のソースの最初(%matplotlib inline)を以下に変更して再実行してみましょう。

```
%matplotlib notebook
```

##  5.Try環境ではできないけど・・・

Try環境で外部APIなど呼ぶサンプルをトライしたのですが、制限がかかっているようで、実行できませんでした。
<img width="465" alt="27.JPG" src="http://qiita-image-store.s3.amazonaws.com/0/79389/00f38ef1-4260-e274-42dc-7b3a6a103135.jpeg">


時間があればMac環境でデモします。

Enjoy :tada: