使用Pandas提取Cloudant聊天json多个列出的日志?

hwazgwia  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(81)

如何使用Pandas读取多个列出的JSON,我们正在连接Cloudant数据库,并使用日期过滤器来选择时间段。下面是代码片段。预期结果是将JSON参数提取到每一列中。

# Date filter
        log_from_date = datetime.datetime.strptime('202210250000.00', "%Y%m%d%H%M%S.%f") # Jan 2022
        log_to_date = datetime.datetime.strptime('202210310000.00', "%Y%m%d%H%M%S.%f")
         
    #Language
    
    lang = ['EN','AR']
        
        fromDateTime = datetime.datetime(log_from_date.year,log_from_date.month,log_from_date.day,log_from_date.hour,log_from_date.minute,log_from_date.second,log_from_date.microsecond) # time in GMT  Format YYYY, MM , DD , HH,MM, SS
        toDateTime =  datetime.datetime(log_to_date.year,log_to_date.month,log_to_date.day,log_to_date.hour,log_to_date.minute,0,0) #fromDateTime + timedelta(hours=interval)
        output_file =  str(fromDateTime.strftime("%Y%m%d%H%M"))+'_' + str(toDateTime.strftime("%Y%m%d%H%M")) +'.csv'
        fromDateTime = fromDateTime -datetime.timedelta(hours=4, minutes=0)# time in GMT  Format YYYY, MM , DD , HH,MM, SS
        toDateTime   = toDateTime - datetime.timedelta(hours=4, minutes=0) 

epoch = datetime.datetime(1970,1,1)
from_datetime = (fromDateTime - epoch).total_seconds()*1000
to_datetime = (toDateTime - epoch).total_seconds()*1000

数据库连接

for language in lang:
    client = Cloudant(cloudant_db_credential['serviceUsername'], cloudant_db_credential['servicePassword'], url=cloudant_db_credential['serviceURL'])
    client.connect()
    # Create an instance of the database.
    
    db = client[cloudant_db]   # client.create_database(databaseName)
    if db.exists:
        rows = []
        result_collection = Result(db.all_docs, include_docs=True)
        
        query = cld.query.Query(    db, #sort =[{"_id": "asc"}] 
                                    selector= {"$and": [ {"requestTime": {"$gt": from_datetime,"$lte": to_datetime}},{"language": language}]},
                                    fields= ["client_channel","language","_id","workspaceId",'conversationId','conversation_id',"requestTime","conversationResponseTime","request","response" ]
                                )
        for doc in query()['docs']:   # for doc in query(limit=100, skip=100)['docs']:
            row = {}

如果你打印“doc”,你会得到下面的json,我需要提取下面的数据到数据框中。请注意,我传递的日期作为一个过滤器循环和下载聊天日志

