Қарапайым есептерді роботқа қалай тапсыруға болады. Біз Python және Google BigQuery-де бот жазамыз

Қарапайым есептерді роботқа қалай тапсыруға болады. Біз Python және Google BigQuery-де бот жазамыз

Күн сайын, апта сайын қайталанатын тапсырмаларыңыз бар ма? Мысалы, есептер жазу. Сіз деректерді сұрайсыз, оны талдайсыз, визуализациялайсыз (графиктерді, диаграммаларды жасайсыз), содан кейін оны бастығыңызға жібересіз. Бірақ мұның бәрі автоматтандырылған болса ше?

Бұл оқулықта біз Telegram үшін есеп беруді автоматтандыруға көмектесетін бот жасаймыз. Ең кереметі, бүкіл бағдарлама тек 50 код жолынан тұрады! Егер сіз Telegram үшін бірінші рет бот жасап жатсаңыз, оны да оқып шығуыңыз керек пошта.

Skillbox ұсынады: Практикалық курс Python әзірлеушісі нөлден бастап.

Біз еске саламыз: «Хабрдың» барлық оқырмандары үшін - «Habr» жарнамалық кодын пайдаланып кез келген Skillbox курсына жазылу кезінде 10 000 рубль көлемінде жеңілдік.

Бастайық

Кітапханаларды орнату

Қолданамыз google-cloud-bigquery Google BigQuery деректерін алу үшін. матплотлиб, мылқау и панда деректеріңізді визуализациялауға көмектеседі. python-telegram-bot дайын деректерді Telegram-ға жібереді.

pip3 орнату google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

Google BigQuery API қосылуда

Егер біз қызметті пайдаланғымыз келсе, Google BigQuery API қосуымыз керек. Мұны істеу үшін біз барамыз Google Developers Console және жаңа жобаны жасаңыз (немесе барын таңдаңыз).

Басқару тақтасында API AND SERVICES ҚОСУ опциясын таңдап, BigQuery API іздеңіз.

Қарапайым есептерді роботқа қалай тапсыруға болады. Біз Python және Google BigQuery-де бот жазамыз

API қосу үшін Қосу опциясын таңдаңыз.

Қарапайым есептерді роботқа қалай тапсыруға болады. Біз Python және Google BigQuery-де бот жазамыз

Тіркелгі кілтін жасаңыз

Қайтадан барайық Google Developers Console, Тіркелгі деректері қойындысын, Тіркелгі деректерін жасау және Қызмет тіркелгісі кілтін таңдаңыз.

Содан кейін - Жаңа қызмет тіркелгісі және атын Қызмет тіркелгісі аты өрісіне енгізіңіз.

Рөл ашылмалы тізімінен Жоба > Ие, одан кейін Жасау тармағын таңдаңыз.

Қарапайым есептерді роботқа қалай тапсыруға болады. Біз Python және Google BigQuery-де бот жазамыз

Автоматты түрде жүктелетін файл creds.json деп аталады.

Терминалдағы creds.json жолын көрсете отырып, GOOGLE_APPLICATION_CREDENTIALS орнатыңыз.

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

Егер бәрі жақсы болса, бағдарламаны жазуды бастау уақыты келді.

Қолданба құру

Оқулық үшін bigquery-public-data.stackoverflow деректерін қолданамыз, есеп үшін біз күнделікті жарияланымдар санын таңдаймыз.

Барлығы өте қарапайым.

Кестеге сұрау -> Деректерді визуализациялау -> Визуализацияны сақтау -> Суретті жіберу

Әрбір ағынды анықтау үшін бір функция жасайық.

BigQuery-ге сұрау

Алдымен кітапхананы импорттаймыз.

google.cloud файлынан bigquery импорттау

Біз query_to_bigquery деп аталатын функцияны жасаймыз, мұнда параметр сұрау болып табылады.

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 желтоқсанынан бастап екі апта бойы деректерді жинауға көмектеседі.

Біз бұл күнді қолданамыз, себебі 2018-12-02 - bigquery-public-data.stackoverflow.post_history ішінде жазылған соңғы деректер, басқа жағдайларда ең жаңа деректерді алу үшін CURRENT_DATE() функциясын пайдалануға болады.

Деректерді алу үшін query_to_bigquery функциясына қоңырау шалыңыз.

dataframe = query_to_bigquery(сұрау)

Содан кейін біз x осі үшін күн деректері бағанын және y осі үшін total_posts бағанын пайдаланамыз.

x = dataframe['date'].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 және /старт теріңіз. Бот қажетті ақпаратпен жауап береді, chat_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'))

Негізгі бағдарлама

Соңында біз қосымшаны іске қосу үшін негізгі функцияны жасаймыз. Бот үшін 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 ұсынады:

Ақпарат көзі: www.habr.com

пікір қалдыру