Cách ủy quyền các báo cáo đơn giản cho robot. Viết bot bằng Python và Google BigQuery

Cách ủy quyền các báo cáo đơn giản cho robot. Viết bot bằng Python và Google BigQuery

Bạn có công việc lặp đi lặp lại ngày này qua ngày khác, tuần này qua tuần khác không? Ví dụ như viết báo cáo. Bạn yêu cầu dữ liệu, phân tích, trực quan hóa nó (tạo đồ thị, biểu đồ) rồi gửi cho sếp của bạn. Nhưng nếu tất cả điều này được tự động hóa thì sao?

Trong hướng dẫn này, chúng tôi sẽ tạo một bot cho Telegram để giúp tự động hóa việc báo cáo. Và điều thú vị nhất là toàn bộ chương trình sẽ chỉ bao gồm 50 dòng mã! Nếu bạn đang tạo bot cho Telegram lần đầu tiên thì bạn cũng nên đọc phần này gửi.

Hộp kỹ năng khuyến nghị: khóa học thực hành Nhà phát triển Python từ đầu.

Chúng tôi nhắc nhở: cho tất cả độc giả của "Habr" - giảm giá 10 rúp khi đăng ký bất kỳ khóa học Skillbox nào bằng mã khuyến mại "Habr".

Bắt đầu nào

Cài đặt thư viện

Chúng tôi sẽ sử dụng google-cloud-bigquery để lấy dữ liệu từ Google BigQuery. matplotlib, cục mịch и gấu trúc sẽ giúp bạn trực quan hóa dữ liệu của mình. python-telegram-bot sẽ gửi dữ liệu đã hoàn thành tới Telegram.

pip3 cài đặt google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

Kết nối API Google BigQuery

Nếu muốn sử dụng dịch vụ, chúng tôi cần kết nối API Google BigQuery. Để làm điều này chúng ta đi đến Bảng điều khiển Nhà phát triển của Google và tạo một dự án mới (hoặc chọn một dự án hiện có).

Trong bảng điều khiển, chọn BẬT API VÀ DỊCH VỤ rồi tìm API BigQuery.

Cách ủy quyền các báo cáo đơn giản cho robot. Viết bot bằng Python và Google BigQuery

Chọn Bật để kết nối API.

Cách ủy quyền các báo cáo đơn giản cho robot. Viết bot bằng Python và Google BigQuery

Tạo khóa tài khoản

Chúng ta hãy đi đến một lần nữa Bảng điều khiển Nhà phát triển của Google, chọn tab Thông tin xác thực, Tạo thông tin xác thực và Khóa tài khoản dịch vụ.

Sau đó - Tài khoản dịch vụ mới và nhập tên vào trường Tên tài khoản dịch vụ.

Từ danh sách thả xuống Vai trò, chọn Dự án > Chủ sở hữu, sau đó chọn Tạo.

Cách ủy quyền các báo cáo đơn giản cho robot. Viết bot bằng Python và Google BigQuery

Tệp sẽ được tự động tải xuống có tên là creds.json.

Đặt GOOGLE_APPLICATION_CREDENTIALS, chỉ định đường dẫn đến creds.json trong thiết bị đầu cuối.

xuất GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Nếu mọi việc suôn sẻ thì đã đến lúc bắt đầu viết chương trình.

Tạo một ứng dụng

Đối với phần hướng dẫn, chúng tôi sẽ sử dụng dữ liệu từ bigquery-public-data.stackoverflow, đối với báo cáo của mình, chúng tôi sẽ chọn số lượng ấn phẩm hàng ngày.

Mọi thứ khá đơn giản.

Truy vấn bảng -> Trực quan hóa dữ liệu -> Lưu trực quan hóa -> Gửi hình ảnh

Hãy tạo một hàm để xác định từng luồng.

Truy vấn tới BigQuery

Đầu tiên chúng ta import thư viện.

từ bigquery nhập google.cloud

Chúng tôi tạo một hàm có tên query_to_bigquery, trong đó tham số là truy vấn.

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

Hàm này sẽ trả về yêu cầu dưới dạng khung dữ liệu.

Trực quan hóa dữ liệu

Để giải quyết vấn đề này, hãy chọn matplotlib.

nhập matplotlib.pyplot dưới dạng plt

Chúng ta cần năm tham số, trong đó x là dữ liệu trục x, x_label là tiêu đề cho trục, y là dữ liệu trục y, y_label là tiêu đề cho trục và tiêu đề là tiêu đề của toàn bộ hình ảnh trực quan.

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

Lưu hình ảnh

Bây giờ, hãy sử dụng hai hàm để tạo trực quan hóa và lưu nó.

Chúng tôi sẽ gửi số lượng bài đăng được đăng hàng ngày. Đầu tiên chúng tôi viết một yêu cầu.

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
        """

Truy vấn giúp thu thập dữ liệu trong hai tuần bắt đầu từ ngày 2 tháng 2018 năm XNUMX.

Chúng tôi sử dụng ngày này vì 2018-12-02 là dữ liệu mới nhất được ghi trong bigquery-public-data.stackoverflow.post_history, trong các trường hợp khác, bạn có thể sử dụng CURRENT_DATE() để nhận dữ liệu mới nhất.

Gọi hàm query_to_bigquery để lấy dữ liệu.

khung dữ liệu = query_to_bigquery(truy vấn)

Sau đó, chúng tôi sử dụng cột dữ liệu ngày cho trục x và cột Total_posts cho trục y.

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

Chúng tôi trực quan hóa nó bằng hàm Visual_bar_chart và lưu nó dưới dạng hình ảnh.

plt = Visualization_bar_chart(x=x, x_label='Ngày', y=y, y_label='Tổng số bài viết', title='Bài viết hàng ngày')
plt.savefig('viz.png')

Chúng tôi gói mã này trong một hàm gọi là 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')

Gửi một hình ảnh

Để gửi báo cáo đến người nhận, bạn cần biết tham số chat_id.

Chúng tôi sử dụng thông tin người dùng và gõ /bắt đầu. Bot phản hồi với thông tin cần thiết, chat_id được chứa trong trường id.

Bây giờ hãy tạo hàm send_image. Nó sẽ sử dụng hàm get_and_save_image để lấy và lưu hình ảnh. Và sau đó chúng tôi gửi mọi thứ đến đúng địa chỉ liên hệ.

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'))

Chương trình chính

Cuối cùng, chúng ta tạo một hàm khác, main, để khởi chạy ứng dụng. Đừng quên thay đổi YOUR_TOKEN cho bot.

Hãy nhớ: chương trình này sẽ tự động gửi hình ảnh vào thời điểm bạn chỉ định. Ví dụ: chúng tôi sẽ gửi báo cáo vào lúc XNUMX giờ sáng hàng ngày.

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()

Kết quả là ứng dụng của chúng ta sẽ trông như thế này:

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()

Lưu tệp và gọi nó là main.py.

Chúng tôi khởi chạy ứng dụng bằng cách nhập lệnh trong terminal:

python3 main.py

Tất cả đã sẵn sàng. Bây giờ chúng tôi có một robot gồm 50 dòng mã tạo báo cáo mà không cần sự can thiệp của chúng tôi.

Hãy kiểm tra bot do đóbằng cách chọn lệnh /gửi.

Cách ủy quyền các báo cáo đơn giản cho robot. Viết bot bằng Python và Google BigQuery

Bạn có thể lấy mã hoàn thành tại GitHub của tôi.

Hộp kỹ năng khuyến nghị:

Nguồn: www.habr.com

Thêm một lời nhận xét