Lesen aus Textdateien und SQLite mit Python (+ Pandas), R, Julia (+ DataFrames)

Postskriptum 2017/1/3: DataFrames.jl wird voraussichtlich im Februar 2017 v.0.9 mit einem wichtigen Fix veröffentlichen, der auch die API-Kompatibilität teilweise beeinträchtigt. Bitte beachten Sie, dass dieser Artikel auf v.0.6.10 basiert. Bitte. Wenn ich Zeit habe und Lust dazu habe (hey), kann ich es entsprechend umschreiben. Allerdings hatte ich heutzutage nicht viel Zeit, Julia zu berühren ...


Ich interessiere mich wirklich für die Worte "Lass es uns beiläufig schreiben!", Also habe ich es berührt, aber ich werde es als Artikel für Julia Adventskalender 2015 veröffentlichen.

In diesem Artikel werde ich über Datenformatierung und grundlegende Aggregationsverarbeitung in Julia schreiben, indem ich sie mit Pythons Pandas-Bibliothek und R (die ich normalerweise verwende) vergleiche. Ich hatte vor, das zu tun, aber als ich es schrieb, war ich in einer traurigen Situation, dass mir die Zeit zum Lesen der Daten ausgegangen war. Bitte vergib mir, da ich vorhabe, mehr zu schreiben.

Verwenden Sie als Beispieldatensatz den unten veröffentlichten Datensatz "Subset of Million Songs" (Thierry Bertin-Mahieux et al., 2011.).

http://labrosa.ee.columbia.edu/millionsong/pages/getting-dataset#subset

Es tut mir leid, wenn jemand diese Daten herunterlädt, die ziemlich groß sind, obwohl es sich um eine Teilmenge handelt. In diesem Artikel wird jedoch nur ein kleiner Teil dieses Datensatzes verwendet, die folgenden beiden im Verzeichnis AdditionalDataset: ist:

  1. subset_artist_term.db
  2. subset_unique_artists.txt

Die Datei 1 . Ist SQLite DB und 2. ist im Textformat. Wenn Sie die Beschreibung auf der Originalseite lesen, werden Sie feststellen, dass die Datei in 2. im Format "Künstler-ID \ <SEP > Künstler mbid \ <SEP > Titel-ID \ <SEP > Künstlername" beschrieben ist. Wenn Sie sich diese Datei vorerst mit Kopf ansehen, sieht sie folgendermaßen aus.

AR009211187B989185<SEP>9dfe78a6-6d91-454e-9b95-9d7722cbc476<SEP>TRAWSCW12903CD6C7E<SEP>Carroll Thompson
AR00A6H1187FB5402A<SEP>312c14d9-7897-4608-944a-c5b1c76ae682<SEP>TRAKWGL12903CB8529<SEP>The Meatmen
AR00LNI1187FB444A5<SEP>7e836d29-fc2d-4a1f-b8da-566d47c49eed<SEP>TRAHVYQ128F429826B<SEP>Bruce BecVar
AR00MBZ1187B9B5DB1<SEP>ff748426-8873-4725-bdc7-c2b18b510d41<SEP>TRAFCPP128F426EC01<SEP>Memphis Minnie
AR01IP11187B9AF5D2<SEP>dbd2ebce-623d-4639-946e-c558bf56a0e3<SEP>TRAZNKG12903CDCF8A<SEP>Call To Preserve
AR01VU31187B997DA0<SEP>103241b0-6adf-4b4f-9cff-5c87459f61a4<SEP>TRAKZMB128F427B44F<SEP>Grand Funk
AR01W2D1187FB5912F<SEP>125948ec-7f91-4d1a-8b83-accbf50fae3d<SEP>TRASHYD128F93119EE<SEP>3OH!3
AR022JO1187B99587B<SEP>9538ab80-dcbf-4b94-a0cf-e5d1fbbc42c9<SEP>TRAHSJR12903CBF093<SEP>Ross
AR02DB61187B9A0B5E<SEP>bf035517-124e-409b-90f5-35618081a332<SEP>TRBANKK12903CDA071<SEP>Annie Philippe
AR02IU11187FB513F2<SEP>f19ad155-d809-4770-ab8d-7579467d9f55<SEP>TRAJFCC12903CC55AD<SEP>Tito Puente

