PageRenderTime 86ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/rpy/robjects/pandas2ri.py

https://bitbucket.org/lgautier/rpy2
Python | 73 lines | 52 code | 9 blank | 12 comment | 19 complexity | 855f074cbc1411c74984d996dc85817f MD5 | raw file
Possible License(s): AGPL-3.0, GPL-2.0, LGPL-2.1, MPL-2.0-no-copyleft-exception
  1. import rpy2.robjects as ro
  2. import rpy2.robjects.conversion as conversion
  3. import rpy2.rinterface as rinterface
  4. from rpy2.rinterface import SexpVector, INTSXP
  5. from pandas.core.frame import DataFrame as PandasDataFrame
  6. from pandas.core.series import Series as PandasSeries
  7. from pandas.core.index import Index as PandasIndex
  8. from collections import OrderedDict
  9. from rpy2.robjects.vectors import DataFrame, Vector, ListVector, StrVector, IntVector, POSIXct
  10. # pandas is requiring numpy. We add the numpy conversion as implicit
  11. import rpy2.robjects.numpy2ri as numpy2ri
  12. numpy2ri.activate()
  13. original_conversion = conversion.py2ri
  14. ISOdatetime = rinterface.baseenv['ISOdatetime']
  15. def pandas2ri(obj):
  16. if isinstance(obj, PandasDataFrame):
  17. od = OrderedDict()
  18. for name, values in obj.iteritems():
  19. if values.dtype.kind == 'O':
  20. od[name] = StrVector(values)
  21. else:
  22. od[name] = ro.conversion.py2ri(values)
  23. res = DataFrame(od)
  24. # # "index" is equivalent to "names" in R
  25. # if obj.ndim == 1:
  26. # res.names = ListVector({'x': ro.conversion.py2ri(obj.index)})
  27. # pass
  28. # else:
  29. # res.dimnames = ListVector(ro.conversion.py2ri(obj.index))
  30. return res
  31. elif isinstance(obj, PandasIndex):
  32. if obj.dtype.kind == 'O':
  33. return StrVector(obj)
  34. else:
  35. # only other alternative to 'O' is integer, I think
  36. return original_conversion(obj)
  37. elif isinstance(obj, PandasSeries):
  38. if obj.dtype == '<M8[ns]':
  39. # time series
  40. d = [IntVector([x.year for x in obj]),
  41. IntVector([x.month for x in obj]),
  42. IntVector([x.day for x in obj]),
  43. IntVector([x.hour for x in obj]),
  44. IntVector([x.minute for x in obj]),
  45. IntVector([x.second for x in obj])]
  46. res = ISOdatetime(*d)
  47. #FIXME: can the POSIXct be created from the POSIXct constructor ?
  48. # (is '<M8[ns]' mapping to Python datetime.datetime ?)
  49. res = POSIXct(res)
  50. else:
  51. # converted as a numpy array
  52. res = original_conversion(obj)
  53. return res
  54. else:
  55. return original_conversion(obj)
  56. def ri2pandas(o):
  57. if isinstance(o, DataFrame):
  58. raise NotImplementedError("Conversion from rpy2 DataFrame to pandas' DataFrame")
  59. else:
  60. res = ro.default_ri2py(o)
  61. return res
  62. def activate():
  63. conversion.py2ri = pandas2ri
  64. conversion.ri2py = ri2pandas