Ich habe eine große Datenmenge 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 gekennzeichnet sind. Die Sensorwerte sind vom Datentyp float.
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
}
mongo_doc.data_frame = my_pandas_df
Antworten:
pymongo
könnte Ihnen helfen, folgendes sind einige Codes, die ich benutze:quelle
list()
Inneredf = pd.DataFrame(list(cursor))
als Liste oder Generator ausgewertet wird, um die CPU kühl zu halten. Wenn Sie einunddreißig Datenelemente haben und die nächsten paar Zeilen einigermaßen aufgeteilt, detailliert und abgeschnitten wären, ist das ganze Shmegegge immer noch sicher. Schön.df = pd.DataFrame(list(cursor))
. Reine Datenbankabfrage ist viel schneller. Könnten wir daslist
Casting in etwas anderes ändern ?Mit diesem Code können Sie Ihre Mongodb-Daten in pandas DataFrame laden. Für mich geht das. Hoffentlich auch für dich.
quelle
Monary
macht genau das und es ist super schnell . (ein weiterer Link )Sehen Sie sich diesen coolen Beitrag an, der ein kurzes Tutorial und einige Timings enthält.
quelle
client = Monary(host, 27017, database="db_tmp") columns = ["col1", "col2"] data_type = ["int64", "int64"] arrays = client.query("db_tmp", "coll", {}, columns, data_type)
für50000
Aufzeichnungen dauert herum200s
.Nach PEP ist einfach besser als kompliziert:
Sie können Bedingungen einschließen, wie Sie es mit einer normalen MongoDB-Datenbank tun würden, oder sogar find_one () verwenden, um nur ein Element aus der Datenbank usw. abzurufen.
und voila!
quelle
quelle
Sie können das Python Blaze-Ökosystem Blaze / Dask / Odo ausprobieren, um Daten außerhalb des Kerns (die nicht in den RAM passen) effizient zu verarbeiten (dh bei paralleler Ausführung) .
Blaze (und Odo ) verfügen über sofort einsatzbereite Funktionen für 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 Abfragen von 975 GB Reddit-Kommentaren in Sekunden).
PS Ich bin mit keiner dieser Technologien verbunden.
quelle
Eine andere Option, die ich sehr nützlich fand, ist:
Auf diese Weise können Sie verschachtelte Mongodb-Dokumente kostenlos entfalten.
quelle
TypeError: data argument can't be an iterator
3.6.7
mit Pandas0.24.2
. Vielleicht kannst du esdf = json_normalize(list(cursor))
stattdessen versuchen ?Verwenden von
verbraucht viel Speicher, wenn das Ergebnis des Iterators / Generators groß ist
Besser kleine Brocken und Concat am Ende zu generieren
quelle
http://docs.mongodb.org/manual/reference/mongoexport
Export nach CSV und Verwendung
read_csv
oder JSON und VerwendungDataFrame.from_records()
quelle
DataFrame.from_records()
.Nach dieser großartigen Antwort von waitkuo möchte ich die Möglichkeit hinzufügen, dies mit Chunksize in Übereinstimmung mit .read_sql () und .read_csv () zu tun . Ich vergrößere die Antwort von Deu Leung, indem ich vermeide, nacheinander jeden 'Datensatz' des 'Iterators' / 'Cursors' zu gehen. Ich werde die vorherige Funktion read_mongo ausleihen .
quelle
Ein ähnlicher Ansatz wie Rafael Valero, Waitkuo und Deu Leung mit Paginierung :
quelle
Mit pdmongo können Sie in drei Zeilen erreichen, was Sie wollen :
Wenn Ihre Daten sehr groß sind, können Sie zuerst eine aggregierte Abfrage durchführen, indem Sie nicht gewünschte Daten filtern und sie dann Ihren gewünschten Spalten zuordnen.
Hier ist ein Beispiel für die Zuordnung
Readings.a
zu einer Spaltea
und die Filterung nachreportCount
Spalte:read_mongo
akzeptiert die gleichen Argumente wie Pymongo-Aggregatquelle