Bagaimana mendelegasikan laporan sederhana ke robot. Menulis bot dengan Python dan Google BigQuery



Apakah Anda memiliki tugas yang diulang hari demi hari, dari minggu ke minggu? Misalnya, menulis laporan. Anda meminta data, melakukan analisis, memvisualisasikan (membuat grafik, bagan), dan kemudian mengirimkannya ke bos. Tetapi bagaimana jika semua ini dilakukan secara otomatis?

Dalam tutorial ini, kami akan membuat bot untuk Telegram yang akan membantu mengotomatiskan pelaporan. Dan yang paling keren adalah seluruh program hanya terdiri dari 50 baris kode! Jika Anda membuat bot untuk Telegram untuk pertama kalinya, maka Anda harus membaca posting ini di sini .

Skillbox merekomendasikan: Pengembang Python langsung dari awal .

Kami mengingatkan Anda: untuk semua pembaca "Habr" - diskon 10.000 rubel saat mendaftar untuk kursus Skillbox apa pun menggunakan kode promo "Habr".

Turun


Instal perpustakaan

Kami akan menggunakan google-cloud-bigquery untuk mengambil data dari Google BigQuery. matplotlib , numpy dan panda akan membantu memvisualisasikan data. python-telegram-bot akan mengirim data yang sudah selesai ke Telegram.

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

Hubungkan Google BigQuery API

Jika kami ingin menggunakan layanan ini, kami harus menghubungkan API Google BigQuery. Untuk melakukannya, buka Google Developers Console dan buat proyek baru (atau pilih yang sudah ada).

Di panel kontrol, pilih AKTIFKAN LAYANAN DAN LAYANAN dan cari BigQuery API.



Pilih Aktifkan untuk menghubungkan API.



Buat kunci akun

Kami kembali ke Google Developers Console , pilih tab Kredensial, Buat kredensial, dan kunci akun Layanan.

Lalu - Akun layanan baru, dan di bidang Nama akun layanan, masukkan namanya.

Dari daftar turun bawah Peran, pilih Proyek> Pemilik, lalu Buat.



File yang akan dimuat secara otomatis disebut creds.json.

Kami mengekspos GOOGLE_APPLICATION_CREDENTIALS, yang menunjukkan jalur ke creds.json di terminal.

export GOOGLE_APPLICATION_CREDENTIALS = '[PATH_TO_CREDS.JSON]'

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

Pembuatan aplikasi


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

Semuanya cukup sederhana.

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

Mari kita buat satu fungsi untuk mendefinisikan setiap utas.

Permintaan ke BigQuery

Pertama, impor perpustakaan.

dari google.cloud mengimpor bigquery

Buat fungsi yang disebut query_to_bigquery, di mana parameternya adalah kueri.

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.

Visualisasikan data

Untuk mengatasi masalah ini, pilih matplotlib.

impor matplotlib.pyplot sebagai plt

Kita memerlukan lima parameter, di mana x adalah data pada sumbu x, x_label adalah nama untuk sumbu, y adalah data untuk sumbu y, y_label adalah nama untuk sumbu dan judul adalah judul dari 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 gambar

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

Kami akan mengirimkan jumlah posting yang diterbitkan setiap hari. Pertama, kami 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 membantu mengumpulkan data selama dua minggu mulai 2 Desember 2018.

Kami menggunakan tanggal ini karena 2018-12-02 adalah data terbaru yang direkam dalam 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.

dataframe = query_to_bigquery (permintaan)

Kemudian gunakan kolom tanggal untuk sumbu x, dan kolom total_post untuk sumbu y.

x = dataframe ['date']. tolist ()
y = dataframe ['total_posts']. tolist ()

Kami memvisualisasikan menggunakan fungsi visualize_bar_chart dan menyimpannya sebagai gambar.

plt = visualize_bar_chart (x = x, x_label = 'Tanggal', y = y, y_label = 'Total Posting', title = 'Tulisan 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 kepada penerima, Anda perlu mengetahui parameter chat_id.

Kami menggunakan userinfobot dan ketik / mulai. Bot merespons dengan informasi yang diperlukan, chat_id terkandung dalam bidang id.

Sekarang buat fungsi send_image. Ini akan menggunakan fungsi get_and_save_image untuk mengambil dan menyimpan gambar. Dan kemudian kami mengirim 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

Akhirnya, buat fungsi lain, utama, untuk meluncurkan aplikasi. Jangan lupa untuk mengubah YOUR_TOKEN untuk bot.

Ingat: program ini akan mengirim gambar secara otomatis pada waktu yang Anda tentukan. Misalnya, kami akan mengirim 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() 

Akibatnya, 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 main.py

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

Mari kita periksa bot dari sini dengan memilih perintah / send.



Anda bisa mendapatkan kode yang sudah jadi di GitHub saya .

Skillbox merekomendasikan:

Source: https://habr.com/ru/post/id443702/


All Articles