web-dev-qa-db-fra.com

Chargement de fichiers .RData dans Python

J'ai un tas de fichiers de séries chronologiques .RData et je voudrais les charger directement dans Python sans d'abord convertir les fichiers en une autre extension (comme .csv). Toutes les idées sur le meilleur moyen d'accomplir cela?

25
Stu

Les gens demandent ce genre de chose sur la liste R-help et R-dev et la réponse habituelle est que le code est la documentation du .RData format de fichier. Ainsi, toute autre implémentation dans un autre langage est hard ++ .

Je pense que la seule façon raisonnable est d'installer RPy2 et d'utiliser la fonction load de R à partir de cela, en convertissant en objets appropriés python au fur et à mesure. Le .RData Le fichier peut contenir des objets structurés ainsi que des tableaux simples, alors faites attention.

Linky: http://rpy.sourceforge.net/rpy2/doc-2.4/html/

Quicky:

>>> import rpy2.robjects as robjects
>>> robjects.r['load'](".RData")

les objets sont maintenant chargés dans l'espace de travail R.

>>> robjects.r['y']
<FloatVector - Python:0x24c6560 / R:0xf1f0e0>
[0.763684, 0.086314, 0.617097, ..., 0.443631, 0.281865, 0.839317]

C'est un simple scalaire, d est un bloc de données, je peux sous-ensemble pour obtenir des colonnes:

>>> robjects.r['d'][0]
<IntVector - Python:0x24c9248 / R:0xbbc6c0>
[       1,        2,        3, ...,        8,        9,       10]
>>> robjects.r['d'][1]
<FloatVector - Python:0x24c93b0 / R:0xf1f230>
[0.975648, 0.597036, 0.254840, ..., 0.891975, 0.824879, 0.870136]
24
Spacedman

Comme alternative pour ceux qui préfèrent ne pas avoir à installer R pour accomplir cette tâche (r2py l'exige), il existe un nouveau package "pyreadr" qui permet de lire les fichiers RData et Rds directement dans python sans dépendances.

C'est un wrapper autour de la librdata de la bibliothèque C, donc c'est très rapide.

Vous pouvez l'installer facilement avec pip:

pip install pyreadr

Par exemple, vous feriez:

import pyreadr

result = pyreadr.read_r('/path/to/file.RData') # also works for Rds

# done! let's see what we got
# result is a dictionary where keys are the name of objects and the values python
# objects
print(result.keys()) # let's check what objects we got
df1 = result["df1"] # extract the pandas data frame for object df1

Le repo est ici: https://github.com/ofajardo/pyreadr

Avertissement: je suis le développeur de ce package.

11
Otto Fajardo

Utilisateurs de portables Jupyter

Si vous utilisez le bloc-notes Jupyter, vous devez effectuer 2 étapes:

Étape 1: allez sur http://www.lfd.uci.edu/~gohlke/pythonlibs/#rpy2 et téléchargez Python interface vers le langage R (intégré R) dans mon cas, j'utiliserai rpy2-2.8.6-cp36-cp36m-win_AMD64.whl

Placez ce fichier dans le même répertoire de travail que vous vous trouvez actuellement.

Étape 2: accédez à votre bloc-notes Jupyter et écrivez les commandes suivantes

# This is to install rpy2 library in Anaconda
!pip install rpy2-2.8.6-cp36-cp36m-win_AMD64.whl

puis

# This is important if you will be using rpy2
import os
os.environ['R_USER'] = 'D:\Anaconda3\Lib\site-packages\rpy2'

puis

import rpy2.robjects as robjects
from rpy2.robjects import pandas2ri
pandas2ri.activate()

Cela devrait vous permettre d'utiliser les fonctions R en python. Maintenant, vous devez importer le readRDS comme suit

readRDS = robjects.r['readRDS']
df = readRDS('Data1.rds')
df = pandas2ri.ri2py(df)
df.head()

Toutes nos félicitations! vous avez maintenant le Dataframe que vous vouliez

Cependant, je vous conseille de l'enregistrer dans un fichier pickle pour une utilisation ultérieure dans python as

 df.to_pickle('Data1') 

La prochaine fois, vous pouvez simplement l'utiliser en

df1=pd.read_pickle('Data1')
6
rsc05

Il existe une bibliothèque tierce appelée rpy, et vous pouvez utiliser cette bibliothèque pour charger .RData des dossiers. Vous pouvez l'obtenir via un pip install pip instally rpy fera l'affaire, si vous n'avez pas rpy, alors je vous suggère de regarder comment l'installer. Sinon, vous pouvez simplement faire:

from rpy import *
r.load("file name here")

ÉDITER:

Il semble que je sois un peu vieille école là-bas, s rpy2 maintenant, vous pouvez donc l'utiliser.

2
Games Brainiac