Google ColabでSIGNATE APIを使う

Google ColabでSIGNATEのデータセットをダウンロードする方法を備忘録的に記す。

# 事前準備
1. SIGNATEのアカウント設定画面で "API Token" の "作成" をクリック
2. "新規作成" をクリックしてAPI Token(``signate.json``)を取得
3. ダウンロードした``signate.json``をGoogle Drive上のどこかにアップロードする。

# Google ColaboratoryでAPIの認証を実行
以下のコードを実行する。

```python
!pip install signate

from googleapiclient.discovery import build
import io, os
from googleapiclient.http import MediaIoBaseDownload
from google.colab import auth


auth.authenticate_user()

drive_service = build('drive', 'v3')
results = drive_service.files().list(
        q="name = 'signate.json'", fields="files(id)").execute()
signate_api_key = results.get('files', [])

filename = "/root/.signate/signate.json"
os.makedirs(os.path.dirname(filename), exist_ok=True)

request = drive_service.files().get_media(fileId=signate_api_key[0]['id'])
fh = io.FileIO(filename, 'wb')
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
    status, done = downloader.next_chunk()
    print("Download %d%%." % int(status.progress() * 100))
os.chmod(filename, 600)
```

認証コードを取得するためのURLが表示されるため、アクセスし、認証コードをコピペする。

```python
（略）
Download 100%.
```
と表示されれば成功。

# SIGNATEで開催されているコンピ一覧の表示

以下のコードを実行する

```shell
! signate list
```

```shell
  competitionId  title                                                              closing     prize             submitters
---------------  -----------------------------------------------------------------  ----------  --------------  ------------
              1  【練習問題】銀行の顧客ターゲティング                               -                                   4772
             24  【練習問題】お弁当の需要予測                                       -                                   5810
             27  【練習問題】Jリーグの観客動員数予測                                -                                   1200
            100  【練習問題】手書き文字認識                                         -           Knowledge                140
            102  【練習問題】タイタニックの生存予測                                 -           Knowledge                631
            103  【練習問題】音楽ラベリング                                         -           Knowledge                 46
            104  【練習問題】スパムメール分類                                       -           Knowledge                101
            105  【練習問題】毒キノコの分類                                         -           Knowledge                207
            106  【練習問題】アワビの年齢予測                                       -           Knowledge                310
            107  【練習問題】国勢調査からの収入予測                                 -           Knowledge                468
            108  【練習問題】画像ラベリング（20種類）                               -           Knowledge                209
            112  【練習問題】ワインの品種の予測                                     -           Knowledge                272
            113  【練習問題】山火事の消失面積予測                                   -           Knowledge                 66
            114  【練習問題】レンタル自転車の利用者数予測                           -           Knowledge                326
            115  【練習問題】アヤメの分類                                           -           Knowledge                284
            116  【練習問題】活動センサーログからの動作予測                         -           Knowledge                 27
            118  【練習問題】テニスの試合結果の予測                                 -           Knowledge                 48
            121  【練習問題】自動車の走行距離予測                                   -           Knowledge               1084
            122  【練習問題】自動車の評価                                           -           Knowledge                283
            123  【練習問題】オゾンレベルの分類                                     -           Knowledge                 22
            124  【練習問題】ボットの判別                                           -           Knowledge                252
            125  【練習問題】ガラスの分類                                           -           Knowledge                 65
            126  【練習問題】林型の分類                                             -           Knowledge                 13
            127  【練習問題】ゲーム選手のリーグ分類                                 -           Knowledge                 10
            128  【練習問題】ステンレス板の欠陥分類                                 -           Knowledge                 13
            129  【練習問題】都市サイクルの燃料消費量予測                           -           Knowledge                 19
            130  【練習問題】天秤のバランス分類                                     -           Knowledge                 10
            132  【練習問題】ネット広告のクリック予測                               -           Knowledge                128
            133  【練習問題】画像ラベリング（10種類）                               -                                    315
            135  【練習問題】ネット画像の分類                                       -                                     67
            262  【SOTA】国立国会図書館の画像データレイアウト認識                   2100-12-31  -                         11
            263  【SOTA】産業技術総合研究所 衛星画像分析コンテスト                  2100-12-31  -                         18
            264  【SOTA】マイナビ × SIGNATE Student Cup 2019: 賃貸物件の家賃予測    2100-12-31  -                        217
            265  【練習問題】健診データによる肝疾患判定                             -                                    317
            266  【練習問題】民泊サービスの宿泊価格予測                             -                                    295
            267  【SOTA】海洋研究開発機構 熱帯低気圧（台風等）検出アルゴリズム作成  2100-12-31  -                         10
            268  【SOTA】オプト レコメンドエンジン作成                              2100-12-31                            14
            269  【SOTA】アップル 引越し需要予測                                    2100-12-31  -                        171
            270  【SOTA】Weather Challenge：雲画像予測                              2100-12-31  -                          3
            271  【SOTA】JR西日本 走行中の北陸新幹線車両台車部の着雪量予測          2100-12-31  -                          2
            288  【SOTA】Sansan 名刺の項目予測                                      2100-12-31  -                         12
            294  【練習問題】債務不履行リスクの低減                                 -                                     92
            358  【練習問題】機械稼働音の異常検知                                   -                                     42
            404  【練習問題】モノクロ顔画像の感情分類                               -                                     17
            406  【練習問題】鋳造製品の欠陥検出                                     -                                     72
            409  【練習問題】株価の推移予測                                         -                                     76
            444  パナソニック株式会社 間取り図解析アルゴリズム作成                  2021-06-30  総額¥2,000,000            86
```

# コンペのデータセットをダウンロード

今回はリスト表示した中の**108**番のデータセットをダウンロードしてみます。
まずは以下のコードを実行して、**108**番のデータ一覧を表示します。

```shell
! signate files --competition-id=108
```

```
  fileId  name               title                                    size  updated_at
--------  -----------------  ----------------------------------  ---------  -------------------
     313  train.zip          学習用画像データ                    117694558  2018-06-26 23:12:54
     314  test.zip           評価用画像データ                     23554059  2018-06-26 23:14:56
     315  label_master.tsv   ラベルマスタ                              419  2018-06-26 23:16:23
     316  train_master.tsv   学習用画像データとラベルIDの対応表     975020  2018-06-26 23:17:07
     317  sample_submit.csv  応募用サンプルファイル                4212460  2018-06-26 23:17:33
```

続いて、こちらのファイルをダウンロードしてみます。
以下のコードを実行。

```shell
! signate download --competition-id=108
```

```shell
label_master.tsv

train_master.tsv

sample_submit.csv

test.zip

train.zip


Download completed.
```

ダウンロードが完了しました。

``train.zip``と``test.zip``はzip形式なので解凍します。

```shell
! unzip train.zip
! unzip test.zip
```

```shell
（略）
  inflating: test/test_09997.png     
  inflating: test/test_09998.png     
  inflating: test/test_09999.png 
```

ディレクトリ内のファイル一覧を見てみます。

```shell
%ls
```

一覧は以下です。

```shell
adc.json          sample_data/       test/     train/            train.zip
label_master.tsv  sample_submit.csv  test.zip  train_master.tsv
```

例えば、trainデータを読み込みたいときは、ディレクトリは以下のように指定。

```
./train/
```

# 追記
- 特定のデータをダウンロードする

今回は、**108**番のコンペのファイルIDが**313**をダウンロードする場合は、``--file-id=``の後に番号を記載する。

```shell
! signate download --competition-id=108 --file-id=313
```