1

Sucede que tengo una df llamada df_trading_pair_date_time_index la cual contiene la siguiente data:

                         Open      High       Low     Close                End Date
Start Date                                                                         
2022-08-12 00:25:00  23834.13  23909.27  23830.00  23877.62 2022-08-12 00:29:59.999
2022-08-12 00:30:00  23877.62  23968.52  23877.62  23936.89 2022-08-12 00:34:59.999
2022-08-12 00:35:00  23936.89  23989.95  23915.92  23962.50 2022-08-12 00:39:59.999
2022-08-12 00:40:00  23960.64  23985.03  23935.60  23966.71 2022-08-12 00:44:59.999
2022-08-12 00:45:00  23966.71  23996.94  23958.00  23983.68 2022-08-12 00:49:59.999
2022-08-12 00:50:00  23982.53  24009.67  23958.89  23996.59 2022-08-12 00:54:59.999
2022-08-12 00:55:00  23995.49  24005.30  23963.92  23964.37 2022-08-12 00:59:59.999
2022-08-12 01:00:00  23965.31  24000.00  23940.61  23975.64 2022-08-12 01:04:59.999
2022-08-12 01:05:00  23977.04  23996.85  23928.95  23943.09 2022-08-12 01:09:59.999
2022-08-12 01:10:00  23944.05  23972.86  23885.00  23905.23 2022-08-12 01:14:59.999
2022-08-12 01:15:00  23905.23  23944.66  23901.74  23925.72 2022-08-12 01:19:59.999
2022-08-12 01:20:00  23925.72  23951.21  23917.84  23945.03 2022-08-12 01:24:59.999
2022-08-12 01:25:00  23945.03  23961.78  23935.12  23945.60 2022-08-12 01:29:59.999
2022-08-12 01:30:00  23945.60  23949.86  23919.90  23934.50 2022-08-12 01:34:59.999
2022-08-12 01:35:00  23934.49  23934.50  23853.65  23895.44 2022-08-12 01:39:59.999
2022-08-12 01:40:00  23895.44  23932.11  23894.67  23906.00 2022-08-12 01:44:59.999
2022-08-12 01:45:00  23905.42  23927.26  23878.57  23902.75 2022-08-12 01:49:59.999
2022-08-12 01:50:00  23902.76  23915.00  23888.08  23889.19 2022-08-12 01:54:59.999

Al ejecutar df_trading_pair_date_time_index.dtypes la siguiente salida se presenta:

Open               float64
High               float64
Low                float64
Close              float64
End Date    datetime64[ns]
dtype: object

Y al ejecutar df_trading_pair_date_time_index.index la siguiente salida es retornada:

DatetimeIndex(['2022-08-12 00:25:00', '2022-08-12 00:30:00', '2022-08-12 00:35:00', '2022-08-12 00:40:00', '2022-08-12 00:45:00', '2022-08-12 00:50:00', '2022-08-12 00:55:00', '2022-08-12 01:00:00',
               '2022-08-12 01:05:00', '2022-08-12 01:10:00', '2022-08-12 01:15:00', '2022-08-12 01:20:00', '2022-08-12 01:25:00', '2022-08-12 01:30:00', '2022-08-12 01:35:00', '2022-08-12 01:40:00',
               '2022-08-12 01:45:00', '2022-08-12 01:50:00'],
              dtype='datetime64[ns]', name='Start Date', freq=None)

Con el fin de graficar los datos de mi df, creé el siguiente código:

import requests
import mplfinance as mpf
import matplotlib.pyplot as plt
import pandas as pd

# Plotting
# Create my own `marketcolors` style:
mc = mpf.make_marketcolors(up='#2fc71e',down='#ed2f1a',inherit=True)
# Create my own `MatPlotFinance` style:
s  = mpf.make_mpf_style(base_mpl_style=['bmh', 'dark_background'],marketcolors=mc, y_on_right=True)    

# Plot it
btc_plot, axlist = mpf.plot(df_trading_pair_date_time_index,
                            figratio=(10, 6),
                            type="candle",
                            style=s,
                            tight_layout=True,
                            datetime_format = '%H:%M',
                            ylabel = "Precio ($)",
                            returnfig=True)
# Add Title
axlist[0].set_title("BTC/USDT - 5m", fontsize=25, style='italic', fontfamily='fantasy' )

Después de ejecutarlo y escribir btc_plot en la consola para su ejecución, la siguiente gráfica es retornada:

chart

Y finalmente al ejecutar type(btc_plot) la siguiente salida es retornada:

matplotlib.figure.Figure

El problema:

Estoy embalado tratanto de hacer una "simple" cosa, quiero enviar la gráfica almacenada en btc_plot a un canal privado de Telegram usando la API de Telegram con Python3, y según esta sección de la documentación de dicha API, la siguiente línea debería funcionar:

requests.post(f'https://api.telegram.org/bot{bot_str}/sendPhoto',
                          data = {'chat_id':f'-100{channel_id_str}', 'photo': btc_plot, 'caption':'Fue detectada una señal bajista en el par BTC/USDT!'})

Sin embargo, después de ejecutar esa línea, lo único que obtuve fue un <Response [400]> como salida sin ninguna otra explicación ni excepción por parte de la consola.

Yo creo que puede estar sucediendo porque estoy intentando enviar un objeto matplotlib.figure.Figure, pero erróneamente pensé que la variable btc_plot había almacenado un objeto png debido a que una imagen era devuelta al ejecutar btc_plot en la consola, entonces estoy perdido.

Irónicamente, la siguiente línea de código funciona como se esperaría con un <Response [200]> como salida:

requests.post(f'https://api.telegram.org/bot{bot_str}/sendMessage',
                              data = {'chat_id':f'-100{channel_id_str}', 'text': 'Fue detectada una señal bajista en el par BTC/USDT!'})

wtf

Honestamente no sé cómo solucionarlo, ¿puedo obtener alguna retroalimentación que mejore mi solución o quizá una alternativa?

1 respuesta 1

1

Encontré una alternativa, la cual en realidad creo que siempre fue la forma correcta de hacer lo que deseaba:

import telegram

btc_plot.savefig('signal.png',dpi=300, bbox_inches = "tight")
telegram.Bot(token= token_str).send_photo(chat_id= chat_id_str,
                                          photo=open("signal.png", 'rb'),
                                          caption="Fue detectada una señal bajista en el par BTC/USDT!")

Output:

solución

¿No es la respuesta que buscas? Examina otras preguntas con la etiqueta o formula tu propia pregunta.