2019年6月17日月曜日

rpy2でPythonのPandasデータフレームをRのデータフレームに変換する

PythonでRのスクリプトを実行するではsubprocessモジュールを使ってRスクリプトを実行してみたが、やっぱりPythonからもっとシームレスにRを使ってみたい。そこで、rpy2でPandasのデータフレームをRのデータフレームに変換して、Rの関数で重回帰分析をやってみる。


環境


Windows10のWSL(Ubuntu 18.04)。


さらに、Rを以下のコマンドでインストールしておく。



rpy2のインストール


pipでrpy2をインストール。


Pandasのデータフレームを扱うにはtzlocalも必要なのでインストールしておく。



Pandasデータフレームの作成


まずはRのデータフレームに変換するPandasデータムレームを用意する。
import pandas as pd
import numpy as np

# 日付データのインデックス作成 
dates = pd.date_range(
    start = '4/1/2019',
    periods=30
)

# 乱数の固定
np.random.seed(100) 
# 0-9の乱数で配列データ作成
y = np.random.randint(10, size=30)
x1 = y + np.random.randint(10, size=30)
x2 = np.random.randint(10, size=30)
values = np.stack([y, x1, x2], 1)
# データフレーム作成
df = pd.DataFrame(values, index=dates, columns=['y', 'x1', 'x2'])
print(df)

以下のようなデータフレームが作成される。



PandasデータフレームをRデータフレームに変換


作成したPandasデータフレームをrpy2でRデータフレームに変換してみる。
import rpy2.robjects as ro
from rpy2.robjects import pandas2ri

# PandasデータフレームをRデータフレームに変換
with ro.conversion.localconverter(ro.default_converter + pandas2ri.converter):
    df_r = ro.conversion.py2rpy(df)
        
print(df_r)

結果は以下の通り。



PythonからRのlm関数を使って重回帰分析をする


Rのデータフレームに変換したものを、Rのlm関数で重回帰分析する。
import pandas as pd
import numpy as np

import rpy2.robjects as ro
from rpy2.robjects import pandas2ri, globalenv
from rpy2.robjects.packages import importr

# Rライブラリのインポート
base = importr('base')
stats = importr('stats')

# 日付データのインデックス作成 
dates = pd.date_range(
    start = '4/1/2019',
    periods=30
)

# 乱数の固定
np.random.seed(100) 
# 0-9の乱数で配列データ作成
values = np.random.randint(10, size=(30, 3))
# データフレーム作成
df = pd.DataFrame(values, index=dates, columns=['y', 'x1', 'x2'])
#print(df)

# PandasデータフレームをRデータフレームに変換
with ro.conversion.localconverter(ro.default_converter + pandas2ri.converter):
    df_r = ro.conversion.py2rpy(df)
        
#print(df_r)

# Rのグローバル環境変数を設定
globalenv['df_r'] = df_r

# 重回帰分析
lm_model = stats.lm('y ~ x1 + x2', data=base.as_symbol('df_r'))
print(base.summary(lm_model))

計算過程のようなものがずらずらと出力されるが、最後にはちゃんと結果が出力される。



0 件のコメント:

コメントを投稿