Боке, как обращаться с datetime с обновлением источника данных ajax - PullRequest
1 голос
/ 12 июня 2019

Я играю с новой безсерверной системой отчетности, построенной вокруг Bokeh и AJAX, и у меня возникла проблема с датами и временем.У меня есть версия, которая передает числовые данные из облачной функции в HTML-файл, созданный с помощью Bokeh.Очень похоже на:

https://github.com/bokeh/bokeh/blob/1.2.0/examples/howto/ajax_source.py

Это сработало хорошо, но проблема усложняется при добавлении даты-времени в уравнение.(в частности, по оси x)

Мой план атаки состоял в том, чтобы написать файл JSON, который передает поток AJAX из источника Bokeh ColumnDataSource (df) .to_json_string ().Это был предпочтительный метод, поскольку именно так данные обычно передаются объектам bokeh, которые включают компоненты javascript.Основываясь на выводе ColumnDataSource, кажется, что существует какое-то неизвестное хеширование или перекодирование столбца datetime, который, по-видимому, распознает Bokeh при его чтении. Это автоматическое распознавание не работает при потоковой передаче ColumnDataSource (df) .to_json_string () в качестве вашегоAJAX источник.Я предполагаю, что это требует некоторой дополнительной обработки на стороне javascript, но я не могу найти в Интернете примеров того, что мне следует делать, чтобы график Боке распознавал эти данные.

import pandas as pd
from bokeh.models.sources import AjaxDataSource
from bokeh.plotting import figure, ColumnDataSource

adapter = CustomJS(code="""
    //console.log(cb_data)


    const result = { 'y': cb_data.response.data["y"],'datetime': cb_data.response.data['datetime']}

    console.log(result)
    return result
""")


source=AjaxDataSource(data_url='***************',
                    polling_interval=10000*60,adapter=adapter,method='GET')

