Momwe mungagawire malipoti osavuta ku robot. Kulemba bot mu Python ndi Google BigQuery

Momwe mungagawire malipoti osavuta ku robot. Kulemba bot mu Python ndi Google BigQuery

Kodi muli ndi ntchito zomwe zimabwereza tsiku ndi tsiku, sabata ndi sabata? Mwachitsanzo, kulemba malipoti. Mumapempha deta, kusanthula, kuwona m'maganizo (pangani ma graph, ma chart), ndiyeno tumizani kwa abwana anu. Koma bwanji ngati zonsezi zidangochitika zokha?

Mu phunziro ili tipanga bot ya Telegalamu yomwe ingathandize kuchitira malipoti. Ndipo chozizira kwambiri ndi chakuti pulogalamu yonseyi idzakhala ndi mizere 50 yokha ya code! Ngati mukupanga bot ya Telegraph kwa nthawi yoyamba, ndiye kuti muyeneranso kuwerenga iyi positi.

Skillbox imalimbikitsa: Njira yothandiza Wopanga Python kuyambira poyambira.

Tikukukumbutsani: kwa owerenga onse a Habr - kuchotsera ma ruble 10 polembetsa maphunziro aliwonse a Skillbox pogwiritsa ntchito nambala yotsatsira ya Habr.

Tiyeni tiyambe

Kukhazikitsa malaibulale

Tidzagwiritsa ntchito google-cloud-bigquery kuti mupeze deta kuchokera ku Google BigQuery. matloti, osasamala и panda zikuthandizani kuti muwonetsetse deta yanu. python-telegram-bot adzatumiza zomwe zamalizidwa ku Telegraph.

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

Kulumikiza Google BigQuery API

Ngati tikufuna kugwiritsa ntchito ntchitoyi, tifunika kulumikiza API ya Google BigQuery. Kuti tichite izi timapita Google Developers Console ndi kupanga pulojekiti yatsopano (kapena sankhani yomwe ilipo).

Mugawo lowongolera, sankhani THANDIZANI APIS NDI SERVICES ndikuyang'ana BigQuery API.

Momwe mungagawire malipoti osavuta ku robot. Kulemba bot mu Python ndi Google BigQuery

Sankhani Yambitsani kulumikiza API.

Momwe mungagawire malipoti osavuta ku robot. Kulemba bot mu Python ndi Google BigQuery

Pangani kiyi ya akaunti

Tiyeni tipitenso Google Developers Console, sankhani tabu ya Credentials, Pangani zidziwitso ndi kiyi ya akaunti ya Service.

Ndiye - Akaunti Yatsopano yautumiki, ndikulowetsa dzina mu gawo la dzina la akaunti ya Service.

Kuchokera pamndandanda wotsitsa wa Maudindo, sankhani Project> Mwini, kenako Pangani.

Momwe mungagawire malipoti osavuta ku robot. Kulemba bot mu Python ndi Google BigQuery

Fayilo yomwe idzatsitsidwe yokha imatchedwa creds.json.

Khazikitsani GOOGLE_APPLICATION_CREDENTIALS, kufotokoza njira yopita ku creds.json patheshoni.

tumizani kunja GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Ngati zonse zidayenda bwino, ndi nthawi yoti muyambe kulemba pulogalamuyi.

Kupanga pulogalamu

Pa phunziroli tidzagwiritsa ntchito deta kuchokera ku bigquery-public-data.stackoverflow, pa lipoti lathu tidzasankha chiwerengero cha zofalitsa za tsiku ndi tsiku.

Zonse ndi zophweka.

Fufuzani patebulo -> Onani m'maganizo -> Sungani zowonera -> Tumizani chithunzicho

Tiyeni tipange ntchito imodzi kuti tifotokoze ulusi uliwonse.

Funso ku BigQuery

Choyamba timaitanitsa laibulale.

kuchokera ku google.cloud import bigquery

Timapanga ntchito yotchedwa query_to_bigquery, pomwe gawo ndi funso.

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

Ntchitoyi idzabwezera pempho ngati data frame.

Kuwona deta

Kuti muthetse vutoli, sankhani matplotlib.

tumizani matplotlib.pyplot ngati plt

Timafunikira magawo asanu, pomwe x ndi data ya x-axis, x_label ndiye mutu wa axis, y ndi data ya y-axis, y_label ndiye mutu wa axis, ndipo mutu ndi mutu wa chiwonetsero chonse.

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

Sungani chithunzicho

Tsopano tiyeni tigwiritse ntchito ntchito ziwiri kuti tipange zowonera ndikuzisunga.

Tikutumizirani kuchuluka kwa zolemba zomwe zimasindikizidwa tsiku lililonse. Choyamba timalemba pempho.

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

Funsoli limathandizira kusonkhanitsa deta kwa milungu iwiri kuyambira pa Disembala 2, 2018.

Timagwiritsa ntchito tsikuli chifukwa 2018-12-02 ndi data yaposachedwa kwambiri yojambulidwa mu bigquery-public-data.stackoverflow.post_history, nthawi zina mutha kugwiritsa ntchito CURRENT_DATE() kuti mupeze zatsopano.

Imbani query_to_bigquery kuti mupeze zambiri.

dataframe = query_to_bigquery(funso)

Kenako timagwiritsa ntchito gawo la data la x-axis, ndi total_posts column ya y-axis.

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

Timaziwona pogwiritsa ntchito visualize_bar_chart ndikusunga ngati chithunzi.

plt = visualize_bar_chart(x=x, x_label='Tsiku', y=y, y_label='Zolemba Zonse', title='Zolemba Tsiku ndi Tsiku')
plt.savefig('viz.png')

Timakulunga code iyi mu ntchito yotchedwa 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')

Tumizani chithunzi

Kuti mutumize lipoti kwa wolandira, muyenera kudziwa chat_id parameter.

Timagwiritsa ntchito userinfobot ndi lembani /kuyamba. Bot imayankha ndi zofunikira, chat_id ili m'munda wa id.

Tsopano tiyeni tipange send_image ntchito. Idzagwiritsa ntchito get_and_save_image kuti itenge ndikusunga chithunzicho. Ndiyeno timatumiza chirichonse kwa kukhudzana kolondola.

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

Pulogalamu yayikulu

Pomaliza, timapanga ntchito ina, yayikulu, kuyambitsa pulogalamuyi. Osayiwala kusintha YOUR_TOKEN pa bot.

Kumbukirani: pulogalamuyi idzatumiza chithunzicho nthawi yomweyo. Mwachitsanzo, timatumiza lipoti XNUMX koloko m’maŵa tsiku lililonse.

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

Zotsatira zake, pulogalamu yathu idzawoneka motere:

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

Sungani fayilo ndikuyitcha main.py.

Timatsegula pulogalamuyi polowetsa lamulo mu terminal:

python3 main.py

Zonse zakonzeka. Tsopano tili ndi robot yokhala ndi mizere ya 50 ya code yomwe imapanga malipoti popanda kulowererapo kwathu.

Tiyeni tiwone bot kuchokera panoposankha / kutumiza lamulo.

Momwe mungagawire malipoti osavuta ku robot. Kulemba bot mu Python ndi Google BigQuery

Mutha kupeza code yomalizidwa GitHub yanga.

Skillbox imalimbikitsa:

Source: www.habr.com

Kuwonjezera ndemanga