Lecture à partir de fichiers texte et SQLite avec Python (+ Pandas), R, Julia (+ DataFrames)

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:

  1. subset_artist_term.db
  2. subset_unique_artists.txt

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

Lecture à partir de fichiers texte et SQLite avec Python (+ Pandas), R, Julia (+ DataFrames)
Lire et écrire du texte en Python
Étude à partir de Python Lecture et écriture de fichiers Hour9
Lire et écrire des fichiers CSV et JSON avec Python
Manipuler des fichiers et des dossiers en Python
Lire et utiliser des fichiers Python à partir de Python
Extraire du texte d'images avec Python
Trier les gros fichiers texte en Python
Hashing de données en R et Python
Exporter et exporter des fichiers en Python
Extraire des chaînes de fichiers avec Python
Lire et écrire des fichiers JSON avec Python
Lire et écrire des fichiers JSON avec Python
[Easy Python] Lecture de fichiers Excel avec des pandas
Obtenez des options en Python à partir des fichiers JSON et des arguments de ligne de commande
Charger et exécuter la commande depuis yml avec python
Sqlite en Python
Comparaison de Python (+ Pandas), R, Julia (+ DataFrames) (résumé du contenu de la table, accès par colonne)
La lecture et l'écriture s'adaptent aux fichiers avec Python (mémo)
Lecture de texte Python pour plusieurs lignes et une ligne
Traduire de Visual Studio 2017 vers Python (API Microsoft Translator Text)
Implémentation de List et Bool en Python et SQLite3 (note personnelle)
Inclure et utiliser des fichiers Kv externes avec Python Kivy
Comment télécharger des fichiers depuis Selenium of Python dans Chrome
Importez des classes dans des fichiers jar directement à partir d'un script Python
Récupérer des fichiers depuis Linux en utilisant paramiko et scp [Python]
Recherche récursive de fichiers et de répertoires en Python et sortie
Texte de cluster en Python
Traitement de texte avec Python
[Python] Lecture de fichiers CSV
J'ai essayé de [gratter] des images de mode et des phrases de texte avec Python.
[R] [Python] Memo pour lire plusieurs fichiers csv dans plusieurs fichiers zip
Distribution de Poisson et tracé de distribution cumulative de Poisson via sqlite en Python et Java
[Python] Dessinez des dataframes Pandas dans Plotly avec des boutons de manchette
Autoriser Python à sélectionner la chaîne de caractères du fichier d'entrée dans le dossier
Prédire le sexe à partir du nom à l'aide de l'API Gender et de Pykakasi en Python
Graphique des données de séries chronologiques en Python à l'aide de pandas et matplotlib
Comparaison de la gestion des trames de données en Python (pandas), R, Pig
[Python] Extraction / combinaison de données aléatoires à partir de DataFrame en utilisant random et pandas
Comment créer une trame de données et jouer avec des éléments avec des pandas
Notes sur la lecture et l'écriture d'images TIFF float32 avec python
Traitement de texte UTF8 avec python
Lire et écrire des fichiers csv
Pile et file d'attente en Python
Lire des fichiers .txt avec Python
Parler avec Python [synthèse vocale]
Connectez-vous à sqlite depuis python
Unittest et CI en Python
Permuter les colonnes dans les trames de données pandas
Fonctionne avec Python et R
Comment importer des fichiers CSV et TSV dans SQLite avec Python
uproot: bibliothèque basée sur Python / Numpy pour lire et écrire des fichiers ROOT
Comment utiliser les fonctions dans des fichiers séparés version Perl et version Python
Extraire le texte du pdf [python] et lire les caractères à haute voix avec Open-Jtalk
[Python3] Enregistrez la matrice de moyenne et de covariance dans json avec les pandas
Extraction d'éléments conditionnels à partir du bloc de données: R est% en%, Python est .isin ()
Extraire des tables de base de données avec CSV [connexion ODBC de R et python]