Comment réaliser plusieurs DataFrames pandas en une seule dataframe dask plus grande que la mémoire?

j'analyse des données délimitées par tabulations pour créer des données tabulaires, que j'aimerais stocker dans un HDF5.

mon problème est que je dois regrouper les données dans un format, puis les transférer dans HDF5. Il s'agit de données de taille ~1 TB, donc je ne peux naturellement pas l'ajuster en RAM. Dask pourrait être le meilleur moyen d'accomplir cette tâche.

si j'utilise l'analyse de mes données pour m'adapter à une base de données pandas, je ferais ceci:

import pandas as pd
import csv   

csv_columns = ["COL1", "COL2", "COL3", "COL4",..., "COL55"]
readcsvfile = csv.reader(csvfile)

total_df = pd.DataFrame()    # create empty pandas DataFrame
for i, line in readcsvfile:
    # parse create dictionary of key:value pairs by table field:value, "dictionary_line"
    # save dictionary as pandas dataframe
    df = pd.DataFrame(dictionary_line, index=[i])  # one line tabular data 
    total_df = pd.concat([total_df, df])   # creates one big dataframe

utiliser dask pour faire la même tâche, il semble utilisateurs devriez essayer quelque chose comme ceci:

import pandas as pd
import csv 
import dask.dataframe as dd
import dask.array as da

csv_columns = ["COL1", "COL2", "COL3", "COL4",..., "COL55"]   # define columns
readcsvfile = csv.reader(csvfile)       # read in file, if csv

# somehow define empty dask dataframe   total_df = dd.Dataframe()? 
for i, line in readcsvfile:
    # parse create dictionary of key:value pairs by table field:value, "dictionary_line"
    # save dictionary as pandas dataframe
    df = pd.DataFrame(dictionary_line, index=[i])  # one line tabular data 
    total_df = da.concatenate([total_df, df])   # creates one big dataframe

après avoir créé une dataframe ~TB, j'enregistrerai dans hdf5.

Mon problème est que total_df ne rentre pas en RAM, et doit être sauvegardé sur le disque. Pouvez dask dataframe accomplir cette tâche?

Devrais-je essayer autre chose? Serait-il plus facile de créer un HDF5 à partir de plusieurs réseaux dask, c.-à-d. chaque colonne/champ un réseau dask? Peut-être partager les dataframes entre plusieurs noeuds et réduire à la fin?

EDIT: pour plus de clarté, Je ne lis pas directement un fichier csv. Je suis en train d'agréger, d'analyser et de formater des données tabulaires. Donc, readcsvfile = csv.reader(csvfile) est utilisé ci-dessus pour la clarté/brièveté, mais c'est beaucoup plus compliqué que de lire dans un fichier csv.

12
demandé sur Community 2016-10-09 23:18:04

1 réponses

Dask.dataframe gère des ensembles de données plus grands que la mémoire par paresse. Ajouter des données concrètes à un dask.dataframe ne sera pas productif.

Si vos données peuvent être traitées par mp.read_csv

pandas.read_csv la fonction est très flexible. Vous dites au-dessus que votre processus d'analyse est très complexe, mais il pourrait être intéressant de regarder dans les options pour pd.read_csv pour voir si elle fonctionne toujours. dask.dataframe.read_csv la fonction supporte ces mêmes argument.

en particulier si la préoccupation est que vos données sont séparées par des onglets plutôt que des virgules ce n'est pas un problème du tout. Pandas supporte un sep='\t' mot clé, avec quelques dizaines d'autres options.

Envisager de dask.sac

si vous voulez utiliser textfiles ligne par ligne, alors envisagez d'utiliser dask.sac à analyser vos données, en commençant comme un tas de texte.

import dask.bag as db
b = db.read_text('myfile.tsv', blocksize=10000000)  # break into 10MB chunks
records = b.str.split('\t').map(parse)
df = records.to_dataframe(columns=...)

Écrire à HDF5 fichier

une Fois que vous avez dask.essayez le dataframe .to_hdf méthode:

df.to_hdf('myfile.hdf5', '/df')
6
répondu MRocklin 2016-10-10 15:58:42