Я хотел бы использовать pandas для всех моих анализов вместе с numpy, но использовать Rpy2 для построения моих данных. Я хочу сделать все анализы с помощью pandas dataframes, а затем использовать полный график R через rpy2 для их построения. py2, и я использую ipython для построения. Каков правильный способ сделать это?
Почти все команды, которые я пытаюсь выполнить, не работают. Например:
- Я пытаюсь построить разброс между двумя столбцами pandas DataFrame
df
. Я бы хотел, чтобы меткиdf
использовались по оси x/y, так же, как и если бы они были фреймворком данных R. Есть ли способ сделать это? Когда я пытаюсь сделать это с помощьюr.plot
, я получаю этот таинственный сюжет:
In: r.plot(df.a, df.b) # df is pandas DataFrame
дает:
Out: rpy2.rinterface.NULL
что приводит к графику:
Как вы можете видеть, метки меток перепутаны и не читают метки осей из DataFrame, как это должно (ось X равна столбцу a
df
, а ось Y - столбец b
).
-
Если я попытаюсь сделать гистограмму с помощью
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
И в результате этот сюжет:
Любая идея, что означает ошибка? И снова здесь, оси все испорчены и замусорены с тарабарщиками.
EDIT. Эта ошибка возникает только при использовании ipython. Когда я запускаю команду из script, она все же создает проблемный график, но, по крайней мере, работает без ошибок. Это должно быть что-то неправильно с вызовом этих команд из ipython.
-
Я также попытался преобразовать pandas DataFrame
df
в R DataFrame, как рекомендовано на плакате ниже, но это тоже не с этой ошибкой: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" завершается с ошибкой, хотя data.c2 является столбцом pandas df, и поэтому для всех целей и задач должен быть массив numpy. Я использую вызов activate()
, поэтому я думал, что он будет обрабатывать этот столбец как массив numpy и начертить его.
Второй вызов для построения фрейма данных data
после преобразования в R-фрейм также не выполняется. Почему это? Если я загружаю test.txt
из R в качестве фрейма данных, я могу plot()
его, и, поскольку мой фреймворк был преобразован из pandas в R, похоже, что он тоже должен работать.
Когда я пытаюсь использовать rmagic
в ipython, он почему-то не запускает окно графика, хотя это не ошибка. То есть если я это сделаю:
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)
Нет ошибки, но нет окна графика. В любом случае, я хотел бы придерживаться rpy2 и не полагаться на rmagic
, если это возможно.
Спасибо.