Dockerコンテナ内でKaggle APIをつかう

# やること
- Kaggle公式イメージ(kaggle/python)をつかってコンテナ起動
- `kaggle ~`コマンドでcsvファイルをダウンロードする
- `kaggle ~`コマンドで公開notebookをダウンロードする

# まずはまとめ

1. `kaggle.json`をDL (kaggle.com > My Account > Create New API Tokenボタン)
2. `$ docker run -it --rm --mount type=bind,src=`pwd`,dst=/root/dev kaggle/python`
3. `$ pip install kaggle`
4. `$ mkdir ~/.kaggle`
5. `$ cp /root/dev/kaggle.json ~/.kaggle`
6. `$ chmod 600 ~/.kaggle/kaggle.json`
7. `$ kaggle competitions download -c titanic -p input/titanic`
8. `$ unzip input/titanic/titanic.zip input/titanic`
9. `$ kaggle kernels pull arthurtok/introduction-to-ensembling-stacking-in-python -p ./`

データセットはタイタニックコンペのものをダウンロードしてます
問題なく動いた方はここで閉じでもらって大丈夫です:relaxed:


# 環境
macOS 10.14.6 (Mojave)
Docker 19.03.4


# なんでDockerつかうの？
- notebook不安定
- VSCodeでコード書きたい
- グローバル環境を汚したくない
- pipとcondaの衝突コワイ
- Kaggle公式イメージがあるので安心


# Kaggle APIってなにさ？
Kaggleのサイト上でやってる操作をコマンドラインでできちゃうやつ


# たとえば？
- データセットのダウンロード
- サブミット
- 参加可能コンペを一覧表示
- リーダーボードをダウンロード

などなど…

