Как вернуть данные табеля в коде, для использования в расчете в боке? - PullRequest
0 голосов
/ 23 февраля 2020
import numpy as np
import pandas as pd
from bokeh.plotting import figure, gridplot
from bokeh.io import output_file, show, curdoc
from bokeh.models.widgets import FileInput, DataTable, DateFormatter, TableColumn
from pybase64 import b64decode
from bokeh.models import ColumnDataSource
import io

# output to static HTML file
output_file("./OUTPUT/001_koreksi.html", title='Koreksi Gayaberat')


def upload_fit_data(attr, old, new):
    print("fit data upload succeeded")
    decoded = b64decode(new)
    f = io.BytesIO(decoded)
    new_df = pd.read_excel(f, sheet_name='data')
    # print(new_df)
    data = dict(utmx=new_df['UTM X'],
                utmy=new_df['UTM Y'],
                elev=new_df['Elevasi'],
                lat=new_df['Latitude'],
                lon=new_df['Longitude'],
                ta=new_df['Tinggi Alat'],
                N=new_df['N'],
                E=new_df['E'],
                S=new_df['S'],
                W=new_df['W'],
                time=new_df['Time'],
                kt=new_df['Koreksi Tide'],
                rdgrav=new_df['Bacaan'])
    source = ColumnDataSource(data)

    columns = [TableColumn(field="utmx", title="UTM X"), TableColumn(field="utmy", title="UTM Y"),
               TableColumn(field="elev", title="Elevasi"), TableColumn(field="lat", title="Latitude"),
               TableColumn(field="lon", title="Longitude"), TableColumn(field="ta", title="Tinggi Alat"),
               TableColumn(field="N", title="North"), TableColumn(field="E", title="East"),
               TableColumn(field="S", title="South"), TableColumn(field="W", title="West"),
               TableColumn(field="time", title="Waktu Pengukuran"), TableColumn(field="kt", title="Koreksi tide"),
               TableColumn(field="rdgrav", title="Bacaan Alat")]
    data_table = DataTable(source=source, columns=columns, width=500, height=300)
    global data_table

    # return data_table


# data_table = DataTable(source=source, columns=columns, width=500, height=300)
file_input = FileInput(accept=".xlsx")
file_input.on_change('value', upload_fit_data)


p = gridplot([file_input, data_table])
doc = curdoc()
doc.add_root(p)

Вопрос: как использовать и показать значение «data_table» в приложении bokeh? если я запускаю этот код, в интерфейсе bokeh «data_table» не отображается

1 Ответ

1 голос
/ 23 февраля 2020

Помимо проблем, упомянутых в комментарии к вашему вопросу Z4-уровня, есть и другие:

  • output_file не будет работать с bokeh serve - и bokeh serve - это именно то, что вам нужно учесть, что вы хотите запустить Python код в ответ на действия пользователей в веб-интерфейсе.
  • gridplot принимает список кортежей, в котором указывается не только сам элемент, но и место для размещения каждого элемента. , Поскольку у вас есть только два виджета, column должно быть достаточно

Рассмотрите этот рабочий код:

import io
from base64 import b64decode

import pandas as pd

from bokeh.io import curdoc
from bokeh.layouts import column
from bokeh.models import ColumnDataSource
from bokeh.models.widgets import FileInput, DataTable, TableColumn

column_map = dict(utmx='UTM X', utmy='UTM Y', elev='Elevasi',
                  lat='Latitude', lon='Longitude', ta='Tinggi Alat',
                  N='N', E='E', S='S', W='W', time='Time',
                  kt='Koreksi Tide', rdgrav='Bacaan')

source = ColumnDataSource(data={c: [] for c in column_map})

columns = [TableColumn(field="utmx", title="UTM X"), TableColumn(field="utmy", title="UTM Y"),
           TableColumn(field="elev", title="Elevasi"), TableColumn(field="lat", title="Latitude"),
           TableColumn(field="lon", title="Longitude"), TableColumn(field="ta", title="Tinggi Alat"),
           TableColumn(field="N", title="North"), TableColumn(field="E", title="East"),
           TableColumn(field="S", title="South"), TableColumn(field="W", title="West"),
           TableColumn(field="time", title="Waktu Pengukuran"), TableColumn(field="kt", title="Koreksi tide"),
           TableColumn(field="rdgrav", title="Bacaan Alat")]
data_table = DataTable(source=source, columns=columns, width=500, height=300)


def upload_fit_data(attr, old, new):
    f = io.BytesIO(b64decode(new))
    new_df = pd.read_excel(f, sheet_name='data')
    source.data = {ds_c: new_df[df_c] for ds_c, df_c in column_map.items()}


file_input = FileInput(accept=".xlsx")
file_input.on_change('value', upload_fit_data)

curdoc().add_root(column(file_input, data_table))

Обратите внимание, что если вы не хотите иметь интерактивную веб-страницу и просто хотите иметь файл stati c HTML, тогда вы не можете использовать никакие обратные вызовы Python. Вам нужно будет указать файл XLSX через CLI и обрабатывать данные прямо при запуске скрипта.

...