2016-08-08 15 views
6

natknąłem tej dyskusji (z rok temu): https://github.com/bokeh/bokeh/issues/2392Bokeh: ValueError: Poza zakresem wartości pływak nie JSON zgodny

Widziałem też biały ekran bez errors..and Potem próbował przejąć mały podzbiór 2 kolumn i wypróbowany poniżej:

Ponieważ pandy pobierają również kilka wierszy z pustymi danymi, spróbowałem dropna, co spowodowało brak danych. Więc zamiast po prostu określone wiersze, które powinny iść do df (stąd linii 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 

Powyższe jest pokazując mi wyjście w notatniku, ale nadal rzuca: ValueError: Out of range float values are not JSON compliant

A także nie ma (stąd?) Produkuje również plik wyjściowy. Jak pozbyć się tego błędu dla tego małego podzestawu? Czy jest to związane z wartościami NaN? Czy rozwiązałoby to problem "białego ekranu śmierci" dla większego zestawu danych?

Dzięki za vm za spojrzenie!

W przypadku chcesz zobaczyć całą błąd:

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

Odpowiedz

3

Miałem ten sam błąd i debugowanie problem: Miałem NaN wartości w moim wykreślonej zbiorze i serialize_json() funkcji bokeh „s (w /core/json_encoder.py) nie pozwala na wartości NaN (nie wiem dlaczego ...). W return ramach tej funkcji nie jest allow_nan=False argumentem json.dumps(). ((Problem występuje tylko w io ramach procesu bokeh gdy plik wyjściowy jest generowany (wywołuje powyższą serialize_json() funkcji)

Więc trzeba zastąpić NaN wartości w dataframe, np .:

df = df.fillna('') 

Nice day! :)

2

NaN wsparcie będzie lepiej obsługiwane podczas this Pull Request dodać binarne tablica serializacji Opti on jest połączony. Powinno być dostępne w Bokeh 0.12.4 w styczniu 2017. Bokeh nie używa allow_nan w kodzie pythonowym JSON, ponieważ nie jest to standard — nan i inf nie są częścią oficjalnej specyfikacji JSON (poważny nadzór IMO, ale poza naszą kontrolą)

0

Po usunięciu wartości NAN może być nieskończona wartość, Śledzenie całego zestawu danych może mieć pewne nieskończone wartości, jak inf usunąć te nieskończone wartości, jak, to powinno działać.

df['column'].describe() 

następnie, jeśli okaże się jakakolwiek wartość inf usunąć te wiersze z

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

referencyjny: solution here

0

No to nie jest dokładnie to odpowiedź na twoje pytanie to raczej moje doświadczenie w pracy z bokeh na tydzień. W moim przypadku próbowałem zrobić fabułę jak przykład z Teksasu z bokeh ..... Po wielu frustracjach zauważyłem, że bokeh lub json, czy coś innego, gdy napotyka pierwszą wartość listy (myList), która ma być NaNem odmawia działki dając wiadomość

ValueError: Out of range float values are not JSON compliant

jeśli mogę zmienić pierwszą wartość z listy (myList [0]) float to działa dobrze, nawet jeśli zawiera NaN do innych pozycjach. Biorąc to pod uwagę ktoś, kto rozumie, jak te rzeczy działają, zaproponuje odpowiedź. Moja ma na celu restrukturyzację danych, aby pierwsza wartość nie była nan.