【画像で説明】KaggleのNoteBookでpickleをつかい回す

# やること
1. csvファイルのデータセットをpickle化
2. pickleファイルを別のnotebookで読み込む


# pickleってなんなのよ？
pythonオブジェクトをバイナリデータで保存するやつ
https://docs.python.org/ja/3/library/pickle.html

# なにがうれしくて？
読み込みが早い
バイナリデータなのでパーズ処理がいらんから早いんですって
学習済みモデルとかもpickle化してつかい回せる

こちらの検証記事がすばらしいです
[Python: pandas の永続化フォーマットについて調べた](https://blog.amedama.jp/entry/2018/07/11/081050)


# タイタニックのデータでやってみる
ひとまずtrain.csvをpickleにする
コードはこれだけ


```.py
# pickleは標準ライブラリなのでinstall不要
import pickle

import pandas as pd


train = pd.read_csv('../input/titanic/train.csv')

# 'wb'(write binary)を指定
with open('train.pickle', 'wb') as f:
    pickle.dump(train, f)
```

# Datasetとして保存

まずはcommit
![スクリーンショット 2019-12-09 3.16.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/23d3225e-caab-2f64-782d-97258bb35f54.png)

左上に緑のCompleteがでたらOpen Versionをポチ
![スクリーンショット 2019-12-09 3.17.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/d3183699-c1bc-cb24-11b8-b37e393b0cdb.png)

Outputの欄までスクロールして
![スクリーンショット 2019-12-09 3.18.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/f04941f1-2568-01e8-f4d2-d0c25460bc68.png)

`train.pickle`が確認できたらNew Dataset
![スクリーンショット 2019-12-09 3.19.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/d9c16ad4-fb2d-f905-3550-ce687a8ae252.png)

お好きなDatasetタイトルを入力してCreateすると
![スクリーンショット 2019-12-09 3.20.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/1f80b151-7c2b-94d2-e166-c90a45f56d35.png)

Datasetが完成
![スクリーンショット 2019-12-09 3.21.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/b9f8be23-37ad-cab4-044e-58e954ae4f4b.png)


# 別のnotebookにもってくる

新しいnotebookをつくったら+ Add Data
![スクリーンショット 2019-12-09 3.44.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/6adf6f8a-b740-6477-04cb-08a21c768c45.png)

Your Datasetsでフィルタリングして
![スクリーンショット 2019-12-09 3.44.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/02971f62-f45c-4c90-9d36-172abff33fde.png)

さっきつくったやつをAdd
![スクリーンショット 2019-12-09 3.45.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/e8f90adf-075a-f324-f04c-26d04e099c8c.png)

ここに表示されてれば優勝
![スクリーンショット 2019-12-09 3.46.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/07d980cb-6273-afa4-8d11-b39df9f6070f.png)


# 読み込んでみよう
コードはこれだけ

```.py
# 'ｒb'(read binary)を指定
with open('../input/titanicdatasetpickles/train.pickle', 'rb') as f:
    train = pickle.load(f)
```

ちゃんとDataFrameとして読み込まれてますね

```.py
train.shape

# (891, 12)
```

<br>
ディレクトリ名は画面右に表示されてるものと違うことがあるのでお気をつけください
`https://www.kaggle.com/anata-no-namae/data-set-no-namae`　<- この表記がディレクトリ名になる
`ls`コマンドで確認すると`-`ナシのディレクトリ名になっていることがわかります

```.py
!ls ../input

# titanicdatasetpickles
```

# ファイル化してもよいかも
dumpの処理は使いまわせそう

```dump_pickles.py

import pickle

import pandas as pd


# Kaggle上と別環境でpathを切り替え
if '/kaggle/working' in _dh:
    input_path = '../input'
else:
    input_path = './input'

# コンペごとにココだけ書き換える
data_sets = {
    'train': f'{input_path}/titanic/train.csv',
    'test': f'{input_path}/titanic/test.csv',
    'gender_submission': f'{input_path}/titanic/gender_submission.csv'
}

for name, path in data_sets.items():
    df = pd.read_csv(path)
    with open(f'{name}.pickle', 'wb') as f:
        pickle.dump(df, f)
```

# pandasでも同じことできる

```.py
# これは
with open('./train.pickle', 'wb') as f:
    pickle.dump(train, f)

# こう
train.to_pickle('./train.pickle')
```

```.py
# これは
with open('../input/titanicdatasetpickles/train.pickle', 'rb') as f:
    df_ss = pickle.load(f)

# こう
train = pd.read_pickle('../input/titanicdatasetpickles/train.pickle')
```

# こんなエラーでる時ある

`ModuleNotFoundError: No module named 'pandas.core.internals.managers'; 'pandas.core.internals' is not a package`

とか言われたらpandasのバージョンの問題らしい

```bash
pip install -U pandas
```
で解決
※ Kaggleの公式dockerイメージ(kaggle/python)はpandas==0.23.4でエラーが出たので注意(2019/12/09現在)

こちらの記事に救っていただきました
[pickleとpandasの不整合](https://estuarine.jp/2017/07/pickle_pandas_error/)


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