ProHoster > Blog > berita internet > 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.
Kami mengingatkan:untuk semua pembaca "Habr" - diskaun sebanyak 10 rubel apabila mendaftar dalam mana-mana kursus Skillbox menggunakan kod promosi "Habr".
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.
Pilih Dayakan untuk menyambungkan API.
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.
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.
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.
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.
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.