วิธีมอบหมายรายงานอย่างง่ายให้กับหุ่นยนต์ การเขียนบอทใน Python และ Google BigQuery

วิธีมอบหมายรายงานอย่างง่ายให้กับหุ่นยนต์ การเขียนบอทใน Python และ Google BigQuery

คุณมีงานที่ทำซ้ำวันแล้ววันเล่า สัปดาห์แล้วสัปดาห์เล่าหรือไม่? เช่น การเขียนรายงาน. คุณขอข้อมูล วิเคราะห์ แสดงภาพ (สร้างกราฟ แผนภูมิ) แล้วส่งให้เจ้านายของคุณ แต่จะเกิดอะไรขึ้นถ้าทั้งหมดนี้เป็นแบบอัตโนมัติ?

ในบทช่วยสอนนี้ เราจะสร้างบอทสำหรับ Telegram ซึ่งจะช่วยรายงานโดยอัตโนมัติ และที่เจ๋งที่สุดคือทั้งโปรแกรมจะประกอบด้วยโค้ดเพียง 50 บรรทัดเท่านั้น! หากคุณกำลังสร้างบอทสำหรับ Telegram เป็นครั้งแรก คุณควรอ่านบอทนี้ด้วย เสา.

Skillbox แนะนำ: หลักสูตรภาคปฏิบัติ ผู้พัฒนา Python ตั้งแต่เริ่มต้น.

เราเตือนคุณ: สำหรับผู้อ่าน "Habr" ทุกคน - ส่วนลด 10 rubles เมื่อลงทะเบียนในหลักสูตร Skillbox ใด ๆ โดยใช้รหัสส่งเสริมการขาย "Habr"

มาเริ่มกันเลย

การติดตั้งไลบรารี

เราจะใช้ google-cloud-bigquery เพื่อรับข้อมูลจาก Google BigQuery matplotlib, มึน и หมีแพนด้า จะช่วยให้คุณเห็นภาพข้อมูลของคุณ python-โทรเลข-bot จะส่งข้อมูลที่เสร็จแล้วไปที่ Telegram

pip3 ติดตั้ง google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

กำลังเชื่อมต่อ Google BigQuery API

หากเราต้องการใช้บริการเราจำเป็นต้องเชื่อมต่อ Google BigQuery API การทำเช่นนี้เราไปที่ Google Developers Console และสร้างโครงการใหม่ (หรือเลือกโครงการที่มีอยู่)

ในแผงควบคุม ให้เลือกเปิดใช้งาน APIS และบริการ และมองหา 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

เราใช้วันที่นี้เนื่องจาก 2018-12-02 เป็นข้อมูลล่าสุดที่บันทึกไว้ใน bigquery-public-data.stackoverflow.post_history ในกรณีอื่นๆ คุณสามารถใช้ CURRENT_DATE() เพื่อรับข้อมูลใหม่ล่าสุดได้

เรียกใช้ฟังก์ชัน query_to_bigquery เพื่อรับข้อมูล

dataframe = 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

เราใช้ userinfobot และพิมพ์ /start บอทตอบกลับด้วยข้อมูลที่จำเป็น 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 main.py

ทุกอย่างพร้อมแล้ว ตอนนี้เรามีโรบ็อตที่ประกอบด้วยโค้ด 50 บรรทัดที่สร้างรายงานโดยที่เราไม่ต้องดำเนินการใดๆ

มาตรวจสอบบอทกัน ด้วยเหตุนี้โดยเลือกคำสั่ง /send

วิธีมอบหมายรายงานอย่างง่ายให้กับหุ่นยนต์ การเขียนบอทใน Python และ Google BigQuery

สามารถรับโค้ดที่เสร็จแล้วได้ที่ GitHub ของฉัน.

Skillbox แนะนำ:

ที่มา: will.com

เพิ่มความคิดเห็น