Olá,
Estou enfrentando problema com o meu script, anterior ao comando de atualizar no BI fica dessa forma:
Após dar o comando ele dá erro na visualização do gráfico
segue o código:
# Importando as bibliotecas
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.ticker as mticker
# Configurações das fontes
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams["font.sans-serif"] = 'Verdana'
def candlestick(date, open, high, low, close):
fig, ax = plt.subplots(figsize=(30, 12), dpi=100, facecolor='#edf3ee')
ax.set_facecolor("#edf3ee")
# Definindo as cores de cada candle
cores = ["green" if c > o else "red" for c, o in zip(close, open)]
# Desenhando o corpo dos candles
for i in range(len(date)):
# Pavio
ax.plot([date[i], date[i]], [low[i], high[i]], color=cores[i], alpha=0.7)
# Corpo do candle
ax.bar(date[i], close[i] - open[i], bottom=open[i], color=cores[i], width=0.8, alpha=0.7)
# Cálculo das médias móveis
mav_7 = close.rolling(7).mean().fillna(method='ffill')
mav_30 = close.rolling(30).mean().fillna(method='ffill')
# Plotando as médias móveis
ax.plot(date, mav_7, label="MAV 7", color="#E76F51", linewidth=2)
ax.plot(date, mav_30, label="MAV 30", color="#023E8A", linewidth=2)
# Identificando cruzamentos
#cruzamentos = np.where(np.diff(np.sign(mav_7 - mav_30)))[0] # Identificando cruzamentos
#for cruzamento in cruzamentos:
# ax.scatter(date[cruzamento + 1], mav_7[cruzamento + 1], color='black', s=100, zorder=5)
# Marcando os pontos máximos e mínimos
for i in range(len(date)):
if low[i] == np.min(low):
ax.annotate('Mínimo', xy=(date[i], low[i]), xytext=(15, -15), fontsize=26,
textcoords='offset points', arrowprops=dict(arrowstyle='-|>'))
if high[i] == np.max(high):
ax.annotate('Máximo', xy=(date[i], high[i]), xytext=(15, 15), fontsize=26,
textcoords='offset points', arrowprops=dict(arrowstyle='-|>'))
# Valor Atual
ax.axhline(y=close[len(close)-1], color="grey", linestyle='--')
# Melhorando a formatação do gráfico
ax.xaxis.set_major_locator(mdates.DayLocator(interval=7)) # Definir o intervalo dos labels do eixo x para 7 dias
ax.xaxis.set_major_formatter(mdates.DateFormatter('%d/%m')) # Formatar os labels do eixo x como data dd/mm
ax.tick_params(axis='x', rotation=45) # Rotacionar os labels do eixo x para evitar sobreposição
# Ajustar labels do eixo y para serem sempre visíveis e formatados em reais
ax.yaxis.set_major_formatter(mticker.FuncFormatter(lambda y, _: f'R${y:,.2f}'))
ax.set_xlabel("Date")
ax.set_ylabel("Price")
ax.legend() # Adicionando a legenda para as médias móveis
# Formatação do dataset
dataset["Date"] = pd.to_datetime(dataset["Date"], format="%Y-%m-%dT%H:%M:%S")
# Chamando a função candlestick
candlestick(dataset["Date"], dataset["Open"], dataset["High"], dataset["Low"], dataset["Close"])
plt.subplots_adjust(left=0.07, bottom=0.15, right=0.95, top=0.95)
plt.show()