2016-08-23 72 views
1

我一直在使用bokeh web server本地主机到html文件的Boost web服务器应用程序

我创建了一个Web应用程序,用我自己的数据和下面这个例子:https://github.com/bokeh/bokeh/blob/master/examples/app/movies/main.py

我已经完成了剧本,一切都OK。我可以使用此命令看到的结果是:bokeh serve --show main.py

我用于创建Web应用程序的模块有:

from os.path import dirname, join 
from pandas import Series, DataFrame 
from bokeh.plotting import figure 
from bokeh.layouts import layout, widgetbox 
from bokeh.models import ColumnDataSource, HoverTool, Div 
from bokeh.models.widgets import Slider, Select, TextInput 
from bokeh.io import curdoc 
from scipy import stats 
import numpy as np 
import pandas 

然而,我的目标是将结果上传到我的gh-pages GitHub上的分支。

如何将bokeh的结果保存为html文件以便在网页中使用它?

我尝试使用showbokeh.plotting,但它显示本地主机路径为命令bokeh serve --show main.py做的。

是否有其他命令我可以使用?

任何建议表示赞赏!提前致谢。

UPDATE

我用这个代码以获取解决方案。有了这段代码,我得到了一个html文件作为输出,但它需要改进。

from os.path import dirname, join 
from pandas import Series, DataFrame 
from bokeh.plotting import figure 
from bokeh.layouts import layout, widgetbox 
from bokeh.models import ColumnDataSource, HoverTool, Div 
from bokeh.models.widgets import Slider, Select, TextInput 
from bokeh.io import curdoc 
from bokeh.resources import JSResources 
from bokeh.embed import file_html 
from bokeh.util.browser import view 
from jinja2 import Template 
from scipy import stats 
import numpy as np 
import pandas 

csvdata = pandas.read_csv('Alimentacion.csv', low_memory = False, encoding = 'latin-1') 

# Convert amount field into int() 
def str_to_int(mainList): 
    for item in mainList: 
     newList = [(int(item.replace('$', '').replace(',', ''))/(1000000)) for item in mainList] 
    return newList 

# Call str_to_int function 
csvdata['CuantiaInt'] = str_to_int(csvdata['Cuantía']) 
mean = np.mean(csvdata['CuantiaInt']) 

# Assing colors to each contract by mean 
csvdata['color'] = np.where(csvdata['CuantiaInt'] > mean, 'red', 'blue') 
csvdata['alpha'] = np.where(csvdata['CuantiaInt'] > mean, 0.75, 0.75) 

# Replace missing values (NaN) with 0 
csvdata.fillna(0, inplace=True) 

csvdata['revenue'] = csvdata.CuantiaInt.apply(lambda x: '{:,d}'.format(int(x))) 

estados1 = [line.rstrip() for line in open('Estados1.txt')] 
estados2 = [line.rstrip() for line in open('Estados2.txt')] 

csvdata.loc[csvdata.Estado.isin(estados1), 'color'] = 'grey' 
csvdata.loc[csvdata.Estado.isin(estados1), 'alpha'] = 0.75 

csvdata.loc[csvdata.Estado.isin(estados2), 'color'] = 'brown' 
csvdata.loc[csvdata.Estado.isin(estados2), 'alpha'] = 0.75 

csvdata['z score'] = stats.zscore(csvdata['CuantiaInt']) 
csvdata['sigma'] = np.std(csvdata['CuantiaInt']) 

date_time = pandas.DatetimeIndex(csvdata['Fecha (dd-mm-aaaa)']) 
newdates = date_time.strftime('%Y') 
newdates = [int(x) for x in newdates] 
csvdata['dates'] = newdates 
csvdata['Dptos'] = csvdata['Loc dpto'] 
csvdata['Entidad'] = csvdata['Entidad Compradora'] 
csvdata['Proceso'] = csvdata['Tipo de Proceso'] 

axis_map = { 
    'Cuantía y promedio': 'z score', 
    'Cuantía (Millones de pesos)': 'CuantiaInt', 
    'Desviación estándar': 'sigma', 
    'Fecha del contrato': 'dates', 
} 

desc = Div(text=open(join(dirname(__file__), 'alimentacion.html')).read(), width=800) 

DptosList = [line.rstrip() for line in open('locdpto.txt')] 
ProcesosList = [line.rstrip() for line in open('tipoproceso.txt')] 
EntidadesList = [line.rstrip() for line in open('entidades.txt')] 

