LoginSignup
8
6

More than 3 years have passed since last update.

pandas1.0.0から,read_pickle()とto_pickle()でS3/GCSのURLを指定できるようになった!

Last updated at Posted at 2020-02-02

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導入ともいかないのだよな。。。)


  1. ちなみに,この表は同じくpandas1.0.0から追加されたdf.to_markdown()を使用して出力しました。便利。 

  2. IAMやcredentialキーの設定方法などについては割愛します。 

  3. 確認はしていませんが,GCSでもいけるはずです。 

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6