Bokeh Server与Flask错误集成

时间:2018-06-15 03:06:56

标签: python google-maps flask bokeh

我遇到了一个问题,我试图将我的散景服务器应用程序与Flask集成。我在bokeh中使用GMapOptions库来生成可视化,显示我的客户端数据在整个地理区域的分布。运行Flask应用程序代码时出现以下错误

TypeError: __init__() missing 2 required positional arguments: 'google_api_key' and 'map_options' 

当我在命令提示符中使用bokeh serve命令独立运行散景服务器应用程序时,我在命令提示符中收到相同的消息,但应用程序仍在运行。显然,它是散景库中的某种生成消息的错误,但根据库的开发人员的说法,这不应该阻止我的应用程序运行,它在独立运行时会发生这种情况。我向该库的开发人员https://github.com/bokeh/bokeh/issues/7985报告了该错误。

这是我的可视化代码,

from bokeh.plotting import output_file
from bokeh.plotting import gmap
from bokeh.io import curdoc
from bokeh.models import Button, GMapOptions, ColumnDataSource, CategoricalColorMapper
from bokeh.models import *
from bokeh.layouts import column, row
import pandas as pd
import numpy as np
import pymssql



# parameters
server = 'X.X.X.X\PQR'
db = 'ABC'

# Create the connection
conn = pymssql.connect(database = db, host = server)
cur = conn.cursor()
map_options = GMapOptions(lat=37.686293, lng=-97.3614409, map_type="roadmap", zoom=13)
p = gmap("My Google Maps API Key", map_options, title="Resolutions Clients", plot_width=1000, plot_height=600)

sql = """
        with CTE AS
            (SELECT
            CR.ClientID, CR.Latitude, CR.Longtitude
            FROM 
            Company C LEFT JOIN ClientRegistration CR on C.CompanyID = CR.CompanyID
            WHERE
            C.CompanyID = 555 AND (CR.Latitude IS NOT NULL AND CR.Longtitude IS NOT NULL)
            )
        SELECT
        C.ClientID, C.Latitude, C.Longtitude, CL.Sex
        FROM
        CTE C LEFT JOIN Clients CL on C.ClientID = CL.ClientID
    """

df = pd.read_sql(sql, conn)



df[['Latitude', 'Longtitude']] = df[['Latitude', 'Longtitude']].apply(pd.to_numeric)
df['Sex'] = df['Sex'].astype('str')

map_options = GMapOptions(lat=37.686293, lng=-97.3614409, map_type="roadmap", zoom=10)
p = gmap("My Google Maps API Key", map_options, title="Resolutions Clients Genderwise", plot_width=1000,
             plot_height=600)

lat = df['Latitude'].tolist()
lon = df['Longtitude'].tolist()
sex = df['Sex'].tolist()

source = ColumnDataSource(
        data=dict(latitude=lat,
                  longitude=lon,
                  gender=sex
                  )
)


color_mapper = CategoricalColorMapper(factors=['M', 'F', 'U'], palette=['Red', 'Blue', 'Green'])


p.circle(x="longitude", y="latitude", size=4, fill_alpha=0.9, source=source,
             fill_color={'field': 'gender', 'transform': color_mapper},
             line_color={'field': 'gender', 'transform': color_mapper})

x = np.linspace(0, 4 * np.pi, 100)
y = np.sin(x)

p.circle(x, y, legend="Male", color="red")
p.circle(x, 2 * y, legend="Female", color="Blue")
p.circle(x, 3 * y, legend="Unknown", color="Green")

def update():
    # query db
    curdoc().clear()
    sql = """
            with CTE AS
                (SELECT
                CR.ClientID, CR.Latitude, CR.Longtitude
                FROM
                Company C LEFT JOIN ClientRegistration CR on C.CompanyID = CR.CompanyID
                WHERE
                C.CompanyID = 555 AND (CR.Latitude IS NOT NULL AND CR.Longtitude IS NOT NULL)
                )
            SELECT
                C.ClientID, C.Latitude, C.Longtitude,
                CASE WHEN age > 0 AND age <= 15 THEN 'Children'
                     WHEN age > 15 AND age <= 30 THEN 'Young Adult'
                     WHEN age > 30 AND age <= 55 THEN 'Adult'
                     WHEN age > 55 THEN 'Senior Citizen'
                     END AS 'Age_Group'
            FROM
            CTE C LEFT JOIN Clients CL on C.ClientID = CL.ClientID
    """
    df = pd.read_sql(sql, conn)

    df[['Latitude', 'Longtitude']] = df[['Latitude', 'Longtitude']].apply(pd.to_numeric)
    df['Age_Group'] = df['Age_Group'].astype('str')

    df['Latitude'].median()
    df['Longtitude'].median()

    map_options = GMapOptions(lat=37.686293, lng=-97.3614409, map_type="roadmap", zoom=10)

    p = gmap("My Google Maps API Key", map_options, title="Resolutions Clients Age wise",
             plot_width=1000, plot_height=600)

    lat = df['Latitude'].tolist()
    lon = df['Longtitude'].tolist()
    age = df['Age_Group'].tolist()

    source = ColumnDataSource(
        data=dict(latitude=lat,
                  longitude=lon,
                  age_Group=age
                  )
    )

    color_mapper = CategoricalColorMapper(factors=['Children', 'Young Adult', 'Adult', 'Senior Citizen'],
                                          palette=['Red', 'Blue', 'Green', 'Yellow'])

    p.add_tools(LassoSelectTool())
    p.add_tools(ZoomInTool())
    p.add_tools(ZoomOutTool())

    p.circle(x="longitude", y="latitude", size=4, fill_alpha=0.9, source=source,
             fill_color={'field': 'age_Group', 'transform': color_mapper},
             line_color={'field': 'age_Group', 'transform': color_mapper})

    x = np.linspace(0, 4 * np.pi, 100)
    y = np.sin(x)

    p.circle(x, y, legend="Children : Age <= 15", color="red")
    p.circle(x, 2 * y, legend="Young Adult : 30 >= Age > 15", color="Blue")
    p.circle(x, 3 * y, legend="Adult : 55 >= Age > 30 ", color="Green")
    p.circle(x, 4 * y, legend="Senior Citizen : Age > 55", color="Yellow")

    curdoc().add_root(row(button1, button2))
    curdoc().add_root(column(p))

