'RPY2 error in Python script! (Conversion 'py2rpy' not defined for objects of type '<class 'pandas.core.frame.DataFrame'>')
This is my current Python code:
import pandas as pd
import numpy as np
import rpy2.robjects.packages as rp
from rpy2 import robjects as ro
utils = rp.importr('utils')
utils.chooseCRANmirror(ind=1)
utils.install_packages("sidrar")
sidrar = rp.importr("sidrar")
table_NameUrl = pd.read_csv("Data.txt", sep=";", header= None)
table_Size = len(table_NameUrl)
sequence = np.arange(1, table_Size, 2)
for i in sequence:
csvName = table_NameUrl.iloc[::2]
csvUrl = table_NameUrl.iloc[1::2]
last_url = "/n3/all/n6/in%20n3%2028"
fileName = (tableName + ".csv")
url = (csvUrl + last_url)
ro.globalenv['fileName'] = fileName
ro.globalenv['url'] = url
ro.r('table= get_sidra(api= url)')
ro.r('write.csv(table, file= fileName, row.names = F)
Short version of CSV (line by line):
Panu 2.1.1, 2.1.5
/t/2093/p/2000,2010/v/93/c86/2776,2777,2778,2779,2780,2781/c2/0,4,5/c1/1,2/
Panu 5.1.1, 5.1.2, 5.1.3, 5.1.4, 5.1.5, 5.1.6, 5.1.7, 5.1.9, 5.1.10
/t/1612/p/2013,2014,2015,2016,2017/v/109,216,214/c81/2688,2691,2692,2694,2696,2708,2702,2715,2703/
Panu 5.1.8
/t/839/p/2013,2014,2015,2016,2017/v/109,216,214/c81/114254/
I´m using rpy2 in Python to get R's sidrar
package.
I'm not using native Python packages sidrapy
or DadosAbertosBrasil
because I need to auto generate a lot of CSVs with the Sidra API's URLs from Data.txt
. So, sidrar
is the best one to do it.
But when I try to use new CSV's name inside of fileName
and new CSV's url inside of url
this error appears:
Conversion 'py2rpy' not defined for objects of type '<class 'pandas.core.frame.DataFrame'>'
P.S.: last_url
is a url complement to get full Sidra API table, so that's why I need to concatenate the strings.
Solution: I added this function below in my Python code and the error is gone.
from rpy2.robjects.conversion import localconverter as lc
with lc(ro.default_converter + pr.converter):
fileName_c = ro.conversion.py2rpy(fileName)
url_c = ro.conversion.py2rpy(url)
ro.globalenv['fileName'] = fileName_c
ro.globalenv['url'] = url_c
Solution 1:[1]
This fixed the error. It seems to call an R function on pandas dataframe we have to first import the pandas2ri object from rpy2.
from rpy2.robjects import pandas2ri
pandas2ri.activate()
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Martin Gal |