
Her gün, her hafta tekrarlanan görevleriniz var mı? Örneğin rapor yazmak. Veri talep edersiniz, analiz edersiniz, görselleştirirsiniz (grafikler, tablolar hazırlarsınız) ve ardından bunu patronunuza gönderirsiniz. Peki ya tüm bunlar otomatikleştirilmişse?
Bu eğitimde Telegram için raporlamayı otomatikleştirmeye yardımcı olacak bir bot oluşturacağız. Ve en güzeli de tüm programın yalnızca 50 satır koddan oluşacak olması! Telegram için ilk kez bir bot oluşturuyorsanız bunu da okumalısınız. .
Skillbox şunları önerir: pratik kurs .
Hatırlatıyoruz: tüm "Habr" okuyucuları için - "Habr" promosyon kodunu kullanarak herhangi bir Skillbox kursuna kayıt olurken 10 ruble indirim.
Başlayalım
Kitaplıkları yükleme
Kullanacağız Google BigQuery'den veri almak için. , и verilerinizi görselleştirmenize yardımcı olacaktır. tamamlanan verileri Telegram'a gönderecek.
pip3 google-cloud-bigquery matplotlib numpy pandas python-telegram-bot'u yükleyin
Google BigQuery API'yi Bağlama
Hizmeti kullanmak istiyorsak Google BigQuery API'ye bağlanmamız gerekiyor. Bunu yapmak için şuraya gidiyoruz: ve yeni bir proje oluşturun (veya mevcut bir projeyi seçin).
Kontrol panelinde API'LERİ VE HİZMETLERİ ETKİNLEŞTİR'i seçin ve BigQuery API'yi arayın.

API'ye bağlanmak için Etkinleştir'i seçin.

Hesap anahtarı oluşturun
Tekrar gidelim , Kimlik Bilgileri sekmesini, Kimlik bilgileri oluştur'u ve Hizmet hesabı anahtarını seçin.
Ardından - Yeni hizmet hesabı'nı seçin ve Hizmet hesabı adı alanına adı girin.
Rol açılır listesinden Proje > Sahip'i ve ardından Oluştur'u seçin.

Otomatik olarak indirilecek dosyanın adı creds.json'dur.
Terminalde creds.json yolunu belirterek GOOGLE_APPLICATION_CREDENTIALS'ı ayarlayın.
dışa aktar GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'
Her şey yolunda gittiyse, programı yazmaya başlama zamanı gelmiştir.
Bir uygulama oluşturma
Eğitim için bigquery-public-data.stackoverflow verilerini kullanacağız, raporumuz için günlük yayın sayısını seçeceğiz.
Her şey oldukça basit.
Tabloyu sorgulayın -> Verileri görselleştirin -> Görselleştirmeyi kaydedin -> Resmi gönderin
Her iş parçacığını tanımlamak için bir işlev oluşturalım.
BigQuery'ye sorgulama
Öncelikle kütüphaneyi import ediyoruz.
google.cloud'dan bigquery'yi içe aktar
Parametresinin query olduğu query_to_bigquery adında bir fonksiyon oluşturuyoruz.
def query_to_bigquery(query):
client = bigquery.Client()
query_job = client.query(query)
result = query_job.result()
dataframe = result.to_dataframe()
return dataframeBu işlev, isteği bir veri çerçevesi olarak döndürecektir.
Verileri görselleştirme
Bu sorunu çözmek için matplotlib'i seçin.
matplotlib.pyplot dosyasını plt olarak içe aktar
Beş parametreye ihtiyacımız var; burada x, x ekseni verileridir, x_label, eksenin başlığıdır, y, y ekseni verileridir, y_label, eksenin başlığıdır ve başlık, tüm görselleştirmenin 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 pltResmi kaydet
Şimdi bir görselleştirme oluşturmak ve onu kaydetmek için iki işlevi kullanalım.
Günlük yayınlanan gönderi sayısını göndereceğiz. İlk önce bir istek yazıyoruz.
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
"""Sorgu, 2 Aralık 2018'den itibaren iki hafta boyunca veri toplanmasına yardımcı olur.
Bu tarihi kullanıyoruz çünkü 2018-12-02 bigquery-public-data.stackoverflow.post_history'de kaydedilen en son verilerdir, diğer durumlarda en yeni verileri almak için CURRENT_DATE() işlevini kullanabilirsiniz.
Verileri almak için query_to_bigquery işlevini çağırın.
veri çerçevesi = query_to_bigquery(sorgu)
Daha sonra x ekseni için tarih verisi sütununu ve y ekseni için total_posts sütununu kullanırız.
x = veri çerçevesi['tarih'].tolist()
y = veri çerçevesi['total_posts'].tolist()
Visualize_bar_chart fonksiyonunu kullanarak görselleştiriyoruz ve görsel olarak kaydediyoruz.
plt = görselleştirme_bar_chart(x=x, x_label='Tarih', y=y, y_label='Toplam Gönderiler', title='Günlük Gönderiler')
plt.savefig('viz.png')
Bu kodu get_and_save_image adlı bir fonksiyona sarıyoruz.
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')Bir resim gönder
Alıcıya rapor gönderebilmek için chat_id parametresini bilmeniz gerekmektedir.
Kullanırız ve /start yazın. Bot gerekli bilgilerle yanıt verir, id alanında chat_id bulunur.
Şimdi send_image fonksiyonunu oluşturalım. Görüntüyü almak ve kaydetmek için get_and_save_image işlevini kullanacaktır. Ve sonra her şeyi doğru kişiye gönderiyoruz.
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'))Ana program
Son olarak uygulamayı başlatmak için main adında başka bir fonksiyon oluşturuyoruz. Bot için YOUR_TOKEN'inizi değiştirmeyi unutmayın.
Unutmayın: Bu program, görüntüyü belirttiğiniz saatte otomatik olarak gönderecektir. Mesela her gün sabah dokuzda rapor göndereceğiz.
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()Sonuç olarak uygulamamız şu şekilde görünecektir:
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()Dosyayı kaydedin ve main.py olarak adlandırın.
Terminalde şu komutu girerek uygulamayı başlatıyoruz:
python3 ana.py
Her şey hazır. Artık bizim müdahalemize gerek kalmadan rapor üreten, 50 satır koddan oluşan bir robotumuz var.
Botu kontrol edelim /send komutunu seçerek.

Bitmiş kodu şu adresten alabilirsiniz: .
Skillbox şunları önerir:
- İki yıllık uygulamalı kurs .
- çevrimiçi kurs .
- Uygulamalı yıl kursu .
Kaynak: habr.com
