После этого урока я пытаюсь визуализировать набор данных, используя Holoviews вместо Bokeh (примеры данных доступны здесь в виде файла CSV), предоставляя результаты с помощью Flask.Я решил использовать Flask, а не Bokeh Server, потому что я строю больший рабочий процесс, используя первый.
Мой код следующий:
from flask import Flask, render_template, request
import numpy as np
import pandas as pd
from datetime import datetime
from bokeh.embed import components
from bokeh.io import curdoc
import holoviews as hv
hv.extension("bokeh")
app = Flask(__name__)
renderer = hv.renderer('bokeh')
infile = "./uploads/test.csv"
def loadRegionData(regionProperty, **kwargs):
df = pd.read_csv(infile, parse_dates=['Datetime'])
df1 = df[regionProperty]
df = pd.concat([df['Datetime'],df1], axis=1)
return hv.Curve(df)
colNames = ((pd.read_csv(infile, nrows=1)).drop(['Datetime'], axis=1)).columns.values
dmap = hv.DynamicMap(loadRegionData, kdims='RegionProperty').redim.values(RegionProperty=colNames)
hvplot = renderer.get_plot(dmap)
plot = hvplot.state
plot.name = 'plot'
curdoc().add_root(plot)
@app.route("/")
def index():
# Embed plot into HTML via Flask Render
script, div = components(plot)
return render_template("index.html", script=script, div=div)
if __name__ == '__main__':
app.run(port=5000, debug=True)
Я сталкиваюсь со следующими (несвязанные проблемы)
- При развертывании с использованием Flask раскрывающиеся списки для выбора столбцов не отображаются.Я подозреваю, что это потому, что я не возвращаю / ссылаюсь на правильные переменные из функции
index()
в мой index.html
:
<html>
<head>
<link
href="http://cdn.pydata.org/bokeh/release/bokeh-1.0.2.min.css"
rel="stylesheet" type="text/css">
<link
href="http://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.2.min.css"
rel="stylesheet" type="text/css">
<script src="http://cdn.pydata.org/bokeh/release/bokeh-1.0.2.min.js"></script>
<script src="http://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.2.min.js"></script>
</head>
<body>
<h1>Holoview test</h1>
{{ script|safe }}
{{ div|safe }}
</body>
</html>
Как заставить Flask также отображать выпадающий селектор?
Несвязанная проблема, которую я обнаружил при тестировании этого приложения с использованием Bokeh Server и которая также могла возникнуть в реализации Flask, заключается в том, что шкалы не настраиваются динамически в зависимости от выбора столбцов.Возможно, это может стать отдельным вопросом для SO, но я подумал включить его здесь, чтобы все было вместе.