128 votes

Comment importer des données de mongodb vers pandas ?

J'ai une grande quantité de données dans une collection dans mongodb que je dois analyser. Comment puis-je importer ces données dans pandas ?

Je suis novice en matière de pandas et de numpy.

EDIT : La collection mongodb contient des valeurs de capteur étiquetées avec la date et l'heure. Les valeurs des capteurs sont de type float.

Données de l'échantillon :

{
"_cls" : "SensorReport",
"_id" : ObjectId("515a963b78f6a035d9fa531b"),
"_types" : [
    "SensorReport"
],
"Readings" : [
    {
        "a" : 0.958069536790466,
        "_types" : [
            "Reading"
        ],
        "ReadingUpdatedDate" : ISODate("2013-04-02T08:26:35.297Z"),
        "b" : 6.296118156595,
        "_cls" : "Reading"
    },
    {
        "a" : 0.95574014778624,
        "_types" : [
            "Reading"
        ],
        "ReadingUpdatedDate" : ISODate("2013-04-02T08:27:09.963Z"),
        "b" : 6.29651468650064,
        "_cls" : "Reading"
    },
    {
        "a" : 0.953648289182713,
        "_types" : [
            "Reading"
        ],
        "ReadingUpdatedDate" : ISODate("2013-04-02T08:27:37.545Z"),
        "b" : 7.29679823731148,
        "_cls" : "Reading"
    },
    {
        "a" : 0.955931884300997,
        "_types" : [
            "Reading"
        ],
        "ReadingUpdatedDate" : ISODate("2013-04-02T08:28:21.369Z"),
        "b" : 6.29642922525632,
        "_cls" : "Reading"
    },
    {
        "a" : 0.95821381,
        "_types" : [
            "Reading"
        ],
        "ReadingUpdatedDate" : ISODate("2013-04-02T08:41:20.801Z"),
        "b" : 7.28956613,
        "_cls" : "Reading"
    },
    {
        "a" : 4.95821335,
        "_types" : [
            "Reading"
        ],
        "ReadingUpdatedDate" : ISODate("2013-04-02T08:41:36.931Z"),
        "b" : 6.28956574,
        "_cls" : "Reading"
    },
    {
        "a" : 9.95821341,
        "_types" : [
            "Reading"
        ],
        "ReadingUpdatedDate" : ISODate("2013-04-02T08:42:09.971Z"),
        "b" : 0.28956488,
        "_cls" : "Reading"
    },
    {
        "a" : 1.95667927,
        "_types" : [
            "Reading"
        ],
        "ReadingUpdatedDate" : ISODate("2013-04-02T08:43:55.463Z"),
        "b" : 0.29115237,
        "_cls" : "Reading"
    }
],
"latestReportTime" : ISODate("2013-04-02T08:43:55.463Z"),
"sensorName" : "56847890-0",
"reportCount" : 8
}

15voto

fengwt Points 189
import pandas as pd
from odo import odo

data = odo('mongodb://localhost/db::collection', pd.DataFrame)

10voto

Denis Golomazov Points 1211

Pour traiter efficacement les données hors cœur (ne rentrant pas dans la RAM) (c'est-à-dire avec une exécution parallèle), vous pouvez essayer L'écosystème Python Blaze : Blaze / Dask / Odo.

Blaze (et Odo ) dispose de fonctions prêtes à l'emploi pour traiter avec MongoDB.

Quelques articles utiles pour commencer :

Et un article qui montre les choses étonnantes qui sont possibles avec la pile Blaze : Analyser 1,7 milliard de commentaires Reddit avec Blaze et Impala (essentiellement en interrogeant 975 Go de commentaires Reddit en quelques secondes).

P.S. Je ne suis affilié à aucune de ces technologies.

6voto

Deo Leung Points 163

Utilisation de

pandas.DataFrame(list(...))

consommera beaucoup de mémoire si le résultat de l'itérateur/générateur est grand.

Il est préférable de générer de petits morceaux et de les concaténer à la fin.

def iterator2dataframes(iterator, chunk_size: int):
  """Turn an iterator into multiple small pandas.DataFrame

  This is a balance between memory and efficiency
  """
  records = []
  frames = []
  for i, record in enumerate(iterator):
    records.append(record)
    if i % chunk_size == chunk_size - 1:
      frames.append(pd.DataFrame(records))
      records = []
  if records:
    frames.append(pd.DataFrame(records))
  return pd.concat(frames)

6voto

Vous pouvez également utiliser pymongoarrow -- il s'agit d'une bibliothèque officielle proposée par MongoDB pour exporter les données de mongodb vers pandas, numPy, des fichiers parquet, etc.

3voto

Jeff Points 27612

http://docs.mongodb.org/manual/reference/mongoexport

exporter en csv et utiliser read_csv ou JSON et utiliser DataFrame.from_records()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X