Mi piacerebbe usare i Panda per tutte le mie analisi insieme a Numpy ma usare Rpy2 per tracciare i miei dati. Voglio fare tutte le analisi usando i datafram dei panda e poi usare il plotting completo di R via rpy2 per tracciare questi. py2 e sto usando ipython per tracciare. Qual è il modo corretto per farlo?Come utilizzare i dataframe pandas e gli array di numpy in Rpy2?
Quasi tutti i comandi che cerco falliscono. Per esempio:
- Sto cercando di tracciare una dispersione tra le due colonne di una dataframe panda
df
. Mi piacerebbe che le etichette didf
fossero usate nell'asse x/y proprio come verrebbero usate se fosse un dataframe R. C'è un modo per fare questo? Quando provo a farlo conr.plot
, ottengo questa trama senza senso:
In: r.plot(df.a, df.b) # df is pandas DataFrame
rendimenti:
Out: rpy2.rinterface.NULL
conseguente trama:
Come voi c un vedere, le etichette degli assi sono incasinate e non sta leggendo le etichette degli assi dal DataFrame come dovrebbe (l'asse X è la colonna a
di df
e l'asse Y è la colonna b
).
Se provo a fare un istogramma con
r.hist
, non funziona affatto, ottenendo l'errore: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
E con conseguente questa trama:
Qualche idea di cosa significa l'errore? E ancora qui, gli assi sono tutti incasinati e disseminati di dati senza senso.
EDIT: questo errore si verifica solo quando si utilizza ipython. Quando eseguo il comando da uno script, esso produce ancora la trama problematica, ma almeno corre senza errori. Deve essere qualcosa di sbagliato nel chiamare questi comandi da ipython.
Ho anche provato a convertire il dataframe panda
df
a un R dataframe come raccomandato dal manifesto al di sotto, ma questo fallisce anche con questo errore: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
Come posso ottenere questi funzionalità di tracciamento di base per lavorare su Pandas DataFrame (con etichette di grafici letti dalle etichette di Pandas DataFrame) e anche per far funzionare la conversione tra un DF Panda e un DF R?
EDIT2: questo è un esempio completo di un file csv "test.txt"(http://pastebin.ca/2311928) e il mio codice di rispondere @ commento di 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)
La chiamata per tracciare la colonna di 'data.c2' non riesce, anche se data.c2 è una colonna di un df panda e quindi per tutti gli effetti dovrebbero essere una matrice NumPy. uso la chiamata activate()
così ho pensato che sarebbe gestire questa colonna come una matrice NumPy e tracciare esso.
la seconda chiamata per tracciare il dataframe data
dopo la conversione in un dataframe R anche fallisce Perché è così? Se carico test.txt
da R come un dataframe, sono in grado di plot()
e dal momento che il mio dataframe è stato convertito da panda a R, sembra come se dovrebbe funzionare anche qui
Quando provo lo rmagic
in ipython, non genera una finestra di stampa per qualche motivo, sebbene non sia un errore. Cioè se faccio:
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)
Non c'è nessun errore, ma nessuna finestra di trama. In ogni caso, mi piacerebbe attenermi a rpy2 e non fare affidamento su rmagic
se possibile.
Grazie.
è possibile esportare in formato CSV e importare di nuovo o utilizzare RPY – locojay
@locojay: Come uso RPY con i panda dataframe? – user248237dfsf
dai un'occhiata a http://rpy.sourceforge.net/rpy/doc/rpy_html/DataFrame-class.html che usa std python ds ... usa lo stesso approccio usando pandas df – locojay