ရိုးရှင်းသော အစီရင်ခံစာများကို စက်ရုပ်သို့ လွှဲအပ်နည်း။ ကျွန်ုပ်တို့သည် Python နှင့် Google BigQuery တွင် bot တစ်ခုကို ရေးသည်။

ရိုးရှင်းသော အစီရင်ခံစာများကို စက်ရုပ်သို့ လွှဲအပ်နည်း။ ကျွန်ုပ်တို့သည် Python နှင့် Google BigQuery တွင် bot တစ်ခုကို ရေးသည်။

တစ်နေ့ပြီးတစ်နေ့ တစ်ပတ်ပြီးတစ်ရက် ပြန်လုပ်ရတဲ့ အလုပ်တွေရှိလား။ ဥပမာ အစီရင်ခံစာတွေရေးတယ်။ သင်သည် ဒေတာတောင်းသည်၊ ၎င်းကို ခွဲခြမ်းစိတ်ဖြာရန်၊ ၎င်းကို မြင်ယောင်ကြည့်ပါ (ဂရပ်များဖန်တီးရန်၊ ဇယားကွက်များပြုလုပ်ရန်) ပြီးနောက် ၎င်းကို သင့်သူဌေးထံ ပေးပို့ပါ။ သို့သော် ဤအရာအားလုံးသည် အလိုအလျောက်ဖြစ်လျှင်ကော။

ဤသင်ခန်းစာတွင် ကျွန်ုပ်တို့သည် အလိုအလျောက်အစီရင်ခံခြင်းကို ကူညီပေးမည့် Telegram အတွက် bot တစ်ခုကို ဖန်တီးပါမည်။ အအေးဆုံးအချက်ကတော့ ပရိုဂရမ်တစ်ခုလုံးမှာ ကုဒ်လိုင်း 50 သာ ပါဝင်မှာ ဖြစ်ပါတယ်။ Telegram အတွက် ပထမဆုံး bot တစ်ခုကို ဖန်တီးနေတယ်ဆိုရင် ဒီတစ်ခုကိုလည်း ဖတ်သင့်ပါတယ်။ တိုင်.

Skillbox မှ အကြံပြုထားသည်- လက်တွေ့သင်တန်း Python developer သည် အစမှစ.

ငါတို့မင်းကိုသတိပေးတယ် "Habr" ၏စာဖတ်သူအားလုံးအတွက် - "Habr" ပရိုမိုးရှင်းကုဒ်ကို အသုံးပြု၍ မည်သည့် Skillbox သင်တန်းတွင်စာရင်းသွင်းသည့်အခါ 10 ရူဘယ်လျှော့စျေး။

စလိုက်ကြစို့

စာကြည့်တိုက်များ တပ်ဆင်ခြင်း။

ငါတို့သုံးမယ် google-cloud-bigquery Google BigQuery မှဒေတာရယူရန်။ ကွမ်းခြံကုန်း, ခုန် и ပန်ဒါ သင်၏ဒေတာကိုမြင်ယောင်ရန်ကူညီလိမ့်မည်။ python-telegram-bot ပြီးပြည့်စုံသောဒေတာကို Telegram သို့ပေးပို့လိမ့်မည်။

pip3 ကို google-cloud-bigquery matplotlib numpy pandas python-telegram-bot ကို ထည့်သွင်းပါ

Google BigQuery API ကို ချိတ်ဆက်နေသည်။

ဝန်ဆောင်မှုကို အသုံးပြုလိုပါက Google BigQuery API ကို ချိတ်ဆက်ရန် လိုအပ်ပါသည်။ ဒါကိုလုပ်ဖို့ ငါတို့သွားမယ်။ Google Developers Console ပရောဂျက်အသစ်တစ်ခု ဖန်တီးပါ (သို့မဟုတ် ရှိပြီးသားတစ်ခုကို ရွေးပါ)။

ထိန်းချုပ်မှုဘောင်တွင်၊ ဖွင့်ရန် APIS နှင့် ဝန်ဆောင်မှုများကို ရွေးချယ်ပြီး BigQuery API ကိုရှာပါ။

ရိုးရှင်းသော အစီရင်ခံစာများကို စက်ရုပ်သို့ လွှဲအပ်နည်း။ ကျွန်ုပ်တို့သည် Python နှင့် Google BigQuery တွင် bot တစ်ခုကို ရေးသည်။

API ကိုချိတ်ဆက်ရန် Enable ကိုရွေးချယ်ပါ။

ရိုးရှင်းသော အစီရင်ခံစာများကို စက်ရုပ်သို့ လွှဲအပ်နည်း။ ကျွန်ုပ်တို့သည် Python နှင့် Google BigQuery တွင် bot တစ်ခုကို ရေးသည်။

အကောင့်သော့တစ်ခုဖန်တီးပါ။

ထပ်သွားရအောင် Google Developers Consoleအထောက်အထားများ တဘ်ကို ရွေးပါ၊ အထောက်အထားများ ဖန်တီးရန်နှင့် ဝန်ဆောင်မှု အကောင့်သော့ကို ရွေးချယ်ပါ။

