Танд өдөр бүр, долоо хоног бүр давтагддаг даалгавар байдаг уу? Жишээлбэл, тайлан бичих. Та өгөгдөл хүсэх, дүн шинжилгээ хийх, дүрслэх (график, диаграмм хийх), дараа нь даргадаа илгээнэ үү. Гэхдээ энэ бүгдийг автоматжуулсан бол яах вэ?
Энэ зааварт бид Telegram-д зориулж тайланг автоматжуулахад туслах робот үүсгэх болно. Хамгийн гайхалтай нь бүх програм нь ердөө 50 мөр кодоос бүрдэх болно! Хэрэв та анх удаа Telegram-д зориулж робот үүсгэж байгаа бол үүнийг уншаарай
Skillbox зөвлөж байна: Практик курс
Эхнээс нь Python хөгжүүлэгч .Бид танд сануулж байна: "Хабр" -ын бүх уншигчдад - "Habr" сурталчилгааны кодыг ашиглан Skillbox-ын аль ч курст бүртгүүлэхдээ 10 рублийн хөнгөлөлт.
Эхэлцгээе
Номын сангуудыг суулгаж байна
Бид ашиглах болно
pip3 google-cloud-bigquery matplotlib numpy панда python-telegram-bot-г суулгана уу
Google BigQuery API-г холбож байна
Хэрэв бид үйлчилгээг ашиглахыг хүсвэл Google BigQuery API-г холбох хэрэгтэй. Үүнийг хийхийн тулд бид очдог
Хяналтын самбараас API, ҮЙЛЧИЛГЭЭГ ИДЭВХЖҮҮЛЭХ гэснийг сонгоод BigQuery API-г олоорой.
API-г холбохын тулд "Идэвхжүүлэх" гэснийг сонгоно уу.
Бүртгэлийн түлхүүр үүсгэх
Дахин орцгооё
Дараа нь - Шинэ үйлчилгээний бүртгэл, үйлчилгээний дансны нэр талбарт нэрийг оруулна уу.
Үүргийн унадаг жагсаалтаас Төсөл > Эзэмшигч, дараа нь Үүсгэх гэснийг сонго.
Автоматаар татагдах файлыг creds.json гэж нэрлэдэг.
GOOGLE_APPLICATION_CREDENTIALS-ийг тохируулж, терминал дахь creds.json руу очих замыг зааж өгнө.
экспорт GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'
Хэрэв бүх зүйл сайн болсон бол програм бичиж эхлэх цаг болжээ.
Програм үүсгэх
Хичээлийн хувьд бид bigquery-public-data.stackoverflow-аас өгөгдлийг ашиглах бөгөөд тайландаа бид өдөр тутмын нийтлэлийн тоог сонгох болно.
Бүх зүйл маш энгийн.
Хүснэгтээс асуулга -> Өгөгдлийг дүрслэх -> Дүрслэлийг хадгалах -> Зургийг илгээ
Thread бүрийг тодорхойлох нэг функц үүсгэцгээе.
BigQuery руу асуулга
Эхлээд бид номын санг импортолдог.
google.cloud-аас 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-р сарын XNUMX-ноос эхлэн хоёр долоо хоногийн турш мэдээлэл цуглуулахад тусална.
2018-12-02 бол bigquery-public-data.stackoverflow.post_history-д бүртгэгдсэн хамгийн сүүлийн үеийн өгөгдөл учраас бид энэ огноог ашигладаг, бусад тохиолдолд та CURRENT_DATE()-г ашиглан хамгийн сүүлийн үеийн өгөгдлийг авах боломжтой.
Өгөгдлийг авахын тулд query_to_bigquery функц руу залгана уу.
dataframe = query_to_bigquery(асуулга)
Дараа нь бид x тэнхлэгт огнооны өгөгдлийн баганыг, y тэнхлэгт нийт_пост баганыг ашиглана.
x = dataframe['огноо'].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 параметрийг мэдэх хэрэгтэй.
Бидний хэрэглэдэг
Одоо илгээх_зургийн функцийг үүсгэцгээе. Энэ нь зургийг авч, хадгалахын тулд 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'))
Үндсэн програм
Эцэст нь бид програмыг ажиллуулах өөр үндсэн функцийг бий болгодог. Ботын хувьд ӨӨРИЙН_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