10
votes

Un meilleur moyen de charger des données de MongoDB sur un Dataframe à l'aide de Pandas et de Pymongo?

J'ai une base de données de 0,7 Go de MongoDB contenant des tweets que j'essaie de charger dans un Dataframe. Cependant, je reçois une erreur.

cursor = tweets.find() #Where tweets is my collection
tweet_fields = ['id']
result = DataFrame(list(cursor), columns = tweet_fields)


0 commentaires

4 Réponses :


10
votes

J'ai modifié mon code dans les éléments suivants: xxx

en ajoutant le paramètre champs dans la fonction Rechercher () J'ai limité la sortie. Ce qui signifie que je ne charge pas tous les champs mais que seuls les champs sélectionnés dans le Dataframe. Tout fonctionne bien maintenant.


0 commentaires

5
votes

la voie la plus rapide et la plus efficace de la plupart de la mémoire, de créer un Dataframe à partir d'une requête de MongoDB, comme dans votre cas, utiliserait monary .

Cet article a une explication agréable et concise.


1 commentaires

J'ai vu cela poussé sur Stackoverflow plusieurs fois maintenant, mais cela a presque toujours été mal utilisé. Si vous vérifiez l'API, il semble être clair que les seuls types de données autorisés sont numériques pas texte . Dans ce cas, je suppose (en raison de l'inclusion du terme "tweet") que c'est pas le cas d'utilisation approprié du monary.



2
votes

Un moyen élégant de faire serait le suivant:

import pandas as pd
def my_transform_logic(x):
    if x :
        do_something
        return result

def process(cursor):
    df = pd.DataFrame(list(cursor))
    df['result_col'] = df['col_to_be_processed'].apply(lambda value: my_transform_logic(value))

    #making list off dictionaries
    db.collection_name.insert_many(final_df.to_dict('records'))

    # or update
    db.collection_name.update_many(final_df.to_dict('records'),upsert=True)


#make a list of cursors.. you can read the parallel_scan api of pymongo

cursors = mongo_collection.parallel_scan(6)
for cursor in cursors:
    process(cursor)


0 commentaires

1
votes

the de_records Code> ClassMethod code> est probablement le meilleur moyen de le faire:

from pandas import pd
import pymongo

client = pymongo.MongoClient()
data = db.mydb.mycollection.find() # or db.mydb.mycollection.aggregate(pipeline)

df = pd.DataFrame.from_records(data)


0 commentaires