Я не могу повторно применить select_tool более одного раза, не влияя на конечный процесс при первом выборе. ⇐ Python
-
Anonymous
Я не могу повторно применить select_tool более одного раза, не влияя на конечный процесс при первом выборе.
Я создал простой инструмент выбора для определения точки поворота выбранного диапазона. Мы принимаем его в качестве отправной точки для функции update_chart_2 для извлечения данных из набора данных MySQL. Проблема в том, что я не могу повторно применить select_tool более одного раза, не влияя на результирующий процесс при первом выборе, я пробовал вручную назначать разные имена переменных, используя циклы, функции.
импортировать панд как pd импортировать sqlalchemy из рисунка импорта bokeh.plotting, curdoc из bokeh.models импорт ColumnDataSource время импорта MYSQLHOST = "локальный хост" MYSQLUSER = "туфик" MYSQLPASSWORD = "туфик" MYSQLDATABASE = "kraken_data" uri = f"mysql+mysqlconnector://{MYSQLUSER}:{MYSQLPASSWORD}@{MYSQLHOST}/{MYSQLDATABASE}" двигатель = sqlalchemy.create_engine(uri) запрос = sqlalchemy.text('SELECT * FROM kraken_trades') с engine.connect() в качестве соединения: результат = соединение.execute(запрос) df = pd.DataFrame(result.fetchall(), columns=result.keys()) df['time'] = pd.to_datetime(df['time']) df.set_index('id', inplace=True) источник = ColumnDataSource(data={'id': df.index, 'time': df['time'], 'price': df['price']}) инструменты = "панорама,box_zoom,сброс,сохранение,xbox_select" p = рисунок(title="Цена биткойнов в реальном времени", x_axis_type='datetime', высота=650, ширина=1350, инструменты=инструменты) # Исходная строка источника данных line_rend = p.step(x='time', y='price', source=source, mode="after", line_width=2, color='navy') line_rend.selection_glyph = line_rend.glyph line_rend.nonselection_glyph = line_rend.glyph # Теперь создайте скаттер-рендерер с нулевой альфа-каналом, используя тот же ColumnDataSource scatter_rend = p.scatter('время','цена', fill_alpha=0, source=source, line_alpha=0) scatter_rend.selection_glyph = scatter_rend.glyph scatter_rend.nonselection_glyph = scatter_rend.glyph df_cum = pd.DataFrame() first_id = Нет def box_select_callback(attr, old_indices, new_indices): глобальный first_id если новые_индексы: selected_i = [source.data['id'] для i в new_indices] selected_x = [source.data['time'] для i в new_indices] selected_y = [source.data['price'] для i в new_indices] # Конвертируем выбранные данные в DataFrame df_range = pd.DataFrame({'id': selected_i, 'time': selected_x, 'price': selected_y}) df_range.set_index('время', место=True) max_price = df_range['цена'].idxmax() min_price = df_range['цена'].idxmin() если максимальная_цена < минимальная_цена: diff_1 = (max_price - df_range.iloc[0].name).total_секунды() diff_2 = (df_range.iloc[-1].name - min_price).total_секунды() если diff_1 < diff_2: пивот_время = минимальная_цена Pivot_id = df_range.loc[min_price]['id'] Pivot_price = df_range.loc[min_price]['цена'] еще: пивот_время = максимальная_цена Pivot_id = df_range.loc[max_price]['id'] Pivot_price = df_range.loc[max_price]['цена'] Элиф минимальная_цена < максимальная_цена: diff_1 = ( min_price- df_range.iloc[0].name).total_секунд() diff_2 = (df_range.iloc[-1].name - max_price).total_секунды() если diff_1 < разница_2: пивот_время = максимальная_цена Pivot_id = df_range.loc[max_price]['id'] Pivot_price = df_range.loc[max_price]['цена'] еще: пивот_время = минимальная_цена Pivot_id = df_range.loc[min_price]['id'] Pivot_price = df_range.loc[min_price]['цена'] first_id = Pivot_id - 1 print('новый first_id:',first_id) защита update_chart_2(): глобальный first_id, df_cum с engine.connect() в качестве соединения: query = sqlalchemy.text('SELECT * FROM kraken_trades WHERE id >= :first_id LIMIT 3') результат = Connection.execute(запрос, {'first_id': int(first_id)}) df_2 = pd.DataFrame(result.fetchall(), columns=result.keys()) df_2['время'] = pd.to_datetime(df_2['время']) df_2.set_index('время', место=True) если не df_2.empty: если не df_2.isna().values.any(): first_id = df_2.iloc[-1]['id'] + 1 # Установить first_id в последний 'id' в данных df df_cum = pd.concat([df_cum, df_2]) curdoc().add_ periodic_callback(update_chart_2, 5000) # Прикрепите обратный вызов Python к выбранному атрибуту фигуры source.selected.on_change('indices', box_select_callback) curdoc().add_root(p)
Я создал простой инструмент выбора для определения точки поворота выбранного диапазона. Мы принимаем его в качестве отправной точки для функции update_chart_2 для извлечения данных из набора данных MySQL. Проблема в том, что я не могу повторно применить select_tool более одного раза, не влияя на результирующий процесс при первом выборе, я пробовал вручную назначать разные имена переменных, используя циклы, функции.
импортировать панд как pd импортировать sqlalchemy из рисунка импорта bokeh.plotting, curdoc из bokeh.models импорт ColumnDataSource время импорта MYSQLHOST = "локальный хост" MYSQLUSER = "туфик" MYSQLPASSWORD = "туфик" MYSQLDATABASE = "kraken_data" uri = f"mysql+mysqlconnector://{MYSQLUSER}:{MYSQLPASSWORD}@{MYSQLHOST}/{MYSQLDATABASE}" двигатель = sqlalchemy.create_engine(uri) запрос = sqlalchemy.text('SELECT * FROM kraken_trades') с engine.connect() в качестве соединения: результат = соединение.execute(запрос) df = pd.DataFrame(result.fetchall(), columns=result.keys()) df['time'] = pd.to_datetime(df['time']) df.set_index('id', inplace=True) источник = ColumnDataSource(data={'id': df.index, 'time': df['time'], 'price': df['price']}) инструменты = "панорама,box_zoom,сброс,сохранение,xbox_select" p = рисунок(title="Цена биткойнов в реальном времени", x_axis_type='datetime', высота=650, ширина=1350, инструменты=инструменты) # Исходная строка источника данных line_rend = p.step(x='time', y='price', source=source, mode="after", line_width=2, color='navy') line_rend.selection_glyph = line_rend.glyph line_rend.nonselection_glyph = line_rend.glyph # Теперь создайте скаттер-рендерер с нулевой альфа-каналом, используя тот же ColumnDataSource scatter_rend = p.scatter('время','цена', fill_alpha=0, source=source, line_alpha=0) scatter_rend.selection_glyph = scatter_rend.glyph scatter_rend.nonselection_glyph = scatter_rend.glyph df_cum = pd.DataFrame() first_id = Нет def box_select_callback(attr, old_indices, new_indices): глобальный first_id если новые_индексы: selected_i = [source.data['id'] для i в new_indices] selected_x = [source.data['time'] для i в new_indices] selected_y = [source.data['price'] для i в new_indices] # Конвертируем выбранные данные в DataFrame df_range = pd.DataFrame({'id': selected_i, 'time': selected_x, 'price': selected_y}) df_range.set_index('время', место=True) max_price = df_range['цена'].idxmax() min_price = df_range['цена'].idxmin() если максимальная_цена < минимальная_цена: diff_1 = (max_price - df_range.iloc[0].name).total_секунды() diff_2 = (df_range.iloc[-1].name - min_price).total_секунды() если diff_1 < diff_2: пивот_время = минимальная_цена Pivot_id = df_range.loc[min_price]['id'] Pivot_price = df_range.loc[min_price]['цена'] еще: пивот_время = максимальная_цена Pivot_id = df_range.loc[max_price]['id'] Pivot_price = df_range.loc[max_price]['цена'] Элиф минимальная_цена < максимальная_цена: diff_1 = ( min_price- df_range.iloc[0].name).total_секунд() diff_2 = (df_range.iloc[-1].name - max_price).total_секунды() если diff_1 < разница_2: пивот_время = максимальная_цена Pivot_id = df_range.loc[max_price]['id'] Pivot_price = df_range.loc[max_price]['цена'] еще: пивот_время = минимальная_цена Pivot_id = df_range.loc[min_price]['id'] Pivot_price = df_range.loc[min_price]['цена'] first_id = Pivot_id - 1 print('новый first_id:',first_id) защита update_chart_2(): глобальный first_id, df_cum с engine.connect() в качестве соединения: query = sqlalchemy.text('SELECT * FROM kraken_trades WHERE id >= :first_id LIMIT 3') результат = Connection.execute(запрос, {'first_id': int(first_id)}) df_2 = pd.DataFrame(result.fetchall(), columns=result.keys()) df_2['время'] = pd.to_datetime(df_2['время']) df_2.set_index('время', место=True) если не df_2.empty: если не df_2.isna().values.any(): first_id = df_2.iloc[-1]['id'] + 1 # Установить first_id в последний 'id' в данных df df_cum = pd.concat([df_cum, df_2]) curdoc().add_ periodic_callback(update_chart_2, 5000) # Прикрепите обратный вызов Python к выбранному атрибуту фигуры source.selected.on_change('indices', box_select_callback) curdoc().add_root(p)