2015-05-03 18 views
8

Mam ramkę danych w Pandach i chcę zrobić kilka statystyk na jej temat, używając funkcji R. Nie ma problemu! RPY ułatwia wysłać dataframe od Pandy do R:* Efektywnie * przenoszenie ramek danych od Pandy do R z RPy (lub innymi sposobami)

import pandas as pd 
df = pd.DataFrame(index=range(100000),columns=range(100)) 
from rpy2 import robjects as ro 
ro.globalenv['df'] = df 

A jeśli jesteśmy w ipython:

%load_ext rmagic 
%R -i df 

Z jakiegoś powodu trasa ro.globalenv jest nieco wolniejszy niż trasie rmagic, ale bez znaczenia. Liczy się to: ramka danych, której ostatecznie użyję, ma ~ 100 GB. Pojawia się kilka problemów:

  1. Nawet z 1GB danych, transfer jest raczej powolny.
  2. Jeśli dobrze rozumiem, tworzy to dwie kopie ramki danych w pamięci: jedną w języku Python, a drugą w R. Oznacza to, że właśnie podwoiłem swoje wymagania dotyczące pamięci i nie mam nawet uruchomionych testów statystycznych !

Czy istnieje jakiś sposób, aby:

  1. transferu duża dataframe między Python i R szybciej?
  2. Dostęp do tego samego obiektu w pamięci? Podejrzewam, że to prosi o księżyc.
+1

To interesujące pytanie - zwykle kończę zapisywanie moich danych na dysku, a następnie przeczytanie ich ponownie w R. Nie trzeba chyba dodawać, że jest to dalece mało skuteczne. Jednak 'python' i' R' są zupełnie innymi językami. To niesamowite, że coś podobnego do 'rpy' jest możliwe w pythonie. Wątpię, czy możliwe jest posiadanie struktury danych ramek danych, która działa zarówno dla Pythona, jak i R bez potrzeby dużych transformacji. Oczekuję jednak odpowiedzi. – cel

+0

Czy możesz napisać do pliku '.RData' z Pand? –

+0

Prawdopodobnie nie bez konwersji na ramkę danych 'R'. – cel

Odpowiedz

5

rpy2 używa mechanizmu konwersji, który próbuje uniknąć kopiowania obiektów podczas przechodzenia między Python i R. Jednak obecnie działa tylko w kierunku R -> Python.

Python ma interfejs zwany „interfejs bufor”, które jest używane przez rpy2 i że pozwala to zminimalizować liczbę kopii C poziomie zgodnym między R i Pythonie (patrz http://rpy.sourceforge.net/rpy2/doc-2.5/html/numpy.html#from-rpy2-to-numpy - doc wydaje się nieaktualny, interfejs __array_struct__ nie jest już podstawowym wyborem).

Nie ma odpowiednika interfejsu bufora w R, a bieżącym problemem powstrzymującym mnie od zapewnienia równoważnej funkcji w rpy2 jest obsługa pożyczonych referencji podczas odśmiecania (oraz brak czasu na dogłębne przemyślenie).

Tak w skrócie jest to sposób na wymianę danych między Pythonem i R bez kopiowania, ale będzie to wymagać, aby dane utworzone w R.

+0

Dzięki! Czy to zadziała w przypadku Pandas 'DataFrame'? To znaczy, tworząc 'dane.frame' w R, a następnie wysyłając go do Pythona, aby użyć go jako' DataFrame'? Jakie byłyby odpowiednie polecenia? – jeffalstott

+1

Patrząc na kod dla 'pandas2ri.ri2py_dataframe' i' numpy2ri.ri2py_list', wygląda na to, że _nie_ nie dzieje się domyślnie dla wysłania 'data.frame' do Pythona? Czy to jest poprawne? – jeffalstott

+0

'pandas2ri.ri2py_dataframe' używa po raz pierwszy konwertera' numpy' i spróbuje przekształcić listę R (ramki danych R dziedziczy z list) w strukturę numpy danych używając 'numpy.rec.fromarrays'. Alternatywą byłoby najpierw utworzyć numpy 'recarray' i zapełnić go za pomocą' numpy.asarray (column_in_R_dataframe) '. – lgautier

2

Obecnie feather wydaje się być najbardziej efektywnym rozwiązaniem dla wymiany danych- między DataFrame R i pand.

Powiązane problemy