我最近开始在Bokeh工作,完成了有关Datacamp的一些快速课程,并且无法创建DateRangeSlider。滑块本身对我来说看起来不错,更改滑块上的值是可行的,但我无法通过它来更改绘图。

不知道我缺少什么,因为我找不到使用此特定工具的正确教程/信息,因此,对此将给予任何帮助。

这是代码:

data['periodFrom'] = pd.to_datetime(data['periodFrom']).dt.date
data = data.rename(columns={'MWh/h' : 'MWH'})
source = ColumnDataSource(data={
    'x'       : data.periodFrom,
    'y'       : data.MWH,
    'point'      : data.pointLabel,
    'direction'      : data.directionKey
})
xmin, xmax = min(data.periodFrom), max(data.periodFrom)
ymin, ymax = min(data['MWH']), max(data['MWH'])

plot = figure(title='Gas renomination', plot_height=400, plot_width=700,
              x_range=(xmin, xmax), y_range=(ymin, ymax))

plot.line(x='x', y='y', source=source)

plot.xaxis.axis_label ='Date'
plot.yaxis.axis_label = 'MWh/h'

def update_plot(attr, old, new):
    yr = slider.value
    new_data = {
    'x'       : data.loc[yr[0]:yr[1]].periodFrom,
    'y'       : data.loc[yr[0]:yr[1]].MWH,
    'point'      : data.loc[yr[0]:yr[1]].pointLabel,
    'direction'      : data.loc[yr[0]:yr[1]].directionKey
    }
    source.data = new_data

slider = DateRangeSlider(start=date(2016,1,1), end=date.today(), step=1,
         value=(date(2016,1,1),date(2016,2,1)), title='Date', width=1000)

slider.on_change('value', update_plot)

curdoc().add_root(plot)
curdoc().add_root(slider)
show(plot)


这是每次更改滑块值时都会出现在命令提示符中的错误消息:

2018-07-19 11:56:55,387 error handling message Message 'PATCH-DOC' (revision 1): KeyError(1451606400000,)


最好,
皮特雷克

编辑:

我在滑块上做了一些工作,现在没有引发任何错误,但是当我向任何方向移动滑块时,绘图都消失了。单独进行过滤的效果很好(例如,当我将'data [data.index> yr [0]]。periodFrom'放入控制台时),但是用新值更新图似乎有问题。

data['periodFrom'] = pd.to_datetime(data['periodFrom'])
data.index = data['periodFrom'].astype(np.int64) // 10 ** 9
data.index = data.index.astype(np.float)

data = data.rename(columns={'MWh/h' : 'MWH'})
source = ColumnDataSource(data={
    'x'       : data.periodFrom,
    'y'       : data.MWH,
    'point'      : data.pointLabel,
    'direction'      : data.directionKey
})

xmin, xmax = min(data.periodFrom), max(data.periodFrom)
ymin, ymax = min(data['MWH']), max(data['MWH'])

# Create the figure: plot
plot = figure(title='Gas renomination', plot_height=400, plot_width=700,
              x_range=(xmin, xmax), y_range=(ymin, ymax))

plot.line(x='x', y='y', source=source)

plot.xaxis.axis_label ='Date'
plot.yaxis.axis_label = 'MWh/h'

#slider
def update_plot(attr, old, new):
    yr = slider.value
    yr=list(yr)
    [float(i) for i in yr]
    new_data = {
        'x' : data[(data.index > yr[0]) & (data.index < yr[1])].periodFrom,
        'y' : data[(data.index > yr[0]) & (data.index < yr[1])].MWH,
        'point' : data[(data.index > yr[0]) & (data.index < yr[1])].pointLabel,
        'direction' : data[(data.index > yr[0]) & (data.index < yr[1])].directionKey}

print(new_data)
source.data = new_data

slider = DateRangeSlider(start=datetime(2016,1,2).timestamp(),
end=datetime.today().timestamp(), step=1, value=
(datetime(2016,2,2).timestamp(),datetime(2016,3,3).timestamp()), title='Date',
width=1000)
slider.on_change('value', update_plot)

#dropdown

def update_dropdown(attr, old, new):
    point_select = select.value
    data_selected ={
        'x' : data[data['pointLabel'] == point_select].periodFrom,
        'y' : data[data['pointLabel'] == point_select].MWH,
        'point' : data[data['pointLabel'] == point_select].pointLabel,
        'direction' : data[data['pointLabel'] == point_select].directionKey}

    source.data=data_selected

select = Select(title="Point", options=pointlabels, value='Kondratki')
select.on_change('value', update_dropdown)

curdoc().add_root(select)
curdoc().add_root(plot)
curdoc().add_root(slider)


我的原始数据帧是40639 x 6,在打印new_data之后,我得到了一个字典:



我还在代码的第二部分中添加了一个Select小部件,data_selected与DateRangeSlider中的格式相同(请参见:图像)。对我而言,奇怪的是Select可以完美运行,而DataRangeSlider则使该图在每次单击时都消失了。

最佳答案

尽管为了方便起见,可以使用日期时间对象初始化滑块,但实际上将滑块值表示为浮点时间戳,具体来说是自历元以来的毫秒数。这意味着您尝试直接使用该值索引数据帧的操作大致等同于:

data.loc[1451606400000].periodFrom


由于明显的原因,这不起作用。

基于名称yr,您似乎想使用年份值索引数据框?然后,您需要将时间戳记值转换为实际日期时间并加上年份:

In [6]: from datetime import datetime

In [7]: datetime.fromtimestamp(1451606400000/1000).year
Out[7]: 2015


顺便说一句,在Bokeh服务器应用程序中从来没有理由使用或调用show

关于python - 散景DateRangeSlider,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51419925/

10-14 01:12