doc
{'language': 'AR',
 '_id': 'feee78d26a0e750a7fad9f80819a435d',
 'workspaceId': '',
 'conversationId': '',
 'requestTime': 1666850951804,
 'conversationResponseTime': 1666850951890,
 'request': {'input': {'text': 'تم تنفيذ الخدمة بشكل مغاير عن المتفق عليه في العقد/الفاتورة'},
  'context': {'Language': 'AR',
   'conversation_id': '20c185f1-1788-4b61-9496-d067459dfcc0',
   'system': {'initialized': True,
    'dialog_stack': [{'dialog_node': 'node_7_1594702137463'}],
    'dialog_turn_counter': 2,
    'dialog_request_counter': 2,
    '_node_output_map': {'Welcome': [0],
     'node_3_1589367319164': {'0': [0]},
     'node_7_1594702137463': {'0': [0]}},
    'last_branch_node': 'node_3_1589367319164'},
   'reask': False,
   'state': '',
   'channel': 'DAD',
   'caseType': '',
   'slotsVariable': None,
   'metadata': {'user_id': '20c185f1-1788-4b61-9496-d067459dfcc0'},
   'log': 'user: \r\nwatson: مرحبا, اسمي "نظام الحماية الذكية". أنا هنا لمساعدتك على أية أسئلة لديك بخصوص حماية المستهلك. يمكنك أن تسألني سؤال متعلق بأحد الموضوعات التالية:\n<wcs:newBubble>  <ol> <li> <a href="#" target="_self" onClick = \'sendVal ("لدي مشكلة متعلقة بمنتج قد اشتريته")\'> مشكلة متعلقة بمنتج قد اشتريته.</a></li> <li><a href="#" target="_self" onClick = \'sendVal ("لدي مشكلة متعلقة بخدمة طلبتها/تلقيتها")\'> مشكلة متعلقة بخدمة طلبتها/تلقيتها</a></li>\n<li><a href="#" target="_self" onClick = \'sendVal ("لدي مشكلة متعلقة بخدمة تصليح")\'> مشكلة متعلقة بخدمة تصليح</a></li>\n<li><a href="#" target="_self" onClick = \'sendVal ("لدي مشكلة متعلقة بعربون دفعته ولم استرده")\'> مشكلة متعلقة باسترداد عربون</a></li>\n<li><a href="#" target="_self" onClick = \'sendVal ("تم احتساب مبلغ إضافي لبطاقة الائتمان على الفاتورة")\'> احتساب مبلغ إضافي لبطاقة الائتمان على الفاتورة</a></li>\n<li><a href="#" target="_self" onClick = \'sendVal ("اريد الاستفسار عن شكوى/رسالة حل")\'>متابعة شكوى/رسالة حل</a></li>\n</ol><wcs:newBubble>\n\r\nuser: لدي مشكلة متعلقة بخدمة طلبتها/تلقيتها\r\nwatson: \r\n',
   'action': '',
   'counter': 0,
   'language': 'ar',
   'LRDT': 'LEGAL RIGHTS BLANK PLACEHOLDER',
   'wcs_version': '201804021452_AR_PROD',
   'NID': 125,
   'ui_didYouKnow': {'text': ['    <ul>    <li>  على التاجر أو مقدم الخدمة توفير المنتجات والخدمات بالجودة والكفاءة والخصائص والمواصفات المعلن عنها في جميع القنوات الإعلانية.    </li>    <li>  على المستهلك التأكد من توافق المنتجات والخدمات مع المتطلبات.    </li>    <li>  الاتفاقيات والعقود يجب أن تحتوي على جميع البنود والتفاصيل والمتطلبات المتفق عليها.    </li>    <li>  على المستهلك الإحتفاظ بالعقود والفواتير والمستندات لضمان وحفظ حقوقه.    </li>    <li>  تعمل إدارة حماية المستهلك على حماية حقوق المستهلكين من خلال التأكد من إلتزام الأطراف بالبنود والاتفاقيات المبرمة كما تعمل الإدارة كوسيط بين المستهلك والتاجر لتسوية الشكاوى ودياً وذلك حسب قانون حماية المستهلك رقم (24) لعام 2006 والسياسات والأحكام المعمول بها في إقتصادية دبي.    </li>  <li>  حل شكاوى المستهلكين تتضمن:    </li>  <ul>    <li>      الإصلاح أو الإستبدال أو الإسترداد النقدي وذلك حسب طبيعة الشكوى والمنتج.    </li>    <li>   إعادة تقديم الخدمة أو استرداد قيمة الخدمة في حال عدم القدرة على إعادة تقديمها.    </li>    <li>   التعويضات ليست ضمن اختصاص وصلاحيات إدارة حماية المستهلك في إقتصادية دبي.    </li>  </ul>  </ul>'],
    'title': ['أساسيات حماية المستهلك']},
   'residencyStatus': 1,
   'complaintDetails': 'لدي مشكلة متعلقة بخدمة طلبتها/تلقيتها',
   'complaintSubject': 'Watson Complaint - '},
  'requestTime': 1666850951804,
  'call_times': {'MAIN': 0, 'OFFTOPIC': 0, 'EXTERNAL_DEPARTMENT': 0},
  'workspaceId': 'd6befc05-5677-4943-8266-a3033263b8ca'},
 'response': {'status': 200,
  'statusText': 'OK',
  'headers': {'access-control-allow-origin': '*',
   'access-control-allow-methods': 'GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS',
   'access-control-allow-headers': 'Content-Type, Content-Length, Authorization, X-Watson-Authorization-Token, X-WDC-PL-OPT-OUT, X-Watson-UserInfo, X-Watson-Learning-Opt-Out, X-Watson-Metadata',
   'access-control-max-age': '3600',
   'content-security-policy': "default-src 'none'",
   'x-dns-prefetch-control': 'off',
   'x-frame-options': 'SAMEORIGIN',
   'strict-transport-security': 'max-age=15552000; includeSubDomains, max-age=31536000; includeSubDomains;',
   'x-download-options': 'noopen',
   'x-content-type-options': 'nosniff',
   'x-xss-protection': '1; mode=block',
   'content-type': 'application/json; charset=utf-8',
   'x-dp-watson-tran-id': 'c3500470-8d65-4ba2-b287-8467f26e847b',
   'x-request-id': 'c3500470-8d65-4ba2-b287-8467f26e847b',
   'x-global-transaction-id': 'c3500470-8d65-4ba2-b287-8467f26e847b',
   'server': 'watson-gateway',
   'x-edgeconnect-midmile-rtt': '3',
   'x-edgeconnect-origin-mex-latency': '64',
   'date': 'Thu, 27 Oct 2022 06:09:11 GMT',
   'content-length': '6258',
   'connection': 'close'},
  'result': {'intents': [{'intent': 'DAD_CR_SERVICE_ISSUE',
     'confidence': 0.7743337631225586}],
   'entities': [{'entity': 'sys-number',
     'location': [51, 54],
     'value': '1000',
     'confidence': 1,
     'metadata': {'numeric_value': 1000},
     'interpretation': {'numeric_value': 1000, 'subtype': 'integer'}}],
   'input': {'text': 'تم تنفيذ الخدمة بشكل مغاير عن المتفق عليه في العقد/الفاتورة'},
   'output': {'generic': [{'response_type': 'text',
      'text': 'ولكن أولا، هل يمكن  أن أعرف إذا كانت لديك فاتورة أو عقد أو أي مستندات داعمة؟  <br><br>    لمزيد من المعلومات رجاء مراجعة قسم <b> {{IMPORTANT_INFO}}</b>.  <wcs:newBubble> يمكنك اختيار <wcs:input>نعم</wcs:input> أو <wcs:input>لا</wcs:input>.'}],
    'text': ['ولكن أولا، هل يمكن  أن أعرف إذا كانت لديك فاتورة أو عقد أو أي مستندات داعمة؟  <br><br>    لمزيد من المعلومات رجاء مراجعة قسم <b> {{IMPORTANT_INFO}}</b>.  <wcs:newBubble> يمكنك اختيار <wcs:input>نعم</wcs:input> أو <wcs:input>لا</wcs:input>.'],
    'nodes_visited': ['node_7_1594702244293', 'node_13_1511117348624'],
    'log_messages': []},
   'context': {'Language': 'AR',
    'conversation_id': '20c185f1-1788-4b61-9496-d067459dfcc0',
    'system': {'initialized': True,
     'dialog_stack': [{'dialog_node': 'node_13_1511117348624'}],
     'dialog_turn_counter': 3,
     'dialog_request_counter': 3,
     '_node_output_map': {'Welcome': [0],
      'node_3_1589367319164': {'0': [0]},
      'node_7_1594702137463': {'0': [0]},
      'node_13_1511117348624': [0, 0]},
     'last_branch_node': 'node_13_1511117348624'},
    'reask': False,
    'state': 'INVOICE',
    'channel': 'DAD',
    'caseType': 'Service Executed differently',
    'slotsVariable': None,
    'metadata': {'user_id': '20c185f1-1788-4b61-9496-d067459dfcc0'},
    'log': 'user: \r\nwatson: مرحبا, اسمي "نظام الحماية الذكية". أنا هنا لمساعدتك على أية أسئلة لديك بخصوص حماية المستهلك. يمكنك أن تسألني سؤال متعلق بأحد الموضوعات التالية:\n<wcs:newBubble>  <ol> <li> <a href="#" target="_self" onClick = \'sendVal ("لدي مشكلة متعلقة بمنتج قد اشتريته")\'> مشكلة متعلقة بمنتج قد اشتريته.</a></li> <li><a href="#" target="_self" onClick = \'sendVal ("لدي مشكلة متعلقة بخدمة طلبتها/تلقيتها")\'> مشكلة متعلقة بخدمة طلبتها/تلقيتها</a></li>\n<li><a href="#" target="_self" onClick = \'sendVal ("لدي مشكلة متعلقة بخدمة تصليح")\'> مشكلة متعلقة بخدمة تصليح</a></li>\n<li><a href="#" target="_self" onClick = \'sendVal ("لدي مشكلة متعلقة بعربون دفعته ولم استرده")\'> مشكلة متعلقة باسترداد عربون</a></li>\n<li><a href="#" target="_self" onClick = \'sendVal ("تم احتساب مبلغ إضافي لبطاقة الائتمان على الفاتورة")\'> احتساب مبلغ إضافي لبطاقة الائتمان على الفاتورة</a></li>\n<li><a href="#" target="_self" onClick = \'sendVal ("اريد الاستفسار عن شكوى/رسالة حل")\'>متابعة شكوى/رسالة حل</a></li>\n</ol><wcs:newBubble>\n\r\nuser: لدي مشكلة متعلقة بخدمة طلبتها/تلقيتها\r\nwatson: \r\n',
    'action': '',
    'counter': 0,
    'language': 'ar',
    'LRDT': 'LEGAL RIGHTS BLANK PLACEHOLDER',
    'wcs_version': '201804021452_AR_PROD',
    'NID': 125,
    'ui_didYouKnow': {'text': [' الفاتورة هي المستند المطبوع أو المرسل عن طريق القنوات الإلكترونية وتشمل التالي:  <ul>    <li> صيغة الفاتورة:              </li>    <ul>      <li> أن تكون باللغة العربية بالإضافة الى أي لغة أخرى.      </li>      <li> تفاصيل المنتجات / الخدمات بحيث تشمل الوصف والسعر والكمية بشكل مفصل                 </li>      <li> تحديد المجموع الإجمالي بنهاية الفاتورة مع وضع في الحسبان المبلغ المدفوع والمتبقي.                </li>    </ul>    <li> تفاصيل الفاتورة:              </li>    <ul>      <li> اسم وعنوان الشركة.                </li>      <li> تاريخ الشراء والرقم التسلسلي                 </li>      <li> تفاصيل المستهلك                </li>      <li> البيانات المتفق عليها كتاريخ التسليم والتركيب والتوصيل بالإضافة الى البيانات التي تدعم الاتفاق كالمقاسات والرسومات البيانية التي يتم (طباعتها بشكل منفصل وإدراجها مع الفاتورة الأصلية).                </li>      <li>           بيانات الضمان وتشمل مدة الضمان والأجزاء الشاملة بالضمان. (طباعتها بشكل منفصل وإدراجها مع الفاتورة الأصلية)                </li>    </ul>    <li>      ضريبة القيمة المضافة (إن وجدت):             </li>    <ul>      <li> يجب أن تحتوي الفاتورة على بيانات ضريبة القيمة المضافة كما هو موضح أدناه:                </li>      <ol>        <li> القيمة الأصلية للمنتج (دون احتساب الضريبة) مثال 200 درهم                   </li>        <li>          نسبة الضريبة المحددة والمبلغ. مثال ضريبة القيمة المضافة 5% - المبلغ 10 دراهم                  </li>        <li>           القيمة الإجمالية وتشمل ضريبة القيمة المضافة. مثال 210 درهم.                  </li>      </ol>    </ul>    <li> على المستهلك الإحتفاظ بالفاتورة وذلك لحماية حقوقه.              </li>  </ul>'],
     'title': ['فاتورة']},
    'residencyStatus': 1,
    'complaintDetails': 'لدي مشكلة متعلقة بخدمة طلبتها/تلقيتها',
    'complaintSubject': 'Watson Complaint - '},
   'user_id': '20c185f1-1788-4b61-9496-d067459dfcc0'}}}
bq3bfh9z

bq3bfh9z1#

您可以尝试以下操作:

final=pd.DataFrame()
for language in lang:
    client = Cloudant(cloudant_db_credential['serviceUsername'], cloudant_db_credential['servicePassword'], url=cloudant_db_credential['serviceURL'])
    client.connect()
    # Create an instance of the database.
    
    db = client[cloudant_db]   # client.create_database(databaseName)
    if db.exists:
        rows = []
        result_collection = Result(db.all_docs, include_docs=True)
        
        query = cld.query.Query(    db, #sort =[{"_id": "asc"}] 
                                    selector= {"$and": [ {"requestTime": {"$gt": from_datetime,"$lte": to_datetime}},{"language": language}]},
                                    fields= ["client_channel","language","_id","workspaceId",'conversationId','conversation_id',"requestTime","conversationResponseTime","request","response" ]
                                )
        for doc in query()['docs']:   # for doc in query(limit=100, skip=100)['docs']:
            final=pd.concat([final,pd.json_normalize(doc)])

相关问题