Энгийн тайланг роботод хэрхэн шилжүүлэх вэ. Python болон Google BigQuery дээр бот бичих

Энгийн тайланг роботод хэрхэн шилжүүлэх вэ. Python болон Google BigQuery дээр бот бичих

Танд өдөр бүр, долоо хоног бүр давтагддаг даалгавар байдаг уу? Жишээлбэл, тайлан бичих. Та өгөгдөл хүсэх, дүн шинжилгээ хийх, дүрслэх (график, диаграмм хийх), дараа нь даргадаа илгээнэ үү. Гэхдээ энэ бүгдийг автоматжуулсан бол яах вэ?

Энэ зааварт бид Telegram-д зориулж тайланг автоматжуулахад туслах робот үүсгэх болно. Хамгийн гайхалтай нь бүх програм нь ердөө 50 мөр кодоос бүрдэх болно! Хэрэв та анх удаа Telegram-д зориулж робот үүсгэж байгаа бол үүнийг уншаарай бичлэг.

Skillbox зөвлөж байна: Практик курс Эхнээс нь Python хөгжүүлэгч.

Бид танд сануулж байна: "Хабр" -ын бүх уншигчдад - "Habr" сурталчилгааны кодыг ашиглан Skillbox-ын аль ч курст бүртгүүлэхдээ 10 рублийн хөнгөлөлт.

Эхэлцгээе

Номын сангуудыг суулгаж байна

Бид ашиглах болно google-cloud-bigquery Google BigQuery-ээс өгөгдөл авах. matplotlib, дүнсгэр и панда нь таны өгөгдлийг дүрслэн харуулахад тусална. python-telegram-bot Дууссан өгөгдлийг Telegram руу илгээнэ.

pip3 google-cloud-bigquery matplotlib numpy панда python-telegram-bot-г суулгана уу

Google BigQuery API-г холбож байна

Хэрэв бид үйлчилгээг ашиглахыг хүсвэл Google BigQuery API-г холбох хэрэгтэй. Үүнийг хийхийн тулд бид очдог Google Хөгжүүлэгчийн Консол болон шинэ төсөл үүсгэх (эсвэл одоо байгаа төслийг сонгох).

Хяналтын самбараас API, ҮЙЛЧИЛГЭЭГ ИДЭВХЖҮҮЛЭХ гэснийг сонгоод BigQuery API-г олоорой.

Энгийн тайланг роботод хэрхэн шилжүүлэх вэ. Python болон Google BigQuery дээр бот бичих

API-г холбохын тулд "Идэвхжүүлэх" гэснийг сонгоно уу.

Энгийн тайланг роботод хэрхэн шилжүүлэх вэ. Python болон Google BigQuery дээр бот бичих

Бүртгэлийн түлхүүр үүсгэх

Дахин орцгооё Google Хөгжүүлэгчийн Консол, "Итгэмжлэх жуух бичиг" таб, "Итгэмжлэх жуух бичиг үүсгэх" болон "Үйлчилгээний дансны түлхүүр" хэсгийг сонгоно уу.

Дараа нь - Шинэ үйлчилгээний бүртгэл, үйлчилгээний дансны нэр талбарт нэрийг оруулна уу.

Үүргийн унадаг жагсаалтаас Төсөл > Эзэмшигч, дараа нь Үүсгэх гэснийг сонго.

Энгийн тайланг роботод хэрхэн шилжүүлэх вэ. Python болон Google BigQuery дээр бот бичих

Автоматаар татагдах файлыг creds.json гэж нэрлэдэг.

GOOGLE_APPLICATION_CREDENTIALS-ийг тохируулж, терминал дахь creds.json руу очих замыг зааж өгнө.

экспорт GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Хэрэв бүх зүйл сайн болсон бол програм бичиж эхлэх цаг болжээ.

Програм үүсгэх

Хичээлийн хувьд бид bigquery-public-data.stackoverflow-аас өгөгдлийг ашиглах бөгөөд тайландаа бид өдөр тутмын нийтлэлийн тоог сонгох болно.

Бүх зүйл маш энгийн.

Хүснэгтээс асуулга -> Өгөгдлийг дүрслэх -> Дүрслэлийг хадгалах -> Зургийг илгээ

Thread бүрийг тодорхойлох нэг функц үүсгэцгээе.

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 нь тэнхлэгийн гарчиг, гарчиг нь бүхэлд нь дүрслэлийн гарчиг юм.

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 функц руу залгана уу.

dataframe = query_to_bigquery(асуулга)

Дараа нь бид x тэнхлэгт огнооны өгөгдлийн баганыг, y тэнхлэгт нийт_пост баганыг ашиглана.

x = dataframe['огноо'].tolist()
y = dataframe['total_posts'].tolist()

Бид үүнийг visualize_bar_chart функцийг ашиглан дүрсэлж, зураг хэлбэрээр хадгална.

plt = visualize_bar_chart(x=x, x_label='Огноо', y=y, y_label='Нийт нийтлэл', гарчиг='Өдөр тутмын нийтлэл')
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 болон /эхлэх гэж бичнэ үү. Бот нь шаардлагатай мэдээллээр хариулах бөгөөд id талбарт chat_id агуулагдсан байна.

Одоо илгээх_зургийн функцийг үүсгэцгээе. Энэ нь зургийг авч, хадгалахын тулд 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'))

Үндсэн програм

Эцэст нь бид програмыг ажиллуулах өөр үндсэн функцийг бий болгодог. Ботын хувьд ӨӨРИЙН_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 зөвлөж байна:

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх