2016-11-17 14 views
1

python3.5でpandasを使ってデータ変換をしようとしています。 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") 
  • はTypeError:データ引数はあなたがjson_normalizeに渡す前に、リストにカーソルを変換する必要がイテレータ

答えて

2

することはできません。

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))) 

また、あなたはリストに変換されたデータの大規模なammountsを回避したい場合はmonaryを見てみたいことがあります。

+0

クイックヘルプ。そのエラーは今そこにはありません。なぜ 'custom_params.suppress_trans'がフラット化されていないのか不明です。値はcustom_paramsの下に表示されます。最後の行の値を見ると、 'custom_params':{'suppress_trans':1}です。 –

+0

あなたのデータセットを見ることなくデバッグするのは難しいですが、代わりに 'json_normalize'を使って[mongodb aggregation](https://docs.mongodb.com/manual/meta/aggregation-quick-参照/)フレームワークを '$ match'で、次に' $ project'ステージからデータベースが平らにされたドキュメントを返すようにします。 –

0

また、Steves氏は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))) 
関連する問題