රොබෝවෙකුට සරල වාර්තා පවරන ආකාරය. Python සහ Google BigQuery හි bot එකක් ලිවීම

රොබෝවෙකුට සරල වාර්තා පවරන ආකාරය. Python සහ Google BigQuery හි bot එකක් ලිවීම

ඔබට දිනෙන් දින, සතියෙන් සතිය පුනරාවර්තනය වන කාර්යයන් තිබේද? උදාහරණයක් ලෙස, වාර්තා ලිවීම. ඔබ දත්ත ඉල්ලන්න, එය විශ්ලේෂණය කරන්න, එය දෘශ්‍යමාන කරන්න (ප්‍රස්තාර, ප්‍රස්ථාර සාදන්න), ඉන්පසු එය ඔබේ ප්‍රධානියාට යවන්න. නමුත් මේ සියල්ල ස්වයංක්රීය නම්?

මෙම නිබන්ධනයේදී අපි Telegram සඳහා bot එකක් සාදනු ඇත, එය වාර්තා කිරීම ස්වයංක්‍රීය කිරීමට උපකාරී වේ. හොඳම දෙය නම් සම්පූර්ණ වැඩසටහන සමන්විත වන්නේ කේත පේළි 50 කින් පමණි! ඔබ පළමු වරට ටෙලිග්‍රාම් සඳහා බොට් එකක් නිර්මාණය කරන්නේ නම්, ඔබ මෙයද කියවිය යුතුය තනතුර.

Skillbox නිර්දේශ කරයි: ප්රායෝගික පාඨමාලාව මුල සිට පයිතන් සංවර්ධකයා.

අපි ඔබට මතක් කරමු: "Habr" හි සියලුම පාඨකයින් සඳහා - "Habr" ප්‍රවර්ධන කේතය භාවිතයෙන් ඕනෑම Skillbox පාඨමාලාවකට ලියාපදිංචි වන විට රූබල් 10 ක වට්ටමක්.

අපි පටන් ගනිමු

පුස්තකාල ස්ථාපනය කිරීම

අපි භාවිතා කරන්නෙමු google-Cloud-bigquery Google BigQuery වෙතින් දත්ත ලබා ගැනීමට. matplotlib, අංක и පැන්ඩා ඔබගේ දත්ත දෘශ්‍යමාන කිරීමට ඔබට උපකාර කරනු ඇත. python-telegram-bot අවසන් දත්ත Telegram වෙත යවනු ඇත.

pip3 google-Cloud-bigquery matplotlib numpy pandas python-telegram-bot ස්ථාපනය කරන්න

Google BigQuery API සම්බන්ධ කරමින්

අපට සේවාව භාවිතා කිරීමට අවශ්‍ය නම්, අපි Google BigQuery API සම්බන්ධ කළ යුතුය. මෙය සිදු කිරීම සඳහා අපි යන්නෙමු ගූගල් සංවර්ධක කොන්සෝලය සහ නව ව්‍යාපෘතියක් සාදන්න (හෝ පවතින එකක් තෝරන්න).

පාලක පැනලයේ, ENABLE APIS සහ SERVICES තෝරන්න සහ BigQuery API සොයන්න.

රොබෝවෙකුට සරල වාර්තා පවරන ආකාරය. Python සහ Google BigQuery හි bot එකක් ලිවීම

API සම්බන්ධ කිරීමට සබල කරන්න තෝරන්න.

රොබෝවෙකුට සරල වාර්තා පවරන ආකාරය. Python සහ Google BigQuery හි bot එකක් ලිවීම

ගිණුම් යතුරක් සාදන්න

අපි නැවත යමු ගූගල් සංවර්ධක කොන්සෝලය, අක්තපත්‍ර පටිත්ත තෝරන්න, අක්තපත්‍ර සාදන්න සහ සේවා ගිණුම් යතුර.

ඉන්පසු - නව සේවා ගිණුම, සහ සේවා ගිණුමේ නම ක්ෂේත්රයේ නම ඇතුළත් කරන්න.

භූමිකාව පතන ලැයිස්තුවෙන්, ව්‍යාපෘතිය > හිමිකරු තෝරන්න, ඉන්පසු සාදන්න.

රොබෝවෙකුට සරල වාර්තා පවරන ආකාරය. Python සහ Google BigQuery හි bot එකක් ලිවීම

ස්වයංක්‍රීයව බාගත වන ගොනුව creds.json ලෙස හැඳින්වේ.

ටර්මිනලයේ creds.json වෙත මාර්ගය සඳහන් කරමින් GOOGLE_APPLICATION_CREDENTIALS සකසන්න.

අපනයනය 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 තෝරන්න.

mattlotlib.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 ශ්‍රිතය අමතන්න.

දත්ත රාමුව = query_to_bigquery(query)

ඉන්පසුව අපි x-අක්ෂය සඳහා දින දත්ත තීරුව සහ y-අක්ෂය සඳහා total_posts තීරුව භාවිතා කරමු.

x = දත්ත රාමුව['දිනය'].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 හි bot එකක් ලිවීම

ඔබට අවසන් කේතය ලබා ගත හැක මගේ GitHub.

Skillbox නිර්දේශ කරයි:

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න