ထို့နောက် - ဝန်ဆောင်မှုအကောင့်အသစ်၊ ဝန်ဆောင်မှုအကောင့်အမည်အကွက်တွင် အမည်ကို ရိုက်ထည့်ပါ။

Role drop-down list မှ Project > Owner ကို ရွေးပါ၊ ထို့နောက် ဖန်တီးပါ။

ရိုးရှင်းသော အစီရင်ခံစာများကို စက်ရုပ်သို့ လွှဲအပ်နည်း။ ကျွန်ုပ်တို့သည် Python နှင့် Google BigQuery တွင် bot တစ်ခုကို ရေးသည်။

အလိုအလျောက်ဒေါင်းလုဒ်လုပ်မည့်ဖိုင်ကို creds.json ဟုခေါ်သည်။

GOOGLE_APPLICATION_CREDENTIALS ကို သတ်မှတ်ပြီး terminal ရှိ crds.json သို့ လမ်းကြောင်းကို သတ်မှတ်ခြင်း။

GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]' ကို ထုတ်ယူရန်

အားလုံးအဆင်ပြေရင် ပရိုဂရမ်ကို စတင်ရေးဖို့ အချိန်ရောက်ပါပြီ။

အက်ပလီကေးရှင်းတစ်ခုဖန်တီးခြင်း။

သင်ခန်းစာအတွက် ကျွန်ုပ်တို့သည် ကျွန်ုပ်တို့၏အစီရင်ခံစာအတွက် bigquery-public-data.stackoverflow မှဒေတာကိုအသုံးပြုမည်ဖြစ်ပြီး၊ ကျွန်ုပ်တို့၏အစီရင်ခံစာအတွက် နေ့စဉ်ထုတ်ဝေမှုအရေအတွက်ကို ရွေးချယ်ပါမည်။

တော်တော်ရိုးရှင်းပါတယ်

ဇယားကို မေးမြန်းပါ -> ဒေတာကို မြင်ယောင်ခြင်း -> အမြင်အာရုံကို သိမ်းဆည်းပါ -> ပုံကို ပေးပို့ပါ။

thread တစ်ခုစီကို သတ်မှတ်ဖို့ function တစ်ခု ဖန်တီးကြည့်ရအောင်။

BigQuery သို့ မေးမြန်းချက်

အရင်ဆုံး စာကြည့်တိုက်ကို တင်သွင်းပါတယ်။

google.cloud မှ bigquery တင်သွင်းခြင်း။

parameter သည် query ဖြစ်သည့် 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 ကိုရွေးချယ်ပါ။

plt ကဲ့သို့ matplotlib.pyplot ကိုတင်သွင်းပါ

ကျွန်ုပ်တို့သည် ကန့်သတ်ချက်ငါးခု လိုအပ်သည်၊ x သည် 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-ဝင်ရိုးအတွက် ရက်စွဲဒေတာကော်လံနှင့် y-ဝင်ရိုးအတွက် total_posts ကော်လံကို အသုံးပြုသည်။

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

Visualize_bar_chart လုပ်ဆောင်ချက်ကို အသုံးပြု၍ ၎င်းကို မြင်ယောင်ပုံဖော်ပြီး ၎င်းကို ရုပ်ပုံအဖြစ် သိမ်းဆည်းပါ။

plt = visualize_bar_chart(x=x၊ x_label='ရက်စွဲ'၊ y=y၊ y_label='Total Posts'၊ title='Daily Posts')
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 ပြီးလျှင် /start ကိုရိုက်ပါ။ bot သည် လိုအပ်သော အချက်အလက်များဖြင့် တုံ့ပြန်သည်၊ 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'))

အဓိကအစီအစဉ်

နောက်ဆုံးတွင်၊ ကျွန်ုပ်တို့သည် အပလီကေးရှင်းကိုဖွင့်ရန် အခြားလုပ်ဆောင်ချက်တစ်ခု ဖန်တီးသည်။ bot အတွက် 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 လို့ ခေါ်ပါတယ်။

terminal တွင် command ကိုရိုက်ထည့်ခြင်းဖြင့်အပလီကေးရှင်းကိုဖွင့်ပါ။

python3 main.py

အားလုံးအဆင်သင့်ဖြစ်နေပါပြီ။ ယခု ကျွန်ုပ်တို့တွင် ကျွန်ုပ်တို့၏ဝင်ရောက်စွက်ဖက်မှုမရှိဘဲ အစီရင်ခံစာများထုတ်ပေးသည့် ကုဒ်လိုင်း 50 ပါဝင်သော စက်ရုပ်တစ်ခုရှိသည်။

bot ကို စစ်ကြည့်ရအောင် ဒီမှာ/send အမိန့်ကိုရွေးချယ်ခြင်းဖြင့်။

ရိုးရှင်းသော အစီရင်ခံစာများကို စက်ရုပ်သို့ လွှဲအပ်နည်း။ ကျွန်ုပ်တို့သည် Python နှင့် Google BigQuery တွင် bot တစ်ခုကို ရေးသည်။

ပြီးသွားတဲ့ ကုဒ်ကို မှာ ရယူနိုင်ပါတယ်။ ကျွန်ုပ်၏ GitHub.

Skillbox မှ အကြံပြုထားသည်-

source: www.habr.com

မှတ်ချက် Add