Oddiy hisobotlarni robotga qanday topshirish mumkin. Python va Google BigQuery-da bot yozish

Oddiy hisobotlarni robotga qanday topshirish mumkin. Python va Google BigQuery-da bot yozish

Sizda kundan-kunga, haftadan haftaga takrorlanadigan vazifalaringiz bormi? Masalan, hisobotlarni yozish. Siz ma'lumotlarni so'raysiz, tahlil qilasiz, vizualizatsiya qilasiz (grafiklar, diagrammalar tuzasiz) va keyin uni boshlig'ingizga yuborasiz. Ammo bularning barchasi avtomatlashtirilgan bo'lsa-chi?

Ushbu qo'llanmada biz Telegram uchun hisobotlarni avtomatlashtirishga yordam beradigan bot yaratamiz. Va eng zo'r narsa shundaki, butun dastur faqat 50 qator koddan iborat bo'ladi! Agar siz Telegram uchun birinchi marta bot yaratayotgan bo'lsangiz, buni ham o'qib chiqishingiz kerak post.

Skillbox tavsiya qiladi: Amaliy kurs Noldan boshlab Python dasturchisi.

Sizga eslatib o'tamiz: "Habr" ning barcha o'quvchilari uchun - "Habr" promo-kodidan foydalangan holda har qanday Skillbox kursiga yozilishda 10 000 rubl chegirma.

Qani boshladik

Kutubxonalarni o'rnatish

Biz foydalanamiz google-bulut-bigquery Google BigQuery'dan ma'lumotlarni olish uchun. matplotlib, achchiq и pandalar ma'lumotlaringizni vizuallashtirishga yordam beradi. python-telegram-bot tayyor ma’lumotlarni Telegram’ga jo‘natadi.

pip3 o'rnating google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

Google BigQuery API ulanishi

Agar xizmatdan foydalanmoqchi bo'lsak, Google BigQuery API-ni ulashimiz kerak. Buning uchun biz boramiz Google Developers Console va yangi loyiha yarating (yoki mavjudini tanlang).

Boshqaruv panelida API VA XIZMATLARNI YOQISH ni tanlang va BigQuery API ni qidiring.

Oddiy hisobotlarni robotga qanday topshirish mumkin. Python va Google BigQuery-da bot yozish

APIni ulash uchun Yoqish-ni tanlang.

Oddiy hisobotlarni robotga qanday topshirish mumkin. Python va Google BigQuery-da bot yozish

Hisob kalitini yarating

Keling, yana boramiz Google Developers Console, Hisob ma'lumotlari yorlig'ini, Hisob ma'lumotlarini yaratish va Xizmat hisobi kalitini tanlang.

Keyin - Yangi xizmat hisobi va xizmat qaydnomasi nomi maydoniga nomni kiriting.

Rol ochiladigan ro'yxatidan Loyiha > Egasini, keyin Yaratish-ni tanlang.

Oddiy hisobotlarni robotga qanday topshirish mumkin. Python va Google BigQuery-da bot yozish

Avtomatik yuklab olinadigan fayl creds.json deb ataladi.

GOOGLE_APPLICATION_CREDENTIALS ni sozlang, terminalda creds.json yo‘lini belgilang.

eksport GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Agar hamma narsa yaxshi bo'lsa, dasturni yozishni boshlash vaqti keldi.

Ilova yaratish

Qo'llanma uchun biz bigquery-public-data.stackoverflow ma'lumotlaridan foydalanamiz, hisobotimiz uchun kundalik nashrlar sonini tanlaymiz.

Hamma narsa juda oddiy.

Jadvalga so'rov yuborish -> Ma'lumotlarni vizualizatsiya qilish -> Vizualizatsiyani saqlash -> Rasmni yuborish

Keling, har bir mavzuni aniqlash uchun bitta funktsiya yarataylik.

BigQuery-ga so'rov

Avval kutubxonani import qilamiz.

