ProHoster > Блог > интернет новини > Как да делегирате прости отчети на робот. Писане на бот в Python и Google BigQuery
Как да делегирате прости отчети на робот. Писане на бот в Python и Google BigQuery
Имате ли задачи, които се повтарят ден след ден, седмица след седмица? Например писане на доклади. Искате данни, анализирате ги, визуализирате ги (правите графики, диаграми) и след това ги изпращате на шефа си. Но какво, ако всичко това беше автоматизирано?
В този урок ще създадем бот за Telegram, който ще помогне за автоматизирането на отчитането. И най-готиното е, че цялата програма ще се състои само от 50 реда код! Ако създавате бот за Telegram за първи път, трябва да прочетете и това пост.
Ако искаме да използваме услугата, трябва да свържем Google BigQuery API. За да направим това, отиваме на Google Developers Console и създайте нов проект (или изберете съществуващ).
В контролния панел изберете АКТИВИРАНЕ НА API И УСЛУГИ и потърсете BigQuery API.
Изберете Активиране, за да свържете API.
Създайте ключ за акаунт
Да отидем отново Google Developers Console, изберете раздела Идентификационни данни, Създаване на идентификационни данни и ключ за акаунт за услуга.
След това - Нов акаунт за услуга и въведете името в полето Име на акаунт за услуга.
От падащия списък Роля изберете Проект > Собственик, след което Създаване.
Файлът, който ще бъде изтеглен автоматично, се нарича creds.json.
Задайте GOOGLE_APPLICATION_CREDENTIALS, като посочите пътя до creds.json в терминала.
Тази функция ще върне заявката като рамка с данни.
Визуализиране на данни
За да разрешите този проблем, изберете matplotlib.
импортирайте matplotlib.pyplot като plt
Имаме нужда от пет параметъра, където x са данните по оста x, x_label е заглавието на оста, y е данните по оста y, y_label е заглавието на оста и title е заглавието на цялата визуализация.
def visualize_bar_chart(x, x_label, y, y_label, title):
plt.title(title)
plt.xlabel(x_label)
plt.ylabel(y_label)
index = np.arange(len(x))
plt.xticks(index, x, fontsize=5, rotation=30)
plt.bar(index, y)
return plt
Запазете изображението
Сега нека използваме две функции, за да създадем визуализация и да я запазим.
Ще изпращаме броя на публикациите, публикувани ежедневно. Първо пишем молба.
query = """
SELECT DATE(creation_date) date, COUNT(*) total_posts
FROM `bigquery-public-data.stackoverflow.post_history`
GROUP BY 1
HAVING date > DATE_SUB('2018-12-02', INTERVAL 14 DAY)
ORDER BY 1
"""
Заявката помага за събирането на данни за две седмици, считано от 2 декември 2018 г.
Използваме тази дата, защото 2018-12-02 са най-новите данни, записани в bigquery-public-data.stackoverflow.post_history, в други случаи можете да използвате CURRENT_DATE(), за да получите най-новите данни.
Извикайте функцията query_to_bigquery, за да получите данните.
dataframe = query_to_bigquery(заявка)
След това използваме колоната с данни за датата за оста x и колоната total_posts за оста y.
x = dataframe['date'].tolist()
y = dataframe['total_posts'].tolist()
Ние го визуализираме с помощта на функцията visualize_bar_chart и го запазваме като изображение.
Обвиваме този код във функция, наречена get_and_save_image.
def get_and_save_image():
query = """
SELECT DATE(creation_date) date, COUNT(*) total_posts
FROM `bigquery-public-data.stackoverflow.post_history`
GROUP BY 1
HAVING date > DATE_SUB('2018-12-02', INTERVAL 14 DAY)
ORDER BY 1
"""
dataframe = query_to_bigquery(query)
x = dataframe['date'].tolist()
y = dataframe['total_posts'].tolist()
plt = visualize_bar_chart(x=x, x_label='Date', y=y, y_label='Total Posts', title='Daily Posts')
plt.savefig('viz.png')
Изпратете изображение
За да изпратите отчет до получателя, трябва да знаете параметъра chat_id.
употреба userinfobot и въведете /start. Ботът отговаря с необходимата информация, chat_id се съдържа в полето id.
Сега нека създадем функцията send_image. Той ще използва функцията get_and_save_image за извличане и запазване на изображението. И след това изпращаме всичко на правилния контакт.
Накрая създаваме друга функция, main, за стартиране на приложението. Не забравяйте да промените YOUR_TOKEN за бота.
Запомнете: тази програма ще изпрати изображението автоматично във времето, което посочите. Например, ние ще изпращаме доклад в девет сутринта всеки ден.