【notion-tqdm】どこでもPythonの進捗状況がわかるライブラリをつくった【Notion】

Web系の企業でデータサイエンティストをしている者です。

今回は<b>どこでも進捗状況が見れる「notion-tqdm」</b>というPyPIライブラリを作ったので、そのお話をします。

https://github.com/shunyooo/notion-tqdm

![](https://user-images.githubusercontent.com/17490886/100184781-97ae2580-2f25-11eb-9700-2d9c5ce95592.gif)



# 🤔 処理はどこまで完了したのか？

DSの人間なら、以下のようなことを思ったことはないでしょうか？

- **あの重たいデータ整形どこまで終わってるかな？？**
- **あのモデルの学習はどこまで完了してるかな？？**

軽い処理なら`tqdm`を仕込めばその場で確認できますが、重たい処理ではそうはいきません。

例えばJupyterで処理を実行する場合、コネクションが切れたりすると再度ノートブックを開いても`tqdm`の反映はそこで止まってしまいます。

そのため、重たい処理の進捗を確認する場合によく取られるケースは以下です

- slack, line 等の botで通知
- 実験管理系のライブラリ（tensorboard, Naptune.ai, MLFlow）等で確認

### 気軽に仕込んで、いつでも見れるようにしたい

bot導入はトークン取得までが面倒だったり、実験管理系のライブラリはモデルの学習など使える場面が限定されます。

**自分がやりたいのは、あくまで `tqdm` のようなシンプルで汎用的な進捗の確認です。**



# 🤩 Notion上で見れたら素敵なのでは？

![Notion Labs, Inc. Logo Vector Download - (.SVG + .PNG) - Logovectordl.Com](https://tva1.sinaimg.cn/large/0081Kckwly1glq14ao91hj30e807w744.jpg)

<b>Notionって知ってますか？</b>最近巷で流行っているドキュメント管理サービスです。

Notionの特徴として<b>「データベース」</b>という機能があります。データベースでは一元化されたデータを異なるビューで表示することができたり、**リッチなフィルタリングやソート機能**がついています。

僕は、Notionのデータベースにプログレス状況をPOSTするようなtqdmを作れば、ビューも機能もいい感じにあるし、コスパ良く進捗が確認できるのでは？と考えました。

つまり<b>「Notionにフロント部分は任せてしまおう」</b>ということですね。

そこで作成したのが、冒頭でも述べた<b>「notion-tqdm」</b>です。



#  💈 notion-tqdm とは

notion-tqdmはtqdm、つまり**プログレスをNotion上で見れるライブラリ**です。

これで**いつでもどこでもスマホでもプログレスを確認することができます**。

# ▶️ Quick Start

[チュートリアル用のGoogle Colabはこちら](https://drive.google.com/file/d/14JxR1lV1XRCiKzzXbp5FaP8iX_qVKYFr/view?usp=sharing)

## 事前準備

1. （作っていない場合）[Notionのアカウントを作ります。](https://www.notion.so/signup)
2. [こちらを参考に](https://www.notion.so/How-to-get-your-token-d7a3421b851f406380fb9ff429cd5d47)トークンを取得します。→ メモっておく
3. [このページ](https://www.notion.so/syunyo/notion-tqdm-template-7d2d53595e774c9eb7a020e00fd81fab)を自分のワークスペースに複製します。
4. 複製後、テーブルのリンク（ページのリンクではない）をコピーします。 → メモっておく
![image](https://user-images.githubusercontent.com/17490886/100450226-9f71f380-30f8-11eb-97c5-2538d99d4a5b.png)

5. notion-tqdmをインストール

    ```
    pip install git+https://github.com/shunyooo/notion-tqdm
    ```



## サンプル実行

変数に取得したトークンなどを設定して、以下を実行してみましょう。

```python
from time import sleep
from notion_tqdm import notion_tqdm

# 設定. token やユーザ情報, タイムゾーンを入れる
token_v2 = '<token_v2>'
table_url = '<table_url>'
notion_email = '<notion_email>'
timezone = 'Asia/Tokyo' 

notion_tqdm.set_config(token_v2, table_url, notion_email, timezone)
for i in notion_tqdm(range(100), desc='Processing'):
    sleep(0.3)
    print(i, end=', ')
```

Notionのテーブルに以下のようなプログレスが出てくるはずです。

![img](https://user-images.githubusercontent.com/17490886/100450225-9ed95d00-30f8-11eb-8932-19c4d9a1e955.png)

ちなみに**タイムラインビューを使うと、実行時間が可視化される**ので複数プロセスのログを確認するのに便利です。

![img](https://user-images.githubusercontent.com/17490886/100450217-9c770300-30f8-11eb-8b8a-241fc622d700.png)



## サンプル: 普通のtqdmと併用したい時

**通常のtqdmの表示も見たい**というときは以下のようにラップして使いましょう。（ちょっと汚いですが...）

```python
from tqdm.auto import tqdm as tqdm_auto
from time import sleep
tqdm = lambda *args, **kwags: tqdm_auto(notion_tqdm(*args, **kwags), **kwags)
for i in tqdm(range(100), desc='Processing with tqdm.auto'):
  sleep(0.3)
  print(i, end=', ')
```



## サンプル: テーブルにカスタムなプロパティを追加する

例えば、**「どのマシンで実行しているか」や「今の精度はどれぐらい」みたいなプロパティを知りたい場合**は以下のようにカスタムなプロパティを設定することができます。注意点として、事前に設定するプロパティをテーブルビューに型を揃えて追加しておく必要があります。

```python
# 事前に machine:Text カラムと precision:Number カラムをテーブルに追加しておく
from time import sleep
notion_tqdm.set_common_props(machine='GoogleColab')

with notion_tqdm(range(50), desc='process') as pbar:
    for i in pbar:
      sleep(0.3)
      pbar.update_props(precision=1-i/50)
```



#  🤞 notion-tqdmで素敵なPythonライフを

notion-tqdmはtqdmを継承しています。そのためtqdmと同様の使い方ができ、移行も簡単です。

<b>「プログレスが気になっていたけど面倒くさくて放置していたあの処理」</b>に notion-tqdm を組み込んでみてはいかがでしょうか？

#### 余談 実装の工夫

notion-tqdmの実装では **tqdm の更新メソッドをオーバライドしています**。
工夫点をあげると、更新メソッドではNotionのAPIを経由して、プログレス情報をPOSTするわけですが、通信コストで処理が重たくならないように、**非同期にPOSTするような工夫をしています**。また同様に通信コストを少なくするために、1回POSTしたら、**次のPOSTまでに3秒以上間隔を空ける**ようにしています。



# Link

- GitHub: https://github.com/shunyooo/notion-tqdm
- Google Colab: https://drive.google.com/file/d/14JxR1lV1XRCiKzzXbp5FaP8iX_qVKYFr/view?usp=sharing

- [Notionトークンの取得方法](https://www.notion.so/How-to-get-your-token-d7a3421b851f406380fb9ff429cd5d47)