Отображение потоковой сетки в ноутбуке Jupyter - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь отображать живые обновления цен, поступающие с канала redis pubsub в сетке в Jupyter. Каждый раз, когда происходит обновление цены, сообщение будет добавлено в конце таблицы. Другими словами, виджет gridview будет привязан к Dataframe, поэтому каждый раз, когда он изменяется, вид grid будет меняться. Идея состоит в том, чтобы получить что-то вроде этого: enter image description here

Я попытался сделать это, отобразив и очистив вывод. Однако я не получаю потоковую сетку, которая обновляется на месте, а скорее отображаю и очищаю вывод, что очень раздражает.

Вот виджет вывода в одной ячейке юпитера

import ipywidgets as iw
from IPython.display import display 

o = iw.Output()
def output_to_widget(df, output_widget): 
    output_widget.clear_output()
    with output_widget: 
        display(df)
o

Вот код для подписки на redis и обработки сообщения

import redis, json, time

r = redis.StrictRedis(host = HOST, password = PASS, port = PORT, db = DB)
p = r.pubsub(ignore_subscribe_messages=True)
p.subscribe('QUOTES')

mdf = pd.DataFrame()
while True:
    message = p.get_message()
    if message:
        json_msg = json.loads(message['data'])
        df = pd.DataFrame([json_msg]).set_index('sym')
        mdf = mdf.append(df)
        output_to_widget(mdf, o)
    time.sleep(0.001)

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Мне удалось заставить его работать с использованием потоковых фреймов данных из библиотеки streamz.

Вот класс для передачи данных в потоковый фрейм данных.

class DataEmitter:
def __init__(self, pubsub, src):
    self.pubsub = pubsub
    self.src = src
    self.thread = None

def emit_data(self, channel):
    self.pubsub.subscribe(**{channel: self._handler})
    self.thread = self.pubsub.run_in_thread(sleep_time=0.001)

def stop(self):
    self.pubsub.unsubscribe()
    self.thread.stop()    

def _handler(self, message):
    json_msg = json.loads(message['data'])
    df = pd.DataFrame([json_msg])
    self.src.emit(df)

и вот ячейка для отображения потокового кадра данных

r = redis.StrictRedis(host = HOST, password = PASS, port = PORT, db = DB)
p = r.pubsub(ignore_subscribe_messages=True)
source = Stream()
emitter = DataEmitter(p, source, COLUMNS)
emitter.emit_data(src='PRICE_UPDATES')

#sample for how the dataframe it's going to look like
example = pd.DataFrame({'time': [], 'sym': []})
sdf = source.to_dataframe(example=example)
sdf
0 голосов
/ 31 октября 2018

Попробуйте изменить первую строку output_to_widget на output_widget.clear_output(wait = True).

https://ipython.org/ipython-doc/3/api/generated/IPython.display.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...