Источник обновления боке с использованием агрегата

Я создаю панель управления Bokeh с данными страны, чтобы динамически изменять график для линейного графика.

Пользователь может выбрать несколько стран с помощью CheckboxGroup.

Я могу динамически создавать подмножества исходной таблицы по мере выбора / отмены выбора стран.

После того, как я подмножество, я объединяю исходную таблицу для графика, где возникает проблема. (сгруппировать все страны по дате)

Я понимаю, что нам нужно напрямую использовать source=src, но мне нужно агрегировать каждый раз, когда я обновляю новый источник.

Есть ли какие-нибудь предложения о том, как я могу подойти к этой проблеме?

Спасибо!

def make_plot(src):
    temp = pd.DataFrame.from_dict(src.data)
    agg_date_full = ColumnDataSource(temp.groupby('date').sum().reset_index())
    fig1.line('date', 'y',source=agg_date_full)

def update(attr, old, new):
    country_to_plot = [country_checkbox.labels[i] for i in country_checkbox.active]
    new_src = make_dataset(country_to_plot)
    src.data.update(new_src.data)

country_checkbox = CheckboxGroup(labels=country_labels, active= list(range(0,len(country_labels))))
country_checkbox.on_change('active', update)

initial_countries = [country_checkbox.labels[i] for i in country_checkbox.active]

src = make_dataset(initial_countries)
    
p = make_plot(src)

person Danny Yoon    schedule 26.08.2020    source источник
comment
Помог ли мой ответ с вашей проблемой?   -  person gherka    schedule 02.10.2020


Ответы (1)


Ответ зависит от того, как вы планируете развернуть и использовать свою панель управления.

Если вы можете запустить bokeh сервер, то довольно просто добиться динамического преобразования данных, которые вы описываете.

Мы можем получить пример набора данных таймсерий с несколькими странами из Всемирного банка, используя их API. Из вашего описания это должно быть достаточно близко:

http://api.worldbank.org/v2/country/eas;ecs;lcn;mea;nac;sas;ssf/indicator/EN.ATM.CO2E.KT?source=2&downloadformat=csv

После небольшой уборки фрейм данных должен выглядеть так:

Country Name                Year    Value
East Asia & Pacific         1960    1.215380e+06
Europe & Central Asia       1960    4.583646e+06
Latin America & Caribbean   1960    3.024539e+05
Middle East & North Africa  1960    9.873685e+04
North America               1960    3.083749e+06
...

Теперь код bokeh. Я использовал подход с одним модулем из docs, но вы можете сделать его настолько сложным, насколько захотите. Обратите внимание, что вы должны поместить этот код в .py файл, а не запускать его из записной книжки Jupyter.

from bokeh.layouts import row
from bokeh.models import CheckboxGroup, NumeralTickFormatter
from bokeh.plotting import figure, curdoc

initial_x = df["Year"].unique()
initial_y = (
    df[df["Country Name"] == "Europe & Central Asia"]
        .groupby("Year")["Value"]
        .sum()
        .values
)

# create a plot and style its properties
p = figure(height=400, width=600, toolbar_location=None)
p.yaxis[0].formatter = NumeralTickFormatter(format="0.0a")
p.yaxis.axis_label = "CO2 emissions (kt)"
p.xaxis.axis_label = "Years"

# create line renderer
line = p.line(x=initial_x, y=initial_y, line_width=2)

ds = line.data_source

# create a callback that will reset the datasource
def callback(self):

    selected = [checkbox_group.labels[i] for i in checkbox_group.active]
    filtered =  df[df["Country Name"].isin(selected)]
    new_data = dict()
    new_x = filtered["Year"].unique()
    new_y = filtered.groupby("Year")["Value"].sum().values
    new_data["x"] = new_x
    new_data["y"] = new_y

    ds.data = new_data

# add checkboxes and the callback
labels = list(df["Country Name"].unique())
checkbox_group = CheckboxGroup(labels=labels, active=[1])
checkbox_group.on_click(callback)

# put the checkboxes and plot in a layout and add to the document
curdoc().add_root(row(checkbox_group, p))

Теперь, когда вы запустите следующую команду со своего терминала: bokeh serve --show app.py, вы сможете увидеть свою панель инструментов в браузере, например:

введите описание изображения здесь

Когда вы нажимаете на разные регионы, их выбросы углерода складываются и отображаются в виде одной линии.

person gherka    schedule 31.08.2020