Bokeh: ValueError: значения с плавающей точкой вне диапазона не соответствуют JSON

Я сталкивался с этим обсуждением (год назад):https://github.com/bokeh/bokeh/issues/2392

Я также увидел белый экран без каких-либо ошибок ... и затем я попытался взять небольшое подмножество из 2 столбцов и попробовал следующее:

Так как pandas просто получает кучу строк с пустыми данными, я попробовал dropna ... это привело к тому, что данных вообще не было. Так что вместо этого я просто указал строки, которые должны идти в df (отсюдаdf = df.head(n=19) линия)

import pandas as pd
from bokeh.plotting import figure, output_file, show

df = pd.read_excel(path,sheetname,parse_cols="A:B")
df = df.head(n=19)
print(df)
rtngs = ['iAAA','iAA+','iAA','iAA-','iA+','iA','iA-','iBBB+','iBBB','iBBB-','iBB+','iBB','iBB-','iB+','iB','iB-','NR','iCCC+']
x= df['Score']
output_file("line.html")

p = figure(plot_width=400, plot_height=400, x_range=(0,100),y_range=rtngs)

# add a circle renderer with a size, color, and alpha
p.circle(df['Score'], df['Rating'], size=20, color="navy", alpha=0.5)

# show the results
#output_notebook()
show(p)

ДФ:

   Rating  Score
0    iAAA   64.0
1    iAA+   33.0
2     iAA    7.0
3    iAA-   28.0
4     iA+   36.0
5      iA   62.0
6     iA-   99.0
7   iBBB+   10.0
8    iBBB   93.0
9   iBBB-   91.0
10   iBB+   79.0
11    iBB   19.0
12   iBB-   95.0
13    iB+   26.0
14     iB    9.0
15    iB-   26.0
16     NR   49.0
17  iCCC+   51.0
18   iAAA   18.0

Вышеприведенное показывает мне вывод в блокноте, но все равно выдает:ValueError: Out of range float values are not JSON compliant

И также он (следовательно?) Не создает выходной файл. Как мне избавиться от этой ошибки для этого небольшого подмножества? Это связано со значениями NaN? Решит ли это также проблему «белого экрана смерти» для большого набора данных?

Спасибо за просмотр!

В случае, если вы хотите увидеть всю ошибку:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-12-4fa6b88aa415> in <module>()
     16 # show the results
     17 #output_notebook()
---> 18 show(p)

C:\Users\x\AppData\Local\Continuum\Anaconda3\lib\site-packages\bokeh\io.py in show(obj, browser, new)
    300     if obj not in _state.document.roots:
    301         _state.document.add_root(obj)
--> 302     return _show_with_state(obj, _state, browser, new)
    303 
    304 

C:\Users\x\AppData\Local\Continuum\Anaconda3\lib\site-packages\bokeh\io.py in _show_with_state(obj, state, browser, new)
    310 
    311     if state.notebook:
--> 312         comms_handle = _show_notebook_with_state(obj, state)
    313         shown = True
    314 

C:\Users\x\AppData\Local\Continuum\Anaconda3\lib\site-packages\bokeh\io.py in _show_notebook_with_state(obj, state)
    334         comms_target = make_id()
    335         publish_display_data({'text/html': notebook_div(obj, comms_target)})
--> 336         handle = _CommsHandle(get_comms(comms_target), state.document, state.document.to_json())
    337         state.last_comms_handle = handle
    338         return handle

C:\Users\x\AppData\Local\Continuum\Anaconda3\lib\site-packages\bokeh\document.py in to_json(self)
    792         # this is a total hack to go via a string, needed because
    793         # our BokehJSONEncoder goes straight to a string.
--> 794         doc_json = self.to_json_string()
    795         return loads(doc_json)
    796 

C:\Users\x\AppData\Local\Continuum\Anaconda3\lib\site-packages\bokeh\document.py in to_json_string(self, indent)
    785         }
    786 
--> 787         return serialize_json(json, indent=indent)
    788 
    789     def to_json(self):

C:\Users\x\AppData\Local\Continuum\Anaconda3\lib\site-packages\bokeh\core\json_encoder.py in serialize_json(obj, encoder, indent, **kwargs)
     97         indent = 2
     98 
---> 99     return json.dumps(obj, cls=encoder, allow_nan=False, indent=indent, separators=separators, sort_keys=True, **kwargs)

C:\Users\x\AppData\Local\Continuum\Anaconda3\lib\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 

C:\Users\x\AppData\Local\Continuum\Anaconda3\lib\json\encoder.py in encode(self, o)
    197         # exceptions aren't as detailed.  The list call should be roughly
    198         # equivalent to the PySequence_Fast that ''.join() would do.
--> 199         chunks = self.iterencode(o, _one_shot=True)
    200         if not isinstance(chunks, (list, tuple)):
    201             chunks = list(chunks)

C:\Users\x\AppData\Local\Continuum\Anaconda3\lib\json\encoder.py in iterencode(self, o, _one_shot)
    255                 self.key_separator, self.item_separator, self.sort_keys,
    256                 self.skipkeys, _one_shot)
--> 257         return _iterencode(o, 0)
    258 
    259 def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,

ValueError: Out of range float values are not JSON compliant

Ответы на вопрос(4)

NaN значения в моем построенном наборе данных иbokeh«sserialize_json() функция (в/core/json_encoder.py) не позволяетNaN ценности (я не знаю почему ...). вreturn часть этой функции естьallow_nan=False аргумент вjson.dumps() : ((Проблема возникает только наio часть процесса боке, когда генерируется выходной файл (он вызывает вышеserialize_json() функция).

Таким образом, вы должны заменитьNaN значения в вашем фрейме данных, например:

df = df.fillna('')

Приятный день! :)

роследить весь набор данных может иметь некоторые бесконечные значения какinf удалите эти бесконечные значения как-то, тогда это должно работать.

df['column'].describe()

затем, если вы найдете любое значение inf, удалите эти строки с

df = df[~df.isin([np.nan, np.inf, -np.inf]).any(1)]

ссылка:решение здесь

Решение Вопроса

NaN поддержка будет лучше поддерживаться, когдаэтот запрос на вытягивание Для добавления двоичного массива опция сериализации объединена. Это должно быть доступно в Боке0.12.4 в январе 2017 года. Боке не используетallow_nan в питонеJSON кодер, потому что это не стандартно -nan а такжеinf не являются частью официальной спецификации JSON (вопиющий надзор ИМО, но вне нашего контроля)

это не совсем ответ на ваш вопрос, это больше похоже на мой опыт работы с боке в течение недели. В моем случае, пытаясь создать график, подобный примеру Техаса, из bokeh ..... После большого разочарования я заметил, что bokeh или json или что-то еще, когда встречается с первым значением списка (myList), который будет нанесен как NaN он отказывается от сюжета, дающего сообщение

ValueError: Out of range float values are not JSON compliant

если я изменяю первое значение списка (myList [0]) на float, он работает нормально, даже если он содержит NaN для других позиций. Принимая это во внимание, тот, кто понимает, как все это работает, предложит ответ. Моя задача - реструктурировать ваши данные так, чтобы первое значение не было наном.

Ваш ответ на вопрос