2017/1/3 postscript: DataFrames.jl devrait sortir v.0.9 en février 2017 avec un correctif majeur qui rompt également partiellement la compatibilité de l'API. Veuillez noter que cet article est basé sur la v.0.6.10. S'il vous plaît. Si j'ai le temps et que j'ai envie (hé), je peux le réécrire en conséquence. Cependant, je n'ai pas eu beaucoup de temps pour toucher Julia ces jours-ci ...
Je suis vraiment intéressé par les mots "écrivons-le avec désinvolture!", Donc je l'ai touché, mais je le posterai comme un article pour Julia Advent Calendar 2015.
Dans cet article, j'écrirai sur le formatage des données et le traitement d'agrégation de base dans Julia en le comparant à la bibliothèque Pandas de Python et à R (que j'utilise habituellement). J'avais l'intention de le faire, mais quand je l'écrivais, j'étais dans une triste situation de manquer de temps pour lire les données. Veuillez me pardonner car j'ai l'intention d'écrire davantage.
Comme exemple d'ensemble de données, utilisez l'ensemble de données Subset of Million Songs (Thierry Bertin-Mahieux et al., 2011.) publié ci-dessous.
http://labrosa.ee.columbia.edu/millionsong/pages/getting-dataset#subset
Je suis désolé si quelqu'un télécharge ces données, qui sont assez volumineuses, même s'il s'agit d'un sous-ensemble, mais cet article n'utilise qu'une petite partie de cet ensemble de données, les deux suivants dans le répertoire AdditionalDataset: est:
Le fichier 1 . Est SQLite DB et 2. est au format texte. Si vous lisez la description sur la page d'origine, vous constaterez que le fichier en 2. est décrit dans le format "artist id \ <SEP > artist mbid \ <SEP > track id \ <SEP > artist name". Si vous regardez ce fichier avec tête pour le moment, il ressemble à ce qui suit.
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
En regardant le format de fichier, \ <SEP > est utilisé comme chaîne de délimitation comme décrit, et il n'y a pas d'en-tête. Read.delim de R et DataFrames.readtable de Julia ne prennent pas en charge les délimiteurs à plusieurs caractères, vous devez donc les remplacer de manière appropriée. La virgule peut être utilisée dans le nom de l'artiste, etc., de sorte que l'onglet semble sûr. Dans R et Julia, nous lirons \ <SEP > avec remplacement de tabulation.
Incidemment, il y a un nom d'artiste Buzzov¬ "en sur la 224ème ligne de ce fichier, et dans un cas où il n'y a qu'un guillemet double, Pandas semble l'ignorer et le lire. , Autre que cela, une erreur se produit et il ne peut pas être lu, j'ai donc décidé de supprimer cette double citation cette fois.
La lecture des données avec Python + Pandas est la suivante.
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>")
Avec R, ça ressemble à ça.
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"))
Et la version Julia.
import DataFrames
unique_artists = DataFrames.readtable(
"subset_unique_artists.tsv",
header=false,
names=[:artist_id, :artist_mbid, :track_id, :artist_name])
C'était bien jusqu'à ce que je charge TSV avec le code ci-dessus, mais je suis resté coincé avec le chargement de SQLite. SQLite.jl lit au format DataStreams.Data.Table et doit être converti en DataFrame. Pour la méthode de conversion, l'échange suivant au sein de julia-users a été utile (même s'il n'a pas fonctionné comme il l'était) https://groups.google.com/forum/#!msg/julia-users/ IFkPso4JUac / KwYj91fJAwAJ J'ai pu lire les données de SQLite avec DataFrame comme suit.
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)
Post-scriptum 2015/12/18:
Dans le code ci-dessus, chaque colonne est de type Nullable {UTF8Strings}, mais je pense qu'il serait préférable de l'exprimer en utilisant NA plutôt que cela.
Alors
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
Il vaudrait peut-être mieux dire.
Pour le moment, c'est la fin. J'écrirai à nouveau une comparaison du traitement de découpage, de l'agrégation d'adieu, etc.
L'opération a été confirmée dans l'environnement suivant:
Réparer:
Recommended Posts