web-dev-qa-db-fra.com

Comment profiler de grands ensembles de données avec Pandas profilage?

Les données ne sont pas parfaitement propres, mais sont utilisées sans problème avec les pandas. Le pandas Bibliothèque fournit de nombreuses fonctions extrêmement utiles pour EDA.

Mais lorsque j'utilise le profilage pour de grandes données, c'est-à-dire 100 millions d'enregistrements avec 10 colonnes, le lire à partir d'une table de base de données, il ne fonctionne pas et mon ordinateur portable est sorti de la mémoire, la taille des données dans CSV est d'environ 6 Go et mon RAM est 14 Go Mon utilisation inactive est d'environ 3 - 4 Go environ.

df = pd.read_sql_query("select * from table", conn_params)
profile = pandas.profiling.ProfileReport(df)
profile.to_file(outputfile="myoutput.html")

J'ai aussi essayé avec check_recoded = False option aussi. Mais cela n'aide pas entièrement au profilage. Y a-t-il un moyen de calculer et de lire les données et de générer enfin le rapport sommaire dans son ensemble? OR toute autre méthode pour utiliser cette fonction avec un ensemble de données grand.

6
Viv

La syntaxe pour désactiver le calcul des corrélations (ainsi réduisant fortement les calculs) a beaucoup changé entre pandas-profiling=1.4 et la version actuelle (bêta) pandas-profiling=2.0 Pour ce qui suit:

profile = df.profile_report(correlations={
    "pearson": False,
    "spearman": False,
    "kendall": False,
    "phi_k": False,
    "cramers": False,
    "recoded":False,}
)

De plus, vous pouvez réduire les calculs effectués en désactivant les calculs des bacs pour le tracé des histogrammes.

profile = df.profile_report(plot={'histogram': {'bins': None}}
1
cptnJ

Une autre option est de réduire les données.

Une option peut être obtenue avec sample:

df.sample(number)

Plus de détails sur Documentation Pandas .

0

Depuis la version 2.4 Vous pouvez utiliser le MODE minimal qui désactive des calculs coûteux (tels que corrélations et binning dynamique):

from pandas_profiling import ProfileReport


profile = ProfileReport(df, minimal=True)
profile.to_file(output_file="output.html")
0