Basit raporların bir robota devredilmesi. Python ve Google BigQuery'de bot yazma

Basit raporların bir robota devredilmesi. Python ve Google BigQuery'de bot yazma

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. postalamak.

Skillbox şunları önerir: pratik kurs Sıfırdan Python geliştiricisi.

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-bulut-bigquery Google BigQuery'den veri almak için. matplotlib, dizi и pandalar verilerinizi görselleştirmenize yardımcı olacaktır. piton-telgraf-bot 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: Google Developers Console 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.

Basit raporların bir robota devredilmesi. Python ve Google BigQuery'de bot yazma

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

Basit raporların bir robota devredilmesi. Python ve Google BigQuery'de bot yazma

Hesap anahtarı oluşturun

Tekrar gidelim Google Developers Console, 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.

Basit raporların bir robota devredilmesi. Python ve Google BigQuery'de bot yazma

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 dataframe

Bu 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 plt

Resmi 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 kullanıcı bilgisibotu 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 bundan dolayı/send komutunu seçerek.

Basit raporların bir robota devredilmesi. Python ve Google BigQuery'de bot yazma

Bitmiş kodu şu adresten alabilirsiniz: GitHub'ım.

Skillbox şunları önerir:

Kaynak: habr.com

Yorum ekle