Saya memiliki sejumlah besar data dalam koleksi di mongodb yang perlu saya analisis. Bagaimana cara mengimpor data itu ke panda?
Saya baru mengenal panda dan numpy.
EDIT: Koleksi mongodb berisi nilai sensor yang ditandai dengan tanggal dan waktu. Nilai sensor adalah tipe data float.
Contoh data:
{
"_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
Jawaban:
pymongo
mungkin bisa membantu Anda, berikut adalah beberapa kode yang saya gunakan:sumber
list()
dalamdf = pd.DataFrame(list(cursor))
mengevaluasi sebagai daftar atau generator, untuk menjaga CPU tetap dingin. Jika Anda memiliki milyaran satu item data, dan beberapa baris berikutnya akan cukup dipartisi, level-of-detail, dan dipotong, seluruh shmegegge masih aman untuk dimasukkan. Bagus.df = pd.DataFrame(list(cursor))
. Quering db murni jauh lebih cepat. Bisakah kita mengubahlist
transmisi ke yang lain?Anda dapat memuat data mongodb Anda ke DataFrame pandas menggunakan kode ini. Ini bekerja untuk saya. Semoga untuk Anda juga.
sumber
Monary
melakukan persis seperti itu, dan ini sangat cepat . ( tautan lain )Lihat posting keren ini yang menyertakan tutorial singkat dan beberapa pengaturan waktu.
sumber
client = Monary(host, 27017, database="db_tmp") columns = ["col1", "col2"] data_type = ["int64", "int64"] arrays = client.query("db_tmp", "coll", {}, columns, data_type)
Untuk50000
catatan mengambil sekitar200s
.Sesuai PEP, sederhana lebih baik daripada rumit:
Anda dapat menyertakan kondisi seperti Anda bekerja dengan database mongoDB biasa atau bahkan menggunakan find_one () untuk hanya mendapatkan satu elemen dari database, dll.
dan voila!
sumber
sumber
Untuk menangani data out-of-core (tidak sesuai dengan RAM) secara efisien (yaitu dengan eksekusi paralel), Anda dapat mencoba ekosistem Python Blaze : Blaze / Dask / Odo.
Blaze (dan Odo ) memiliki fungsi out-of-the-box untuk menangani MongoDB.
Beberapa artikel bermanfaat untuk memulai:
Dan sebuah artikel yang menunjukkan hal-hal menakjubkan yang mungkin terjadi dengan tumpukan Blaze: Menganalisis 1,7 Miliar Komentar Reddit dengan Blaze dan Impala (pada dasarnya, menanyakan 975 Gb komentar Reddit dalam hitungan detik).
NB Saya tidak berafiliasi dengan salah satu teknologi ini.
sumber
Opsi lain yang menurut saya sangat berguna adalah:
dengan cara ini Anda dapat membuka dokumen mongodb bersarang secara gratis.
sumber
TypeError: data argument can't be an iterator
3.6.7
menggunakan panda0.24.2
. Mungkin Anda bisa mencobanyadf = json_normalize(list(cursor))
?Menggunakan
akan memakan banyak memori jika hasil iterator / generator besar
lebih baik untuk menghasilkan potongan kecil dan concat di bagian akhir
sumber
http://docs.mongodb.org/manual/reference/mongoexport
ekspor ke csv dan gunakan
read_csv
atau JSON dan gunakanDataFrame.from_records()
sumber
DataFrame.from_records()
.Mengikuti jawaban hebat ini oleh waitingkuo, saya ingin menambahkan kemungkinan melakukan itu menggunakan chunksize sejalan dengan .read_sql () dan .read_csv () . Saya memperbesar jawaban dari Deu Leung dengan menghindari pergi satu per satu setiap 'catatan' dari 'iterator' / 'kursor'. Saya akan meminjam fungsi read_mongo sebelumnya .
sumber
Pendekatan serupa seperti Rafael Valero, waitingkuo, dan Deu Leung menggunakan pagination :
sumber
Anda dapat mencapai apa yang Anda inginkan dengan pdmongo dalam tiga baris:
Jika data Anda sangat besar, Anda dapat melakukan kueri agregat terlebih dahulu dengan memfilter data yang tidak Anda inginkan, kemudian memetakannya ke kolom yang Anda inginkan.
Berikut adalah contoh pemetaan
Readings.a
ke koloma
dan pemfilteran berdasarkanreportCount
kolom:read_mongo
menerima argumen yang sama dengan agregat pymongosumber