څنګه روبوټ ته ساده راپورونه واستوئ. موږ په Python او Google BigQuery کې یو بوټ لیکو

څنګه روبوټ ته ساده راپورونه واستوئ. موږ په Python او Google BigQuery کې یو بوټ لیکو

ایا تاسو داسې دندې لرئ چې ورځ په ورځ تکرار کړئ، اونۍ وروسته اونۍ؟ د مثال په توګه، راپورونه لیکل. تاسو د معلوماتو غوښتنه کوئ، تحلیل یې کړئ، لیدل یې کړئ (ګرافونه، چارټونه جوړ کړئ) او بیا یې خپل مالک ته واستوئ. مګر که دا ټول اتومات وي؟

پدې لوست کې به موږ د ټیلیګرام لپاره یو بوټ جوړ کړو چې د اتوماتیک راپور ورکولو کې به مرسته وکړي. او ترټولو ښه شی دا دی چې ټول برنامه به د کوډ یوازې 50 لینونه ولري! که تاسو د لومړي ځل لپاره د ټیلیګرام لپاره بوټ رامینځته کوئ ، نو تاسو باید دا هم ولولئ پوسته.

Skillbox وړاندیز کوي: عملي کورس د پیل څخه د پایتون پراختیا کونکی.

موږ یادونه کوو: د ټولو هابر لوستونکو لپاره - د 10 روبل تخفیف کله چې د هابر پرومو کوډ په کارولو سره د مهارت بکس کوم کورس کې نوم لیکنه وکړئ.

راځه چي پیل یی کړو

د کتابتونونو نصبول

موږ به وکاروو google-Cloud-bigquery د ګوګل BigQuery څخه ډاټا ترلاسه کولو لپاره. میټپلوټلیب, نیمه и پانډا ستاسو د معلوماتو لیدو کې به مرسته وکړي. python-telegram-bot بشپړ شوي معلومات به ټیلیګرام ته واستوي.

pip3 google-cloud-bigquery matplotlib numpy pandas python-telegram-bot نصب کړئ

د Google BigQuery API سره نښلول

که موږ غواړو خدمت وکاروو، موږ اړتیا لرو چې د Google BigQuery API سره وصل کړو. د دې کولو لپاره موږ ځو د Google پراختیایی کنسول او یوه نوې پروژه جوړه کړئ (یا موجوده یوه غوره کړئ).

په کنټرول پینل کې، د APIs او خدماتو فعالول غوره کړئ او د BigQuery API لپاره وګورئ.

څنګه روبوټ ته ساده راپورونه واستوئ. موږ په Python او Google BigQuery کې یو بوټ لیکو

د API سره نښلولو لپاره فعال کړئ غوره کړئ.

څنګه روبوټ ته ساده راپورونه واستوئ. موږ په Python او Google BigQuery کې یو بوټ لیکو

د حساب کیلي جوړه کړئ

راځئ چې بیا لاړ شو د Google پراختیایی کنسول، د اعتباراتو ټب غوره کړئ ، د اعتبار او خدماتو حساب کیلي رامینځته کړئ.

بیا - د نوي خدماتو حساب، او د خدماتو حساب نوم ساحه کې نوم دننه کړئ.

د رول ډراپ-ډاون لیست څخه، پروژه> مالک غوره کړئ، بیا جوړ کړئ.

څنګه روبوټ ته ساده راپورونه واستوئ. موږ په Python او Google BigQuery کې یو بوټ لیکو

هغه فایل چې په اوتومات ډول ډاونلوډ کیږي creds.json نومیږي.

GOOGLE_APPLICATION_CREDENTIALS تنظیم کړئ، په ټرمینل کې creds.json ته لاره مشخص کړئ.

صادر کړئ GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

که هرڅه سم وي، دا د پروګرام لیکلو وخت دی.

د غوښتنلیک جوړول

د ټیوټوریل لپاره به موږ د bigquery-public-data.stackoverflow ډیټا وکاروو، زموږ د راپور لپاره به موږ د ورځني خپرونو شمیر وټاکو.

هرڅه خورا ساده دي.

د میز څخه پوښتنه وکړئ -> ډیټا لید کړئ -> لید خوندي کړئ -> عکس واستوئ

راځئ چې د هر تار تعریف کولو لپاره یو فنکشن جوړ کړو.

BigQuery ته پوښتنه

لومړی موږ کتابتون واردوو.

