Cara mendelegasikan laporan sederhana ke robot. Kami menulis bot dengan Python dan Google BigQuery

Cara mendelegasikan laporan sederhana ke robot. Kami menulis bot dengan Python dan Google BigQuery

Apakah Anda mempunyai tugas yang berulang hari demi hari, minggu demi minggu? Misalnya saja menulis laporan. Anda meminta data, menganalisisnya, memvisualisasikannya (membuat grafik, bagan), dan kemudian mengirimkannya ke atasan Anda. Namun bagaimana jika semua ini dilakukan secara otomatis?

Dalam tutorial ini kita akan membuat bot untuk Telegram yang akan membantu mengotomatiskan pelaporan. Dan yang paling keren adalah keseluruhan program hanya terdiri dari 50 baris kode! Jika Anda membuat bot untuk Telegram untuk pertama kalinya, Anda juga harus membaca yang ini pos.

Skillbox merekomendasikan: Tentu saja praktis Pengembang Python dari awal.

Kami mengingatkan: untuk semua pembaca "Habr" - diskon 10 rubel saat mendaftar di kursus Skillbox apa pun menggunakan kode promosi "Habr".

Mari kita mulai

Menginstal perpustakaan

Kami akan menggunakan google-cloud-bigquery untuk mendapatkan data dari Google BigQuery. matplotlib.dll, mati rasa ΠΈ panda akan membantu Anda memvisualisasikan data Anda. python-telegram-bot akan mengirimkan data yang sudah jadi ke Telegram.

pip3 instal google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

Menghubungkan API Google BigQuery

Jika kita ingin menggunakan layanan ini, kita perlu menghubungkan Google BigQuery API. Untuk melakukan ini kita pergi ke Google Developers Console dan buat proyek baru (atau pilih yang sudah ada).

Di panel kontrol, pilih ENABLE APIS AND SERVICES dan cari BigQuery API.

Cara mendelegasikan laporan sederhana ke robot. Kami menulis bot dengan Python dan Google BigQuery

Pilih Aktifkan untuk menghubungkan API.

Cara mendelegasikan laporan sederhana ke robot. Kami menulis bot dengan Python dan Google BigQuery

Buat kunci akun

Mari kita pergi ke lagi Google Developers Console, pilih tab Kredensial, Buat kredensial, dan Kunci akun layanan.

Lalu - Akun layanan baru, dan masukkan nama di kolom Nama akun layanan.

Dari daftar drop-down Peran, pilih Proyek > Pemilik, lalu Buat.

Cara mendelegasikan laporan sederhana ke robot. Kami menulis bot dengan Python dan Google BigQuery

File yang akan diunduh secara otomatis disebut creds.json.

Setel GOOGLE_APPLICATION_CREDENTIALS, tentukan jalur ke creds.json di terminal.

ekspor GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Jika semuanya berjalan dengan baik, saatnya untuk mulai menulis program.

Buat aplikasi

Untuk tutorialnya kami akan menggunakan data dari bigquery-public-data.stackoverflow, untuk laporan kami akan memilih jumlah publikasi harian.

Semuanya cukup sederhana.

Kueri tabel -> Visualisasikan data -> Simpan visualisasi -> Kirim gambar

Mari buat satu fungsi untuk mendefinisikan setiap thread.

Kueri ke BigQuery

Pertama kita mengimpor perpustakaan.

dari google.cloud impor bigquery

Kami membuat fungsi bernama query_to_bigquery, dengan parameternya adalah query.

def query_to_bigquery(query):
    client = bigquery.Client()
    query_job = client.query(query)
    result = query_job.result()
    dataframe = result.to_dataframe()
    return dataframe

Fungsi ini akan mengembalikan permintaan sebagai bingkai data.

Memvisualisasikan data

Untuk mengatasi masalah ini, pilih matplotlib.

impor matplotlib.pyplot sebagai plt

Kita membutuhkan lima parameter, dimana x adalah data sumbu x, x_label adalah judul sumbu, y adalah data sumbu y, y_label adalah judul sumbu, dan title adalah judul keseluruhan visualisasi.

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

Simpan gambarnya

Sekarang mari kita gunakan dua fungsi untuk membuat visualisasi dan menyimpannya.

Kami akan mengirimkan jumlah postingan yang diterbitkan setiap hari. Pertama kita menulis permintaan.

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

Kueri tersebut membantu mengumpulkan data selama dua minggu mulai 2 Desember 2018.

Kami menggunakan tanggal ini karena 2018-12-02 adalah data terbaru yang dicatat di bigquery-public-data.stackoverflow.post_history, dalam kasus lain Anda dapat menggunakan CURRENT_DATE() untuk mendapatkan data terbaru.

Panggil fungsi query_to_bigquery untuk mendapatkan data.

kerangka data = query_to_bigquery(kueri)

Kemudian kita gunakan kolom data tanggal untuk sumbu x, dan kolom total_posts untuk sumbu y.

x = kerangka data['tanggal'].tolist()
y = kerangka data['total_posts'].tolist()

Kami memvisualisasikannya menggunakan fungsi visualize_bar_chart dan menyimpannya sebagai gambar.

plt = visualize_bar_chart(x=x, x_label='Tanggal', y=y, y_label='Total Postingan', title='Postingan Harian')
plt.savefig('viz.png')

Kami membungkus kode ini dalam fungsi yang disebut get_and_save_image.

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

Kirim gambar

Untuk mengirim laporan ke penerima, Anda perlu mengetahui parameter chat_id.

Gunakan infobot pengguna dan ketik /mulai. Bot merespons dengan informasi yang diperlukan, chat_id terdapat di kolom id.

Sekarang mari kita buat fungsi send_image. Ini akan menggunakan fungsi get_and_save_image untuk mengambil dan menyimpan gambar. Dan kemudian kami mengirimkan semuanya ke kontak yang benar.

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

Program utama

Terakhir, kami membuat fungsi lain, main, untuk meluncurkan aplikasi. Jangan lupa ganti YOUR_TOKEN untuk botnya.

Ingat: program ini akan mengirimkan gambar secara otomatis pada waktu yang Anda tentukan. Misalnya, kami akan mengirimkan laporan pada jam sembilan pagi setiap hari.

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

Hasilnya, aplikasi kita akan terlihat seperti ini:

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

Simpan file dan beri nama main.py.

Kami meluncurkan aplikasi dengan memasukkan perintah di terminal:

python3 utama.py

Semuanya sudah siap. Sekarang kami memiliki robot yang terdiri dari 50 baris kode yang menghasilkan laporan tanpa campur tangan kami.

Mari kita periksa botnya karenanyadengan memilih perintah / kirim.

Cara mendelegasikan laporan sederhana ke robot. Kami menulis bot dengan Python dan Google BigQuery

Anda bisa mendapatkan kode yang sudah jadi di GitHub saya.

Skillbox merekomendasikan:

Sumber: www.habr.com

Tambah komentar