Frage Wie importiere ich Daten von Mongodb zu Pandas?


Ich habe eine große Menge an Daten in einer Sammlung in mongodb, die ich analysieren muss. Wie importiere ich diese Daten in Pandas?

Ich bin neu in Pandas und numpy.

BEARBEITEN: Die Mongodb-Sammlung enthält Sensorwerte, die mit Datum und Uhrzeit versehen sind. Die Sensorwerte sind vom Float-Datentyp.

Beispieldaten:

{
"_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
}

59
2018-04-27 07:59


Ursprung


Antworten:


pymongo könnte Ihnen helfen, folgen einige Codes, die ich benutze:

import pandas as pd
from pymongo import MongoClient


def _connect_mongo(host, port, username, password, db):
    """ A util for making a connection to mongo """

    if username and password:
        mongo_uri = 'mongodb://%s:%s@%s:%s/%s' % (username, password, host, port, db)
        conn = MongoClient(mongo_uri)
    else:
        conn = MongoClient(host, port)


    return conn[db]


def read_mongo(db, collection, query={}, host='localhost', port=27017, username=None, password=None, no_id=True):
    """ Read from Mongo and Store into DataFrame """

    # Connect to MongoDB
    db = _connect_mongo(host=host, port=port, username=username, password=password, db=db)

    # Make a query to the specific DB and Collection
    cursor = db[collection].find(query)

    # Expand the cursor and construct the DataFrame
    df =  pd.DataFrame(list(cursor))

    # Delete the _id
    if no_id:
        del df['_id']

    return df

85
2018-04-27 18:45



Mit diesem Code können Sie Ihre mongodb-Daten in pandas DataFrame laden. Für mich geht das. Hoffentlich auch für dich.

import pymongo
import pandas as pd
from pymongo import MongoClient
client = MongoClient()
db = client.database_name
collection = db.collection_name
data = pd.DataFrame(list(collection.find()))

21
2017-12-23 09:15



Monary tut genau das, und es ist Super schnell. (ein weiterer Link)

Sehen dieser coole Beitrag Dazu gehören ein schnelles Tutorial und einige Timings.


19
2017-12-19 22:33



import pandas as pd
from odo import odo

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

8
2017-10-20 23:33



Laut PEP ist einfach besser als kompliziert:

import pandas as pd
df = pd.DataFrame.from_records(db.<database_name>.<collection_name>.find())

Sie können Bedingungen wie bei der Arbeit mit der regulären mongoDB-Datenbank hinzufügen oder sogar find_one () verwenden, um nur ein Element aus der Datenbank zu erhalten.

und voila!


8
2017-10-23 11:43



Um mit out-of-core (nicht in RAM) Daten effizient umgehen zu können (d. H. Mit paralleler Ausführung), können Sie es versuchen Python Blaze Ökosystem: Blaze / Dask / Odo.

Blaze (und Odo) verfügt über Out-of-the-Box-Funktionen für den Umgang mit MongoDB.

Ein paar nützliche Artikel zum Starten:

Und ein Artikel, der zeigt, welche erstaunlichen Dinge mit Blaze Stack möglich sind: Analysieren von 1,7 Milliarden Reddit-Kommentaren mit Blaze und Impala (im Wesentlichen 975 Gb Reddit Kommentare in Sekunden abfragen).

P.S. Ich bin mit keiner dieser Technologien verbunden.


4
2017-09-27 00:16



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

Export nach CSV und verwenden read_csv oder JSON und verwenden DataFrame.from_records


2
2018-04-27 11:32



Verwenden

pandas.DataFrame(list(...))

Wenn der Iterator / Generator-Ergebnis groß ist, wird viel Speicher verbraucht

besser um kleine Brocken zu generieren und am Ende concat

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)

2
2017-09-12 08:19



Ein ähnlicher Ansatz wie Rafael Valero, Waitingkuo und Deu Leung Seitennummerierung:

def read_mongo(
       # db, 
       collection, query=None, 
       # host='localhost', port=27017, username=None, password=None,
       chunksize = 100, page_num=1, no_id=True):

    # Connect to MongoDB
    db = _connect_mongo(host=host, port=port, username=username, password=password, db=db)

    # Calculate number of documents to skip
    skips = chunksize * (page_num - 1)

    # Sorry, this is in spanish
    # https://www.toptal.com/python/c%C3%B3digo-buggy-python-los-10-errores-m%C3%A1s-comunes-que-cometen-los-desarrolladores-python/es
    if not query:
        query = {}

    # Make a query to the specific DB and Collection
    cursor = db[collection].find(query).skip(skips).limit(chunksize)

    # Expand the cursor and construct the DataFrame
    df =  pd.DataFrame(list(cursor))

    # Delete the _id
    if no_id:
        del df['_id']

    return df

1
2018-03-20 01:19