p=figure(width=1500,height=500,x_axis_type="datetime")
p.line(x='y',y='datetime,source=source,color='Orange',line_width=3)

ВотJSON, что AJAX refrences:

{ "данные": { "DateTime": { " ndarray ": "AACAWT20dkIAACZoPbR2QgAAzHY9tHZCAAByhT20dkIAABiUPbR2QgAAvqI9tHZCAABksT20dkIAAArAPbR2QgAAsM49tHZCAABW3T20dkIAAPzrPbR2QgAAovo9tHZCAABICT60dkIAAO4XPrR2QgAAlCY + tHZCAAA6NT60dkIAAOBDPrR2QgAAhlI + tHZCAAAsYT60dkIAANJvPrR2QgAAeH4 + tHZCAAAejT60dkIAAMSbPrR2QgAAaqo + tHZCAAAQuT60dkIAALbHPrR2QgAAXNY + tHZCAAAC5T60dkIAAKjzPrR2QgAATgI / tHZC" "DTYPE": "float64", "форма": [30]}, "индекс": { " ndarray ":" AACAWT20dkIAACZoPbR2QgAAzHY9tHZCAAByhT20dkIAABiUPbR2QgAAvqI9tHZCAABksT20dkIAAArAPbR2QgAAsM49tHZCAABW3T20dkIAAPzrPbR2QgAAovo9tHZCAABICT60dkIAAO4XPrR2QgAAlCY + tHZCAAA6NT60dkIAAOBDPrR2QgAAhlI + tHZCAAAsYT60dkIAANJvPrR2QgAAeH4 + tHZCAAAejT60dkIAAMSbPrR2QgAAaqo + tHZCAAAQuT60dkIAALbHPrR2QgAAXNY + tHZCAAAC5T60dkIAAKjzPrR2QgAATgI / tHZC " "DTYPE": "float64", "форма": [30]}, "у": { " ndarray ": "AAAAAAA6ukAAAAAAACi6QAAAAAAAG7pAAAAAAAAGukAAAAAAAPK5QAAAAAAA47lAAAAAAADYuUAAAAAAAMm5QAAAAAAAu7lAAAAAAACruUAAAAAAAJS5QAAAAAAAgLlAAAAAAABquUAAAAAAAFu5QAAAAAAARrlAAAAAAAA4uUAAAAAAACi5QAAAAAAAFblAAAAAAAD8uEAAAAAAAOq4QAAAAAAA2rhAAAAAAADFuEAAAAAAALK4QAAAAAAAprhAAAAAAACOuEAAAAAAAHm4QAAAAAAAZLhAAAAAAABOuEAAAAAAADm4QAAAAAAAIrhA", "DTYPE": "float64","shape ": [30]}}," id ":" 14848 "} '

Данные получены правильно в JavaScript AJAX, но на графике ничего не отображается.Как я уже говорил ранее, я считаю, что должна быть некоторая дополнительная обработка на стороне JavaScript, чтобы правильно получить переменную datetime, но я понятия не имею, что это будет.Никаких ошибок ни на стороне Python, ни на JavaScript, сюжет просто не показывает никаких данных.

1 Ответ

1 голос
/ 12 июня 2019

Таким образом, вы столкнулись с ситуацией, когда никто не сталкивался раньше.Для автономного вывода HTML Bokeh выполняет кодирование base64 столбцов CDS, которые являются массивами NumPy или Pandas Series, потому что он более производительный, чем массивы обработки JSON, особенно вложенные массивы (например, для изображений).Вы можете видеть их в своем выводе как объекты с клавишами "ndarray".Как правило, BokehJS автоматически обрабатывает декодирование для реальных объектов CDS, которые сериализуются во время show и т. Д.

Но это взаимодействие, когда данные используются AjaxDataSource, имеет проблему.AjaxDataSource не не знает о кодировке base64 или знает, что делать с этими "ndarray" объектами.Он ожидает простые массивы чисел JSON во всех случаях.

К сожалению, для to_json_string нет ни параметра, ни глобальной настройки, ни переменной среды для подавления кодировки base64 (вопреки моему лучшему мнению, меня убедили удалить его).Итак, мое лучшее предложение для обходного пути на данный момент состоит в том, чтобы обезопасить исправление функции, которая контролирует, происходит ли кодирование:

In [12]: from bokeh.sampledata.perceptions import numberly

In [13]: from  bokeh.models import ColumnDataSource

In [14]: import bokeh.util.serialization as s

In [15]: s.array_encoding_disabled = lambda x: True # PATCH HERE FORCES ENCODE OFF 

In [16]: source = ColumnDataSource(numberly)

In [17]: source.to_json_string(include_defaults=False)

Вы заметите, что вывод теперь не имеет ни одного из этих "ndarray" объектов, которые присутствуют в вашем выводе.

Out [17]: '{"data": {"Пара": [2,2,2,2,2,2,2,2,2,2,2,2, 2,2,2,2,2,2,5,2,2,2,3,2,2,2,2,2,2,2,2,3,2,4,8,2,2, 3,2,2,2,3,2,2,2,2], «Несколько»: [3,3,5,5,3,3,3,3,4,5,4,6,3,3,3,3,3,3,2,3,3,3,4,3,3,3,3,3,3,3,3,4,3,7,10,3,3,5,3,3,3,5,3,3,3,4], «Много»: [20,12,15,15,50,10,9,50,30,16,80,50,25, 10,10,10,100,20,20,10,10,12,20,20,10,9,25,10,12,14,47,10,2948,43,20,8,10,23,7, 12,20,10,12,7,12,20], "десятка": [30,24,30,30,48,36,36,50,36,36,36,36,36,48,12, 24,36,36,12,24,36,48,60,12,24,36,24,36,36,30,36,36,24,12,50,36,12,40,36,24, 24,36,36,60,120,36], «Фракции»: [0,15,0.5,0.25,0.25,0.01,0,5,4,0,0,5,0,2,4,0,0,5,0,33,0,2,0,25,0,25,1,1.0,0.1,1.0,0.01,0.1,15.0,0.25,3.0,0.1,0.5,0.25,0.25,0.1,2.0,0.4,0.5,10.0,0.5,0.1,3.0,0.4,33.0,0.5,0.1,50.0,0.5,0.2,0.1,0.1,100.0], "сотни": [250,200,500,500,599,400,200,1000,500,300,300,200,300,400,350,200,3000,300,200,200,300,400,250,300,250,200,200,300,500,200,318,300,500,120,700,300,100,400,500,300,500,200,300,300,300,500], "Многие": [12,50,25,25,5,20,7,20,20, 25,7,50,10,60,8,10,30,9,8,10,10,40,25,20,25,10,25,20,5,7,8,20,1000,30,100,25,20,58,7,6,10,15,20,5,25,80], «Scores of»: [80,40,500,500,100000,400,8,100,100,1000,30000,100,50,40,14,6, 40,50,3,40,300,80,100,30,40,60,100,2000,60,200,67,40,50,25,100,100,100,40,40,300,1000,40,200,80,80,500], "Несколько": [7,10, 4,4,5,7,3,10,8,8,4,8,7,7,4,4,7,5,10,2,5,6,7,8,4,7,10, 5,7,7,4,8,7,5,8,4,5,6,4,7,10,10,5,7,5,5], "Некоторые": [4,6,5, 5,3,5,4,15,5,10,3,4,4,8,3,2,5,3,3,3,3,6,3,3,5,4,5,4, 4,4,5,5,5,5,4,5,6,6,5,4,5,5,4,3,3,7], "индекс": [0,1,2,3, 4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28, 29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45]}, "id": "1001"} '

Я бы предложил вам отправить отчет об ошибке на GitHub со всей этой информацией, чтобы можно было улучшить ситуацию с AjaxDataSource.

...