Sadə hesabatları robota necə həvalə etmək olar. Python və Google BigQuery-də bot yazmaq

Sadə hesabatları robota necə həvalə etmək olar. Python və Google BigQuery-də bot yazmaq

Gündən-günə, həftədən həftəyə təkrarlanan tapşırıqlarınız varmı? Məsələn, hesabatların yazılması. Siz məlumatları tələb edirsiniz, təhlil edirsiniz, vizuallaşdırırsınız (qrafiklər, diaqramlar hazırlayır) və sonra onu müdirinizə göndərirsiniz. Bəs bütün bunlar avtomatlaşdırılsaydı?

Bu dərslikdə biz Telegram üçün hesabatın avtomatlaşdırılmasına kömək edəcək bir bot yaradacağıq. Ən maraqlısı odur ki, bütün proqram yalnız 50 kod sətirindən ibarət olacaq! Əgər siz ilk dəfə Telegram üçün bot yaradırsınızsa, o zaman bunu da oxumalısınız yazı.

Skillbox tövsiyə edir: Praktik kurs Sıfırdan Python tərtibatçısı.

Xatırladırıq: "Habr" ın bütün oxucuları üçün - "Habr" promosyon kodundan istifadə edərək hər hansı bir Skillbox kursuna yazılarkən 10 000 rubl endirim.

Başlanır

Kitabxanaların quraşdırılması

İstifadə edəcəyik google-bulud-bigquery Google BigQuery-dən məlumat əldə etmək üçün. matplotlib, qarınqulu и pandalar məlumatlarınızı vizuallaşdırmağa kömək edəcək. python-telegram-bot hazır məlumatları Telegram-a göndərəcək.

pip3 quraşdırın google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

Google BigQuery API qoşulur

Xidmətdən istifadə etmək istəyiriksə, Google BigQuery API-yə qoşulmalıyıq. Bunu etmək üçün gedirik Google Developers Konsolu və yeni layihə yaradın (və ya mövcud olanı seçin).

İdarə panelində API VƏ XİDMƏTLƏRİ AKTİV EDİN seçin və BigQuery API-ni axtarın.

Sadə hesabatları robota necə həvalə etmək olar. Python və Google BigQuery-də bot yazmaq

API-yə qoşulmaq üçün Enable seçin.

Sadə hesabatları robota necə həvalə etmək olar. Python və Google BigQuery-də bot yazmaq

Hesab açarı yaradın

Yenə gedək Google Developers Konsolu, Etibarnamələr nişanını, Etibarnamələri yarat və Xidmət hesabı açarını seçin.

Sonra - Yeni xidmət hesabı seçin və Xidmət hesabının adı sahəsinə adı daxil edin.

Rol açılan siyahısından Layihə > Sahib, sonra Yarat seçin.

Sadə hesabatları robota necə həvalə etmək olar. Python və Google BigQuery-də bot yazmaq

Avtomatik yüklənəcək fayl creds.json adlanır.

Terminalda creds.json yolunu göstərərək GOOGLE_APPLICATION_CREDENTIALS tətbiqini təyin edin.

ixrac GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Hər şey qaydasındadırsa, proqramı yazmağa başlamağın vaxtı gəldi.

Tətbiqin yaradılması

Dərslik üçün bigquery-public-data.stackoverflow məlumatlarından istifadə edəcəyik, hesabatımız üçün gündəlik nəşrlərin sayını seçəcəyik.

Hər şey olduqca sadədir.

Cədvəl sorğusu -> Verilənləri vizuallaşdır -> Vizualizasiyanı yadda saxla -> Şəkli göndər

Hər mövzunu müəyyən etmək üçün bir funksiya yaradaq.

BigQuery-ə sorğu

Əvvəlcə kitabxananı idxal edirik.

google.cloud-dan bigquery idxal edin

Biz query_to_bigquery adlı funksiya yaradırıq, burada parametr sorğudur.

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

Bu funksiya sorğunu verilənlər çərçivəsi kimi qaytaracaq.

Məlumatların vizuallaşdırılması

Bu problemi həll etmək üçün matplotlib seçin.

matplotlib.pyplot faylını plt olaraq idxal edin

Bizə beş parametr lazımdır, burada x x oxu məlumatıdır, x_label oxun başlığıdır, y y oxu məlumatıdır, y_label oxun başlığıdır və başlıq bütün vizuallaşdırmanın başlığıdır.

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

Şəkli yadda saxlayın

İndi vizuallaşdırma yaratmaq və onu saxlamaq üçün iki funksiyadan istifadə edək.

Gündəlik dərc olunan yazıların sayını göndərəcəyik. Əvvəlcə sorğu yazırıq.

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

Sorğu 2 dekabr 2018-ci ildən başlayaraq iki həftə ərzində məlumat toplamağa kömək edir.

Bu tarixdən istifadə edirik, çünki 2018-12-02 bigquery-public-data.stackoverflow.post_history-də qeydə alınan ən son məlumatdır, digər hallarda ən yeni məlumatları əldə etmək üçün CURRENT_DATE() istifadə edə bilərsiniz.

Məlumatı əldə etmək üçün query_to_bigquery funksiyasına zəng edin.

dataframe = query_to_bigquery(sorğu)

Sonra x oxu üçün tarix məlumatları sütunundan və y oxu üçün total_posts sütunundan istifadə edirik.

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

Biz onu visualize_bar_chart funksiyasından istifadə edərək vizuallaşdırırıq və şəkil kimi saxlayırıq.

plt = visualize_bar_chart(x=x, x_label='Tarix', y=y, y_label='Ümumi Yazılar', başlıq='Gündəlik Yazılar')
plt.savefig('viz.png')

Bu kodu get_and_save_image adlı funksiyaya bükürük.

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

Şəkil göndərin

Alıcıya hesabat göndərmək üçün chat_id parametrini bilməlisiniz.

Biz istifadə edirik userinfobot və /start yazın. Bot lazımi məlumatla cavab verir, chat_id id sahəsindədir.

İndi isə göndərmə_image funksiyasını yaradaq. Şəkli əldə etmək və saxlamaq üçün get_and_save_image funksiyasından istifadə edəcək. Və sonra hər şeyi düzgün kontakta göndəririk.

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

Əsas proqram

Nəhayət, tətbiqi işə salmaq üçün başqa bir funksiya yaradırıq, əsas. Bot üçün YOUR_TOKEN-i dəyişməyi unutmayın.

Unutmayın: bu proqram sizin təyin etdiyiniz vaxtda şəkli avtomatik göndərəcək. Məsələn, hər gün səhər saat doqquzda hesabat göndərəcəyik.

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

Nəticədə tətbiqimiz belə görünəcək:

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

Faylı yadda saxlayın və onu main.py adlandırın.

Terminalda əmr daxil edərək proqramı işə salırıq:

python3 main.py

Hamısı hazırdır. İndi bizim müdaxiləmiz olmadan hesabatlar yaradan 50 kod sətirindən ibarət robotumuz var.

Gəlin botu yoxlayaq buradan/send əmrini seçməklə.

Sadə hesabatları robota necə həvalə etmək olar. Python və Google BigQuery-də bot yazmaq

Hazır kodu buradan əldə edə bilərsiniz mənim GitHub.

Skillbox tövsiyə edir:

Mənbə: www.habr.com

Добавить комментарий