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:
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