ቀላል ሪፖርቶችን ለሮቦት እንዴት ማስተላለፍ እንደሚቻል። በ Python እና Google BigQuery ውስጥ ቦት በመጻፍ ላይ

ቀላል ሪፖርቶችን ለሮቦት እንዴት ማስተላለፍ እንደሚቻል። በ Python እና Google BigQuery ውስጥ ቦት በመጻፍ ላይ

ከቀን ወደ ቀን፣ ከሳምንት ወደ ሳምንት የሚደጋገሙ ስራዎች አሉዎት? ለምሳሌ, ሪፖርቶችን መጻፍ. መረጃን ትጠይቃለህ፣ ተንትነህ፣ በዓይነ ሕሊናህ ተመልከት (ግራፎችን፣ ገበታዎችን አዘጋጅ) እና ከዚያ ወደ አለቃህ ላክ። ግን ይህ ሁሉ በራስ-ሰር ቢሆንስ?

በዚህ ማጠናከሪያ ትምህርት ለቴሌግራም አውቶማቲክ ሪፖርት ማድረግን የሚረዳ ቦቶን እንፈጥራለን። እና በጣም ጥሩው ነገር አጠቃላይ ፕሮግራሙ 50 የኮድ መስመሮችን ብቻ የያዘ መሆኑ ነው! ለቴሌግራም ለመጀመሪያ ጊዜ ቦት እየፈጠሩ ከሆነ ይህንንም ማንበብ አለብዎት ፖስት.

Skillbox ይመክራል፡ ተግባራዊ ኮርስ የ Python ገንቢ ከባዶ.

እኛ እናስታውስዎታለን- ለሁሉም የ "ሀብር" አንባቢዎች - የ "Habr" የማስተዋወቂያ ኮድን በመጠቀም በማንኛውም የ Skillbox ኮርስ ውስጥ ሲመዘገቡ የ 10 ሩብልስ ቅናሽ.

እንደ መጀመር

ቤተ መፃህፍት በመጫን ላይ

እንጠቀማለን ጉግል-ደመና-ቢግኪውሪ ከGoogle BigQuery ውሂብ ለማግኘት። matplotlib, ደብዛዛ и ፓናስ ውሂብህን በዓይነ ሕሊናህ እንድትታይ ይረዳሃል። ፓይቶን-ቴሌግራም-ቦት የተጠናቀቀውን መረጃ ወደ ቴሌግራም ይልካል።

pip3 ጫን ጉግል-ክላውድ-ቢግquery matplotlib numpy pandas python-telegram-bot

Google BigQuery API በማገናኘት ላይ

አገልግሎቱን መጠቀም ከፈለግን ጎግል BigQuery API ማገናኘት አለብን። ይህንን ለማድረግ ወደ እኛ እንሄዳለን የ Google ገንቢዎች መሥሪያ እና አዲስ ፕሮጀክት ይፍጠሩ (ወይም ነባሩን ይምረጡ)።

በመቆጣጠሪያ ፓኔል ውስጥ ኤፒአይኤስን እና አገልግሎቶችን አንቃ የሚለውን ይምረጡ እና BigQuery API ን ይፈልጉ።

ቀላል ሪፖርቶችን ለሮቦት እንዴት ማስተላለፍ እንደሚቻል። በ Python እና Google BigQuery ውስጥ ቦት በመጻፍ ላይ

ኤፒአይን ለማገናኘት አንቃን ይምረጡ።

ቀላል ሪፖርቶችን ለሮቦት እንዴት ማስተላለፍ እንደሚቻል። በ Python እና Google BigQuery ውስጥ ቦት በመጻፍ ላይ

የመለያ ቁልፍ ፍጠር

እንደገና እንሂድ የ Google ገንቢዎች መሥሪያ, ምስክርነቶች የሚለውን ትር ይምረጡ, ምስክርነቶችን ይፍጠሩ እና የአገልግሎት መለያ ቁልፍ.

ከዚያ - አዲስ የአገልግሎት መለያ, እና በአገልግሎት መለያ ስም መስክ ውስጥ ስሙን ያስገቡ.

ከሚና ተቆልቋይ ዝርዝር ውስጥ ፕሮጄክት > ባለቤት የሚለውን ምረጥ ከዚያም ፍጠር።

ቀላል ሪፖርቶችን ለሮቦት እንዴት ማስተላለፍ እንደሚቻል። በ Python እና Google BigQuery ውስጥ ቦት በመጻፍ ላይ

በራስ ሰር የሚወርደው ፋይል creds.json ይባላል።

በተርሚናል ውስጥ ወደ creds.json የሚወስደውን መንገድ በመግለጽ GOOGLE_APPLICATION_CREDENTIALS ያቀናብሩ።

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-ዘንግ ዳታ፣ x_label የዘንግ ርዕስ፣ 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 ተግባር ይደውሉ።

የውሂብ ፍሬም = መጠይቅ_ወደ_ትልቅ መጠይቅ(ጥያቄ)

ከዚያም የቀን ውሂብ አምድ ለ x-ዘንግ፣ እና ጠቅላላ_ፖስቶች አምድ ለy-ዘንግ እንጠቀማለን።

x = የውሂብ ፍሬም ['ቀን']።tolist()
y = የውሂብ ፍሬም['total_posts'].tolist()

ምስላዊ_አሞሌ_ቻርት ተግባርን በመጠቀም እናየዋለን እና እንደ ምስል እናስቀምጠዋለን።

plt = ምስላዊ_ባር_ቻርት (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')

ምስል ላክ

ሪፖርት ለተቀባዩ ለመላክ የቻት_id መለኪያውን ማወቅ አለቦት።

እንጠቀማለን userinfobot እና ይተይቡ / ጀምር. ቦቱ አስፈላጊውን መረጃ ይሰጣል፣ chat_id በመታወቂያው መስክ ውስጥ ይገኛል።

አሁን የመላክ_ምስል ተግባርን እንፍጠር። ምስሉን ለማውጣት እና ለማስቀመጥ የማግኘት_እና_ማስቀመጥ_ተግባርን ይጠቀማል። እና ከዚያ ሁሉንም ነገር ወደ ትክክለኛው አድራሻ እንልካለን.

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 ዋና.py

ሁሉም ዝግጁ ነው። አሁን ያለእኛ ጣልቃገብነት ሪፖርቶችን የሚያመነጭ 50 የኮድ መስመሮችን የያዘ ሮቦት አለን።

ቦቱን እንፈትሽ እዚህየ/መላክ ትዕዛዙን በመምረጥ።

ቀላል ሪፖርቶችን ለሮቦት እንዴት ማስተላለፍ እንደሚቻል። በ Python እና Google BigQuery ውስጥ ቦት በመጻፍ ላይ

የተጠናቀቀውን ኮድ በ ላይ ማግኘት ይችላሉ። የእኔ GitHub.

Skillbox ይመክራል፡

ምንጭ: hab.com

አስተያየት ያክሉ