2017-09-21 3 views
0

Ich folge einem Udemy Tutorial auf Bokeh und ich bin auf einen Fehler gestoßen, den ich nicht herausfinden kann, wie man löst, und habe keine Antwort vom Tutor erhalten. Anfangs dachte ich, dass etwas mit meinem Code nicht in Ordnung wäre, also verbrachte ich ungefähr eine Woche damit, es herauszufinden und schließlich den Tutor-Code nachzugeben und zu kopieren, nur um festzustellen, dass der Fehler weiterhin besteht.Bokeh Fehler vom periodischen Rückruf

Der Code dient zum Erstellen und Plotten von Live-Daten. Code unten:

from bokeh.io import curdoc 
from bokeh.models import ColumnDataSource, DatetimeTickFormatter 
from bokeh.plotting import figure 
from random import randrange 
import requests 
from bs4 import BeautifulSoup 

# Create the figure 
f = figure() 

# Create webscraping function 
def extract_value(): 
    r = requests.get("https://bitcoincharts.com/markets/okcoinUSD.html", headers = {'User-Agent' : 'Chrome'}) 
    c = r.content 
    soup = BeautifulSoup(c, "html.parser") 
    value_raw = soup.find_all("p") 
    value_net = float(value_raw[0].span.text) 
    return value_net 

# Create ColumnDataSource 
source = ColumnDataSource(dict(x = [], y = [])) 

# Create glyphs 
f.circle(x = 'x', y = 'y', color = 'olive', line_color = 'brown', source = source) 
f.line(x = 'x', y = 'y', source = source) 

# Create periodic funtion 
def update(): 
    new_data = dict(x = [source.data['x'][-1]+1], y = [extract_value]) 
    source.stream(new_data, rollover = 200) 
    print(source.data) # Displayed in the commmand line! 

# Add a figure to curdoc and configure callback 
curdoc().add_root(f) 
curdoc().add_periodic_callback(update, 2000) 

Welche werfen wird:

Fehler von periodischen Rückruf geworfen: Indexerror ('Listenindex aus Bereich')

Irgendwelche Ideen auf, was los ist Hier?

+0

Ich folgte dem gleichen Tutorial und es verwendet eine ältere Version von Bokeh. Es ist möglich, dass die Syntax in der Zwischenzeit geändert wurde. Bokeh ist von diesem Standpunkt aus sehr "dynamisch". Ich sehe, dass mit den neuesten BeautifulSoup und Bokeh es wegen eines Fehlers in BeSoup (_html5lib.py) nicht funktioniert. Welche Version verwenden Sie jetzt? Hast du versucht, den vom Ausbilder verwendeten zu installieren? Auf welcher Zeile gibt es einen Fehler? –

Antwort

1

Ihre Update-Funktion wie so ändern:

# Create periodic funtion 
def update(): 
    if len(source.data['x']) == 0: 
     x = 0 
    else: 
     x = source.data['x'][-1]+1 

    new_data = dict(x = [x] , y = [extract_value()]) 
    print("new_data", new_data) 
    source.stream(new_data, rollover = 200) 
    print(source.data) # Displayed in the commmand line! 

Es gibt zwei Probleme mit Ihrem Code:

  1. Sie nicht Anruf die extract_value Funktion, aber Sie es einfach zuweisen y . Daher enthält y den zurückgegebenen Wert nicht.
  2. source.data['x'] ist eine leere Liste beim ersten Aufruf von update(). Daher versuchen Sie, auf das letzte Element (über [-1]) einer leeren Liste zuzugreifen. Dies gibt Ihnen den Fehler IndexError ('Listenindex außerhalb des Bereichs')

Die Lösung für 1 ist trivial. Für 2 ist es vergleichbar mit dem, was Sie zuvor versucht haben. Aber zuerst prüfen Sie, ob source.data ['x'] leer ist. Dies wird beim ersten Aufruf von update der Fall sein. Dort setzen Sie x auf 0. Wenn die Liste nicht leer ist, nehmen Sie bei den folgenden Ausführungen den letzten Wert in der Liste und erhöhen ihn um eins.

+0

Vielen Dank dafür, tolle Erklärung! – Maverick

Verwandte Themen