Warning: This may be more of a Python question than a bokeh one?
I am creating a complex plot with multiple data sources created from DataFrames and dictionaries, using bokeh server. At runtime, I get the following error:
message: Message 'PULL-DOC-REQ' content: {}
error: TypeError("Object of type 'mpf' is not JSON serializable",)
Traceback (most recent call last):
File "/home/agilly/.local/lib/python3.6/site-packages/bokeh/server/protocol_handler.py", line 90, in handle
work = await handler(message, connection)
File "/home/agilly/.local/lib/python3.6/site-packages/bokeh/server/session.py", line 67, in _needs_document_lock_wrapper
result = func(self, *args, **kwargs)
File "/home/agilly/.local/lib/python3.6/site-packages/bokeh/server/session.py", line 232, in _handle_pull
return connection.protocol.create('PULL-DOC-REPLY', message.header['msgid'], self.document)
File "/home/agilly/.local/lib/python3.6/site-packages/bokeh/protocol/__init__.py", line 85, in create
return self._messages[msgtype].create(*args, **kwargs)
File "/home/agilly/.local/lib/python3.6/site-packages/bokeh/protocol/messages/pull_doc_reply.py", line 74, in create
content = { 'doc' : document.to_json() }
File "/home/agilly/.local/lib/python3.6/site-packages/bokeh/document/document.py", line 882, in to_json
doc_json = self.to_json_string()
File "/home/agilly/.local/lib/python3.6/site-packages/bokeh/document/document.py", line 911, in to_json_string
return serialize_json(json, indent=indent)
File "/home/agilly/.local/lib/python3.6/site-packages/bokeh/core/json_encoder.py", line 166, in serialize_json
return json.dumps(obj, cls=BokehJSONEncoder, allow_nan=False, indent=indent, separators=separators, sort_keys=True, **kwargs)
File "/usr/lib/python3.6/json/__init__.py", line 238, in dumps
**kw).encode(obj)
File "/usr/lib/python3.6/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python3.6/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "/home/agilly/.local/lib/python3.6/site-packages/bokeh/core/json_encoder.py", line 261, in default
return self.transform_python_types(obj)
File "/home/agilly/.local/lib/python3.6/site-packages/bokeh/core/json_encoder.py", line 228, in transform_python_types
return super().default(obj)
File "/usr/lib/python3.6/json/encoder.py", line 180, in default
o.__class__.__name__)
TypeError: Object of type 'mpf' is not JSON serializable
I understand that this happens when bokeh encounters a type it doesn’t support for serialization in one of the data sources. However, the only place where I use mpf
from the mpmath
library is here:
sp["logp"]=[-1*float(str(log10(mpf(x)))) for x in sp["P-value"]]
The logp column gets used later on:
cohdat[i]=dict(logsp=sp.logp, ...)
source = ColumnDataSource(cohdat[0])
p1=figure(x_range=[start, end], tools="box_zoom,lasso_select,tap,xwheel_zoom,reset,save", y_range=[-0.5, maxlogp+0.5], width=1500)
mainplot_points=p1.circle(y='logsp', ..., source=source)
However, given the type conversion, I am completely puzzled as to where the mpf
type is coming from at the bokeh stage. The column should not retain the mpf
type since it goes through float(str())
. The code was np.float()
before, I added an extra string conversion to be sure to strip the type for good but it still doesn’t seem to work. Am I missing something?