روبوٽ کي سادي رپورٽون ڪيئن نمائندو ڪجي. Python ۽ Google BigQuery ۾ هڪ بوٽ لکڻ

روبوٽ کي سادي رپورٽون ڪيئن نمائندو ڪجي. Python ۽ Google BigQuery ۾ هڪ بوٽ لکڻ

ڇا توھان وٽ ڪم آھن جيڪي ورجائيندا آھن ڏينھن کان پوءِ، ھفتي کان پوءِ؟ مثال طور، رپورٽون لکڻ. توھان ڊيٽا جي درخواست ڪريو، ان جو تجزيو ڪريو، ان کي ڏسو (گرافس، چارٽ ٺاھيو)، ۽ پوء اھو پنھنجي باس ڏانھن موڪليو. پر ڇا جيڪڏهن اهو سڀ ڪجهه خودڪار هو؟

هن سبق ۾ اسان ٽيليگرام لاءِ هڪ بوٽ ٺاهينداسين جيڪو خودڪار رپورٽنگ ۾ مدد ڪندو. ۽ سڀ کان سٺي ڳالهه اها آهي ته سڄو پروگرام صرف 50 لائنن جي ڪوڊ تي مشتمل هوندو! جيڪڏهن توهان پهريون ڀيرو ٽيليگرام لاءِ بوٽ ٺاهي رهيا آهيو، ته پوءِ توهان کي اهو به پڙهڻ گهرجي پوسٽ.

Skillbox سفارش ڪري ٿو: عملي ڪورس شروع کان پٿون ڊولپر.

اسان توهان کي ياد ڏياريون ٿا: "Habr" جي سڀني پڙهندڙن لاءِ - 10 روبل جي رعايت جڏهن "Habr" پروموشنل ڪوڊ استعمال ڪندي ڪنهن به اسڪل باڪس ڪورس ۾ داخلا.

اچو ته شروع ڪريون

لائبريريون انسٽال ڪرڻ

اسان استعمال ڪنداسين google-Cloud-bigquery گوگل BigQuery مان ڊيٽا حاصل ڪرڻ لاءِ. ميٽلبليب, اڻ کليل и پاندا توهان جي ڊيٽا کي ڏسڻ ۾ مدد ڪندي. python-telegram-bot ختم ٿيل ڊيٽا موڪليندو ٽيليگرام ڏانهن.

pip3 انسٽال ڪريو google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

Google BigQuery API سان ڳنڍڻ

جيڪڏهن اسان خدمت استعمال ڪرڻ چاهيون ٿا، اسان کي ڳنڍڻ جي ضرورت آهي Google BigQuery API. هن کي ڪرڻ لاء اسان وڃون ٿا گوگل ڊولپرز ڪنسول ۽ هڪ نئون منصوبو ٺاهيو (يا موجوده هڪ چونڊيو).

ڪنٽرول پينل ۾، چونڊيو APIS ۽ خدمتن کي فعال ڪريو ۽ ڏسو BigQuery API.

روبوٽ کي سادي رپورٽون ڪيئن نمائندو ڪجي. Python ۽ Google BigQuery ۾ هڪ بوٽ لکڻ

چونڊيو فعال ڪريو API کي ڳنڍڻ لاءِ.

روبوٽ کي سادي رپورٽون ڪيئن نمائندو ڪجي. Python ۽ Google BigQuery ۾ هڪ بوٽ لکڻ

اڪائونٽ چيڪ ٺاهيو

اچو ته وري هلون گوگل ڊولپرز ڪنسول, منتخب ڪريو سندون ٽيب, ٺاھ جوڙ سندون ۽ سروس اڪائونٽ چيڪ.

پوء - نئون سروس اڪائونٽ، ۽ نالو داخل ڪريو خدمت کاتي جو نالو فيلڊ ۾.

مان رول ڊراپ-ڊائون لسٽ، چونڊيو پروجيڪٽ > مالڪ، پوء ٺاھيو.

روبوٽ کي سادي رپورٽون ڪيئن نمائندو ڪجي. Python ۽ Google BigQuery ۾ هڪ بوٽ لکڻ

فائل جيڪا خودڪار طريقي سان ڊائون لوڊ ڪئي ويندي creds.json سڏيو ويندو آهي.

GOOGLE_APPLICATION_CREDENTIALS سيٽ ڪريو، ٽرمينل ۾ creds.json ڏانهن رستو بيان ڪندي.

برآمد ڪريو GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'

جيڪڏهن سڀ ڪجهه ٺيڪ ٿي ويو، اهو پروگرام لکڻ شروع ڪرڻ جو وقت آهي.

ايپليڪيشن ٺاهڻ

سبق لاءِ اسين استعمال ڪنداسين ڊيٽا bigquery-public-data.stackoverflow، اسان جي رپورٽ لاءِ اسين چونڊ ڪنداسين روزاني اشاعتن جو تعداد.

اهو تمام سادو آهي.

جدول کان سوال ڪريو -> ڊيٽا کي ڏسو -> تصوير محفوظ ڪريو -> تصوير موڪليو

اچو ته هر ٿريڊ کي بيان ڪرڻ لاءِ هڪ فنڪشن ٺاهيو.

BigQuery ڏانهن سوال

پهرين اسان لائبريري درآمد ڪريون ٿا.

google.cloud import 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-axis ڊيٽا آھي، x_label محور لاءِ عنوان آھي، y y-axis ڊيٽا آھي، 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 فنڪشن کي ڪال ڪريو.

dataframe = query_to_bigquery(سوال)

ان کان پوء اسان x-axis لاء تاريخ ڊيٽا ڪالمن، ۽ ڪل_پوسٽ ڪالم y-axis لاء استعمال ڪندا آهيون.

x = dataframe['date'].tolist()
y = ڊيٽا فريم['total_posts'].tolist()

اسان ان کي visualize_bar_chart فنڪشن استعمال ڪندي ڏسو ۽ ان کي تصوير جي طور تي محفوظ ڪيو.

plt = visualize_bar_chart(x=x, x_label='تاريخ', y=y, y_label='مجموعي تحريرون'، عنوان='روزاني پوسٽ')
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 پيٽرول.

اسان استعمال ڪريون ٿا userinfobot ۽ ٽائپ/شروع ڪريو. بوٽ ضروري معلومات سان جواب ڏئي ٿو، 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 لائينون آھن جيڪي اسان جي مداخلت کان سواءِ رپورٽون ٺاھي ٿو.

اچو ته بوٽ چيڪ ڪريو هتي کانمنتخب ڪندي /send حڪم.

روبوٽ کي سادي رپورٽون ڪيئن نمائندو ڪجي. Python ۽ Google BigQuery ۾ هڪ بوٽ لکڻ

توھان حاصل ڪري سگھو ٿا ختم ٿيل ڪوڊ تي منهنجو GitHub.

Skillbox سفارش ڪري ٿو:

جو ذريعو: www.habr.com

تبصرو شامل ڪريو