Comment importer des données à partir de mongodb pour les pandas?
J'ai une grande quantité de données dans une collection mongodb qui j'ai besoin d'analyser. Comment puis-je importer les données pour les pandas?
Je suis nouveau sur les pandas et numpy.
EDIT:
La collection mongodb contient des valeurs de capteur étiqueté avec la date et l'heure. Le capteur de valeurs du type de données float.
Des 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
}
- À l'aide de un type de champ personnalisé avec MongoEngine peut rendre le stockage et la récupération des Pandas DataFrames aussi simple que
mongo_doc.data_frame = my_pandas_df
Vous devez vous connecter pour publier un commentaire.
pymongo
peut vous donner un coup de main, trouvera ci-après quelques codes que j'utilise:list()
à l'intérieur dedf = pd.DataFrame(list(cursor))
évalue comme une liste ou d'un générateur, afin de garder le CPU cool. Si u ont un zillionty-l'un des éléments de données, et les quelques lignes auraient raisonnablement partioned, au niveau de l'détaillée, et de couper eux, l'ensemble de shmegegge est encore sûr à laisser tomber. Nice.df = pd.DataFrame(list(cursor))
. Pure db quering est beaucoup plus rapide. Pourrions-nous changerlist
casting pour quelque chose d'autre?Vous pouvez charger votre mongodb données aux pandas DataFrame l'aide de ce code. Il fonctionne pour moi. J'espère pour vous aussi.
Monary
fait exactement cela, et c'est super rapide. (un autre lien)Voir ce cool post qui comprend un tutoriel rapide et certains horaires.
client = Monary(host, 27017, database="db_tmp") columns = ["col1", "col2"] data_type = ["int64", "int64"] arrays = client.query("db_tmp", "coll", {}, columns, data_type)
Pour50000
enregistrements prend environ200s
.Comme par PEP, simple est le mieux que compliqué:
Vous pouvez inclure des conditions, comme vous le feriez de travail régulière de la base de données mongoDB ou même utiliser find_one() pour obtenir un seul élément de la base de données, etc.
et le tour est joué!
Pour traiter les out-of-core (pas de montage dans la RAM) les données de façon efficace (c'est à dire avec l'exécution en parallèle), vous pouvez essayer Python Blaze écosystème: Blaze /Dask /Odon.
Blaze (et Odon) a out-of-the-box fonctions de traiter avec MongoDB.
Quelques articles utiles pour commencer:
Et un article qui montre ce qu'est incroyable de choses sont possibles avec le Blaze de la pile: L'analyse de 1,7 Milliard de Reddit Commentaires avec Blaze et Impala (essentiellement, l'interrogation 975 Go de Reddit commentaires en secondes).
P. S. je ne suis pas affilié avec aucun de ces technologies.
Une autre option que je trouve très utile:
cette façon, vous obtenez le déroulement de imbriquée mongodb documents gratuitement.
TypeError: data argument can't be an iterator
3.6.7
à l'aide de pandas0.24.2
. Peut-être que vous pouvez essayerdf = json_normalize(list(cursor))
à la place?À l'aide de
permettra de consommer beaucoup de mémoire si l'itérateur/générateur de résultat est de grande
mieux pour générer petits morceaux et concat à la fin
http://docs.mongodb.org/manual/reference/mongoexport
exporter au format csv et de les utiliser
read_csv
ou JSON et l'utilisation
DataFrame.from_records
DataFrame.from_records()
.La suite de cette grande réponse par waitingkuo je voudrais ajouter la possibilité de le faire à l'aide de chunksize en ligne avec .read_sql() et .read_csv(). Je agrandir la réponse de Deu Leung en évitant d'aller un par un chaque "enregistrement" de la "itérateur' /'curseur'.
Je vais emprunter précédente read_mongo fonction.
Une approche similaire comme Rafael Valero, waitingkuo et Deu Leung à l'aide de pagination: