2016-08-08 16 views
6

ich auf diese Diskussion kam (vor einem Jahr): https://github.com/bokeh/bokeh/issues/2392Bokeh: Valueerror: Bereich Float-Werte sind nicht JSON konform

sah ich den weißen Bildschirm ohne errors..and dann habe ich versucht zu nehmen eine kleine Teilmenge von 2 Spalten und versuchte das folgende:

Da Pandas nur eine Reihe von Zeilen mit leeren Daten auch dort, ich versuchte dropna .. Dies führte dazu, dass überhaupt keine Daten. Anstatt also ich spezifiziert nur die Zeilen, die in die df (daher der df = df.head(n=19) Linie)

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 gehen sollte:

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 

Die oben zeigt mir eine Ausgabe im Notebook, aber immer noch wirft: ValueError: Out of range float values are not JSON compliant

Und es produziert auch nicht (daher?) Die Ausgabedatei. Wie kann ich diesen Fehler für diese kleine Teilmenge loswerden? Handelt es sich um NaN-Werte? Würde das auch das Problem des "weißen Bildschirms des Todes" für den größeren Datensatz lösen?

Danke vm für einen Blick!

Im Fall mögen Sie den gesamten Fehler sehen:

--------------------------------------------------------------------------- 
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 

Antwort

3

Ich hatte den gleichen Fehler und ich gedebuggt das Problem: Ich hatte NaN Werte in meinem geplottet-Datensatz und bokeh ‚s serialize_json() Funktion (in /core/json_encoder.py) erlaubt keine NaN Werte (ich weiß nicht warum ...). Im return Teil dieser Funktion gibt es das allow_nan=False Argument in json.dumps(). ((Das Problem tritt nur bei dem io Teil Bokeh Prozess, wenn die Ausgabedatei erzeugt wird (es die oben serialize_json() Funktion aufruft)

So haben Sie NaN Werte in Datenrahmen, zB .:

df = df.fillna('') 

Schönen Tag zu ersetzen! :)

2

NaN Unterstützung wird besser unterstützt, wenn this Pull Request eine binäre Array Serialisierung opti hinzufügen on ist zusammengeführt. Dies sollte in Bokeh 0.12.4 im Januar 2017 verfügbar sein. Bokeh verwendet allow_nan in der Python JSON Encoder, weil das nicht Standard ist — nan und inf sind nicht Teil der offiziellen JSON-Spezifikation (eine ungeheuerliche Aufsicht IMO, aber außerhalb unserer Kontrolle

)
0

die NAN Werte Nach dem entfernen, könnte es einen unendlichen Wert sein, den gesamten Datensatz Trace es könnte einige unendliche Werte haben als inf einige, wie jene unendliche Werte entfernen, dann sollte es funktionieren.

df['column'].describe() 

dann, wenn Sie inf Wert die Zeilen entfernen finden mit

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

Referenz: solution here

0

Nun, es ist nicht gerade eine Antwort auf Ihre Frage ist es mehr wie meine Erfahrung in der Arbeit mit Bokeh für eine Woche. In meinem Fall versuche ich, eine Handlung wie das Texas Beispiel von Bokeh zu machen ..... Nach einer Menge Frustration bemerkte ich, dass Bokeh oder JSON oder was auch immer, wenn der erste Wert der Liste (myList) geplottet wird, um ein NaN zu sein sie weigert sich, die

Nachricht geben plotten

ValueError: Out of range float values are not JSON compliant

, wenn ich den ersten Wert der Liste ändern (myList [0]) schweben es funktioniert gut, auch wenn es enthält Nans an anderen Positionen. Wenn man das berücksichtigt, wird jemand, der versteht, wie diese Dinge funktionieren, eine Antwort vorschlagen. Meine besteht darin, Ihre Daten so zu restrukturieren, dass der erste Wert kein Nan ist.