Lesen Sie R-Datensätze aus Python.
Das Paket rdata bietet eine einfache Möglichkeit, R-Datensätze/-Objekte, die in den Formaten „.rda“ und „.rds“ gespeichert sind, in Python zu importieren. Seine Hauptvorteile sind:
Es handelt sich um eine reine Python-Implementierung ohne Abhängigkeiten von der R-Sprache oder verwandten Bibliotheken. Daher kann es überall dort verwendet werden, wo Python unterstützt wird, einschließlich des Webs mit Pyodide.
Es wird versucht, alle R-Objekte zu unterstützen, die sinnvoll übersetzt werden können. Im Gegensatz zu anderen Lösungen sind Sie nicht darauf beschränkt, Datenrahmen oder Daten mit einer bestimmten Struktur zu importieren.
Es ermöglicht Benutzern, die Konvertierung von R-Klassen in Python-Klassen einfach anzupassen. Verwenden Ihre Daten benutzerdefinierte R-Klassen? Machen Sie sich keine Sorgen mehr, denn es ist möglich, benutzerdefinierte Konvertierungen für die Python-Klassen Ihrer Wahl zu definieren.
Es verfügt über eine permissive Lizenz (MIT). Im Gegensatz zu anderen Paketen, die von R-Bibliotheken abhängen und daher der GPL-Lizenz unterliegen müssen, können Sie rdata als Abhängigkeit von MIT-, BSD- oder sogar Closed-Source-Projekten verwenden.
rdata ist auf PyPi und kann mit pip
installiert werden:
pip install rdata
Es ist auch für conda
über den conda-forge
-Kanal verfügbar:
conda install -c conda-forge rdata
Die aktuelle Version aus dem Entwicklungszweig kann als installiert werden
pip install git+https://github.com/vnmabus/rdata.git@develop
Die Dokumentation von rdata finden Sie in ReadTheDocs.
Anwendungsbeispiele finden Sie in ReadTheDocs.
Die übliche Methode zum Lesen eines R-Datensatzes ist die folgende:
import rdataconverted = rdata.read_rda(rdata.TESTDATA_PATH / "test_vector.rda")konvertiert
was dazu führt
{'test_vector': array([1., 2., 3.])}
Unter der Haube entspricht dies dem folgenden Code:
import rdataparsed = rdata.parser.parse_file(rdata.TESTDATA_PATH / "test_vector.rda")converted = rdata.conversion.convert(parsed)converted
Dies besteht aus zwei Schritten:
Zunächst wird die Datei mit der Funktion rdata.parser.parse_file geparst. Dies bietet eine wörtliche Beschreibung des Dateiinhalts als Hierarchie von Python-Objekten, die die grundlegenden R-Objekte darstellen. Dieser Schritt ist eindeutig und immer gleich.
Anschließend muss jedes Objekt in ein entsprechendes Python-Objekt konvertiert werden. In diesem Schritt gibt es mehrere Möglichkeiten, welcher Python-Typ als Konvertierung für ein bestimmtes R-Objekt am besten geeignet ist. Daher stellen wir eine Standardroutine rdata.conversion.convert bereit, die versucht, Python-Objekte auszuwählen, die die meisten Informationen des ursprünglichen R-Objekts beibehalten. Für benutzerdefinierte R-Klassen ist es auch möglich, Konvertierungsroutinen in Python-Objekte anzugeben.
Die grundlegende Konvertierungsroutine erstellt nur ein SimpleConverter-Objekt und ruft dessen Konvertierungsmethode auf. Alle Argumente von „convert“ werden direkt an die SimpleConverter-Initialisierungsmethode übergeben.
Es ist möglich, wenn auch nicht trivial, ein benutzerdefiniertes Konverterobjekt zu erstellen, um die Art und Weise zu ändern, wie die grundlegenden R-Objekte in Python-Objekte umgewandelt werden. Eine häufigere Situation besteht jedoch darin, dass man nicht ändern möchte, wie grundlegende R-Objekte konvertiert werden, sondern stattdessen Konvertierungen für bestimmte R-Klassen bereitstellen möchte. Dies kann durch die Übergabe eines Wörterbuchs an die SimpleConverter-Initialisierungsmethode erfolgen, das als Schlüssel die Namen von R-Klassen und als Werte aufrufbare Elemente enthält, die ein R-Objekt dieser Klasse in ein Python-Objekt konvertieren. Standardmäßig ist das verwendete Wörterbuch DEFAULT_CLASS_MAP, das häufig verwendete R-Klassen wie data.frame und Factor konvertieren kann.
Als Beispiel sehen wir hier, wie wir eine Konvertierungsroutine für die Faktorklasse in Byte-Objekte implementieren würden, anstelle der Standardkonvertierung in kategoriale Pandas-Objekte:
import rdatadef Factor_constructor(obj, attrs): Values = [Bytes(attrs['levels'][i - 1], 'utf8') if i >= 0 else None for i in obj] return effectsnew_dict = { **rdata. Conversion.DEFAULT_CLASS_MAP, "Faktor": Faktor_Konstruktor}converted = rdata.read_rda( rdata.TESTDATA_PATH / "test_dataframe.rda", constructionor_dict=new_dict, )konvertiert
was folgendes Ergebnis hat:
{'test_dataframe': Klassenwert 1 b'a' 1 2 b'b' 2 3 b'b' 3}
Weitere Beispiele, die die Funktionalitäten dieses Pakets veranschaulichen, finden Sie in der ReadTheDocs-Dokumentation.