Jupyter Notebookの基本操作を学ぶ

# Jupyter Notebookとは
オープンソースのWebアプリケーション
Pythonの環境構築等の必要がなく、対話的にプログラムの実行ができる（コンソール的な）
またNotebookというだけあって、実行したコードとその結果をドキュメントとして保存できる

# どんなだ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/fe6ca736-31d7-560d-45d9-4464c380c4a5.png)
　　　　↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/9caf1ffa-6662-fc39-1a54-92ff1e215969.png)
- 入力部分（＝`セル`っていう）にコードを書いて `Run` もしくは `Shift + Enter` で実行でき、結果が次の行に表示される
- 最後の行が結果として出力される（代入文のみだと結果は出力されない）
- `print`関数を使えば、コード中どこでも出力が可能

# やってみる
## モジュールを使う
```
import random

random.seed(1)
random.choice(['A', 'B', 'C'])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/11839823-09a0-b343-f03f-850c2907e399.png)
- 通常のPythonプログラミングと同じく、`import`することでモジュールの使用が可能
- １行ごとに別々のセルで実行していくこともできる

## 関数を使う
- 関数の場合もモジュールとほぼ同じなのでサクッと

```
def add(a, b):
  return a + b

result = add(1, 2)
result
```

## マークダウンも書ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/fb7860a6-df2f-f22a-59a6-595b21abf294.png)
 　　↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/30529ace-9fd0-21bd-faff-27228b0a9a81.png)

- 対象のセルを選択した状態でセルタイプを`Markdown`にするとマークダウンが記述できる
  - ドキュメント（note）として残す際には便利そうだなぁ

## グラフの表示
`matplotlib.pyplot`モジュールによってグラフの描画などの機能が使える

```python

%matplotlib inline
import matplotlib.pyplot as plt # 長いから as で命名

plt.title('Sample Graph')
plt.plot([1,3,2,4])
```
これをjupyter notebook上で実行すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/1880f352-d9b1-9668-f78f-9c5bcbf21c4a.png)
んぉ〜すごい

- `%matplotlib inline` は何？
    - この呪文を初めに書くことで、Notebook内にグラフを描画できる
    - この`%`で始まるようなやつを`マジックコマンド`という
    - 書かない場合は `plt.show()` を呼ばないといけない（１つのセルで複数のグラフを描画する場合は必要やね！）
    - 要するに`print`と同じ感じってことか

## マジックコマンド
上述した通り、`%`で始まる記述は`マジックコマンド`と言う便利なもの
`%`が１つの場合・・・ラインマジックコマンド　（１行にのみ適応）
`%`が2つの場合・・・セルマジックコマンド　（そのセル全体に適応）　例：　`%time`、`%%time`

#### いくつか見てみる
##### `%matplotlib inline`  
- グラフをNotebook内に描画できる（show()の実行を省略できる）  
- inline以外にもある 　公式参考：[matplotlib](https://docs.pyq.jp/python/pydata/matplotlib.html)

##### `%quickref`  
- 簡易ヘルプを下部に表示する　Esc、X で消せる

##### `%whos`  
- 変数の一覧を表示

##### `%time` / `%timeit`  
- コードの実行時間を計測、表示  

    |コマンド|対象|実行回数|
    |---|---|---|
    |%time|１行|１回|
    |%%time|セル|１回|
    |%timeit|１行|複数回（オプションで指定）|
    |%%timeit|セル|複数回（オプションで指定）|

- `%timeit`は `-n` で実行回数、`-r` で個数を指定できる  
わかりにくいので例

```JupyterNotebook上.py
%%timeit -n10 -r3
a = 10
b = a + 1
```
```出力.txt
131 ns ± 39.3 ns per loop (mean ± std. dev. of 3 runs, 10 loops each)
```
つまり `-n10`：１０回繰り返し　を `-r3`：３回やった時間　を計測する(計測は平均と標準偏差)
ちなみに、`%timeit`は複数の計測だけ行うだけで変数の定義等は書いてもされない

##### `%store`
- Jupyter上のDBへの保存、参照を行う
 
|マジックコマンド|説明|
|---|---|
|%store 変数|    変数をDBに保存|
|%store -d 変数|	変数をDBから削除|
|%store|	変数の一覧表示|
|%store -r|	保存されている全ての変数の読込|
|%store -z|	保存されている全ての変数の削除|

JupyterのDBのデータは `~/.ipython/profile_default/db/autorestore` にファイルとして保存されている
ファイルの中身はpythonが持つ`pickle`という形式で高速に読み書きできるそう（そんな飲み物あったよなぁ。。）  
なんか結構重要そうなのでメモがてら画面をつけておこう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/8fc073d6-69c7-39fd-d427-6c0c23f6abbc.png)
保存できた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/8fd57905-2132-c3da-3eee-c861100b3fc8.png)
消せた！
`!`コマンドでOSのシステムコマンドが実行できるんやってさ！簡単〜
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412441/bfca61b6-789c-c7fa-f3c0-32ec55bf3c60.png)
pickleで保存
pickleを使う場合はバイナリーを使わないといけないらしいので `wb` でバイナリーを指定してる
pickleで書き込む時は`pickle.dump`、読み込みは`pickle.load`を使う

# 感想
JupyterNotebookすごい！色々できすぎできすぎ君や。
機能が多すぎるからできることだけ覚えておいて、都度カンニングでいいかな〜それぞれ使われる頻度もわからんし。
グラフのモジュールとかは見ておいたほうがいいのかな！
この先PandasとかNumPyとかも楽しみ