Ошибка типа: <watson_developer_cloud.watson_service.DetailedResponse объект в 0x7f64ee350240> не является сериализуемым JSON - PullRequest
0 голосов
/ 22 мая 2019

Я настраиваю проект Jupyter Notebook для проекта машинного обучения с использованием Ibm Watson Studio, и я получаю TypeError не сериализуемую JSON, когда пытаюсь добавить данные из моей таблицы базы данных Postgresql.

полный вывод ошибок:

TypeError                                 Traceback (most recent call last)
<ipython-input-16-e72fac39b809> in <module>()
      1 classes = natural_language_classifier.classify('998520s521-nlc-1398', data_df_1.to_json())
----> 2 print(json.dumps(classes, indent=2))

/opt/conda/envs/DSX-Python35/lib/python3.5/json/__init__.py in dumps(obj, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, default, sort_keys, **kw)
    235         check_circular=check_circular, allow_nan=allow_nan, indent=indent,
    236         separators=separators, default=default, sort_keys=sort_keys,
--> 237         **kw).encode(obj)
    238 
    239 

/opt/conda/envs/DSX-Python35/lib/python3.5/json/encoder.py in encode(self, o)
    198         chunks = self.iterencode(o, _one_shot=True)
    199         if not isinstance(chunks, (list, tuple)):
--> 200             chunks = list(chunks)
    201         return ''.join(chunks)
    202 

/opt/conda/envs/DSX-Python35/lib/python3.5/json/encoder.py in _iterencode(o, _current_indent_level)
    434                     raise ValueError("Circular reference detected")
    435                 markers[markerid] = o
--> 436             o = _default(o)
    437             yield from _iterencode(o, _current_indent_level)
    438             if markers is not None:

/opt/conda/envs/DSX-Python35/lib/python3.5/json/encoder.py in default(self, o)
    177 
    178         """
--> 179         raise TypeError(repr(o) + " is not JSON serializable")
    180 
    181     def encode(self, o):

TypeError: <watson_developer_cloud.watson_service.DetailedResponse object at 0x7f64ee350240> is not JSON serializable

А вот мой код на python в записной книжке, в котором модели AI используются для анализа данных тезисов:

from watson_developer_cloud import NaturalLanguageClassifierV1
import pandas as pd
import psycopg2


# Connecting to my database.
conn_string = 'host={} port={}  dbname={}  user={}  password={}'.format('159.***.20.***', 5432, 'searchdb', 'lcq09', 'Mys3cr3tPass')
conn_cbedce9523454e8e9fd3fb55d4c1a52e = psycopg2.connect(conn_string)
data_df_1 = pd.read_sql('SELECT description from public."search_product"', con=conn_cbedce2drf563454e8e9fd3fb8776fgh2e)

# Connecting to the ML model.
natural_language_classifier = NaturalLanguageClassifierV1(
    iam_apikey='TB97dFv8Dgug6rfi945F3***************'
)

# Apply the ML model to db datas
classes = natural_language_classifier.classify('9841d0z5a1-ncc-9076', data_df_1.to_json())
print(json.dumps(classes, indent=2))

Я попытался запустить это: print(data_df_1.to_json())чтобы убедиться, что формат указан в Json, и он в правильном формате, как вы можете видеть ниже: ps: данные ниже являются случайными предложениями Лорема, но будут описаниями продуктов после тестирования.

{"description":{"0":"Lorem ipsum sjvh  hcx bftiyf,  hufcil, igfgvjuoigv gvj ifcil ,ghn fgbcggtc   yfctgg h vgchbvju.","1":"Lorem ajjgvc wiufcfboitf iujcvbnb hjnkjc  ivjhn oikgjvn uhnhgv 09iuvhb  oiuvh boiuhb mkjhv mkiuhygv m,khbgv mkjhgv mkjhgv.","2":"Lorem aiv ibveikb jvk igvcib ok blnb v  hb b hb bnjb bhb bhn bn vf vbgfc vbgv nbhgv bb nb nbh nj mjhbv mkjhbv nmjhgbv nmkn","3":"Lorem jsvc smc cbd ciecdbbc d vd bcvdvbj obcvb vcibs j dvx","4":"Lorem jsvc smc cbd ciecdbbc d vd bcvdvbj obcvb vcibs j dvx","5":"Lorem jsvc smc cbd ciecdbbc d vd bcvdvbj obcvb vcibs j dvx"}}

ТакжеЯ могу классифицировать одно предложение с помощью приведенного ниже кода, но я хочу классифицировать таблицу описания всей моей базы данных:

classes = natural_language_classifier.classify('998260x551-nlc-1018', 'How hot will it be today?')
print(json.dumps(classes.result, indent=2))

И именно поэтому я заменил предложение на фрейм данных с именем data_df_1.

Но когда я делаю это, как я уже говорил, у меня есть TypeError,

, что мне делать, чтобы исправить эту ошибку?

1 Ответ

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

Ваша проблема в том, что внутри вашего фрейма данных есть watson_developer_cloud.watson_service.DetailedResponse, который модуль Python JSON-сериализатора не знает, как с ним обращаться.

Глядя на API , он выглядит как выможет вызвать метод экземпляра detailed_response._to_dict (это будет вызывать недовольство, потому что он использует закрытый метод), или вызвать метод detailed_response.get_response, чтобы получить словарь для удаления данных из объекта.

В идеале выпредварительно обработать серию данных, используя один из двух описанных выше методов для каждой строки в вашем кадре данных, содержащей этот объект, тогда .to_json не должен выдавать TypeError с этим столбцом.

col = 'column_with_unserializable_type'
data_df_1[col] = data_df_1[col].map(lambda x: x.get_response)
...