def update1():
    # query db
    curdoc().clear()
    sql = """
            with CTE AS
                (SELECT
                CR.ClientID, CR.Latitude, CR.Longtitude
                FROM
                Company C LEFT JOIN ClientRegistration CR on C.CompanyID = CR.CompanyID
                WHERE
                C.CompanyID = 555 AND (CR.Latitude IS NOT NULL AND CR.Longtitude IS NOT NULL)
                )
            SELECT
            C.ClientID, C.Latitude, C.Longtitude, CL.Sex
            FROM
            CTE C LEFT JOIN Clients CL on C.ClientID = CL.ClientID
        """
    df = pd.read_sql(sql, conn)

    df[['Latitude', 'Longtitude']] = df[['Latitude', 'Longtitude']].apply(pd.to_numeric)
    df['Sex'] = df['Sex'].astype('str')

    map_options = GMapOptions(lat=37.686293, lng=-97.3614409, map_type="roadmap", zoom=10)
    p = gmap("My Google Maps API Key", map_options, title="Resolutions Clients Genderwise",
             plot_width=1000,
             plot_height=600)

    lat = df['Latitude'].tolist()
    lon = df['Longtitude'].tolist()
    sex = df['Sex'].tolist()

    source = ColumnDataSource(
        data=dict(latitude=lat,
                  longitude=lon,
                  gender=sex
                  )
    )


    color_mapper = CategoricalColorMapper(factors=['M', 'F', 'U'], palette=['Red', 'Blue', 'Green'])

    p.circle(x="longitude", y="latitude", size=4, fill_alpha=0.9, source=source,
             fill_color={'field': 'gender', 'transform': color_mapper},
             line_color={'field': 'gender', 'transform': color_mapper})

    x = np.linspace(0, 4 * np.pi, 100)
    y = np.sin(x)

    p.circle(x, y, legend="Male", color="red")
    p.circle(x, 2 * y, legend="Female", color="Blue")
    p.circle(x, 3 * y, legend="Unknown", color="Green")

    curdoc().add_root(row(button1, button2))
    curdoc().add_root(column(p))

# add a button widget and configure with the call back
button1 = Button(label="Gender")
button2 = Button(label="Age")

button1.on_click(update1)
button2.on_click(update)

# put the button and plot in a layout and add to the document
curdoc().add_root(row(button1, button2))
curdoc().add_root(column(p))

这是我的app.py文件

from flask import Flask, render_template
from bokeh.embed import autoload_static
from bokeh.client import pull_session

#instantiating the flask app
app = Flask(__name__)

#create the index page function

@app.route("/")
def index():
    session = pull_session(url="http://localhost:5006/Button_test_update_version2")
    bokeh_script = autoload_static(None, url="http://localhost:5006/Button_test_update_version2", session_id=session.id)
    return render_template("index.html", bokeh_script=bokeh_script)

#run the app
if __name__ == "_main_":
    app.run(debug=True)

这是我的index.html文件,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Therasoft Visualization</title>
    <link rel="stylesheet" href={‌{url_for('static', filename='css/main.css')}}>
</head>
<body>
<h1> Therasoft Visualization</h1>
<div>
    {‌{bokeh_script|safe}}
</div>
</body>
</html>

这是我的main.css文件,

h3{
    color : olive;
}

1 个答案:

答案 0 :(得分:0)

修改:已在https://github.com/bokeh/bokeh/pull/7998

中解决

答案在于您的其他问题的代码,您必须将值作为关键字args传递:

 p = gmap(google_api_key="My Google Maps API Key", map_options=map_options, ...)

我不确定为什么这是随便的,似乎是一个错误,传递args位置不起作用,但该解决方案应该足够了。