ඔබට දිනෙන් දින, සතියෙන් සතිය පුනරාවර්තනය වන කාර්යයන් තිබේද? උදාහරණයක් ලෙස, වාර්තා ලිවීම. ඔබ දත්ත ඉල්ලන්න, එය විශ්ලේෂණය කරන්න, එය දෘශ්යමාන කරන්න (ප්රස්තාර, ප්රස්ථාර සාදන්න), ඉන්පසු එය ඔබේ ප්රධානියාට යවන්න. නමුත් මේ සියල්ල ස්වයංක්රීය නම්?
මෙම නිබන්ධනයේදී අපි Telegram සඳහා bot එකක් සාදනු ඇත, එය වාර්තා කිරීම ස්වයංක්රීය කිරීමට උපකාරී වේ. හොඳම දෙය නම් සම්පූර්ණ වැඩසටහන සමන්විත වන්නේ කේත පේළි 50 කින් පමණි! ඔබ පළමු වරට ටෙලිග්රාම් සඳහා බොට් එකක් නිර්මාණය කරන්නේ නම්, ඔබ මෙයද කියවිය යුතුය
Skillbox නිර්දේශ කරයි: ප්රායෝගික පාඨමාලාව
මුල සිට පයිතන් සංවර්ධකයා .අපි ඔබට මතක් කරමු: "Habr" හි සියලුම පාඨකයින් සඳහා - "Habr" ප්රවර්ධන කේතය භාවිතයෙන් ඕනෑම Skillbox පාඨමාලාවකට ලියාපදිංචි වන විට රූබල් 10 ක වට්ටමක්.
අපි පටන් ගනිමු
පුස්තකාල ස්ථාපනය කිරීම
අපි භාවිතා කරන්නෙමු
pip3 google-Cloud-bigquery matplotlib numpy pandas python-telegram-bot ස්ථාපනය කරන්න
Google BigQuery API සම්බන්ධ කරමින්
අපට සේවාව භාවිතා කිරීමට අවශ්ය නම්, අපි Google BigQuery API සම්බන්ධ කළ යුතුය. මෙය සිදු කිරීම සඳහා අපි යන්නෙමු
පාලක පැනලයේ, ENABLE APIS සහ SERVICES තෝරන්න සහ BigQuery API සොයන්න.
API සම්බන්ධ කිරීමට සබල කරන්න තෝරන්න.
ගිණුම් යතුරක් සාදන්න
අපි නැවත යමු
ඉන්පසු - නව සේවා ගිණුම, සහ සේවා ගිණුමේ නම ක්ෂේත්රයේ නම ඇතුළත් කරන්න.
භූමිකාව පතන ලැයිස්තුවෙන්, ව්යාපෘතිය > හිමිකරු තෝරන්න, ඉන්පසු සාදන්න.
ස්වයංක්රීයව බාගත වන ගොනුව 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 පරාමිතිය දැන සිටිය යුතුය.
අපි පාවිච්චි කරන්නේ
දැන් අපි 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 කින් සමන්විත රොබෝවක් අප සතුව ඇත.
අපි බොට් එක පරීක්ෂා කරමු
ඔබට අවසන් කේතය ලබා ගත හැක
Skillbox නිර්දේශ කරයි:
- වසර දෙකක ප්රායෝගික පාඨමාලාව
"මම PRO වෙබ් සංවර්ධකයෙක්" .- මාර්ගගත පාඨමාලාව
"0 සිට C# සංවර්ධකයා" .- ප්රායෝගික වසර පාඨමාලාව
"0 සිට PRO දක්වා PHP සංවර්ධකයා" .
මූලාශ්රය: www.habr.com