نحوه واگذاری گزارش های ساده به یک ربات ما یک ربات در پایتون و گوگل BigQuery می نویسیم

نحوه واگذاری گزارش های ساده به یک ربات ما یک ربات در پایتون و گوگل BigQuery می نویسیم

آیا کارهایی دارید که روز به روز، هفته به هفته تکرار می شوند؟ مثلا نوشتن گزارش. داده‌ها را درخواست می‌کنید، آن‌ها را تجزیه و تحلیل می‌کنید، آن‌ها را تجسم می‌کنید (نمودار، نمودار می‌سازید)، و سپس آن را برای رئیس خود می‌فرستید. اما اگر همه اینها خودکار بود چه؟

در این آموزش ما یک ربات برای تلگرام ایجاد می کنیم که به خودکار کردن گزارش کمک می کند. و جالب ترین چیز این است که کل برنامه فقط از 50 خط کد تشکیل شده است! اگر برای اولین بار است که یک ربات برای تلگرام ایجاد می کنید، باید این یکی را نیز بخوانید ارسال.

Skillbox توصیه می کند: دوره عملی توسعه دهنده پایتون از ابتدا.

یادآوری می کنیم: برای همه خوانندگان "Habr" - تخفیف 10 روبل هنگام ثبت نام در هر دوره Skillbox با استفاده از کد تبلیغاتی "Habr".

بیا شروع کنیم

نصب کتابخانه ها

ما استفاده خواهیم کرد google-cloud-bigquery برای دریافت داده از Google BigQuery. ماتپلوتلب, بی حس и پانداها به شما کمک می کند تا داده های خود را تجسم کنید. پایتون-تلگرام-ربات اطلاعات نهایی را به تلگرام ارسال می کند.

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

اتصال Google BigQuery API

اگر بخواهیم از این سرویس استفاده کنیم، باید Google BigQuery API را متصل کنیم. برای انجام این کار به Google Developers Console و یک پروژه جدید ایجاد کنید (یا یک پروژه موجود را انتخاب کنید).

در کنترل پنل، ENABLE APIS AND SERVICES را انتخاب کنید و به دنبال BigQuery API بگردید.

نحوه واگذاری گزارش های ساده به یک ربات ما یک ربات در پایتون و گوگل BigQuery می نویسیم

برای اتصال API گزینه Enable را انتخاب کنید.

نحوه واگذاری گزارش های ساده به یک ربات ما یک ربات در پایتون و گوگل BigQuery می نویسیم

یک کلید حساب ایجاد کنید

دوباره بریم سراغ Google Developers Console، برگه اعتبارنامه ها، Create credentials و Service key account account را انتخاب کنید.

سپس - New service account و نام را در قسمت Service account name وارد کنید.

از لیست کشویی Role، Project > Owner و سپس Create را انتخاب کنید.

نحوه واگذاری گزارش های ساده به یک ربات ما یک ربات در پایتون و گوگل 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 ایجاد می کنیم که پارامتر آن query است.

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، 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 را فراخوانی کنید.

dataframe = query_to_bigquery (query)

سپس از ستون داده تاریخ برای محور x و از ستون total_posts برای محور y استفاده می کنیم.

x = dataframe['date'].tolist()
y = dataframe['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 و /start را تایپ کنید. ربات با اطلاعات لازم پاسخ می دهد، 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'))

برنامه اصلی

در نهایت، ما یک تابع دیگر، main، برای راه اندازی برنامه ایجاد می کنیم. فراموش نکنید که 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.

نحوه واگذاری گزارش های ساده به یک ربات ما یک ربات در پایتون و گوگل BigQuery می نویسیم

می توانید کد تمام شده را در این آدرس دریافت کنید GitHub من.

Skillbox توصیه می کند:

منبع: www.habr.com

اضافه کردن نظر