google.cloud import bigquery dan

Biz query_to_bigquery deb nomlangan funktsiyani yaratamiz, bu erda parametr so'rovdir.

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 so'rovni ma'lumotlar ramkasi sifatida qaytaradi.

Ma'lumotlarni vizualizatsiya qilish

Ushbu muammoni hal qilish uchun matplotlib-ni tanlang.

matplotlib.pyplotni plt sifatida import qilish

Bizga beshta parametr kerak bo'ladi, bu erda x - x o'qi ma'lumotlari, x_label - o'qning sarlavhasi, y - y o'qi ma'lumotlari, y_label - o'qning sarlavhasi va sarlavha - butun vizualizatsiya sarlavhasi.

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

Rasmni saqlang

Endi vizualizatsiya yaratish va uni saqlash uchun ikkita funksiyadan foydalanamiz.

Biz har kuni chop etilgan postlar sonini yuboramiz. Avval biz so'rov yozamiz.

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

So‘rov 2-yil 2018-dekabrdan boshlab ikki hafta davomida ma’lumotlarni to‘plashga yordam beradi.

Biz bu sanadan foydalanamiz, chunki 2018-12-02 sanasi bigquery-public-data.stackoverflow.post_history da qayd etilgan eng soʻnggi maʼlumotlardir, boshqa hollarda eng yangi maʼlumotlarni olish uchun CURRENT_DATE() dan foydalanishingiz mumkin.

Ma'lumotlarni olish uchun query_to_bigquery funksiyasiga qo'ng'iroq qiling.

dataframe = query_to_bigquery(so'rov)

Keyin x o'qi uchun sana ma'lumotlari ustunidan va y o'qi uchun total_posts ustunidan foydalanamiz.

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

Biz uni visualize_bar_chart funksiyasi yordamida tasavvur qilamiz va uni rasm sifatida saqlaymiz.

plt = visualize_bar_chart(x=x, x_label='Sana', y=y, y_label='Jami xabarlar', title='Kundalik xabarlar')
plt.savefig('viz.png')

Biz ushbu kodni get_and_save_image deb nomlangan funktsiyaga o'tkazamiz.

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

Rasm yuboring

Qabul qiluvchiga hisobot yuborish uchun siz chat_id parametrini bilishingiz kerak.

Biz foydalanamiz userinfobot va /start ni kiriting. Bot kerakli ma'lumotlar bilan javob beradi, chat_id id maydonida joylashgan.

Endi send_image funksiyasini yaratamiz. Tasvirni olish va saqlash uchun get_and_save_image funksiyasidan foydalanadi. Va keyin biz hamma narsani to'g'ri kontaktga yuboramiz.

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

Asosiy dastur

Nihoyat, dasturni ishga tushirish uchun boshqa asosiy funktsiyani yaratamiz. Bot uchun YOUR_TOKENni o'zgartirishni unutmang.

Esingizda bo'lsin: ushbu dastur tasvirni siz ko'rsatgan vaqtda avtomatik ravishda yuboradi. Misol uchun, biz har kuni ertalab to'qqizda hisobot yuboramiz.

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

Natijada, bizning ilovamiz quyidagicha ko'rinadi:

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

Faylni saqlang va uni main.py deb nomlang.

Terminalga buyruqni kiritish orqali dasturni ishga tushiramiz:

python3 main.py

Hammasi tayyor. Endi bizda 50 qator koddan iborat robot bor, u bizning aralashuvimizsiz hisobotlarni yaratadi.

Keling, botni tekshiramiz shu yerda/send buyrug'ini tanlash orqali.

Oddiy hisobotlarni robotga qanday topshirish mumkin. Python va Google BigQuery-da bot yozish

Tayyor kodni quyidagi manzildan olishingiz mumkin mening GitHub.

Skillbox tavsiya qiladi:

Manba: www.habr.com

a Izoh qo'shish