Im Dateiformat wird \ <SEP > wie beschrieben als Trennzeichen verwendet, und es gibt keinen Header. Rs read.delim und Julias DataFrames.readtable unterstützen keine Trennzeichen für mehrere Zeichen, daher müssen Sie sie entsprechend ersetzen. Das Komma kann im Künstlernamen usw. verwendet werden, daher scheint die Registerkarte sicher zu sein. In R und Julia lesen wir \ <SEP > mit Tab-Ersetzung.

Übrigens steht in der 224. Zeile dieser Datei ein Künstlername Buzzov¬ "en, und in einem solchen Fall, in dem es nur ein doppeltes Anführungszeichen gibt, scheint Pandas ihn zu ignorieren und zu lesen. Ansonsten tritt ein Fehler auf, der nicht gelesen werden kann. Deshalb habe ich mich entschlossen, dieses doppelte Anführungszeichen dieses Mal zu löschen.

Das Lesen von Daten mit Python + Pandas ist wie folgt.

import pandas
import sqlite3


conn = sqlite3.connect("subset_artist_term.db")
artist_term = pandas.read_sql(
    "SELECT * FROM ARTIST_TERM",
    conn)
unique_artists = pandas.read_csv(
    "./subset_unique_artists.txt",
    names=["artist_id", "artist_mbid", "track_id", "artist_name"],
    sep="<SEP>")

Mit R sieht es so aus.

require(RSQLite)

conn <- dbConnect(SQLite(), "subset_artist_term.db")
artist_term <- dbReadTable(conn, "artist_term")

unique_artists <- read.delim(
    "subset_unique_artists.tsv",
    sep="\t",
    header=F,
    col.names=c("artist_id", "artist_mbid", "track_id", "artist_name"))

Und die Julia-Version.

import DataFrames
unique_artists = DataFrames.readtable(
    "subset_unique_artists.tsv",
    header=false,
    names=[:artist_id, :artist_mbid, :track_id, :artist_name])

Es war gut, bis ich TSV mit dem obigen Code geladen habe, aber ich blieb beim Laden von SQLite hängen. SQLite.jl liest im Format DataStreams.Data.Table und muss in einen DataFrame konvertiert werden. Für die Konvertierungsmethode war der folgende Austausch innerhalb von Julia-Benutzern hilfreich (obwohl er nicht so funktionierte wie er war) https://groups.google.com/forum/#!msg/julia-users/ IFkPso4JUac / KwYj91fJAwAJ Ich konnte Daten aus SQLite mit DataFrame wie folgt lesen.

import SQLite
import DataStreams

function DataFrame(dt::DataStreams.Data.Table)
    cols = dt.schema.cols
    data = Array(Any,cols)
    types = dt.schema.types
    for i = 1:cols
        data[i] = dt.data[i]
    end
    return DataFrames.DataFrame(data,Symbol[symbol(x) for x in dt.schema.header]) 
end

conn =  SQLite.DB("subset_artist_term.db")
artist_term_table = SQLite.query(conn, "SELECT * FROM ARTIST_TERM")
artist_term = DataFrame(artist_term_table)

18.12.2015 Nachtrag:

Im obigen Code ist jede Spalte vom Typ Nullable {UTF8Strings}, aber ich denke, es wäre besser, sie mit NA auszudrücken.

Damit

function DataFrame(dt::DataStreams.Data.Table)
    cols = dt.schema.cols
    data = Array(Any,cols)
    types = dt.schema.types
    for i = 1:cols
        data[i] = [isnull(el)? NA : get(el) for el in dt.data[i]]
    end
    return DataFrames.DataFrame(data, Symbol[symbol(x) for x in dt.schema.header]) 
end

Es kann besser sein zu sagen.


Dies ist vorerst das Ende. Ich werde noch einmal einen Vergleich der Schnittverarbeitung, der Abschiedsaggregation usw. schreiben.

Die Operation wurde in der folgenden Umgebung bestätigt:

Fix:

Recommended Posts

