13

numpy と一緒にすべての分析に pandas を使用したいのですが、データのプロットには Rpy2 を使用します。pandas データフレームを使用してすべての分析を行い、rpy2 を介して R の完全なプロットを使用してこれらをプロットしたいと考えています。py2 で、ipython を使用してプロットしています。これを行う正しい方法は何ですか?

私が試みるほとんどすべてのコマンドは失敗します。例えば:

  • pandas DataFrame の 2 つの列の間の散布図をプロットしようとしていますdfdfRデータフレームの場合と同じように、x/y軸でラベルを使用したいと思います。これを行う方法はありますか?でやろうとするとr.plot、この意味不明なプロットが表示されます。

In: r.plot(df.a, df.b) # df is pandas DataFrame

収量:

Out: rpy2.rinterface.NULL

プロットの結果:

ここに画像の説明を入力

ご覧のとおり、軸ラベルが台無しになっており、DataFrame から軸ラベルを適切に読み取っていません (X 軸は columnadf、Y 軸は columnbです)。

  • でヒストグラムを作成しようとするとr.hist、まったく機能せず、エラーが発生します。

    In: r.hist(df.a)
    Out: 
    ...
    vectors.pyc in <genexpr>((x,))
        293         if l < 7:
        294             s = '[' + \
    --> 295                 ', '.join((p_str(x, max_width = math.floor(52 / l)) for x in self[ : 8])) +\
        296                 ']'
        297         else:
    
    vectors.pyc in p_str(x, max_width)
        287                     res = x
        288                 else:
    --> 289                     res = "%s..." % (str(x[ : (max_width - 3)]))
        290             return res
        291 
    
    TypeError: slice indices must be integers or None or have an __index__ method
    

そして、このプロットの結果:

ここに画像の説明を入力

エラーの意味はわかりますか?ここでも、軸はすべてめちゃくちゃで、意味不明なデータが散らばっています。

編集: このエラーは、ipython を使用している場合にのみ発生します。スクリプトからコマンドを実行すると、問題のあるプロットが生成されますが、少なくともエラーなしで実行されます。これらのコマンドを ipython から呼び出すのは何か問題があるに違いありません。

  • また、以下のポスターで推奨されているように、pandas DataFrame を R DataFrame に変換しようとしましdfたが、それもこのエラーで失敗します。

    com.convert_to_r_dataframe(mydf) # mydf is a pandas DataFrame
    ----> 1 com.convert_to_r_dataframe(mydf)
    in convert_to_r_dataframe(df, strings_as_factors)
        275     # FIXME: This doesn't handle MultiIndex
        276 
    --> 277     for column in df:
        278         value = df[column]
        279         value_type = value.dtype.type
    
    TypeError: iteration over non-sequence
    

これらの基本的なプロット機能を Pandas DataFrame (Pandas DataFrame のラベルから読み取ったプロットのラベルを使用) で動作させ、Pandas DF から R DF への変換を動作させるにはどうすればよいですか?

