python - 如何通过python列表自动进行多个mongoDB查询
问题描述
这是我的查询
%%time
from pymongo import MongoClient
import datetime as dt
mongo_client = MongoClient(...credential...)
db_score = mongo_client['at-device-info']
cvsms = db_score['flat_sms']
test = cvsms.find({'customer_id': {'$in': list1}},{ 'customer_id': 1,'timestamp': 1})
df1 = pd.DataFrame(list(test))
我所做的是复制最后两行并更改list1
为list2
, 并将 df1 更改为df2
. 所以它会变成
test = cvsms.find({'customer_id': {'$in': list2}},{ 'customer_id': 1,'timestamp': 1})
df2 = pd.DataFrame(list(test))
然后继续对list3
和做同样的事情df3
。如何为 48 个列表自动执行此操作,一个查询需要 4 分钟才能在我的 jupyter 笔记本上运行
解决方案
您总是可以遍历所有查询并制作一个 DataFrame 并将它们添加到一个列表中,如下所示:
from pymongo import MongoClient
import datetime as dt
import pandas as pd
mongo_client = MongoClient(...
credential...)
db_score = mongo_client['at-device-info']
cvsms = db_score['flat_sms']
list1 = [1,2,3,4,5] # list of values to search
list2 = [6,7,8,9,10] # list of values to search
lists = [list1,list2]
df_list = []
for lst in lists:
test = cvsms.find({'customer_id': {'$in': lst}}, {'customer_id': 1, 'timestamp': 1})
df = pd.DataFrame(list(test))
df_list.append(df)
# If you want to access each dataframe seperately from the list you can access the individual list elements
df1 = df_list[0]
df2 = df_list[1]
full_df = pd.concat(df_list)
如果您想加快速度,可以尝试将concurrent
模块与ThreadPoolExecutor
或 一起使用ProcessPoolExecutor
:
from concurrent import futures
def query_df(lst):
test = cvsms.find({'customer_id': {'$in': lst}}, {'customer_id': 1, 'timestamp': 1})
df = pd.DataFrame(list(test))
return df
with futures.ThreadPoolExecutor(max_workers=4) as f:
df_list = f.map(query_df,lists)
full_df = pd.concat(df_list)
最后,您可以通过连接列表从较小的数据帧中创建一个大数据帧。
推荐阅读
- python - 与产出数据大小有关的产出开销
- c# - Visual Studio Code 中的实体框架错误
- angular - 如何从 Angular12 中的 NgbModal 发出 EventEmitter?
- firebase - Firebase 身份验证,错误:NoSuchMethodError:在 null 上调用了方法“登录”
- image - (有效原因)在 Preload 之外加载图像(p5js)
- python - 如何将pynput的键盘监听器隔离到一个窗口
- python - 信号量不限制并发执行的数量
- excel - 用于对增量进行平均的 Excel 函数
- python - 以管理员身份运行 jar 文件
- html - 远程服务器返回错误:(400) 错误请求。尝试使用 Powershell 通过 mail.send 发送 HTML