Carane utusan laporan prasaja menyang robot. Nulis bot ing Python lan Google BigQuery

Carane utusan laporan prasaja menyang robot. Nulis bot ing Python lan Google BigQuery

Apa sampeyan duwe tugas sing bola-bali saben dina, minggu sawise minggu? Contone, nulis laporan. Sampeyan njaluk data, nganalisa, nggambarake (nggawe grafik, grafik), banjur dikirim menyang bos sampeyan. Nanging apa yen kabeh iki otomatis?

Ing tutorial iki, kita bakal nggawe bot kanggo Telegram sing bakal mbantu ngotomatisasi laporan. Lan sing paling apik yaiku kabeh program bakal kalebu mung 50 baris kode! Yen sampeyan nggawe bot kanggo Telegram sapisanan, sampeyan uga kudu maca iki kirim.

Skillbox nyaranake: Kursus praktis pangembang Python saka ngeruk.

Kita ngelingake: kanggo kabeh sing maca "Habr" - diskon 10 rubel nalika ndhaptar kursus Skillbox nggunakake kode promosi "Habr".

Ayo dadi miwiti

Nginstal perpustakaan

Kita bakal nggunakake google-cloud-bigquery kanggo njupuk data saka Google BigQuery. matplotlib, numpak ΠΈ panda bakal mbantu sampeyan nggambarake data sampeyan. python-telegram-bot bakal ngirim data sing wis rampung menyang Telegram.

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

Nyambungake Google BigQuery API

Yen kita pengin nggunakake layanan kasebut, kita kudu nyambungake Google BigQuery API. Kanggo nindakake iki kita pindhah menyang Konsol Google Developers lan gawe proyek anyar (utawa pilih sing wis ana).

Ing panel kontrol, pilih AKTIFKAN API lan LAYANAN banjur goleki API BigQuery.

Carane utusan laporan prasaja menyang robot. Nulis bot ing Python lan Google BigQuery

Pilih Aktifake kanggo nyambungake API.

Carane utusan laporan prasaja menyang robot. Nulis bot ing Python lan Google BigQuery

Nggawe kunci akun

Ayo menyang maneh Konsol Google Developers, pilih tab Kredensial, Gawe kredensial lan tombol akun Layanan.

Banjur - Akun layanan anyar, lan ketik jeneng ing kolom Jeneng akun layanan.

Saka dhaptar gulung-mudhun Peran, pilih Proyek > Pemilik, banjur Gawe.

Carane utusan laporan prasaja menyang robot. Nulis bot ing Python lan Google BigQuery

Berkas sing bakal diundhuh kanthi otomatis diarani creds.json.

Setel GOOGLE_APPLICATION_CREDENTIALS, nemtokake path menyang creds.json ing terminal.

ekspor GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Yen kabeh wis rampung, wektune kanggo miwiti nulis program kasebut.

Nggawe aplikasi

Kanggo tutorial kita bakal nggunakake data saka bigquery-public-data.stackoverflow, kanggo laporan kita bakal milih nomer publikasi saben dina.

Kabeh cukup prasaja.

Njaluk tabel -> Visualisasi data -> Simpen visualisasi -> Kirim gambar

Ayo nggawe siji fungsi kanggo nemtokake saben thread.

Pitakon menyang BigQuery

Pisanan kita ngimpor perpustakaan.

saka google.cloud ngimpor bigquery

Kita nggawe fungsi sing disebut query_to_bigquery, ing ngendi parameter kasebut 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 iki bakal ngasilake panjalukan minangka pigura data.

Visualisasi data

Kanggo ngatasi masalah iki, pilih matplotlib.

ngimpor matplotlib.pyplot minangka plt

We kudu limang paramèter, ngendi x data sumbu x, x_label judhul kanggo sumbu, y data sumbu y, y_label judhul kanggo sumbu, lan judhul judhul kabeh 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

Saiki ayo gunakake rong fungsi kanggo nggawe visualisasi lan simpen.

Kita bakal ngirim jumlah kiriman sing diterbitake saben dina. Pisanan kita nulis panjaluk.

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

Pitakonan mbantu ngumpulake data sajrone rong minggu wiwit tanggal 2 Desember 2018.

Kita nggunakake tanggal iki amarga 2018-12-02 minangka data paling anyar sing direkam ing bigquery-public-data.stackoverflow.post_history, ing kasus liyane, sampeyan bisa nggunakake CURRENT_DATE () kanggo entuk data paling anyar.

Telpon fungsi query_to_bigquery kanggo entuk data.

kerangka data = query_to_bigquery(query)

Banjur kita nggunakake kolom data tanggal kanggo sumbu-x, lan kolom total_posts kanggo sumbu-y.

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

Kita nggambarake nggunakake fungsi visualize_bar_chart lan simpen minangka gambar.

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

Kita mbungkus kode iki ing fungsi sing diarani 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')

Kirimi gambar

Kanggo ngirim laporan menyang panampa, sampeyan kudu ngerti parameter chat_id.

Kita nggunakake userinfobot lan ketik / miwiti. Bot nanggapi kanthi informasi sing dibutuhake, chat_id ana ing kolom id.

Saiki ayo nggawe fungsi send_image. Bakal nggunakake fungsi get_and_save_image kanggo njupuk lan nyimpen gambar. Banjur kita ngirim kabeh menyang kontak sing bener.

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

Pungkasan, kita nggawe fungsi liyane, utama, kanggo miwiti aplikasi kasebut. Aja lali ngganti YOUR_TOKEN kanggo bot.

Elinga: program iki bakal ngirim gambar kanthi otomatis nalika sampeyan nemtokake. Contone, kita bakal ngirim laporan ing jam sanga esuk saben dina.

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

AkibatΓ©, aplikasi kita bakal katon kaya iki:

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 lan sebutno main.py.

Kita miwiti aplikasi kanthi ngetik printah ing terminal:

python3 main.py

Kabeh wis siyap. Saiki kita duwe robot sing dumadi saka 50 baris kode sing ngasilake laporan tanpa intervensi kita.

Ayo mriksa bot saka kenekanthi milih printah / send.

Carane utusan laporan prasaja menyang robot. Nulis bot ing Python lan Google BigQuery

Sampeyan bisa njaluk kode rampung ing GitHub kula.

Skillbox nyaranake:

Source: www.habr.com

Add a comment