У меня есть кривая holoviews, основанная на pandas кадре данных с временными метками. Это хорошо, поскольку он дает автоматическое c форматирование оси x на основе уровня масштабирования.
Вверху кривой я хочу нарисовать прямоугольники, которые выделяют определенные области во временном ряду. Каждое выделение имеет некоторые метаданные, которые я хочу показать в Hover. Рабочий пример - за исключением наличия оси X даты-времени - генерируется с помощью кода ниже:
# imports
import numpy as np
import pandas as pd
import holoviews as hv
hv.notebook_extension('bokeh')
# generate data for time series
n = 10**4
t0 = 1513393355.5
delta_t = np.linspace(0,60*60*24*7,n)
y = pd.Series(np.sin(delta_t/60/60)*np.cos(delta_t/60/60/24))
x = pd.Series(t0+dt for dt in delta_t)
df= pd.DataFrame(dict(x=x,y=y))
# create data for polygons bounding the time series
def make_poly_dict(idx1,idx2):
left =x[idx1]
right =x[idx2]
bottom =y[idx1:idx2].min()
top =y[idx1:idx2].max()
mean =y[idx1:idx2].mean()
std =y[idx1:idx2].std()
return dict(xs=[left,right,right,left,left],ys=[bottom,bottom,top,top,bottom],mean=mean,std=std)
step_len = n//30
poly_list = [make_poly_dict(j*step_len,(j+1)*step_len-1) for j in range(0,n//step_len)]
# Plot
curve = hv.Curve(df_timeseries,vdims=['y'],kdims=['x']) # I really use datashader here, if that matters...
polys = hv.Polygons(poly_list,['xs','ys'],['mean','std']).opts(tools=['hover'])
polys*curve
Замена строки
x = pd.Series(t0+dt for dt in delta_t)
на
x = pd.Series(pd.Timestamp(t0+dt, unit='s') for dt in delta_t)
дает мне ось метки времени, которую я хочу, но hv.Polygon
не может обрабатывать входные данные pd.Timestamp
. Он поднимает TypeError: float() argument must be a string or a number, not 'Timestamp'
.
Я пытался использовать pd.Timestamp
для hv.Curve
и просто отметки времени эпохи для hv.Polygons
. Это невозможно объединить в оверлей с ошибкой invalid type promotion
.
Как нарисовать прямоугольники с всплывающей подсказкой на данных временных рядов в HoloViews?
пс. Я могу сделать хорошие прямоугольники с hv.Bounds
, но я не понимаю, как заставить всплывающую подсказку работать в этом случае ...