Yadda ake ba da rahotanni masu sauƙi ga mutum-mutumi. Muna rubuta bot a Python da Google BigQuery

Yadda ake ba da rahotanni masu sauƙi ga mutum-mutumi. Muna rubuta bot a Python da Google BigQuery

Kuna da ayyuka da suke maimaita kowace rana, mako bayan mako? Misali, rubuta rahotanni. Kuna buƙatar bayanai, bincika shi, duba shi (yi graphs, charts), sa'an nan kuma aika zuwa ga shugaban ku. Amma idan duk wannan an sarrafa ta atomatik fa?

A cikin wannan koyawa za mu ƙirƙiri bot don Telegram wanda zai taimaka yin rahoto ta atomatik. Kuma mafi kyawun abu shine cewa duk shirin zai ƙunshi layi na 50 kawai! Idan kuna ƙirƙirar bot don Telegram a karon farko, to yakamata ku karanta wannan post.

Skillbox yana ba da shawarar: Hakikanin hanya Python developer daga karce.

Muna tunatarwa: ga duk masu karatu na "Habr" - rangwame na 10 rubles lokacin yin rajista a kowane kwas na Skillbox ta amfani da lambar talla "Habr".

Mu fara

Sanya dakunan karatu

Za mu yi amfani google-cloud-bigquery don samun bayanai daga Google BigQuery. matplotlib, m и pandas zai taimaka muku hango bayanan ku. python-telegram-bot zai aiko da bayanan da aka gama zuwa Telegram.

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

Haɗin Google BigQuery API

Idan muna son amfani da sabis ɗin, muna buƙatar haɗa Google BigQuery API. Don yin wannan za mu je zuwa Google Console Console kuma ƙirƙirar sabon aiki (ko zaɓi wanda yake).

A cikin rukunin sarrafawa, zaɓi ENABLE APIS DA SERVICES kuma nemi BigQuery API.

Yadda ake ba da rahotanni masu sauƙi ga mutum-mutumi. Muna rubuta bot a Python da Google BigQuery

Zaɓi Kunna don haɗa API.

Yadda ake ba da rahotanni masu sauƙi ga mutum-mutumi. Muna rubuta bot a Python da Google BigQuery

Ƙirƙiri maɓallin asusu

Mu sake zuwa Google Console Console, zaɓi shafin Shaida, Ƙirƙiri takaddun shaida da maɓallin asusun sabis.

Sannan - Sabon asusun sabis, kuma shigar da sunan a cikin filin sunan asusun sabis.

Daga jerin abubuwan da aka saukar na rawar aiki, zaɓi Project > Mai shi, sannan Ƙirƙiri.

Yadda ake ba da rahotanni masu sauƙi ga mutum-mutumi. Muna rubuta bot a Python da Google BigQuery

Fayil ɗin da za a sauke ta atomatik ana kiransa creds.json.

Saita GOOGLE_APPLICATION_CREDENTIALS, yana fayyace hanyar creds.json a cikin tasha.

fitarwa GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

Idan komai ya tafi daidai, lokaci yayi da za a fara rubuta shirin.

Ƙirƙirar aikace-aikace

Don koyawa za mu yi amfani da bayanai daga bigquery-public-data.stackoverflow, don rahotonmu za mu zaɓi adadin littattafan yau da kullun.

Komai yana da sauki isa.

Nemi tebur -> Haɓaka bayanan -> Ajiye gani -> Aika hoton

Bari mu ƙirƙiri aiki ɗaya don ayyana kowane zaren.

Tambaya zuwa BigQuery

Da farko muna shigo da ɗakin karatu.

daga google.cloud shigo da bigquery

Mun ƙirƙiri wani aiki mai suna query_to_bigquery, inda ma'aunin shine tambaya.

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

Wannan aikin zai dawo da buƙatun azaman firam ɗin bayanai.

Bayanan gani

Don magance wannan matsalar, zaɓi matplotlib.

shigo da matplotlib.pyplot azaman plt

Muna buƙatar sigogi guda biyar, inda x shine bayanan x-axis, x_label shine take ga axis, y shine bayanan y-axis, y_label shine take ga axis, take kuma shine taken duka gani.

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

Ajiye hoton

Yanzu bari mu yi amfani da ayyuka guda biyu don ƙirƙirar gani da adana shi.

Za mu aika da adadin posts da aka buga kullum. Da farko mun rubuta bukata.

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

Tambayar ta taimaka wajen tattara bayanai na makonni biyu daga Disamba 2, 2018.

Muna amfani da wannan kwanan wata saboda 2018-12-02 shine sabon bayanan da aka yi rikodin a bigquery-public-data.stackoverflow.post_history, a wasu lokuta kuna iya amfani da CURRENT_DATE() don samun sabbin bayanai.

Kira aikin query_to_bigquery don samun bayanan.

dataframe = tambaya_to_bigquery(tambaya)

Sannan muna amfani da ginshiƙin bayanan kwanan wata don x-axis, da jimlar jimlar posts na y-axis.

x = dataframe['kwanan wata'].tolist()
y = tsarin bayanai ['total_posts'].tolist()

Muna hango shi ta amfani da aikin visualize_bar_chart kuma muna adana shi azaman hoto.

pt = visualize_bar_chart (x = x, x_label = 'Kwanan wata', y=y, y_label='Jimillar Posts', take='Sabunta Kullu')
plt.savefig('viz.png')

Mun nade wannan lambar a cikin aikin da ake kira 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')

Aika hoto

Domin aika rahoto ga mai karɓa, kuna buƙatar sanin sigar chat_id.

Muna amfani mai amfani kuma rubuta / farawa. Bot ɗin yana amsawa tare da mahimman bayanan, chat_id yana ƙunshe a cikin filin id.

Yanzu bari mu ƙirƙiri aikin send_image. Zai yi amfani da aikin get_and_save_image don dawo da adana hoton. Sannan mu aika komai zuwa madaidaicin lamba.

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

Babban shirin

A ƙarshe, mun ƙirƙiri wani aiki, babba, don ƙaddamar da aikace-aikacen. Kar a manta canza YOU_TOKEN don bot.

Ka tuna: wannan shirin zai aika hoton ta atomatik a lokacin da ka ƙayyade. Misali, za mu aiko da rahoto da karfe tara na safe kowace rana.

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

A sakamakon haka, aikace-aikacen mu zai kasance kamar haka:

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

Ajiye fayil ɗin kuma kira shi main.py.

Muna ƙaddamar da aikace-aikacen ta shigar da umarni a cikin tashar:

Python3 babban.py

Duk a shirye. Yanzu muna da wani mutum-mutumi wanda ya ƙunshi layukan lamba 50 wanda ke samar da rahotanni ba tare da sa hannunmu ba.

Bari mu duba bot daga nanta zaɓin /aika umarnin.

Yadda ake ba da rahotanni masu sauƙi ga mutum-mutumi. Muna rubuta bot a Python da Google BigQuery

Kuna iya samun ƙãre code a GitHub ku.

Skillbox yana ba da shawarar:

source: www.habr.com

Add a comment