Почему обратный вызов приложения bokeh преобразовывает тип переменной? (ColumnDataSource для панд df) - PullRequest
1 голос
/ 14 октября 2019

Я использую встроенное приложение bokeh в jupyter для обозначения разделов временных рядов. Допустим, нам нужен следующий пример кадра данных:

    Time                Y           Label
0   2018-02-13 13:14:05 0.401028    a
1   2018-02-13 13:30:46 0.900101    a
2   2018-02-13 13:40:06 -0.648143   a
3   2018-02-14 16:33:27 1.111675    a
4   2018-03-13 11:43:16 -0.986025   a

, где Time - datetime64 [нс], Y - float64, а Label - из объекта типа.

Теперь я использую следующее приложение bokeh дляизмените записи метки с помощью пользовательского ввода и вызовите обратный вызов нажатием кнопки.

def modify_doc(doc):
    p = figure(tools=["pan, box_zoom, wheel_zoom, reset, save, xbox_select"])
    source=ColumnDataSource(df_test)
    p.line(x="index", y="Y", source=source)
    p.circle(x="index", y="Y", source=source, alpha=0)
    def callback():
        global list_new
        list_new = []
        inds = source.selected.indices
        for j in inds:
            source.data["Label"][j] = label_input.value.strip()
        list_new.append(pd.DataFrame(source.data))
    label_input = TextInput(title="Label")
    button = Button(label="Label Data")
    button.on_click(callback)
    layout = column(p, label_input, button)
    doc.add_root(layout)
show(modify_doc)

enter image description here

Не удивляйтесь, list_new, этоявляется необходимым подходом, так как я использую несколько временных рядов и объекты ColumnDataSource.

После обратного вызова я получаю принятый вывод Label:

    Label   Time        Y           index
0   a   1.518528e+12    0.401028    0
1   a   1.518529e+12    0.900101    1
2   b   1.518529e+12    -0.648143   2
3   b   1.518626e+12    1.111675    3
4   b   1.520941e+12    -0.986025   4

Но почему Time конвертируется во float? Я знаю, как восстановить временные метки, используя datetime.datetime.utcfromtimestamp () или сопоставляя индексы, но как я могу изменить обратный вызов, чтобы сохранить исходные записи во времени?

1 Ответ

1 голос
/ 14 октября 2019

как изменить обратный вызов, чтобы сохранить исходные записи во времени?

Вы не можете. Фактический базовый формат проводов для значений даты и времени составляет миллисекунд с начала эпохи , и именно в это Bokeh автоматически преобразует любой и все типы даты и времени при сериализации, отправке или синхронизации с BokehJS в браузере. В автономных (не серверных) случаях это не является проблемой, поскольку данные никогда не «возвращаются» в процесс Python. Но это может быть удивительно в контексте сервера Bokeh. Вам нужно будет либо преобразовать значения меток времени обратно в любой тип даты и времени, которого вы хотите (их много), либо, если вы просто хотите убедиться, что исходные значения не нарушены, сделайте копию заранее.

...