د google.cloud څخه د bigquery وارد کړئ

موږ د query_to_bigquery په نوم یو فنکشن رامینځته کوو ، چیرې چې پیرامیټر پوښتنه ده.

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

دا فنکشن به غوښتنه د ډیټا چوکاټ په توګه بیرته راولي.

د معلوماتو لید

د دې ستونزې د حل لپاره، matplotlib غوره کړئ.

matplotlib.pyplot د plt په توګه وارد کړئ

موږ پنځه پیرامیټرو ته اړتیا لرو، چیرته چې x د ایکس محور ډاټا ده، x_label د محور لپاره سرلیک دی، y د y محور ډاټا دی، y_label د محور لپاره سرلیک دی، او سرلیک د ټول لید سرلیک دی.

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

انځور خوندي کړئ

اوس راځئ چې د لید جوړولو لپاره دوه افعال وکاروو او خوندي یې کړو.

موږ به هره ورځ د خپرو شویو پوسټونو شمیر واستوو. لومړی موږ یوه غوښتنه لیکو.

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

دا پوښتنه د دسمبر 2، 2018 څخه د دوو اونیو لپاره د معلوماتو راټولولو کې مرسته کوي.

موږ دا نیټه کاروو ځکه چې 2018-12-02 وروستي ډاټا دي چې په bigquery-public-data.stackoverflow.post_history کې ثبت شوي، په نورو قضیو کې تاسو کولی شئ د نوي ډیټا ترلاسه کولو لپاره CURRENT_DATE() وکاروئ.

د معلوماتو ترلاسه کولو لپاره query_to_bigquery فنکشن ته زنګ ووهئ.

ډیټا فریم = query_to_bigquery(پوښتنه)

بیا موږ د x-axis لپاره د نیټې ډیټا کالم کاروو، او د y-axis لپاره د ټول_پوسټ کالم.

x = ډاټا فریم['date'].tolist()
y = ډیټا فریم['total_posts'].tolist()

موږ دا د visualize_bar_chart فنکشن په کارولو سره تصور کوو او د عکس په توګه یې خوندي کوو.

plt = visualize_bar_chart(x=x, x_label='Date', y=y, y_label='ټول پوسټونه', title='ورځني پوسټونه')
plt.savefig('viz.png')

موږ دا کوډ د 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')

یو انځور ولېږئ

ترلاسه کونکي ته د راپور لیږلو لپاره ، تاسو اړتیا لرئ د chat_id پیرامیټر پوه شئ.

مونږ تری ګټه پورته کوو د کارن معلومات بوټ او ټایپ / پیل کړئ. بوټ د اړینو معلوماتو سره ځواب ورکوي، chat_id د ID په ساحه کې شتون لري.

اوس راځئ چې د send_image فنکشن جوړ کړو. دا به د عکس ترلاسه کولو او خوندي کولو لپاره get_and_save_image فنکشن وکاروي. او بیا موږ هرڅه سمې اړیکې ته لیږو.

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

اصلي پروګرام

په نهایت کې ، موږ یو بل فعالیت رامینځته کوو ، اصلي ، د غوښتنلیک پیل کولو لپاره. د بوټو لپاره د YOUR_TOKEN بدلول مه هیروئ.

په یاد ولرئ: دا برنامه به عکس په اوتومات ډول په هغه وخت کې واستوي چې تاسو یې مشخص کوئ. د مثال په توګه، موږ به هره ورځ د سهار په نهو بجو یو راپور واستوو.

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

د پایلې په توګه، زموږ غوښتنلیک به داسې ښکاري:

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

فایل خوندي کړئ او main.py ته زنګ ووهئ.

موږ په ترمینل کې د کمانډ دننه کولو سره غوښتنلیک پیل کوو:

python3 main.py

ټول چمتو دي. اوس موږ یو روبوټ لرو چې د کوډ 50 کرښې لري چې زموږ له مداخلې پرته راپورونه چمتو کوي.

راځئ چې بوټ وګورو له دې ځایهد / لیږلو کمانډ په غوره کولو سره.

څنګه روبوټ ته ساده راپورونه واستوئ. موږ په Python او Google BigQuery کې یو بوټ لیکو

تاسو کولی شئ بشپړ شوی کوډ ترلاسه کړئ زما GitHub.

Skillbox وړاندیز کوي:

سرچینه: www.habr.com

Add a comment