локальная переменная df, на которую ссылаются до назначения (интерактивная визуализация Bokeh) - PullRequest
0 голосов
/ 06 июля 2019

Мне просто нужно выпадающее меню, которое показывает все отделы, и когда мы обновляем отдел, оно должно сгенерировать гистограмму, которая отображает все продукты и соответствующую розничную стоимость. Но это дает окно без визуализации и выпадающий список. Ошибка: "локальная переменная 'df', на которую ссылаются перед присваиванием"

import numpy as np
import pandas as pd
import os
import math
from bokeh.io import show, output_file
from bokeh.plotting import figure
from bokeh.transform import factor_cmap
from bokeh.models import ColumnDataSource, HoverTool, CustomJS
from bokeh.layouts import row, column
from bokeh.models.widgets import  Dropdown
from bokeh.io import curdoc

df = pd.read_csv('/Users/austinejose/Desktop/My Files/Work/Newcastle Service Station/2018/Feb_Totals.csv')
source = ColumnDataSource(data=df)

names = [str(x) for x in df['Product Name']]
plot = figure(x_range = 'Product Name', plot_height = 500, width = 700, title = "Sales By Departments",
              toolbar_location = "below")
plot.vbar(x = "Product Name", top = "Retail Value", width = 0.9, source = source, color = 'deepskyblue')
plot.xgrid.grid_line_color = "white"
plot.y_range.start = 0
plot.xaxis.major_label_orientation = math.pi/4
plot.xaxis.axis_label = "Product"
plot.yaxis.axis_label = "Retail Value"
plot.axis.minor_tick_in = -3
plot.axis.minor_tick_out = 6
plot.outline_line_color = "black"

menu = [("Bill Pay", "Bill Pay"), ("Hot Food", "Hot Food")]

menu_select = Dropdown(label='Department' ,menu=menu)

def dropdown_click(attr, old, new):
    active_dropdown = menu_select.value

    if active_dropdown in df['Department']:
        df = df[df['Department']==active_dropdown]
    source.data = df

menu_select.on_change('value', dropdown_click)

layout = row(menu_select, plot)
curdoc().add_root(layout)

1 Ответ

1 голос
/ 06 июля 2019

В вашем обратном вызове есть логическая ошибка:

def dropdown_click(attr, old, new):
    active_dropdown = menu_select.value

    if active_dropdown in df['Department']:
        df = df[df['Department']==active_dropdown]
    source.data = df

Если active_dropdown in df['Department'] равно False , то ваш код никогда не определяет df до попытки установить source.data = df. Это является непосредственной причиной сообщения Ошибка: «локальная переменная« df »указана перед присвоением» .

Одним из возможных решений является перемещение назначения внутри блока if, чтобы назначение происходило только тогда, когда гарантированно существует df. В противном случае вам нужно выяснить, что вы хотите сделать, когда условие False .

Однако есть и ошибка использования Bokeh, которую вам также нужно исправить. Значение source.data должно быть обычным Python dict , а не Pandas DataFrame.

...