您是否有日复一日、周复一周重复的任务? 例如,写报告。 您请求数据,对其进行分析,将其可视化(制作图表),然后将其发送给您的老板。 但如果这一切都是自动化的呢?
在本教程中,我们将为 Telegram 创建一个机器人,帮助自动化报告。 最酷的是整个程序仅由 50 行代码组成! 如果您是第一次为 Telegram 创建机器人,那么您还应该阅读这篇文章
技能箱推荐: 实践课程
从零开始的Python开发者 .我们提醒: 对于“Habr”的所有读者 - 使用“Habr”促销代码注册任何 Skillbox 课程可享受 10 卢布的折扣。
让我们开始吧
安装库
我们将使用
pip3 安装 google-cloud-bigquery matplotlib numpy pandas python-telegram-bot
连接 Google BigQuery API
如果我们想使用该服务,我们需要连接Google BigQuery API。 为此,我们前往
在控制面板中,选择启用 API 和服务并查找 BigQuery API。
选择启用以连接 API。
创建帐户密钥
我们再去一次
然后 - 新建服务帐户,并在服务帐户名称字段中输入名称。
从角色下拉列表中,选择项目 > 所有者,然后选择创建。
将自动下载的文件称为 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 参数。
我们用
现在让我们创建 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 行代码组成的机器人,可以在无需我们干预的情况下生成报告。
让我们检查一下机器人
您可以在以下位置获取完成的代码
技能箱推荐:
- 两年实践课程
“我是一名专业网络开发人员” .- 在线课程
《C#开发从0开始》 .- 实践年课程
《PHP 开发者从 0 到 PRO》 .
来源: habr.com