Lesen aus Textdateien und SQLite mit Python (+ Pandas), R, Julia (+ DataFrames)
Lesen und Schreiben von Text in Python
Studie aus Python Lesen und Schreiben von Hour9-Dateien
Lesen und Schreiben von CSV- und JSON-Dateien mit Python
Bearbeiten Sie Dateien und Ordner in Python
Lesen und verwenden Sie Python-Dateien aus Python
Extrahieren Sie mit Python Text aus Bildern
Sortieren Sie große Textdateien in Python
Hashing von Daten in R und Python
Exportieren und Ausgeben von Dateien in Python
Extrahieren Sie mit Python Zeichenfolgen aus Dateien
Lesen und Schreiben von JSON-Dateien mit Python
Lesen und schreiben Sie JSON-Dateien mit Python
[Easy Python] Lesen von Excel-Dateien mit Pandas
Rufen Sie Optionen in Python sowohl aus JSON-Dateien als auch aus Befehlszeilenargumenten ab
Laden Sie den Befehl von yml mit Python und führen Sie ihn aus
SQLite in Python
Vergleich von Python (+ Pandas), R, Julia (+ DataFrames) (Zusammenfassung des Tabelleninhalts, Zugriff nach Spalte)
Lesen und Schreiben passt Dateien mit Python (Memo)
Python-Textlesung für mehrere Zeilen und eine Zeile
Übersetzen von Visual Studio 2017 nach Python (Microsoft Translator Text API)
Implementierte List und Bool in Python und SQLite3 (persönliche Notiz)
Schließen Sie externe Kv-Dateien in Python Kivy ein und verwenden Sie sie
So laden Sie Dateien von Selenium of Python in Chrome herunter
Importieren Sie Klassen in JAR-Dateien direkt aus dem Python-Skript
Holen Sie sich Dateien von Linux mit paramiko und scp [Python]
Suchen Sie rekursiv nach Dateien und Verzeichnissen in Python und geben Sie sie aus
Clustertext in Python
Textverarbeitung mit Python
[Python] CSV-Dateien lesen
Ich habe versucht, mit Python Modebilder und Textsätze zu [kratzen].
[R] [Python] Memo zum Lesen mehrerer CSV-Dateien in mehreren Zip-Dateien
Poisson-Verteilung und kumulative Poisson-Verteilung über SQLite in Python und Java
[Python] Zeichnen Sie Pandas-Datenrahmen in Plotly mit Manschettenknöpfen
Erlauben Sie Python, die Zeichenfolge der Eingabedatei aus dem Ordner auszuwählen
Prognostizieren Sie das Geschlecht anhand des Namens mithilfe der Gender-API und von Pykakasi in Python
Zeichnen Sie Zeitreihendaten in Python mit Pandas und Matplotlib
Vergleich der Datenrahmenbehandlung in Python (Pandas), R, Pig
[Python] Zufällige Datenextraktion / -kombination aus DataFrame mit Random und Pandas
So erstellen Sie einen Datenrahmen und spielen mit Elementen mit Pandas
Hinweise zum Lesen und Schreiben von float32 TIFF-Bildern mit Python
UTF8-Textverarbeitung mit Python
Lesen und Schreiben von CSV-Dateien
Stapel und Warteschlange in Python
TXT-Dateien mit Python lesen
Sprechen mit Python [Text zu Sprache]
Stellen Sie von Python aus eine Verbindung zu SQLite her
Unittest und CI in Python
Tauschen Sie Spalten in Pandas-Datenrahmen aus
Funktioniert mit Python und R.
So importieren Sie CSV- und TSV-Dateien mit Python in SQLite
entwurzeln: Python / Numpy-basierte Bibliothek zum Lesen und Schreiben von ROOT-Dateien
Verwendung von Funktionen in separaten Dateien Perl-Version und Python-Version
Extrahieren Sie Text aus [python] pdf und lesen Sie Zeichen mit Open-Jtalk vor
[Python3] Speichern Sie die Mittelwert- und Kovarianzmatrix in json mit Pandas
Bedingte Elementextraktion aus dem Datenrahmen: R ist% in%, Python ist .isin ()
Datenbanktabellen mit CSV extrahieren [ODBC-Verbindung von R und Python]