【Pythonメモ】Google ColaboratoryでKaggle APIを使うおまじないコード&作法

Google Colaboratoryの利便性が素晴らしく、Pythonデータ分析環境はほぼこれ一本で試行錯誤している私です。
Kaggleでのコンペティション参加もColaboratory上で統一できるのかな？ってことで、
KaggleAPIをColaboratory上で実行するおまじないコード&作法です。
何か誤りなどがあったらご指摘いただけると喜びます！！



# Google Driveを使う
Kaggle APIに関係ないんですが、処理上Google Driveを使うのが一番効率的だと思うので、
Google Driveを利用できるようにするマウント処理から。

Google Driveのラッパーをインストールします。
コードを実行するだけでOK。

```python
!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse
```
認証トークンを生成。
URL発行されるので、アクセスしてトークンをコピペしましょう。

```python
from google.colab import auth
auth.authenticate_user()
```

Google Driveライブラリの認証トークンも生成、コピペ。

```python
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}
```


以下で最後。drive直下のファイルが表示されれば成功。

```python
!mkdir -p drive
!google-drive-ocamlfuse drive

print ('Files in Drive:')
!ls drive/
```


# Kaggle APIの準備

まずは Kaggleコマンドをノートブック上でインストールします。

```python
!pip install kaggle
```

続いて、以下よりKaggle API トークンを生成。
`kaggle.json`ファイルをダウンロードする。

https://www.kaggle.com/（ユーザー名）/account
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/165789/499c68d0-a0b4-2c71-2f21-ebd886a16d8f.png)


`kaggle.json`ファイルをGoogle Drive上の好きな場所に保存します。
ファイル名は変えない事。

次のコードでAPIを使えるようにします。
なお、このコードはKaggle Forumで情報提供していただいていた神様のコードそのまま引用です。
感謝です。

- [useful Google Labs tool for people playing with data science and deep learning](https://www.kaggle.com/getting-started/47096)(Kaggle Forum)
- [This notebook provides a recipe for using Kaggle API with Colab](https://colab.research.google.com/drive/1eufc8aNCdjHbrBhuy7M7X6BGyzAyRbrF)(Colaboratory)


>```python
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 = 'kaggle.json'", fields="files(id)").execute()
kaggle_api_key = results.get('files', [])
>
filename = "/content/.kaggle/kaggle.json"
os.makedirs(os.path.dirname(filename), exist_ok=True)
>
request = drive_service.files().get_media(fileId=kaggle_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)
```


# Kaggle APIの利用

さぁ、試してみましょう。

コンペティションの一覧を取得してみます。

```python
!kaggle competitions list
```
こんなリストが返ってきたら成功
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/165789/bd782503-7d84-8a84-8b95-cc3eeb018191.png)

コンペティションのデータのダウンロードもやってみます。
Google Drive上のディレクトリにダウンロードしてみましょう。
サイズが大きいファイルは、残り容量に要注意です。

Kaggleのコンペサイトから、以下のAPI用コマンドをコピーします。
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/165789/5b12afc6-bb32-84c6-9ac8-eabe40909957.png)

Google Colaboratory上に貼付け。
先頭にエクスクラメーションマーク（!）を付けるのを忘れずに。
ここでは、データをダウンロードするディレクトリを以下にしています。
`drive/Colab Notebooks`
※Colaboratoryファイルの作成の仕方によって、`drive/Colab Notebooks`下にファイルが生成されます。
　このディレクトリ名が厄介で、半角スペースが入っています。
　Linuxコマンドを書く際は、半角スペースの前に`\`が必要になりますので注意しましょう。

```python
kaggle competitions download -c titanic -p drive/Colab\ Notebooks

# カレントディレクトリにダウンロードする場合は以下
# !kaggle competitions download -c titanic -p.
```


データセットが指定ディレクトリにダウンロードされたら成功

- gender_submission.csv
- test.csv
- train.csv


Kaggle API の詳しい仕様は以下のGitHubで公開されています。
[Kaggle API](https://github.com/Kaggle/kaggle-api)


# （おまけ）カレントディレクトリの変更

ローカル環境と同様、Colaboratory上でもカレントディレクトリは指定可能です。

```python
import os
os.getcwd() # 現在のカレントディレクトリの取得
```

```python
os.chdir('/content/drive/Colab Notebooks') # カレントディレクトリを指定
os.getcwd()
```

これでカレントディレクトリが変更されていることが確認できるはずです。
あとは以下のように普通にデータを取得してくればOK。

```python
import pandas as pd
train = pd.read_csv('train.csv')
train.head()
```


Enjoy! Colaboratory and Kaggle!!


# 参考
参考にさせていただいたプロフェッショナルの方々の記事まとめ

- [Google Colaboratory事始め](https://qiita.com/kouki_outstand/items/cd24dccbaa92274be39e)
- [Google Colaboratory内で画像やCSVファイルにアクセスするのが一苦労だった話](https://qiita.com/yoshizaki_kkgk/items/bf01842d1a80c0f9e56c)
- [【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935#_reference-e9491d1dba0a154fd048)
- [kaggle-apiというKaggle公式のapiがベータ版で出ていたので使い方を調べてみた](http://www.currypurin.com/entry/2018/kaggle-api)