Kumaha utusan laporan basajan ka robot. Nulis bot dina Python jeung Google BigQuery

Kumaha utusan laporan basajan ka robot. Nulis bot dina Python jeung Google BigQuery

Naha anjeun ngagaduhan tugas anu diulang unggal dinten, minggu ka minggu? Contona, nulis laporan. Anjeun menta data, nganalisis éta, visualize eta (nyieun grafik, grafik), lajeng kirimkeun ka boss Anjeun. Tapi kumaha upami sadayana ieu otomatis?

Dina tutorial ieu kami bakal nyiptakeun bot pikeun Telegram anu bakal ngabantosan ngalaporkeun otomatis. Jeung hal coolest éta sakabéh program bakal diwangun ku ukur 50 garis kode! Upami anjeun mimiti nyiptakeun bot pikeun Telegram, maka anjeun ogé kedah maca ieu pasang.

Skillbox nyarankeun: Kursus praktis pamekar Python ti scratch.

Kami ngingetan: pikeun sakabéh pamiarsa "Habr" - diskon 10 rubles nalika enrolling dina sagala Tangtu Skillbox ngagunakeun "Habr" kode promosi.

Hayu urang ngamimitian

Masang perpustakaan

Urang bakal anggo google-cloud-bigquery pikeun meunangkeun data ti Google BigQuery. matplotlib, numpy и panda bakal mantuan Anjeun visualize data Anjeun. python-telegram-bot bakal ngirim data rengse ka Telegram.

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

Nyambungkeun Google BigQuery API

Upami urang hoyong nganggo jasa éta, urang kedah nyambungkeun API Google BigQuery. Jang ngalampahkeun ieu urang buka Google pamekar konsol sareng jieun proyék énggal (atanapi pilih anu tos aya).

Dina panel kontrol, pilih AKTIFKAN API JEUNG LAYANAN sareng milarian BigQuery API.

Kumaha utusan laporan basajan ka robot. Nulis bot dina Python jeung Google BigQuery

Pilih Aktipkeun pikeun nyambungkeun API.

Kumaha utusan laporan basajan ka robot. Nulis bot dina Python jeung Google BigQuery

Jieun konci akun

Hayu urang balik deui Google pamekar konsol, pilih tab Kapercayaan, Jieun Kapercayaan sareng konci akun Service.

Teras - Akun jasa anyar, sareng lebetkeun nami dina widang Ngaran akun jasa.

Tina daptar turun-handap Peran, pilih Proyék > Pamilik, teras Jieun.

Kumaha utusan laporan basajan ka robot. Nulis bot dina Python jeung Google BigQuery

Berkas anu bakal diunduh sacara otomatis disebut creds.json.

Setel GOOGLE_APPLICATION_CREDENTIALS, nangtukeun jalur ka creds.json di terminal.

ékspor GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Upami sadayana lancar, waktosna pikeun ngamimitian nyerat program.

Nyieun hiji aplikasi

Pikeun tutorial kami bakal nganggo data tina bigquery-public-data.stackoverflow, pikeun laporan kami bakal milih jumlah publikasi sapopoé.

Sagalana geus cukup basajan.

Tanya tabel -> Visualize data -> Simpen visualisasi -> Kirim gambar

Hayu urang nyieun hiji fungsi pikeun nangtukeun unggal thread.

Patarosan ka BigQuery

Mimiti urang ngimpor perpustakaan.

ti google.cloud impor bigquery

Urang nyieun fungsi disebut query_to_bigquery, dimana parameter query.

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

Pungsi ieu bakal balik pamundut salaku pigura data.

Visualizing data

Pikeun ngajawab masalah ieu, pilih matplotlib.

impor matplotlib.pyplot sakumaha plt

Urang peryogi lima parameter, dimana x nyaéta data sumbu-x, x_label nyaéta judul pikeun sumbu, y nyaéta data sumbu-y, y_label nyaéta judul pikeun sumbu, sareng judul nyaéta judul sakabéh 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

Simpen gambar

Ayeuna hayu urang nganggo dua fungsi pikeun nyiptakeun visualisasi sareng simpen.

Kami bakal ngirim jumlah tulisan anu diterbitkeun unggal dinten. Mimiti urang nyerat pamundut.

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

Paménta ngabantosan ngumpulkeun data salami dua minggu mimitian 2 Désémber 2018.

Kami nganggo tanggal ieu kusabab 2018-12-02 mangrupikeun data pangénggalna anu kacatet dina bigquery-public-data.stackoverflow.post_history, dina kasus sanés anjeun tiasa nganggo CURRENT_DATE () pikeun kéngingkeun data énggal.

Nelepon fungsi query_to_bigquery pikeun meunangkeun data.

pigura data = query_to_bigquery(query)

Teras kami nganggo kolom data tanggal pikeun sumbu-x, sareng kolom total_posts pikeun sumbu-y.

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

Urang visualize eta ngagunakeun fungsi visualize_bar_chart tur simpen salaku hiji gambar.

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

Urang bungkus kode ieu dina fungsi 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 hiji gambar

Dina raraga ngirim laporan ka panarima, Anjeun kudu nyaho parameter chat_id.

Urang make pamakéinfobot jeung tipe / ngamimitian. Bot ngaréspon kalayan inpormasi anu diperyogikeun, chat_id dikandung dina widang id.

Ayeuna hayu urang nyieun fungsi send_image. Bakal nganggo fungsi get_and_save_image pikeun nyandak sareng nyimpen gambar. Teras we ngirimkeun sadayana ka kontak anu leres.

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

Tungtungna, urang nyieun fungsi sejen, utama, pikeun ngajalankeun aplikasi. Tong hilap gentos YOUR_TOKEN kanggo bot.

Inget: program ieu bakal ngirim gambar sacara otomatis dina waktos Anjeun tangtukeun. Contona, urang bakal ngirim laporan jam salapan isuk-isuk unggal poé.

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

Hasilna, aplikasi urang bakal kasampak kawas kieu:

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

Simpen file sareng nyauran éta main.py.

Urang ngajalankeun aplikasi ku cara nuliskeun paréntah di terminal:

python3 main.py

Kabéh geus siap. Ayeuna urang gaduh robot anu diwangun ku 50 garis kode anu ngahasilkeun laporan tanpa campur tangan urang.

Hayu urang pariksa bot di dieuku milih / ngirim paréntah.

Kumaha utusan laporan basajan ka robot. Nulis bot dina Python jeung Google BigQuery

Anjeun bisa meunangkeun kode rengse di abdi GitHub.

Skillbox nyarankeun:

sumber: www.habr.com

Tambahkeun komentar