Жөнөкөй отчетторду роботко кантип тапшырса болот. Python жана Google BigQuery менен бот жазуу

Жөнөкөй отчетторду роботко кантип тапшырса болот. Python жана Google BigQuery менен бот жазуу

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

Бул окуу куралында биз Telegram үчүн отчетту автоматташтырууга жардам бере турган бот түзөбүз. Эң сонун нерсе, программанын бардыгы 50 сап коддон турат! Эгер сиз Telegram үчүн ботту биринчи жолу түзүп жатсаңыз, анда муну да окушуңуз керек кызмат.

Skillbox сунуштайт: Практикалык курс Нөлдөн баштап Python иштеп чыгуучусу.

Биз эсиңизге салабыз: "Хабрдын" бардык окурмандары үчүн - "Habr" промо-кодун колдонуу менен каалаган Skillbox курсуна катталганда 10 000 рубль арзандатуу.

Келиңиз баштайлы

Китепканаларды орнотуу

Биз колдонобуз google-cloud-bigquery Google BigQueryден маалымат алуу үчүн. matplotlib, үнсүз и рттъ маалыматыңызды визуализациялоого жардам берет. python-telegram-bot даяр маалыматтарды Telegramга жөнөтөт.

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

Google BigQuery API туташтырылууда

Кызматты колдонгубуз келсе, Google BigQuery API'син туташтырышыбыз керек. Бул үчүн биз барабыз Google Иштеп чыгуучунун аймагы жана жаңы долбоорду түзүү (же учурдагыны тандоо).

Башкаруу панелинен APIS ЖАНА КЫЗМАТТАРДЫ ИШТЕТҮҮ дегенди тандап, BigQuery API издеңиз.

Жөнөкөй отчетторду роботко кантип тапшырса болот. Python жана Google BigQuery менен бот жазуу

API туташтыруу үчүн Иштетүү тандаңыз.

Жөнөкөй отчетторду роботко кантип тапшырса болот. Python жана Google BigQuery менен бот жазуу

Каттоо эсебинин ачкычын түзүңүз

кайра баралы Google Иштеп чыгуучунун аймагы, Каттоо тактасын тандаңыз, Эсептик дайындарды түзүү жана Кызмат эсебинин ачкычы.

Андан кийин - Жаңы кызмат эсеби, жана Кызмат эсебинин аты талаасына атын киргизиңиз.

Рол ылдый түшүүчү тизмеден Долбоор > Ээси, анан Түзүүнү тандаңыз.

Жөнөкөй отчетторду роботко кантип тапшырса болот. 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_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='Жалпы билдирүүлөр', 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 жана териңиз / баштоо. Бот керектүү маалымат менен жооп берет, 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'))

Негизги программа

Акырында, биз тиркемени ишке киргизүү үчүн дагы бир функцияны түзөбүз. Бот үчүн 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 сунуштайт:

Source: www.habr.com

Комментарий кошуу