2016-08-23 40 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

相關問題