# Create Input controls 
min_year = Slider(title = 'Año inicial', start = 2012, end = 2015, value = 2013, step = 1) 
max_year = Slider(title = 'Año final', start = 2012, end = 2015, value = 2014, step = 1) 
boxoffice = Slider(title = 'Costo del contrato (Millones de pesos)', start = 0, end = 77000, value = 0, step = 2) 
dptos = Select(title = 'Departamentos', value = 'Todos los departamentos', options = DptosList) 
proceso = Select(title = 'Tipo de Proceso', value = 'Todos los procesos', options = ProcesosList) 
entidades = Select(title = 'Entidad Compradora', value = 'Todas las entidades', options = EntidadesList) 
objeto = TextInput(title='Objeto del contrato') 
x_axis = Select(title = 'X Axis', options = sorted(axis_map.keys()), value = 'Fecha del contrato') 
y_axis = Select(title = 'Y Axis', options = sorted(axis_map.keys()), value = 'Cuantía (Millones de pesos)') 

# Create Column Data Source that will be used by the plot 
source = ColumnDataSource(data=dict(x=[], y=[], color=[], entidad=[], year=[], revenue=[], alpha=[])) 

hover = HoverTool(tooltips=[ 
    ("Entidad", "@entidad"), 
    ("Año", "@year"), 
    ("$", "@revenue" + ' Millones de pesos') 
]) 

p = figure(plot_height=500, plot_width=700, title='', toolbar_location=None, tools=[hover]) 
p.circle(x = 'x', y = 'y', source = source, size = 7, color = 'color', line_color = None, fill_alpha = 'alpha') 

def select_contracts(): 
    dptos_val = dptos.value 
    proceso_val = proceso.value 
    entidades_val = entidades.value 
    objeto_val = objeto.value.strip() 
    selected = csvdata[ 
     (csvdata.dates >= min_year.value) & 
     (csvdata.dates <= max_year.value) & 
     (csvdata.CuantiaInt >= boxoffice.value) 
    ] 
    if dptos_val != 'Todos los departamentos': 
     selected = selected[selected.Dptos.str.contains(dptos_val) == True] 
    if proceso_val != 'Todos los procesos': 
     selected = selected[selected.Proceso.str.contains(proceso_val) == True] 
    if entidades_val != 'Todas las entidades': 
     selected = selected[selected.Entidad.str.contains(entidades_val) == True] 
    if objeto_val != '': 
     selected = selected[selected.Objeto.str.contains(objeto_val) == True] 

    return selected 

def update(): 
    df = select_contracts() 
    x_name = axis_map[x_axis.value] 
    y_name = axis_map[y_axis.value] 

    p.xaxis.axis_label = x_axis.value 
    p.yaxis.axis_label = y_axis.value 
    p.title.text = '%d contratos seleccionados' % len(df) 

    source.data = dict(
     x = df[x_name], 
     y = df[y_name], 
     color = df['color'], 
     entidad = df['Entidad'], 
     year = df['dates'], 
     revenue = df["revenue"], 
     alpha = df['alpha'], 
    ) 

controls = [min_year, max_year, boxoffice, dptos, proceso, entidades, objeto, x_axis, y_axis] 

for control in controls: 
    control.on_change('value', lambda attr, old, new: update()) 

sizing_mode = 'fixed' 

inputs = widgetbox(*controls, sizing_mode=sizing_mode) 

l = layout([ 
     [desc], 
     [inputs, p], 
    ], sizing_mode=sizing_mode) 

update() 

curdoc().add_root(l) 
curdoc().title = "Contratos" 

with open('../Contratos/Alimentación/alimentacion.jinja', 'r') as f: 
    template = Template(f.read()) 

js_resources = JSResources(mode='inline') 
html = file_html(l, resources=(js_resources, None), title="Contracts", template=template) 
output_file = '../test.html' 

with open(output_file, 'w') as f: 
    f.write(html) 

view(output_file) 

回答

2

如果您的应用程序,使得实际的Python库中的任何事件回调的调用(如numpypandas您在上面展示)(事实上,如果它甚至有任何on_change回调在所有),然后不可能创建一个“独立的HTML文件”(即可以简单地上传)来重现其功能。具体来说:浏览器不能执行python代码,没有numpypandas。对于UI事件,Bokeh服务器的主要用途是python代码可以运行的地方。您需要找到某个实际的服务器运行并托管一台Bokeh服务器。

如果你有背景虚化服务器托管永久的地方,并询问如何嵌入在其上运行的背景虚化应用到静态页面上gh-pages那么答案就是使用autoload_server或者用一个作品嵌入服务器应用程序URL非常好。

+0

除非,OP实际上创建了这个美丽的图形,他想把它放在gh页面上作为一个静态的web图形。只是另一种可能性。 – Vasif

+0

Bokeh不会以编程方式生成静态输出。这是一项长期以来的功能要求,但难以实施。我们正在研究一种涉及Chrome无头的解决方案,但尚未就绪。如果OP刚刚拍摄了一个屏幕截图,并询问在gh-pages上嵌入PNG的人不是Bokeh问题。 – bigreddot

+0

这对我来说很深刻。我只是查看了什么是散景,并将其安装在我的包装箱上。伟大的工作,如果你参与其中。 :) – Vasif

相关问题