なにメモ

コンピュータビジョンや機械学習関係の話題を書き綴ると思うブログです。

RとPythonのデータをほぼそのままやりとりする方法(JSON編)

f:id:alfredplpl:20140225004438p:plain

はじめに

画像やWebページ、行動ログなどのデータを分析するときに、前処理はPython、分析はRという人が世の中多いと思います。この処理結果を途中で保存する場合、Pythonであればpickleモジュール、Rであればsave関数を使うと思いますが、この場合、PythonからRにデータを移行することができません。

この問題を解決する方法の1つにCSV形式でデータを記述することがあります。ただし、連想配列(ハッシュ)をCSVでやりとりするのは面倒ですし、二次元以上の配列も管理がややこしくなります。

そこでRとPythonのデータをほぼそのままやりとりする方法を調べてみました。

 

 

方法

今回使う方法は、JSONでファイルに変数を保存し、保存した変数を相互にやりとりすることです。JSON[1]は主にJavascriptの定数をソースコード中に記述する形式なのですが、今日では、ほとんどのプログラミング言語で互換性のある形式です。Pythonの変数をJSONで保存・読み込みする場合、jsonモジュール[2] を、Rは{rjson}パッケージ[3] を使います。

 

ソースコードと実行結果

今回はPython→Rの流れでデータをやりとりします。コードと実行結果を以下に記します。

 

gist9189363

gist9189535

 

確かにハッシュやリストを多言語間でやりとりできていることがわかります。

 

注意

このやりとりで気をつけてほしいことは、言語に依存するデータ型やパッケージに依存する型をうまくやりとりできるかは保証されない点です。たとえば、RのNAやNaN、Infは、rjsonの規定で文字列型になります。他にもPythonのNumpyに関する型は他の言語では使えません。詳しくは各種ライブラリやJSONそのものを調べてください。

 

この他にも大規模なデータではメモリが溢れてしまう問題があるでしょう。大規模なデータではデータベース(SQL)を利用した方法があると考えられます。

 

まとめ

今回はRとPythonのデータをJSONでやりとりする方法を紹介しました。JSONで変数を保存すれば今回紹介した2つの言語間だけではなく、Javascriptを始めとした多くの言語間でやりとりできます。

他にもデータベース(SQL)を利用した方法があると考えられますが、需要があったらまた今度書きます。

わからないところ、問題があるところがありましたら、気軽にコメントください。

 

参考文献

[1] http://ja.wikipedia.org/wiki/JavaScript_Object_Notation 

[2] http://docs.python.jp/2.6/library/json.html

[3] http://cran.r-project.org/web/packages/rjson/rjson.pdf