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.
Sizga eslatib o'tamiz:"Habr" ning barcha o'quvchilari uchun - "Habr" promo-kodidan foydalangan holda har qanday Skillbox kursiga yozilishda 10 000 rubl chegirma.
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.
APIni ulash uchun Yoqish-ni tanlang.
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.
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.
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.
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.
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.