Hvernig á að framselja einfaldar skýrslur til vélmenni. Að skrifa vélmenni í Python og Google BigQuery

Hvernig á að framselja einfaldar skýrslur til vélmenni. Að skrifa vélmenni í Python og Google BigQuery

Ertu með verkefni sem endurtaka sig dag eftir dag, viku eftir viku? Til dæmis að skrifa skýrslur. Þú biður um gögn, greinir þau, sérð þau fyrir sér (gerir línurit, töflur) og sendir þau síðan til yfirmanns þíns. En hvað ef allt þetta væri sjálfvirkt?

Í þessari kennslu munum við búa til vélmenni fyrir Telegram sem mun hjálpa til við að gera skýrslugerð sjálfvirkan. Og það flottasta er að allt forritið mun samanstanda af aðeins 50 línum af kóða! Ef þú ert að búa til vélmenni fyrir Telegram í fyrsta skipti, þá ættirðu líka að lesa þennan staða.

Skillbox mælir með: Verklegt námskeið Python verktaki frá grunni.

Við minnum á: fyrir alla Habr lesendur - 10 rúblur afsláttur þegar þú skráir þig á hvaða Skillbox námskeið sem er með því að nota Habr kynningarkóðann.

Byrjum

Að setja upp bókasöfn

Við munum nota google-ský-bigquery til að fá gögn frá Google BigQuery. matplotlib, dofinn и pöndur mun hjálpa þér að sjá gögnin þín. python-telegram-bot mun senda fullunnin gögn til Telegram.

pip3 setja upp google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

Tengist Google BigQuery API

Ef við viljum nota þjónustuna þurfum við að tengja Google BigQuery API. Til að gera þetta förum við til Google Developers Console og búðu til nýtt verkefni (eða veldu það sem fyrir er).

Í stjórnborðinu skaltu velja VIRKA APIS OG ÞJÓNUSTU og leita að BigQuery API.

Hvernig á að framselja einfaldar skýrslur til vélmenni. Að skrifa vélmenni í Python og Google BigQuery

Veldu Virkja til að tengja API.

Hvernig á að framselja einfaldar skýrslur til vélmenni. Að skrifa vélmenni í Python og Google BigQuery

Búðu til reikningslykil

Við skulum fara aftur Google Developers Console, veldu flipann Skilríki, Búa til skilríki og Þjónustureikningslykill.

Síðan - Nýr þjónustureikningur og sláðu inn nafnið í reitinn Heiti þjónustureiknings.

Í fellilistanum Hlutverk skaltu velja Verk > Eigandi og síðan Búa til.

Hvernig á að framselja einfaldar skýrslur til vélmenni. Að skrifa vélmenni í Python og Google BigQuery

Skráin sem verður sjálfkrafa hlaðið niður heitir creds.json.

Stilltu GOOGLE_APPLICATION_CREDENTIALS, tilgreindu slóðina að creds.json í flugstöðinni.

flytja GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Ef allt gekk vel er kominn tími til að byrja að skrifa prógrammið.

Að búa til forrit

Fyrir kennsluna munum við nota gögn frá bigquery-public-data.stackoverflow, fyrir skýrsluna okkar munum við velja fjölda daglegra rita.

Það er frekar einfalt.

Spurðu töfluna -> Sýndu gögnin -> Vistaðu sjónmyndina -> Sendu myndina

Við skulum búa til eina aðgerð til að skilgreina hvern þráð.

Fyrirspurn til BigQuery

Fyrst flytjum við inn bókasafnið.

frá google.cloud import bigquery

Við búum til fall sem kallast query_to_bigquery, þar sem færibreytan er query.

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

Þessi aðgerð mun skila beiðninni sem gagnarammi.

Sjónræn gögn

Til að leysa þetta vandamál skaltu velja matplotlib.

flytja inn matplotlib.pyplot sem plt

Við þurfum fimm breytur, þar sem x er x-ás gögnin, x_label er titill áss, y er y-ás gögn, y_label er titill áss og titill er titill allrar sjónmyndarinnar.

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

Vistaðu myndina

Nú skulum við nota tvær aðgerðir til að búa til sjónmynd og vista hana.

Við munum senda fjölda pósta sem birtar eru daglega. Fyrst skrifum við beiðni.

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

Fyrirspurnin hjálpar til við að safna gögnum í tvær vikur frá og með 2. desember 2018.

Við notum þessa dagsetningu vegna þess að 2018-12-02 eru nýjustu gögnin skráð í bigquery-public-data.stackoverflow.post_history, í öðrum tilvikum geturðu notað CURRENT_DATE() til að fá nýjustu gögnin.

Hringdu í query_to_bigquery aðgerðina til að fá gögnin.

gagnarammi = query_to_bigquery(query)

Síðan notum við dagsetningardálkinn fyrir x-ásinn og dálkinn total_posts fyrir y-ásinn.

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

Við sjáum það fyrir okkur með visualize_bar_chart aðgerðinni og vistum það sem mynd.

plt = visualize_bar_chart(x=x, x_label='Date', y=y, y_label='Heildar færslur', title='Daglegar færslur')
plt.savefig('viz.png')

Við vefjum þessum kóða inn í fall sem kallast 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')

Sendu mynd

Til þess að senda skýrslu til viðtakanda þarftu að vita færibreytuna chat_id.

Við notum userinfobot og sláðu inn /start. Botni svarar með nauðsynlegum upplýsingum, chat_id er að finna í id reitnum.

Nú skulum við búa til send_image aðgerðina. Það mun nota get_and_save_image aðgerðina til að sækja og vista myndina. Og svo sendum við allt á réttan tengilið.

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

Aðaldagskrá

Að lokum búum við til aðra aðgerð, aðal, til að ræsa forritið. Ekki gleyma að breyta YOUR_TOKEN fyrir vélmenni.

Mundu: þetta forrit mun senda myndina sjálfkrafa á þeim tíma sem þú tilgreinir. Til dæmis munum við senda skýrslu klukkan níu á morgnana alla daga.

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

Fyrir vikið mun umsókn okkar líta svona út:

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

Vistaðu skrána og kallaðu hana main.py.

Við ræsum forritið með því að slá inn skipunina í flugstöðinni:

python3 main.py

Allt er tilbúið. Nú erum við með vélmenni sem samanstendur af 50 línum af kóða sem býr til skýrslur án afskipta okkar.

Við skulum athuga bot þess vegnameð því að velja /send skipunina.

Hvernig á að framselja einfaldar skýrslur til vélmenni. Að skrifa vélmenni í Python og Google BigQuery

Þú getur fengið klára kóðann á GitHub minn.

Skillbox mælir með:

Heimild: www.habr.com

Bæta við athugasemd