pandas1.0.0がリリースされましたね。
新しい機能として,
- 異なる型の欠損値を統一的に扱うpandas.NAが試験導入された
- rolling.apply()をNumbaで高速化できるオプションが加わった
- データフレームをMarkdown記法で出力できるto_markdown()メソッドが追加された
といった点が目を惹きますが,個人的には上掲リリースノートの'Other enhancements'の一番最後にさりげなく書かれた記述に目が留まりました:
DataFrame.to_pickle() and read_pickle() now accept URL (GH30163)
これ,クラウドストレージ上にpickleで固めたデータを直接保存して読み出しできるってこと!?
てな訳でやってみました:
実演
次のような適当なDataFrameを作成します。
df = pd.DataFrame({'hoge': [1, 2, 3], 'fuga': [4, 5, 6], 'piyo': [7, 8, 9]})
こうすることで,
hoge | fuga | piyo | |
---|---|---|---|
0 | 1 | 4 | 7 |
1 | 2 | 5 | 8 |
2 | 3 | 6 | 9 |
という表できました。1
こいつを,あらかじめ作成しておいたAWS S3のバケット's3://tatamiya-test/
に保存し,読み出します。23
pandas0.25.3の場合
.csv形式での保存・読み出しであれば,従来のバージョンでも可能でした。
pd.__version__
# >> '0.25.3'
df.to_csv('s3://tatamiya-test/test.csv', index=None)
pd.read_csv('s3://tatamiya-test/test.csv')
# >> hoge fuga piyo
# >> 0 1 4 7
# >> 1 2 5 8
# >> 2 3 6 9
ところがpickleの場合,同様の操作ではPATHが認識されませんでした。
pd.__version__
# >> '0.25.3'
df.to_pickle('s3://tatamiya-test/test.pkl')
# >> FileNotFoundError: [Errno 2] No such file or directory: 's3://tatamiya-test/test.pkl'
pd.read_pickle('s3://tatamiya-test/test.pkl')
# >> FileNotFoundError: [Errno 2] No such file or directory: 's3://tatamiya-test/test.pkl'
pandas1.0.0の場合
さて,最新Versionの1.0.0で試してみましょう。
pd.__version__
# >> '1.0.0'
df.to_pickle('s3://tatamiya-test/test.pkl')
pd.read_pickle('s3://tatamiya-test/test.pkl')
# >> hoge fuga piyo
# >> 0 1 4 7
# >> 1 2 5 8
# >> 2 3 6 9
きちんと保存・読み出しができることが確認できました!
終わりに
クラウド上でpandasを使ってデータ加工を行う際,データソースがS3やGCS上にある場合もcsv形式ファイルであればto_csv()で直接URLを指定して読み込むことができました。
しかし,整形・加工後の中間データを一旦保存しておく際には,DataFrameやSeriesをPythonオブジェクトのままバイト列に変換し保存した方が
- 容量が小さくて済む
- 再読み込みが速い
- 型指定をやり直す必要がない
といったメリットがあったため,to_pickle(), read_pickle()が重宝していました。
ただ,前述の通り従来はこのときの保存先にS3/GCSのURLを指定できず,
- クライアントライブラリを使う
- 一旦ローカル保存してからコマンドラインツールで飛ばす
- あらかじめ対象バケットをVMインスタンスにマウントしておく
といったように少し手間をかけなくてはいけませんでした。
そんなわけで,今回のアップデートは,地味ながら個人的には非常にありがたいものでした!
(ただ後方互換性が保証されないから今までコードそのままに1.0.0導入ともいかないのだよな。。。)