詳しくは[公式リポジトリ](https://github.com/Kaggle/kaggle-api)を

```:コマンド一覧
kaggle competitions {list, files, download, submit, submissions, leaderboard}
kaggle datasets {list, files, download, create, version, init}
kaggle kernels {list, init, push, pull, output, status}
kaggle config {view, set, unset}
```


# こんな構成をつくっておきます

```
kaggle_titanic
├── input
│    └── titanic  <- ここにcsvファイルをダウンロードできれば勝ち
└── working  <- ここにipynbファイルをダウンロードできれば優勝
```


# Kaggle API Tokenを取得
右上のMy Accountから
![スクリーンショット 2019-11-27 9.25.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/91826684-c505-bafd-fa39-916180dbc366.png)

真ん中くらいにあるこれをポチ
![スクリーンショット 2019-11-27 9.28.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/1aa20315-42ac-1c5a-6be4-ae8ca8921937.png)

`kaggle.json`がダウンロードされるので `kaggle_titanic` ディレクトリに保存しておく
中身はこんなかんじ

```kaggle.json
{"username":"anata_no_namae","key":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
```


# ちなみに
こっちでトークンを無効化できます
「まちがえてGitHubにkaggle.jsonもプッシュしちまった！」みたいな時が押し時
![スクリーンショット 2019-11-27 9.41.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/d88cdaf5-5789-388a-ea35-2b5bf983d22a.png)


# コンテナ起動
[Kaggleの公式イメージ](https://hub.docker.com/r/kaggle/python) `kaggle/python` をつかう
kaggle_titanicディレクトリで以下のコマンド

```bash
docker run -it --rm --mount type=bind,src=`pwd`,dst=/root/dev kaggle/python
```

オプションの説明なんかはココに書いているのでもしよろしければ
-> [【画像で説明】DockerでAnaconda環境をつくり、コンテナの中でVSCodeを使う](https://qiita.com/komiya_____/items/96c14485eb035701e218#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E8%B5%B7%E5%8B%95)


# ここからはコンテナ側のシェルで
マウントしたディレクトリに移動

```bash
cd /root/dev
```

中身が同期されてればOK

```bash
ls

input  kaggle.json  working
```


# kaggleパッケージをインストール

```bash
pip install kaggle
```


# ちゃんと動くかバージョン確認してみる

```bash
kaggle -v

Traceback (most recent call last):
  File "/opt/conda/bin/kaggle", line 7, in <module>
    from kaggle.cli import main
  File "/opt/conda/lib/python3.6/site-packages/kaggle/__init__.py", line 23, in <module>
    api.authenticate()
  File "/opt/conda/lib/python3.6/site-packages/kaggle/api/kaggle_api_extended.py", line 149, in authenticate
    self.config_file, self.config_dir))
OSError: Could not find kaggle.json. Make sure it's located in /root/.kaggle. Or use the environment method.
```
めっちゃ怒ってきよる
kaggle.jsonが見当たらんみたいなこと言ってますね

# kaggle.jsonを配置
`~/.kaggle/`ディレクトリをつくってその中に`kaggle.json`をコピーします
**※`$ kaggle -v`のタイミングで`~/.kaggle/`ディレクトリが作られている場合がありますが問題ないです**


```bash
mkdir ~/.kaggle # <- すでにディレクトリあるよーっていわれるかもしれないけど気にせず
cp /root/dev/kaggle.json ~/.kaggle
```


# 今度こそ

```bash
kaggle -v

Warning: Your Kaggle API key is readable by other users on this system! To fix this, you can run 'chmod 600 /root/.kaggle/kaggle.json'
Kaggle API 1.5.6
```
一応つかえるけど、まだ怒ってるな
他のユーザーにもAPI Keyが読めちゃうから権限変えなさいって

# 権限変更

```bash
chmod 600 ~/.kaggle/kaggle.json 
```

# 次こそは

```bash
kaggle -v
Kaggle API 1.5.6
```
ふぅ

# 毎回やるのめんどい
ここの一連の処理はまとめてセルで実行してもいいかもです
ファイル化して使い回すって作戦もあります

```kaggle_settings.ipynb 
!pip install kaggle
!mkdir ~/.kaggle
!cp /root/dev/kaggle.json ~/.kaggle
!chmod 600 ~/.kaggle/kaggle.json
```

# それではデータのダウンロード
`-c`でコンペ名指定
`-p`保存先パス指定

```bash
kaggle competitions download -c titanic -p input/titanic
```

```bash
ls input/titanic

titanic.zip
```
`titanic.zip`がダウンロードされました


### コンペ名はURL上の表記をつかう
例えば `Severstal: Steel Defect Detection` コンペであればコレ
![スクリーンショット 2019-11-27 16.38.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/4b88e6d9-0734-acb8-eea2-ec04d1889f33.png)



# 解凍
ダウンロードした`titanic.zip`を解凍

```bash
unzip input/titanic/titanic.zip -d input/titanic
```

```bash
ls input/titanic

gender_submission.csv  test.csv  titanic.zip  train.csv
```
`gender_submission.csv`, `test.csv`, `train.csv`の３つが入ってました
これでデータセットのダウンロードはOK



# 次はnotebookをpullしてみる
notebookの表記はここ
![スクリーンショット 2019-11-27 16.41.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/6778d585-a4e6-8499-6fd9-f299c7719475.png)


```bash
kaggle kernels pull arthurtok/introduction-to-ensembling-stacking-in-python -p ./working
```


```bash
ls ./working

introduction-to-ensembling-stacking-in-python.ipynb
```
ちゃんとpullされているので優勝



# VSCodeをあわせてつかうと便利かも
インテリセンスや自分キーバインドなどでコード書けるのがいい

[【画像で説明】DockerでAnaconda環境をつくり、コンテナの中でVSCodeを使う](https://qiita.com/komiya_____/items/96c14485eb035701e218)

[【画像で説明】VSCodeをJupyter化する
](https://qiita.com/komiya_____/items/547ae8b5a9b031f18b59)



# jupyterつかいたい人はこう
コンテナ起動時に`-p 8888:8888`オプションを追加 （ホスト側とコンテナ側のポートを紐付ける）

```
docker run -p 8888:8888 -it --rm --mount type=bind,src=`pwd`,dst=/root/dev kaggle/python
```
<br>
そしてこんなかんじでjupyterを立ち上げる　※オプションの説明は[こちら](https://qiita.com/komiya_____/items/96c14485eb035701e218#dockerfile)

```
jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token=''
```

ブラウザのアドレスバーから`localhost:8888`をひらけばOK

# おしまい
最後まで読んで頂いてありがとうございました