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.
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.
API'ye bağlanmak için Etkinleştir'i seçin.
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.
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.
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.
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.