Prohoster > Blog > tin tức mạng > 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.
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.
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.
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.
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ệ.