Hogyan delegáljunk egyszerű jelentéseket egy robotra. Bot írása Pythonban és Google BigQueryben

Hogyan delegáljunk egyszerű jelentéseket egy robotra. Bot írása Pythonban és Google BigQueryben

Vannak olyan feladatai, amelyek napról napra, hétről hétre ismétlődnek? Például jelentések írása. Adatokat kér, elemzi, vizualizálja (grafikonokat, diagramokat készít), majd elküldi a főnökének. De mi lenne, ha mindez automatizált lenne?

Ebben az oktatóanyagban létrehozunk egy botot a Telegram számára, amely segít automatizálni a jelentéseket. A legmenőbb pedig az, hogy a teljes program mindössze 50 sornyi kódból áll majd! Ha először hoz létre botot a Telegram számára, akkor ezt is el kell olvasnia posta.

A Skillbox a következőket ajánlja: Gyakorlati tanfolyam Python fejlesztő a semmiből.

Emlékeztetünk: a "Habr" minden olvasója számára - 10 000 rubel kedvezmény, ha a "Habr" promóciós kóddal bármely Skillbox tanfolyamra jelentkezik.

Kezdjük el

Könyvtárak telepítése

Használni fogjuk google-cloud-bigquery hogy adatokat kapjon a Google BigQuery szolgáltatásból. matplotlib, számtalan и pandák segít az adatok megjelenítésében. python-telegram-bot elküldi a kész adatokat a Telegramnak.

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

A Google BigQuery API csatlakoztatása

Ha használni akarjuk a szolgáltatást, csatlakoztatnunk kell a Google BigQuery API-t. Ehhez megyünk Google Developers Console és hozzon létre egy új projektet (vagy válasszon egy meglévőt).

A vezérlőpulton válassza az API-K ÉS SZOLGÁLTATÁSOK ENGEDÉLYEZÉSE lehetőséget, és keresse meg a BigQuery API-t.

Hogyan delegáljunk egyszerű jelentéseket egy robotra. Bot írása Pythonban és Google BigQueryben

Az API csatlakoztatásához válassza az Engedélyezés lehetőséget.

Hogyan delegáljunk egyszerű jelentéseket egy robotra. Bot írása Pythonban és Google BigQueryben

Hozzon létre egy fiókkulcsot

Menjünk újra Google Developers Console, válassza ki a Hitelesítési adatok lapot, majd a Hitelesítési adatok létrehozása és a szolgáltatásfiók kulcsát.

Ezután – Új szolgáltatásfiók, és írja be a nevet a Szolgáltatásfiók neve mezőbe.

A Szerepkör legördülő listából válassza a Projekt > Tulajdonos, majd a Létrehozás lehetőséget.

Hogyan delegáljunk egyszerű jelentéseket egy robotra. Bot írása Pythonban és Google BigQueryben

Az automatikusan letöltött fájl neve creds.json.

Állítsa be a GOOGLE_APPLICATION_CREDENTIALS alkalmazást, és adja meg a creds.json elérési útját a terminálban.

export GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Ha minden jól ment, ideje elkezdeni a program írását.

Hozzon létre egy alkalmazást

Az oktatóanyaghoz a bigquery-public-data.stackoverflow adatait használjuk, a jelentésünkhöz a napi publikációk számát választjuk ki.

Minden nagyon egyszerű.

A táblázat lekérdezése -> Adatok megjelenítése -> Vizualizáció mentése -> Kép elküldése

Hozzon létre egy függvényt az egyes szálak meghatározásához.

Lekérdezés a BigQuery számára

Először importáljuk a könyvtárat.

a google.cloud import bigquery-ből

Létrehozunk egy query_to_bigquery nevű függvényt, ahol a paraméter a query.

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

Ez a függvény adatkeretként adja vissza a kérést.

Adatok megjelenítése

A probléma megoldásához válassza a Matplotlib lehetőséget.

importálja a matplotlib.pyplot fájlt plt-ként

Öt paraméterre van szükségünk, ahol x az x tengely adata, x_címke a tengely címe, y az y tengely adata, y_címke a tengely címe, cím pedig a teljes vizualizáció címe.

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

Mentse el a képet

Most két függvény segítségével készítsünk vizualizációt és mentsük el.

A megjelent bejegyzések számát naponta elküldjük. Először kérést írunk.

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

A lekérdezés segít 2. december 2018-tól kezdődően két hét adatgyűjtésben.

Azért használjuk ezt a dátumot, mert 2018-12-02 a bigquery-public-data.stackoverflow.post_history fájlban rögzített legfrissebb adat, más esetekben a CURRENT_DATE() segítségével kaphatja meg a legújabb adatokat.

Az adatok lekéréséhez hívja meg a query_to_bigquery függvényt.

adatkeret = query_to_bigquery(query)

Ezután a dátum adatoszlopot használjuk az x tengelyhez, és a total_posts oszlopot az y tengelyhez.

x = adatkeret['dátum'].tolist()
y = dataframe['total_posts'].tolist()

A visualize_bar_chart függvény segítségével vizualizáljuk és képként mentjük el.

plt = visualize_bar_chart(x=x, x_label='Dátum', y=y, y_label='Összes bejegyzés', title='Napi bejegyzés')
plt.savefig('viz.png')

Ezt a kódot a get_and_save_image függvénybe csomagoljuk.

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

Kép küldése

Ahhoz, hogy jelentést küldhessen a címzettnek, ismernie kell a chat_id paramétert.

Használjuk userinfobot és írja be a /start. A bot válaszol a szükséges információkkal, a chat_id az id mezőben található.

Most hozzuk létre a send_image függvényt. A get_and_save_image függvényt fogja használni a kép lekéréséhez és mentéséhez. Ezután mindent elküldünk a megfelelő kapcsolattartónak.

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

Fő program

Végül létrehozunk egy másik funkciót, a fő funkciót az alkalmazás elindításához. Ne felejtse el módosítani a YOUR_TOKEN-t a bothoz.

Ne feledje: ez a program automatikusan elküldi a képet az Ön által megadott időpontban. Például minden nap reggel kilenckor küldünk jelentést.

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

Ennek eredményeként az alkalmazásunk így fog kinézni:

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

Mentse el a fájlt, és nevezze el main.py-nek.

Elindítjuk az alkalmazást a parancs beírásával a terminálba:

python3 main.py

Minden készen áll. Most van egy 50 sornyi kódból álló robotunk, amely a mi beavatkozásunk nélkül készít jelentéseket.

Nézzük meg a botot ezérta /send parancs kiválasztásával.

Hogyan delegáljunk egyszerű jelentéseket egy robotra. Bot írása Pythonban és Google BigQueryben

A kész kódot itt érheti el a GitHubomat.

A Skillbox a következőket ajánlja:

Forrás: will.com

Hozzászólás