【データサイエンス向け】Jupyterチートシート【Jupyter Notebook/Lab】

自分は普段**データ分析やモデル構築**を主にJupyter上で行なっています。
その中で何回調べんねん、ってやつをメモっておきます。



# 開発編

## 修正した.pyモジュールをリロードしたい

既にimportしたモジュールはキャッシュされるのか、普通にimportしなおしても更新されません。
**以下でリロード（再import）できます。**


```python
import importlib
importlib.reload(hoge)
# hoge はimport済みのモジュール
```

これ割と最近まで知らなくて、毎回再起動してたのでマジで目からウロコです。
他にも[`%autoreload`でモジュールを自動更新する方法](https://qiita.com/Accent/items/f6bb4d4b7adf268662f4)があります。

## JupyterLabのタブ名を変えたい

いくつもサーバーを起動している場合、どのタブがどのサーバのノートブックかわからなくなることがよくあります。
以下のようにタブ名を変更することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180836/bf5efd1c-a5f3-682e-b02d-4268bca54481.png)

以下をJupyter内で実行

```python
%%javascript
document.title='Jupyter-GPU'
```

あるいはビルド時に指定することができます。

```bash
jupyter lab build --name='Jupyter-GPU'
```

> 参考： https://github.com/jupyterlab/jupyterlab/issues/4422#issuecomment-395962448


# 描画編

## matplotlibで日本語を描画したい

fontにこだわりがなければ、**[japanize-matplotlib](https://github.com/uehara1414/japanize-matplotlib) が一番手取り早いと思います。**

```bash
 pip install japanize-matplotlib
```

```python
import matplotlib.pyplot as plt
import japanize_matplotlib

plt.plot([1, 2, 3, 4])
plt.xlabel('日本語を簡単に使える喜び')
plt.show()
```

<img src='https://user-images.githubusercontent.com/17490886/69253731-728f2480-0bf8-11ea-88f3-d954792eb005.png' height=300/>



# Log編

## pdbでデバッグしたい

デバッガの起動には2つのタイミングがあります。

**ブレークポイント指定してデバッガ起動**
以下コードを差し込む

```python
from IPython.core.debugger import Pdb; Pdb().set_trace()
```

**バグ発生時にデバッガ起動**

```python
# デバッグ後に実行
%%debug
```

ノートブック全体に対して適用

```python
# ノートブックのどこかに挟む
%pdb on
# バグ検知モードを切りたい時はこれ
%pdb off 
```

> [【JupyterNotebook/Lab】Jupyter上でデバッグする３つの方法【Pdb】](https://qiita.com/syunyo/items/1948b5a0dd7fef5c9896)



## プログレスバーを表示したい

一旦これでいけるかと

```python
from tqdm.auto import tqdm
import numpy as np

# tqdm で囲う
for i in tqdm(np.arange(1, 100000, 1)):
    # ここに処理
    pass
```

※ JupyterLabではプラグインをインストールしておかないと上手く表示されない場合があります。[参考](https://qiita.com/iwashi-kun/items/eac8438548de82d25fd1)



# pandas編

## pandasのapplyでプログレスバーを表示したい

```python
import pandas as pd
import numpy as np
from tqdm.auto import tqdm

# set description
tqdm.pandas(desc="これをやります")

# apply
df = pd.DataFrame({'hoge': np.arange(1, 100000, 1)})
df['hoge'] = df['hoge'].progress_apply(lambda x:  x + 1)
```

※ JupyterLabではプラグインをインストールしておかないと上手く表示されない場合があります。[参考](https://qiita.com/iwashi-kun/items/eac8438548de82d25fd1)



## DataFrameの表示が省略されるのを防ぎたい

表示件数や、一つのセルの中で表示できる文字数の上限を増やします。

```python
import pandas as pd
pd.set_option("display.max_colwidth", 500) # 1セルに500文字入る
pd.set_option("display.max_rows", 100) # 100行表示できる
```

**※ JupyterLabでset_optionが効かない場合、`df[:100]`のように`max_rows`以下のレコードを表示するようにすると上手く動作します（個人的な経験より）**


ある特定のセルのみ省略を防ぎたい場合は以下のよう（@chik_taksさんより教えていただきました！）

```python
with pd.option_context('display.max_colwidth', 200):
    display(df)
```


## DataFrameをMarkdownの表形式で出力したい

DataFrameをマークダウンで出力してコピペできます。地味に使います

```bash
pip install pytablewriter
```

```python
import pytablewriter
writer = pytablewriter.MarkdownTableWriter()
writer.from_dataframe(df)
writer.write_table()
# | col1 |  col2  |
# |------|--------|
# |hoge1 |line1   |
# |hoge2 |line2   |
```



# ショートカット系

## コマンドパレットへのショートカット

- Jupyter：**Cmd + Option + P**
- JupyterLab：**Ctrl/Cmd + Shift + C**

> [参考](https://github.com/jupyterlab/jupyterlab/issues/4851)