IBM Functions / Action cree una function que arroja este error "error": "Внутренняя ошибка. Объект модуля типа не поддерживает сериализацию JSON" - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь загрузить среду данных Python в Watson Function Action. Я получил следующую ошибку.

{ "ошибка": "Внутренняя ошибка. Объект модуля типа не поддерживает сериализацию в формате JSON" }

Я загружаю фрейм данных Watson Notebook в Watson Function Action, создавая функцию, которая возвращает Json, из записной книжки я проверяю ее, и она работает, если Json возвращается, но я не знаю, нужно ли мне что-то в функции

Код кадра данных

dfData = dfData[['SOURCE','NUMBER_ID','DATE_OPEN','DATE_CLOSE','COMPANY','CATEGORY','SUBCATEGORY','LOGICAL_NAME','CLR_TXT_SERVICIO','STATUS',]]

jsondf = dfData.to_dict(orient='record')
print(jsondf)

I have tried with:

#jsondf = dfData.to_json( orient='records')
print(jsondf)

#jsondf = jsondf.dumps(dfData, cls=JSONEncoder)
print(jsondf)

Но никто не работает

import sys
import types
import pandas as pd
import numpy as np
import ibm_boto3
import json as jsondf
import dateutil.relativedelta
from pandas import DataFrame
from botocore.client import Config
from datetime import datetime, date, time, timedelta


def main(dict):
    def __iter__(self): 

        client_22e74e133ed74557a9183bca634893be = ibm_boto3.client(service_name='s3',
        ibm_api_key_id='XXXXXXXXXXXXXXXXXXXXXXXXXXXX',
        ibm_auth_endpoint="https://iam.bluemix.net/oidc/token",
        config=Config(signature_version='oauth'),
        endpoint_url='https://s3-api.us-geo.objectstorage.service.networklayer.com')


        streaming_body_14 = client_22e74e133ed74557a9183bca634893be.get_object(Bucket='clarotp-donotdelete-pr-jfrmyss7bazrmn', Key='Vista_Mayo.xlsx')['Body']
        # add missing __iter__ method so pandas accepts body as file-like object
        if not hasattr(streaming_body_14, "__iter__"): streaming_body_14.__iter__ = types.MethodType( __iter__, streaming_body_14 ) 


        #convertir el streaming body del archivo Excel a dataframe
        def load_df(fileobject,sheetname):
            excelFile = pd.ExcelFile(fileobject)
            dfData = excelFile.parse(sheetname)
            return dfData

        #se crea el dateframe (dfData)
        dfData = load_df(streaming_body_14, 'Exportar Hoja de Trabajo')

        dfData = dfData[dfData['NUMBER_ID'].str.contains('IM1010935', case=False)]

        jsondf = dfData.to_dict(orient='record')


    return  {'message': [jsondf] } 

Это функция, которую я создал, но она не работает

Результаты:

{ "ошибка": "Внутренняя ошибка. Объект модуля типа не поддерживает сериализацию в формате JSON" } Журналы: []

1 Ответ

0 голосов
/ 25 мая 2019

Без полного отслеживания трудно определить, какая строка кода вызывает проблему. Однако из этого сообщения об ошибке:

Объект типа модуль не поддерживает сериализацию в формате JSON

мы знаем, что где-то код пытается преобразовать объект модуля в json.

import json as jsondf

эта строка

return  {'message': [jsondf] }

Учитывая ваш текущий код, эта строка эквивалентна

>>> m = {'message': [jsondf]}
>>> m
{'message': [<module 'json' from '/usr/local/lib/python3.7/json/__init__.py'>]}

Обратите внимание, что значение содержит объект модуля, который нельзя сериализовать в json.

>>> jsondf.dumps(m)
Traceback (most recent call last):
  ...
TypeError: Object of type module is not JSON serializable

Возможно, оператор возврата должен иметь отступ, так что jsondf является значением, назначенным в этой строке?

jsondf = dfData.to_dict(orient='record')

Итак, у вас есть

    jsondf = dfData.to_dict(orient='record')
    return  {'message': [jsondf] }

не

    jsondf = dfData.to_dict(orient='record')
return  {'message': [jsondf] }

В любом случае я рекомендую не использовать имена модулей, которые вы импортировали, в качестве переменных в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...