2017-09-21 15 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はこの観点から非常に「ダイナミック」です。 最新のBeautifulSoupとBokehでは、BeSoup(_html5lib.py)のエラーのために動作しません。 現在どのバージョンをお使いですか?インストラクターが使ったものをインストールしようとしましたか?どのラインでエラーが出ていますか? –

答えて

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! 

はあなたのコードには2つの問題があります。

  1. をあなたはコール extract_value機能、しかし、あなたはただyにそれを割り当てません。したがって、yには戻り値が含まれません。
  2. source.data['x']は、update()の最初の呼び出し時に空のリストです。したがって、空のリストの最後の要素([-1]を介して)にアクセスしようとします。これはあなたにエラーIndexError( 'リストのインデックスが範囲外です)を返します。

1の解決策は簡単です。 2の場合は、前にやったことに似ています。しかし、まず、source.data ['x']が空であるかどうかをチェックします。これは、更新の最初の呼び出しの場合になります。ここでは、xを0に設定します。次の実行では、リストが空でないときは、リストの最後の値を1つ増やします。

+0

ありがとう、すばらしい説明! – Maverick

関連する問題