Попытка построения графиков с использованием значения из выпадающего меню в jupyter notebook

#python #ipywidgets

#python #ipywidgets

Вопрос:

Итак, у меня есть цены на акции 5 компаний. То, что я пытаюсь сделать, это использовать выпадающее меню для выбора компании и создания линейного графика с использованием данных для компании, выбранной из выпадающего меню. Код, который у меня есть до сих пор, выглядит следующим образом :

 import pandas as pd

intel = pd.read_csv(r'C:UsersPCDesktopINTEL.csv')
nvidia = pd.read_csv(r'C:UsersPCDesktopNVIDIA.csv')
amd = pd.read_csv(r'C:UsersPCDesktopAMD.csv')
gigabyte = pd.read_csv(r'C:UsersPCDesktopGIGABYTE.csv')
msi= pd.read_csv(r'C:UsersPCDesktopMSI.csv')


stocks= widgets.Dropdown(
description='Stocks:   ',
options=['','Intel','Nvidia','AMD','Gigabyte','MSI']
)

name = stock.value


def response(name):
if name=='Intel' :
    Intel_chart = go.Line(x=Intel['Date'],y=Intel['Close'])
    Intel_data = [Intel_chart]
    iplot(Intel_data)

elif name=='Nvidia' :
    Nvidia_chart = go.Line(x=Nvidia['Date'],y=Nvidia['Close'])
    Nvidia_data = [Nvidia_chart]
    iplot(Nvidia_data)

elif name=='AMD' :
    AMD_chart = go.Line(x=AMD['Date'],y=AMD['Close'])
    AMD_data = [AMD_chart]
    iplot(AMD_data)

elif name=='Gigabyte' :
    Gigabyte_chart = go.Line(x=Gigabyte['Date'],y=Gigabyte['Close'])
    Gigabyte_data = [Gigabyte_chart]
    iplot(Gigabyte_data)

elif name=='MSI' :
    MSI_chart = go.Line(x=MSI['Date'],y=MSI['Close'])
    MSI_data = [MSI_chart]
    iplot(MSI_data)
  

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

Заранее спасибо

Ответ №1:

В конце вашего кода вам нужно заставить выпадающий виджет вызывать response функцию при изменении ее значения.

 stocks.observe(response, type='change', names=['value'])
  

Комментарии:

1. Спасибо, чувак, но это, похоже, не помогло. Если бы вы могли отредактировать код, это было бы намного лучше

Ответ №2:

В Plotly есть режим виджета, который работает хорошо, и я иногда использую его вместе с Voila для панели мониторинга (https://github.com/QuantStack/voila ) и с другими ipywidgets, включая BQplot. (Я предпочитаю некоторые типы графиков Plotly, и я предпочитаю интерактивность BQplot).

Этот код не тестировался, но это может быть что-то вроде этого.

 import ipywidgets as widgets
import plotly.graph_objs as go


data = [go.Scatter(
    x = Intel['date'],
    y = Intel['close'],
    mode = 'lines',
    name = 'Data',
    line = dict(
        color = ('rgb(205, 12, 24)'),
        width = 4)
)]

plotlyFig = go.Figure(data=data)
plotlyFig['layout'].update(height=800,
                           width=800,
                           title='',
                           xaxis=dict(
                               title='x Axis',
                               titlefont=dict(
                                   family='Arial',
                                   size=18,
                                   color='#7f7f7f'
                               )
                           ),
                           yaxis=dict(
                               title='y Axis',
                               titlefont=dict(
                                   family='Arial',
                                   size=18,
                                   color='#7f7f7f'
                               )
                           )
                           )

PlotlyWidget = go.FigureWidget(plotlyFig)   # This creates a Plotly Ipywidget.
PlotlyWidgetData = PlotlyWidget.data[0]        

def response(change):
    name = stocks.value

    if name=='Intel' :
        PlotlyWidgetData.x = Intel['date']
        PlotlyWidgetData.y = Intel['close']
    elif name=='Nvidia' :
        PlotlyWidgetData.x = Nvidia['date']
        PlotlyWidgetData.y = Nvidia['close']
    elif name=='AMD' :
        PlotlyWidgetData.x = AMD['date']
        PlotlyWidgetData.y = AMD['close']
    elif name=='Gigabyte' :
        PlotlyWidgetData.x = Gigabyte['date']
        PlotlyWidgetData.y = Gigabyte['close']
    elif name=='Asus' :
        PlotlyWidgetData.x = Asus['date']
        PlotlyWidgetData.y = Asus['close']
    elif name=='MSI' :
        PlotlyWidgetData.x = MSI['date']
        PlotlyWidgetData.y = MSI['close']
    elif name=='EVGA' :
        PlotlyWidgetData.x = EVGA['date']
        PlotlyWidgetData.y = EVGA['close']  

stocks = widgets.Dropdown(
    description='Stocks:   ',
    options=['','Intel','Nvidia','AMD','Gigabyte','Asus','MSI','EVGA'])

stocks.observe(response, type='change', names=['value'])

stocks
  

Комментарии:

1. Извините за поздний ответ. В любом случае я попробовал, но, похоже, это не сработало. Я получаю выпадающее меню, но рисунок не отображается.

2. Не могли бы вы предоставить свою попытку с данными (или сократить версию doen). Мне было бы проще отлаживать его с фактическими данными в любом формате, который вы используете.

3. Ну, моя попытка такая же, как и с кодом в исходном сообщении. Я беру данные непосредственно из yahoo finance и сохраняю их в dataframes. Однако для вашего удобства я преобразовал все фреймы данных в файлы csv и загрузил их СЮДА , чтобы вы могли их увидеть. Также хотелось бы отметить, что в случае вашего приведенного выше ответа даже начальная цифра не отображалась, хотя она должна быть отображена. Я использовал копирование и вставку, чтобы протестировать ваше решение как есть, не внося никаких изменений. Спасибо 🙂

4. попробуйте это : stocks.observe(response) . Это может сработать. Но я не могу это протестировать, потому что у меня нет времени на создание словарей данных. Я посмотрю на это для вас, если вы предоставите почти рабочий пример с образцами данных, определенными в Python.

5. Попробовал, но это не сработало. Я обновил свой исходный пост словарями данных. Я уже загрузил данные, поэтому все, что вам нужно сделать, это изменить путь к csv-файлам :). Спасибо