2017-09-21 1 views
0

Bokeh에 대한 Udemy 자습서를 따르고 있으며 해결 방법을 찾을 수 없으며 교사로부터 응답을받지 못했습니다. 처음에는 코드에 문제가 있다고 생각했기 때문에 1 주일 정도 지난 후에 코드를 알아 내고 마지막으로 코드를 복사하여 오류가 지속될 때까지 코드를 복사했습니다.주기적인 콜백에서 Bokeh 오류가 발생했습니다.

코드 목적은 라이브 데이터를 긁어 모으는 것입니다. 아래 코드 : 정기적 인 콜백에서 던져

오류 : 던지고

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) 

무슨 일이 일어나고 있는지에 IndexError (' 범위를 벗어난리스트 인덱스')

어떤 아이디어 이리?

+0

나는 동일한 튜토리얼을 따르고 이전 버전의 bokeh를 사용합니다. 그 동안 구문이 변경되었을 수 있습니다. Bokeh는이 관점에서 볼 때 매우 역동적입니다. BeSoup (_html5lib.py) 오류로 인해 BeautifulSoup 및 Bokeh 최신 버전에서 작동하지 않습니다. 현재 어떤 버전을 사용하고 있습니까? 강사가 사용한 것을 설치하려고 했습니까? 어떤 줄에서 오류가 발생합니까? –

답변

1
지금처럼 업데이트 기능을 변경

:

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

이 코드 두 가지 문제가 있습니다

  1. 을 당신은 전화 extract_value 기능,하지만 당신은 단지 y에 할당하지 않습니다 . 따라서 y에는 반환 값이 포함되지 않습니다.
  2. source.data['x']은 update()의 첫 번째 호출에서 비어있는 목록입니다. 따라서 빈 목록의 마지막 요소 ([-1]을 통해)에 액세스하려고합니다. 이 오류는 IndexError ('목록 인덱스가 범위를 벗어남')입니다.

1에 대한 솔루션은 간단합니다. 2의 경우 이전에 시도한 것과 유사합니다. 하지만 먼저 source.data [ 'x']가 비어 있는지 확인합니다. 첫 번째 업데이트 호출의 경우입니다. 여기서 x를 0으로 설정합니다. 다음 실행시 목록이 비어 있지 않으면 목록에서 마지막 값을 가져 와서 하나씩 증가시킵니다.

+0

감사합니다. 훌륭한 설명입니다! – Maverick

관련 문제