2016-11-17 78 views
1

我想在python3.5上使用熊猫进行数据转换。 使用MongoClient()和json_normalize从MongoDB获取数据。 但是,当我执行下面的代码它会抛出错误,因为数据参数不能是一个迭代器。任何指针都会有帮助。Python 3.5 Pandas和MongoDB -json_normalize:raise TypeError(“数据参数不能是一个迭代器”)

样本数据:

{'bank_code': 'CID005', 'status': 'Init', 'cpgmid': '7847', 'blaze_transId': 'ZI4YQFFOTGG96ZRUQWZS121111632121509-9173782788741', 'currency': 'INR', 'amount': 7800, 'merchant_trans_id': '121111632121509-9173782788741', 'date_time': datetime.datetime(2016, 11, 11, 14, 1, 14, 44000), 'consumer_mobile': 9999999999.0, 'consumer_email': '[email protected]', '_id': ObjectId('5825cf2a11eae123023730a9')} 
{'bank_code': 'CID001', 'status': 'Init', 'cpgmid': '228', 'blaze_transId': '1rjfeklmg2281610111931334hjlm4j8xwl', 'currency': 'INR', 'amount': 651.4, 'merchant_trans_id': '161111569056', 'date_time': datetime.datetime(2016, 11, 11, 14, 1, 14, 333000), 'consumer_mobile': 9999992399.0, 'consumer_email': '[email protected]', '_id': ObjectId('5825cf2a11eae123023730af')} 
{'bank_code': 'CID001', '_id': ObjectId('5825cf2a097752b55d0f17ac'), 'custom_params': {'suppress_trans': 1}, 'currency': 'INR', 'merchant_trans_id': 'BX819215014788728725757', 'date_time': datetime.datetime(2016, 11, 11, 14, 1, 14, 421000), 'consumer_mobile': 0, 'status': 'Init', 'cpgmid': '1656', 'blaze_transId': '1bygejlxl16561610111931423bkgfe1uxx', 'amount': 577, 'consumer_email': '[email protected]'} 

代码:

start_datetime1 = (datetime.now() - timedelta(days=1)).replace(hour=18, minute=30, second=00, microsecond=0) 
start_datetime2 = (datetime.now() - timedelta(days=0)).replace(hour=18, minute=29, second=59, microsecond=0) 
client = MongoClient(host_val, int(port_val)) 
db = client.cit 
transactions_collection = db.transactions 

cursor = json_normalize(transactions_collection.find({'date_time': {'$lt': start_datetime2, '$gte': start_datetime1}}, 
               {'_id': 1, 'blaze_transId': 1, 'status': 1, 'merchant_trans_id': 1, 
               'date_time': 1, 'amount': 1, 'status': 1, 'cpgmid': 1, 'currency': 1, 
               'status_msg': 1, 'bank_code': 1, 'custom_params.suppress_trans': 1, 
               'consumer_email': 1,'consumer_mobile': 1})) 

df_txn = pd.DataFrame(cursor) 

错误:

ERROR:root:Exception in fetch 
Traceback (most recent call last): 
File "/opt/Analytics-services/ETLservices/transformationService/Blazenet_Txns_Fact.py", line 174, in fetchBlazenetTxnsFromDB 
'consumer_email': 1,'consumer_mobile': 1})) 
File "/usr/local/lib/python3.5/site-packages/pandas/io/json.py", line 717, in json_normalize 
    return DataFrame(data) 
File "/usr/local/lib/python3.5/site-packages/pandas/core/frame.py", line 283, in __init__ 
raise TypeError("data argument can't be an iterator") 
  • 类型错误:数据参数不能是一个迭代

回答

2

您需要将光标转换到一个列表它传递给json_normalize之前。

cursor = transactions_collection.find({'date_time': {'$lt': start_datetime2, '$gte': start_datetime1}}, 
               {'_id': 1, 'blaze_transId': 1, 'status': 1, 'merchant_trans_id': 1, 
               'date_time': 1, 'amount': 1, 'status': 1, 'cpgmid': 1, 'currency': 1, 
               'status_msg': 1, 'bank_code': 1, 'custom_params.suppress_trans': 1, 
               'consumer_email': 1,'consumer_mobile': 1}) 

df_txn = pd.DataFrame(json_normalize(list(cursor))) 

您可能也想看看monary,如果你想避免转换成列表数据的海量ammounts。

+0

感谢您的快速帮助。所以错误现在不存在。但不知道为什么'custom_params.suppress_trans'没有变平。值在custom_params下显示。如果我们查看数据的最后一行值 - 'custom_params':{'suppress_trans':1}。 –

+0

我很难在没有看到你的数据集的情况下进行调试,但是你可能会发现它更容易,而不是使用'json_normalize'来代替使用[mongodb聚合](https://docs.mongodb.com/manual/meta/aggregation-quick-引用/)框架与'$匹配'然后'$工程'阶段,所以数据库发回平坦的文件。 –

0

随着史蒂夫回答更改mongo查询,以避免选择不需要的数据点。这样做是因为如果我尝试在mongo查询中选择它,custom_params不会变平。

cursor = transactions_collection.find({"date_time": {'$lt': start_datetime2, '$gte': start_datetime1}},{'bankRes':0,'rawDV':0}) 

df_txn = pd.DataFrame(json_normalize(list(cursor))) 
相关问题