EDIT2:これはcsvファイル「test.txt」(http://pastebin.ca/2311928)の完全な例と@daleのコメントに答える私のコードです:

import rpy2
from rpy2.robjects import r
import rpy2.robjects.numpy2ri
import pandas.rpy.common as com
from rpy2.robjects.packages import importr
from rpy2.robjects.lib import grid
from rpy2.robjects.lib import ggplot2
rpy2.robjects.numpy2ri.activate()
from numpy import *
import scipy

# load up pandas df
import pandas
data = pandas.read_table("./test.txt")
# plotting a column fails
print "data.c2: ", data.c2
r.plot(data.c2)
# Conversion and then plotting also fails
r_df = com.convert_to_r_dataframe(data)
r.plot(r_df)

data.c2 は pandas df の列であるため、すべての意図と目的のために numpy 配列にする必要がありますが、「data.c2」の列をプロットする呼び出しは失敗します。私はactivate()呼び出しを使用するので、この列をnumpy配列として処理してプロットすると思いました。

R データフレームへの変換後にデータフレームをプロットする 2 番目の呼び出しdataも失敗します。何故ですか?test.txtRからデータフレームとしてロードすると、それがplot()可能になり、データフレームがパンダからRに変換されたので、ここでも機能するはずです。

ipythonで試してみるとrmagic、エラーにはなりませんが、何らかの理由でプロットウィンドウが起動しません。つまり、もしそうなら:

In [12]: X = np.array([0,1,2,3,4])

In [13]: Y = np.array([3,5,4,6,7])
In [14]: import rpy2

In [15]: from rpy2.robjects import r

In [16]: import rpy2.robjects.numpy2ri

In [17]: import pandas.rpy.common as com

In [18]: from rpy2.robjects.packages import importr

In [19]: from rpy2.robjects.lib import grid

In [20]: from rpy2.robjects.lib import ggplot2


In [21]: rpy2.robjects.numpy2ri.activate()

In [22]: from numpy import *

In [23]: import scipy

In [24]: r.assign("x", X)
Out[24]: 
<Array - Python:0x592ad88 / R:0x6110850>
[       0,        1,        2,        3,        4]

In [25]: r.assign("y", Y)
<Array - Python:0x592f5f0 / R:0x61109b8>
[       3,        5,        4,        6,        7]

In [27]: %R plot(x,y)

エラーはありませんが、プロット ウィンドウもありません。rmagicいずれにせよ、できればrpy2に頼らず、そのまま使い続けたいと思っています。

ありがとう。

4

3 に答える 3

7

[注:「編集2」のコードはここで機能しています(Python 2.7、rpy2-2.3.2、R-1.15.2)。

@dale が言及しているように、R オブジェクトが匿名である (つまり、オブジェクトに R シンボルが存在しない) ときはいつでも、Rは R オブジェクトdeparse(substitute())の を返すことstructure()になり、可能な修正は "xlab" および "ylab" パラメーターを指定することです。main一部のプロットでは、(タイトル)も指定する必要があります。

これを回避する別の方法は、R の数式を使用してデータ フレームをフィードすることです (詳細は、変換部分を処理した後で)。

にあるものは忘れてくださいpandas.rpy。どちらも壊れており、rpy2 で利用可能な機能を無視しているようです。

ipython を使用した変換に対する以前の簡単な修正は、かなり簡単に適切な変換に変換できます。rpy2 コードベースに 1 つ追加することを検討していますが (追加機能を追加して)、それまでの間、コード例のすべてのインポートの後に次のスニペットを追加してください。R 呼び出しが行われるたびに、パンダのDataFrameオブジェクトを rpy2 のオブジェクトに透過的に変換します。DataFrame

from collections import OrderedDict
py2ri_orig = rpy2.robjects.conversion.py2ri
def conversion_pydataframe(obj):
    if isinstance(obj, pandas.core.frame.DataFrame):
        od = OrderedDict()
        for name, values in obj.iteritems():
            if values.dtype.kind == 'O':
                od[name] = rpy2.robjects.vectors.StrVector(values)
            else:
                od[name] = rpy2.robjects.conversion.py2ri(values)
        return rpy2.robjects.vectors.DataFrame(od)
    elif isinstance(obj, pandas.core.series.Series):
        # converted as a numpy array
        res = py2ri_orig(obj) 
        # "index" is equivalent to "names" in R
        if obj.ndim == 1:
            res.names = ListVector({'x': ro.conversion.py2ri(obj.index)})
        else:
            res.dimnames = ListVector(ro.conversion.py2ri(obj.index))
        return res
    else:
        return py2ri_orig(obj) 
rpy2.robjects.conversion.py2ri = conversion_pydataframe

これで、次のコードが「そのまま動作」します。

r.plot(rpy2.robjects.Formula('c3~c2'), data)
# `data` was converted to an rpy2 data.frame on the fly
# and the a scatter plot c3 vs c2 (with "c2" and "c3" the labels on
# the "x" axis and "y" axis).

ggplot2また、使用せずにインポートしていることにも注意してください。現在、変換は明示的に要求する必要があります。例えば:

p = ggplot2.ggplot(rpy2.robjects.conversion.py2ri(data)) +\
    ggplot2.geom_histogram(ggplot2.aes_string(x = 'c3'))
p.plot()
于 2013-02-09T15:17:40.383 に答える
6

r.plot 関数を呼び出すときは、ラベルを明示的に渡す必要があります。

r.plot([1,2,3],[1,2,3], xlab="X", ylab="Y")

R でプロットすると、deparse(substitute(x))基本的に から変数名を取得することでラベルが取得されますplot(testX, testY)。rpy2 経由で python オブジェクトを渡す場合、それは匿名の R オブジェクトであり、R では次のようになります。

> deparse(substitute(c(1,2,3)))
[1] "c(1, 2, 3)"

それがクレイジーなラベルを取得している理由です。

多くの場合、データをやり取りするためだけに rpy2 を使用する方が賢明です。

r.assign('testX', df.A)
r.assign('testY', df.B)
%R plot(testX, testY)

rdf = com.convert_to_r_dataframe(df)
r.assign('bob', rdf)
%R plot(bob$$A, bob$$B)

http://nbviewer.ipython.org/4734581/

于 2013-02-07T22:55:16.463 に答える
5

rpyを使用します。変換はパンダの一部であるため、自分で行う必要はありません http://pandas.pydata.org/pandas-docs/dev/r_interface.html

In [1217]: from pandas import DataFrame

In [1218]: df = DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C':[7,8,9]},
   ......:                index=["one", "two", "three"])
   ......:

In [1219]: r_dataframe = com.convert_to_r_dataframe(df)

In [1220]: print type(r_dataframe)
<class 'rpy2.robjects.vectors.DataFrame'>
于 2013-02-02T01:23:46.413 に答える