/* */

TypeError: read_feather() got an unexpected keyword argument 'nthreads'への対処

Twitterで流れてきたこちらの問題についてちょっと調べてみました。

TL;DR

調査まとめ

以下上の問題を受けて調べたことをまとめました。

現象の再現

ツイートの件、再現するかを確認しました、確かに再現しました。

gist.github.com

原因調査

サクッと調べたらこんなissueを見つけました。 github.com

issueでのやりとりをまとめると、tl;drに書いた内容と重複しますが、pyarrow - read_featherがアップデートで削除されたデフォルト引数(nthreads)をpandas - read_feather側で残したままにしたのが原因。pandasの次のアップデートで修正予定。

原因調査 - 詳細

もう少し具体的に言うと、pyarrowのversionが0.10.0から0.11.0へ上がる際に以下のような変更が発生している。

def read_feather(source, columns=None, nthreads=None, use_threads=False):
def read_feather(source, columns=None, use_threads=True):

そして、問題のpandasのread_featherですが

pandas(0.23.4) - read_feather

featherのread_dataframeをそのまま返していることがわかります。

じゃあfeatherのread_dataframeはどうなっているかというと

feather read_dataframe

こちらはpyarrowのread_featherを返しています。

pyarrow read_feather

まとめるとこんな感じの依存関係になっています。

f:id:wakame1367:20190119181330p:plain:w300

というわけでpyarrowの変更がpandasにまで波及したことで、tl;drに書いた状況になってしまったということです。 また、この調査結果からfeatherを読み込むのにわざわざpandasのread_featherを使う必要はなく、pyarrowのread_featherを使えばよい。

追加調査

上の内容を受けてpypi - pandas(0.24.0rc1)がプレリリース版として上がっていたので修正されているか調べてみました。結果読み込めることが確認できました、次のバージョンが待ち遠しいですね。 gist.github.com

また、pandas 0.24.0rc1のwhatsnewから今回の変更点を列挙してみました。

  • Additionally we no longer depend on feather-format for feather based storage and replaced it with references to pyarrow (GH21639 and GH23053).

どうやら依存関係を下記画像の①から②へ修正した模様。

f:id:wakame1367:20190119173308p:plain:w300
pyarrowの依存関係

  • Deprecated the nthreads keyword of pandas.read_feather() in favor of use_threads to reflect the changes in pyarrow>=0.11.0. (GH23053)

pandas.pydata.org

おまけ

ところでpandasのwhatsnewに面白い一文があったので紹介します。

Warning The 0.24.x series of releases will be the last to support Python 2. Future feature releases will support Python 3 only. See Plan for dropping Python 2.7 for more.

pandasのバージョンアップ履歴を見ると今年中か来年には0.25にアップデートされそうなので、pandasのPython 2へのサポートは今年中、もしくは来年あたりに切られそうですね。 Python 2よ、さらば・・・。

pandas.pydata.org

以上です、ありがとうございました。

参考