Bagaimana untuk menyerahkan laporan mudah kepada robot. Menulis bot dalam Python dan Google BigQuery

Bagaimana untuk menyerahkan laporan mudah kepada robot. Menulis bot dalam Python dan Google BigQuery

Adakah anda mempunyai tugasan yang berulang hari demi hari, minggu demi minggu? Contohnya, menulis laporan. Anda meminta data, menganalisisnya, memvisualisasikannya (membuat graf, carta), dan kemudian menghantarnya kepada bos anda. Tetapi bagaimana jika semua ini automatik?

Dalam tutorial ini kami akan mencipta bot untuk Telegram yang akan membantu mengautomasikan pelaporan. Dan perkara yang paling menarik ialah keseluruhan program akan terdiri daripada hanya 50 baris kod! Jika anda membuat bot untuk Telegram buat kali pertama, maka anda juga harus membaca yang ini jawatan.

Skillbox mengesyorkan: Kursus praktikal Pembangun Python dari awal.

Kami mengingatkan: untuk semua pembaca "Habr" - diskaun sebanyak 10 rubel apabila mendaftar dalam mana-mana kursus Skillbox menggunakan kod promosi "Habr".

Mari kita mulakan

Memasang perpustakaan

Kami akan menggunakan google-cloud-bigquery untuk mendapatkan data daripada Google BigQuery. matplotlib, kekenyangan ΠΈ panda akan membantu anda menggambarkan data anda. python-telegram-bot akan menghantar data yang telah siap ke Telegram.

pip3 pasang google-cloud-bigquery matplotlib numpy panda python-telegram-bot

Menyambungkan Google BigQuery API

Jika kami ingin menggunakan perkhidmatan tersebut, kami perlu menyambungkan API Google BigQuery. Untuk melakukan ini kita pergi ke Konsol Pembangun Google dan buat projek baharu (atau pilih yang sedia ada).

Dalam panel kawalan, pilih DAYAKAN API DAN PERKHIDMATAN dan cari API BigQuery.

Bagaimana untuk menyerahkan laporan mudah kepada robot. Menulis bot dalam Python dan Google BigQuery

Pilih Dayakan untuk menyambungkan API.

Bagaimana untuk menyerahkan laporan mudah kepada robot. Menulis bot dalam Python dan Google BigQuery

Buat kunci akaun

Jom ke lagi Konsol Pembangun Google, pilih tab Kredensial, Cipta bukti kelayakan dan kunci akaun Perkhidmatan.

Kemudian - Akaun perkhidmatan baharu, dan masukkan nama dalam medan Nama akaun perkhidmatan.

Daripada senarai juntai bawah Peranan, pilih Projek > Pemilik, kemudian Cipta.

Bagaimana untuk menyerahkan laporan mudah kepada robot. Menulis bot dalam Python dan Google BigQuery

Fail yang akan dimuat turun secara automatik dipanggil creds.json.

Tetapkan GOOGLE_APPLICATION_CREDENTIALS, tentukan laluan ke creds.json dalam terminal.

eksport GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Jika semuanya berjalan lancar, sudah tiba masanya untuk mula menulis program.

Membuat aplikasi

Untuk tutorial kami akan menggunakan data daripada bigquery-public-data.stackoverflow, untuk laporan kami, kami akan memilih bilangan penerbitan harian.

Semuanya agak mudah.

Tanya jadual -> Visualisasikan data -> Simpan visualisasi -> Hantar imej

Mari buat satu fungsi untuk menentukan setiap utas.

Pertanyaan kepada BigQuery

Mula-mula kita mengimport perpustakaan.

daripada google.cloud import bigquery

Kami mencipta fungsi yang dipanggil query_to_bigquery, di mana parameternya ialah pertanyaan.

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.

Mengvisualkan data

Untuk menyelesaikan masalah ini, pilih matplotlib.

import matplotlib.pyplot sebagai plt

Kami memerlukan lima parameter, di mana x ialah data paksi-x, x_label ialah tajuk untuk paksi, y ialah data paksi-y, y_label ialah tajuk untuk paksi dan tajuk ialah tajuk 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 imej

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

Kami akan menghantar bilangan siaran yang diterbitkan setiap hari. Mula-mula kita tulis 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
        """

Pertanyaan membantu mengumpul data selama dua minggu mulai 2 Disember 2018.

Kami menggunakan tarikh ini kerana 2018-12-02 ialah data terkini yang direkodkan dalam bigquery-public-data.stackoverflow.post_history, dalam kes lain anda boleh menggunakan CURRENT_DATE() untuk mendapatkan data terbaharu.

Panggil fungsi query_to_bigquery untuk mendapatkan data.

kerangka data = query_to_bigquery(query)

Kemudian kami menggunakan lajur data tarikh untuk paksi-x dan lajur total_posts untuk paksi-y.

x = bingkai data['tarikh'].tolist()
y = bingkai data['total_posts'].tolist()

Kami memvisualisasikannya menggunakan fungsi visualize_bar_chart dan menyimpannya sebagai imej.

plt = visualize_bar_chart(x=x, x_label='Tarikh', y=y, y_label='Jumlah Catatan', tajuk='Catatan Harian')
plt.savefig('viz.png')

Kami membungkus kod ini dalam fungsi yang dipanggil 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')

Hantar imej

Untuk menghantar laporan kepada penerima, anda perlu mengetahui parameter chat_id.

Kami guna userinfobot dan taip /mula. Bot bertindak balas dengan maklumat yang diperlukan, chat_id terkandung dalam medan id.

Sekarang mari buat fungsi send_image. Ia akan menggunakan fungsi get_and_save_image untuk mendapatkan dan menyimpan imej. Dan kemudian kami menghantar semuanya kepada kenalan yang betul.

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

Akhir sekali, kami mencipta satu lagi fungsi, utama, untuk melancarkan aplikasi. Jangan lupa tukar YOUR_TOKEN untuk bot.

Ingat: program ini akan menghantar imej secara automatik pada masa yang anda tentukan. Sebagai contoh, kami akan menghantar laporan pada pukul 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()

Akibatnya, aplikasi kami akan kelihatan 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 fail dan panggil ia main.py.

Kami melancarkan aplikasi dengan memasukkan arahan di terminal:

python3 main.py

Semua dah siap. Kini kami mempunyai robot yang terdiri daripada 50 baris kod yang menjana laporan tanpa campur tangan kami.

Mari semak bot oleh itudengan memilih arahan /send.

Bagaimana untuk menyerahkan laporan mudah kepada robot. Menulis bot dalam Python dan Google BigQuery

Anda boleh mendapatkan kod siap di GitHub saya.

Skillbox mengesyorkan:

Sumber: www.habr.com

Tambah komen