如何将简单的报告委托给机器人。 使用 Python 和 Google BigQuery 编写机器人

如何将简单的报告委托给机器人。 使用 Python 和 Google BigQuery 编写机器人

您是否有日复一日、周复一周重复的任务? 例如,写报告。 您请求数据,对其进行分析,将其可视化(制作图表),然后将其发送给您的老板。 但如果这一切都是自动化的呢?

在本教程中,我们将为 Telegram 创建一个机器人,帮助自动化报告。 最酷的是整个程序仅由 50 行代码组成! 如果您是第一次为 Telegram 创建机器人,那么您还应该阅读这篇文章 邮寄.

技能箱推荐: 实践课程 从零开始的Python开发者.

我们提醒: 对于“Habr”的所有读者 - 使用“Habr”促销代码注册任何 Skillbox 课程可享受 10 卢布的折扣。

让我们开始吧

安装库

我们将使用 谷歌云bigquery 从 Google BigQuery 获取数据。 matplotlib, 麻木 и 大熊猫 将帮助您可视化您的数据。 蟒蛇电报机器人 将把完成的数据发送到 Telegram。

pip3 安装 google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

连接 Google BigQuery API

如果我们想使用该服务,我们需要连接Google BigQuery API。 为此,我们前往 Google Developers Console 并创建一个新项目(或选择现有项目)。

在控制面板中,选择启用 API 和服务并查找 BigQuery API。

如何将简单的报告委托给机器人。 使用 Python 和 Google BigQuery 编写机器人

选择启用以连接 API。

如何将简单的报告委托给机器人。 使用 Python 和 Google BigQuery 编写机器人

创建帐户密钥

我们再去一次 Google Developers Console,选择“凭据”选项卡、“创建凭据”和“服务帐户密钥”。

然后 - 新建服务帐户,并在服务帐户名称字段中输入名称。

从角色下拉列表中,选择项目 > 所有者,然后选择创建。

如何将简单的报告委托给机器人。 使用 Python 和 Google BigQuery 编写机器人

将自动下载的文件称为 creds.json。

设置 GOOGLE_APPLICATION_CREDENTIALS,指定终端中 creds.json 的路径。

导出 GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

如果一切顺利,就可以开始编写程序了。

创建应用程序

在本教程中,我们将使用 bigquery-public-data.stackoverflow 中的数据,在报告中,我们将选择每日出版物的数量。

一切都很简单。

查询表 -> 可视化数据 -> 保存可视化 -> 发送图像

让我们创建一个函数来定义每个线程。

查询 BigQuery

首先我们导入库。

从 google.cloud 导入 bigquery

我们创建一个名为query_to_bigquery的函数,其中参数是query。

def query_to_bigquery(query):
    client = bigquery.Client()
    query_job = client.query(query)
    result = query_job.result()
    dataframe = result.to_dataframe()
    return dataframe

该函数将以数据帧的形式返回请求。

可视化数据

为了解决这个问题,选择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 月 XNUMX 日起两周的数据。

我们使用这个日期是因为 2018-12-02 是 bigquery-public-data.stackoverflow.post_history 中记录的最新数据,在其他情况下,您可以使用 CURRENT_DATE() 来获取最新数据。

调用query_to_bigquery函数获取数据。

数据框 = query_to_bigquery(查询)

然后我们使用日期数据列作为 x 轴,使用total_posts 列作为 y 轴。

x = dataframe['日期'].tolist()
y = dataframe['total_posts'].tolist()

我们使用 Visualize_bar_chart 函数将其可视化并将其保存为图像。

plt = Visualize_bar_chart(x=x, x_label='日期', y=y, y_label='帖子总数', title='每日帖子')
plt.savefig('viz.png')

我们将此代码包装在名为 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 参数。

我们用 用户信息机器人 并输入/开始。 机器人会响应必要的信息,chat_id 包含在 id 字段中。

现在让我们创建 send_image 函数。 它将使用 get_and_save_image 函数来检索和保存图像。 然后我们将所有内容发送给正确的联系人。

def send_image(bot, update):
    get_and_save_image()
    chat_id = 'CHAT_ID_RECEIVER'
    bot.send_photo(chat_id=chat_id, photo=open('viz.png','rb'))

主程序

最后,我们创建另一个函数 main 来启动应用程序。 不要忘记更改机器人的 YOUR_TOKEN。

请记住:该程序将在您指定的时间自动发送图像。 例如,我们会在每天早上九点发送报告。

def main():
    updater = Updater('YOUR_TOKEN')
    updater.job_queue.run_daily(send_image, time=datetime.datetime.strptime('9:00AM', '%I:%M%p').time(), days=(0,1,2,3,4,5,6))
    updater.start_polling()
    updater.idle()
 
if __name__ == '__main__':
    main()

结果,我们的应用程序将如下所示:

from google.cloud import bigquery
from telegram.ext import Updater
 
import matplotlib.pyplot as plt
import numpy as np
import datetime
 
def query_to_bigquery(query):
    client = bigquery.Client()
    query_job = client.query(query)
    result = query_job.result()
    dataframe = result.to_dataframe()
    return dataframe
 
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
 
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')
 
def send_image(bot, update):
    get_and_save_image()
    chat_id = 'CHAT_ID_RECEIVER'
    bot.send_photo(chat_id=chat_id, photo=open('viz.png', 'rb'))
 
def main():
    updater = Updater('YOUR_TOKEN')
    updater.job_queue.run_daily(send_image, time=datetime.datetime.strptime('9:00AM', '%I:%M%p').time(), days=(0,1,2,3,4,5,6))
    updater.start_polling()
    updater.idle()
 
if __name__ == '__main__':
main()

保存文件并将其命名为 main.py。

我们通过在终端中输入命令来启动应用程序:

python3 主.py

一切准备就绪。 现在我们有一个由 50 行代码组成的机器人,可以在无需我们干预的情况下生成报告。

让我们检查一下机器人 通过选择 /send 命令。

如何将简单的报告委托给机器人。 使用 Python 和 Google BigQuery 编写机器人

您可以在以下位置获取完成的代码 我的 GitHub.

技能箱推荐:

来源: habr.com

添加评论