Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Sugestão] Código deprecated gerando muitos erros no gráfico candlestick, eis aqui código que funciona

O código de candlestick fornecido está com linhas de código "deprecated" deveriam mudá-lo.

Fiz um código que gera o gráfico parecido e rodou no meu Power BI.

# O código a seguir para criar um dataframe e remover as linhas duplicadas sempre é executado e age como um preâmbulo para o script: 

# dataset = pandas.DataFrame(Ativo, Close, Ano, Trimestre, Mês, Dia, High, Low, Open)
# dataset = dataset.drop_duplicates()

# Cole ou digite aqui seu código de script:
# o código a seguir para criar um dataframe e remover as linhas duplicadas sempre é executado e age como um preâmbulo para o script:

# dataset = pandas.DataFrame(Date, Open, High, Low, Close)
# dataset = dataset.drop_duplicates()
# o código a seguir para criar um dataframe e remover as linhas duplicadas sempre é executado e age como um preâmbulo para o script:

# dataset = pandas.DataFrame(Date, Open, High, Low, Close)
# dataset = dataset.drop_duplicates()
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Ajuste de estilo e fonte
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = ['Verdana']

#  Conversão segura da coluna Date
dataset["Date"] = pd.to_datetime(dataset["Date"], errors="coerce")

#  Removendo valores nulos
dataset.dropna(subset=["Date", "Open", "High", "Low", "Close"], inplace=True)

#  Gerando cores para os candles
cores = ["green" if c >= o else "red" for o, c in zip(dataset["Open"], dataset["Close"])]

#  Criando o gráfico
fig, ax = plt.subplots(figsize=(14, 6), dpi=100)
ax.set_facecolor("#f0f0f0")

# Corpo do candle (diferença entre abertura e fechamento)
ax.bar(dataset["Date"], np.abs(dataset["Open"] - dataset["Close"]),
       bottom=np.minimum(dataset["Open"], dataset["Close"]),
       color=cores, width=0.8, edgecolor="black", linewidth=0.5)

# Pavio (máxima - mínima)
ax.vlines(dataset["Date"], dataset["Low"], dataset["High"],
          color=cores, linewidth=1)

#  Ajustes finais
ax.set_title("Gráfico Candlestick Ações da Bolsa de Valores", fontsize=16, weight="bold")
ax.set_xlabel("Data")
ax.set_ylabel("Preço")
plt.xticks(rotation=45)
plt.tight_layout()
plt.grid(True, linestyle="--", linewidth=0.5, alpha=0.7)

plt.show()
2 respostas
solução!

Pessoal quiser pode usar e alterar de acordo com o gosto de vocês a visualização. Att,

Segue abaixo o mesmo gráfico com ponto de min e max indicando valores tmb.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import seaborn as sns

# Configurações iniciais de fonte
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams["font.sans-serif"] = 'Verdana'

def candlestick_com_min_max(date, open, high, low, close):
    fig, ax = plt.subplots(figsize=(30,11), dpi=72, facecolor='#edf3ee') 
    ax.set_facecolor("#edf3ee")

    # Definindo as cores de cada candle
    cores = ["green" if c > o else "red" for o, c in zip(open, close)]

    # Candlestick corpo
    for i in range(len(date)):
        ax.bar(date[i], abs(close[i]-open[i]), bottom=min(open[i], close[i]), color=cores[i], width=0.8)

    # Pavios (linha vertical entre low e high)
    for i in range(len(date)):
        ax.vlines(date[i], low[i], high[i], color='black', linewidth=1)

    #  Marca ponto mínimo
    idx_min = np.argmin(low)
    ax.plot(date[idx_min], low[idx_min], 'rv', markersize=12, label='Mínimo')
    ax.annotate(f'Mínimo: {low[idx_min]:.2f}',
                xy=(date[idx_min], low[idx_min]),
                xytext=(date[idx_min], low[idx_min] - (max(high)-min(low))*0.05),
                arrowprops=dict(facecolor='red', arrowstyle='->'),
                fontsize=12, color='red')

    #  Marca ponto máximo
    idx_max = np.argmax(high)
    ax.plot(date[idx_max], high[idx_max], 'g^', markersize=12, label='Máximo')
    ax.annotate(f'Máximo: {high[idx_max]:.2f}',
                xy=(date[idx_max], high[idx_max]),
                xytext=(date[idx_max], high[idx_max] + (max(high)-min(low))*0.05),
                arrowprops=dict(facecolor='green', arrowstyle='->'),
                fontsize=12, color='green')

    ax.legend()

# Certifique-se de que a coluna 'Date' seja do tipo datetime
dataset["Date"] = pd.to_datetime(dataset["Date"])

# Chama a função modificada para gerar o gráfico com os marcadores de máximo e mínimo
candlestick_com_min_max(dataset["Date"], dataset["Open"], dataset["High"], dataset["Low"], dataset["Close"])

plt.subplots_adjust(left=0.07, bottom=0.05, right=0.95, top=0.95)
plt.show()