Bokeh: ValueError: values โ€‹โ€‹floating out of range do not match JSON

I came across this discussion (a year ago): https://github.com/bokeh/bokeh/issues/2392

I also saw a white screen without any errors. And then I tried to take a small subset of 2 columns and tried the following:

Since pandas just gets a bunch of rows with empty data, I tried dropna .. this led to no data at all. So instead, I just pointed out the lines that should go into df (hence the line 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) 

DF:

  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 

The above shows me the output to notepad, but still throws: ValueError: Out of range float values are not JSON compliant

And also it does not (therefore?) Also create an output file. How do I get rid of this error for this small subset? Is this related to NaN values? Does this also solve the white screen of death problem for a larger dataset?

Thanks vm for watching!

If you want to see the whole error:

 --------------------------------------------------------------------------- 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 
+6
source share
4 answers

I had the same error and debugged the problem: I had NaN values โ€‹โ€‹in my constructed dataset and bokeh serialize_json() (in /core/json_encoder.py ) does not allow NaN values โ€‹โ€‹(I don't know why ...) . In the return part of this function, there is an argument allow_nan=False in json.dumps() : ((The problem occurs only in the io part of the bokeh process when creating the output file (it calls the serialize_json() function above).

Thus, you should replace the NaN values โ€‹โ€‹in your data framework, for example:

 df = df.fillna('') 

A good day!:)

+3
source

NaN support will be better supported when this Pull request adds a binary array serialization parameter. It should be available in Bokeh 0.12.4 in January 2017. Bokeh does not use allow_nan in the python JSON encoder because it is not standard - NaN and inf not part of the official JSON specification (egregious IMO supervision, but out of our control)

+2
source

Well, this is not exactly the answer to your question, it is more like my experience with bokeh during the week. In my case, trying to make a plot, like an example from Texas from bokeh ..... After a lot of disappointment, I noticed that bokeh or json or something else when it meets the first value of the list (myList), which should be built as NaN it refuses the plot giving the message

ValueError: Out of range float values are not JSON compliant

if I change the first value of the list (myList [0]) to float, it works fine even if it contains NaN for other positions. Bearing this in mind, someone who understands how this works will offer an answer. Mine must restructure your data so that the first value is not nan.

+1
source

After deleting the NAN values, there can be an infinite value, track the entire data set, it can have some infinite values โ€‹โ€‹like inf delete these infinite values โ€‹โ€‹in some way, then it should work.

 df['column'].describe() 

then if you find any value inf, delete these lines with

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

link: here

0
source

All Articles