Lisez les ensembles de données R à partir de Python.
Le package rdata offre un moyen léger d'importer des ensembles de données/objets R stockés aux formats « .rda » et « .rds » dans Python. Ses principaux avantages sont :
Il s'agit d'une implémentation Python pure, sans dépendances sur le langage R ou les bibliothèques associées. Ainsi, il peut être utilisé partout où Python est pris en charge, y compris sur le Web utilisant Pyodide.
Il tente de prendre en charge tous les objets R pouvant être traduits de manière significative. Contrairement à d’autres solutions, vous n’êtes pas limité à importer des dataframes ou des données avec une structure particulière.
Il permet aux utilisateurs de personnaliser facilement la conversion des classes R en classes Python. Vos données utilisent-elles des classes R personnalisées ? Ne vous inquiétez plus, car il est possible de définir des conversions personnalisées vers les classes Python de votre choix.
Il dispose d'une licence permissive (MIT). Contrairement à d'autres packages qui dépendent des bibliothèques R et doivent donc adhérer à la licence GPL, vous pouvez utiliser rdata comme dépendance sur des projets MIT, BSD ou même fermés.
rdata est sur PyPi et peut être installé en utilisant pip
:
pip installer rdata
Il est également disponible pour conda
utilisant le canal conda-forge
:
conda install -c conda-forge rdata
La version actuelle de la branche de développement peut être installée comme
pip install git+https://github.com/vnmabus/rdata.git@develop
La documentation de rdata se trouve dans ReadTheDocs.
Des exemples d'utilisation sont disponibles dans ReadTheDocs.
La manière courante de lire un ensemble de données R est la suivante :
import rdataconverted = rdata.read_rda(rdata.TESTDATA_PATH / "test_vector.rda")converti
ce qui aboutit à
{'test_vecteur': array([1., 2., 3.])}
Sous le capot, cela équivaut au code suivant :
import rdataparsed = rdata.parser.parse_file(rdata.TESTDATA_PATH / "test_vector.rda")converti = rdata.conversion.convert(parsed)converti
Cela consiste en deux étapes :
Tout d'abord, le fichier est analysé à l'aide de la fonction rdata.parser.parse_file. Cela fournit une description littérale du contenu du fichier sous la forme d'une hiérarchie d'objets Python représentant les objets R de base. Cette étape est sans ambiguïté et toujours la même.
Ensuite, chaque objet doit être converti en un objet Python approprié. Dans cette étape, vous avez plusieurs choix quant au type Python le plus approprié comme conversion pour un objet R donné. Ainsi, nous fournissons une routine rdata.conversion.convert par défaut, qui tente de sélectionner les objets Python qui préservent la plupart des informations de l'objet R d'origine. Pour les classes R personnalisées, il est également possible de spécifier des routines de conversion en objets Python.
La routine de conversion de base construit uniquement un objet SimpleConverter et appelle sa méthode de conversion. Tous les arguments de convert sont directement transmis à la méthode d'initialisation SimpleConverter.
Il est possible, bien que non trivial, de créer un objet Converter personnalisé pour modifier la manière dont les objets R de base sont transformés en objets Python. Cependant, une situation plus courante est que l'on ne souhaite pas modifier la façon dont les objets R de base sont convertis, mais que l'on souhaite plutôt fournir des conversions pour des classes R spécifiques. Cela peut être fait en passant un dictionnaire à la méthode d'initialisation SimpleConverter, contenant comme clés les noms des classes R et comme valeurs, des appelables qui convertissent un objet R de cette classe en un objet Python. Par défaut, le dictionnaire utilisé est DEFAULT_CLASS_MAP, qui peut convertir les classes R couramment utilisées telles que data.frame et factor.
À titre d'exemple, voici comment nous implémenterions une routine de conversion pour la classe de facteurs en objets octets, au lieu de la conversion par défaut en objets catégoriels Pandas :
import rdatadef factor_constructor(obj, attrs) : valeurs = [bytes(attrs['levels'][i - 1], 'utf8') si i >= 0 else Aucun pour i dans obj] return valuesnew_dict = { **rdata. conversion.DEFAULT_CLASS_MAP, "factor": factor_constructor}converti = rdata.read_rda( rdata.TESTDATA_PATH / "test_dataframe.rda", constructor_dict=new_dict, )converti
ce qui a le résultat suivant :
{'test_dataframe' : valeur de classe 1 ba' 1 2 b'b' 2 3 b'b' 3}
Des exemples supplémentaires illustrant les fonctionnalités de ce package peuvent être trouvés dans la documentation ReadTheDocs.