#python #jupyter #plotly-python #ipywidgets
#питон #юпитер #сюжетно-питон #ipywidgets
Вопрос:
Я пытаюсь использовать средство визуализации динамической информации о запасах. У меня это работало с matplotlib, но я хотел перейти на Plotly. Однако, как только я переключился на график, моя диаграмма больше не отображается. Jupyter-lab не выдает никаких ошибок в моем коде.
from ipywidgets import VBox, HBox, Text, Button, widgets, Layout from IPython.display import display from datetime import datetime, timedelta import yfinance as yf import pandas as pd import plotly.graph_objs as go import plotly.offline as py import plotly.express as px import numpy as np class StockGraph(): def __init__(self): self.tickers = {} self.lines = [] self.views = { "Raw Data": lambda x: x, "Rolling Average": lambda x: x.rolling(rolling.value).mean(), "Rolling Variance": lambda x: x.rolling(rolling.value).var(), "Rolling Standard Deviation": lambda x: x.rolling(rolling.value).var()**0.5, "Rolling Coefficient of Variation": lambda x: (x.rolling(rolling.value).var()**0.5) / (x.rolling(rolling.value).mean()) } def plot_data(self, *args): if start_date.value.year gt; 1900 and end_date.value.year gt; 1900: new_df = pd.DataFrame() while self.lines: item = self.lines.pop() item.remove() for tick in self.tickers.keys(): df = self.tickers[tick] start = datetime(start_date.value.year, start_date.value.month, start_date.value.day) end = datetime(end_date.value.year, end_date.value.month, end_date.value.day) selection = df.loc[(df.index gt;= start) amp; (df.index lt;= end)] value = self.views[calculation.value](selection[data_type.value]) new_df[tick] = value fig = px.line(new_df, x=new_df.index, y=new_df.columns) fig.show() def render_stocks(self, *args): if stock_text.value != '': ticker = yf.download(stock_text.value.upper(), period="max", progress=False) if not ticker.empty: self.tickers[stock_text.value.upper()] = ticker self.plot_data() stock_text.value = '' boxes = [self.completed_stock(each) for each in self.tickers] tickersWidget.children = ([VBox([VBox(boxes), HBox([stock_text, stock_button])])]) def completed_stock(self, ticker): tickerField = Text(value=ticker,layout=Layout(width='50%',)) removeButton = Button(description='Remove', button_style='danger',layout=Layout(width='50%',)) return HBox([tickerField, removeButton]) def completed_stock(self, ticker): def remove_stock(_): if tickerField.value in self.tickers.keys(): self.tickers.pop(tickerField.value) self.render_stocks() self.plot_data() tickerField = Text(value=ticker,layout=Layout(width='50%',)) removeButton = Button(description='Remove', button_style='danger',layout=Layout(width='50%',)) removeButton.on_click(remove_stock) stock_view = HBox([tickerField, removeButton]) return stock_view def finish_matplotlib(self): ax.legend() title = f"{calculation.value} of {data_type.value} from {start_date.value.strftime('%Y/%m/%d')}" title = f" to {end_date.value.strftime('%Y/%m/%d')}" ax.set_title(title) ax.relim() ax.autoscale() fig.canvas.draw_idle() graph = StockGraph() # Setting up a basic view with an empty field and a button stock_text = widgets.Text(value='',layout=Layout(width='50%',)) stock_button = widgets.Button(description='Add',layout=Layout(width='50%',)) stock_button.on_click(graph.render_stocks) tickersWidget = HBox([stock_text, stock_button]) # Choose data to be shown calculation = widgets.Dropdown(value="Raw Data", options=graph.views.keys(),layout=Layout(width='auto',)) data_type = widgets.Dropdown(value="Close", options=['Open', 'Close', 'High', 'Low', 'Volume'],layout=Layout(width='auto',)) calculation.observe(graph.plot_data) data_type.observe(graph.plot_data) dropdowns = VBox([calculation, data_type]) #Choose dates to be shown start_date = widgets.DatePicker(value=datetime.today() - timedelta(days=365),disabled=False,layout=Layout(width='auto',)) end_date = widgets.DatePicker(value=datetime.today(),disabled=False,layout=Layout(width='auto',)) start_date.observe(graph.plot_data) end_date.observe(graph.plot_data) dates = VBox([start_date, end_date]) #Other Settings for Users rolling = widgets.Dropdown(options=list(range(2,101)), value=60,description='Rolling:',disabled=False,layout=Layout(width='auto',)) rolling.observe(graph.plot_data) final_view = VBox([tickersWidget, dropdowns, dates, rolling],layout=Layout(width='20%',)) display(final_view)
Я хотел бы получить некоторое представление о том, почему диаграмма не будет отображаться.
Комментарии:
1. Пожалуйста, не могли бы вы построить более минимальный пример. Можете ли вы увидеть обычную диаграмму в своем блокноте?
2. Я скопировал и вставил минимальный пример с виджетами IPython и сюжетно в свои записные книжки, и это сработало нормально.
3. Итак, вам нужно поработать над своим минимальным примером, добавляя функциональность пошагово, пока вы не дойдете до того, где она не работает. Затем опубликуйте этот пример. У вас здесь много дополнительного кода, который не является причиной проблемы, дополнительных зависимостей, yfinance и т. Д., Когда вы могли бы создать простой фрейм данных, например, с пандами.