Bokeh отображает только заданный столбец c из данных веб-скрапа - PullRequest
1 голос
/ 06 января 2020

Приведенный ниже код извлекает данные с двух разных веб-сайтов, и Боке выводит их на график. Проблема заключается в том, что когда я отображаю данные «Объемы» в сравнении с datatime.now () по оси x, они отображаются, но когда я отображаю данные «Открыть» или «Длится», мой график Bokeh остается пустым. Я подумал, что в скопированных данных содержится символ мусора, но если это так, то тома также не должны отображаться. Эта проблема возникает также с «ugaz» и «dgaz», когда выходные данные экспортируются в tags1.text и tags2.text. Я уже давно пытаюсь понять.

Тем не менее, когда я печатаю (source.data), вывод приходит как

{'x': [datetime.datetime (2020) , 1, 5, 21, 15, 38, 712611)], 'y': ['1094'], 'y1': ['2.095']}

Код:

 import requests
 from bs4 import BeautifulSoup
 from bokeh.models import Range1d, LinearAxis
 import time
 from datetime import datetime
 from bokeh.models import ColumnDataSource, DatetimeTickFormatter
 from bokeh.plotting import figure, show
 from math import radians
 import pandas as pd

 p = figure()

 Volumes = []
 Opens = []
 Lasts=[]
 Contracts =[]
 Lows = []
 Highs = []

 res3  = requests.get('https://shared.websol.barchart.com/quotes/quote.php? 
 page=quote&sym=ng&x=13&y=8&domain=if&display_ice=1&enabled_ice_exchanges=&tz=0&ed=0')
 res1  = requests.get('https://finance.yahoo.com/quote/ugaz?ltr=1')
 res2  = requests.get('https://finance.yahoo.com/quote/dgaz?ltr=1')
 soup1 = BeautifulSoup(res1.text,'html.parser')
 soup2 = BeautifulSoup(res2.text,'html.parser')
 tags1 = soup1.find_all('span')[11]
 tags2 = soup2.find_all('span')[11]
 soup3 = BeautifulSoup(res3.text, 'lxml')
 soup3.prettify()
 data_rows = soup3.findAll('tr')[2:]
 i = range(len(data_rows))
 for td in data_rows:
 Volume = td.findAll('td')[6].text
 Volumes.append(Volume)
 Open = td.findAll('td')[3].text
 Opens.append(Open)
 Last = td.findAll('td')[1].text
 Lasts.append(Last)
 Contract = td.findAll('td')[0].text
 Contracts.append(Contract)
 Low = td.findAll('td')[5].text
 Lows.append(Low)
 High = td.findAll('td')[4].text
 Highs.append(High)

 source = ColumnDataSource(dict(x=[datetime.now()],y=[Volumes[2]], y1=[Opens[2]]))

 p.circle(x ='x', y ='y',source=source,color='blue')
 p.circle(x ='x', y ='y1',source=source,color='red')  

 show(p)

1 Ответ

0 голосов
/ 06 января 2020

Вы не конвертируете все значения в числа:

{
    'x':  [datetime.datetime(2020, 1, 5, 21, 15, 38, 712611)], 
    'y':  ['1094'],  # value in list is a string -- BAD
    'y1': ['2.095']  # value in list is a string -- BAD
}

Если вы специально не чертите категориальные значения (здесь это не так), то значения в столбцах CDS обычно должны всегда быть числами.

Вы можете преобразовать строки в числа, вызвав для них встроенную функцию float.

...