
Күндөн күнгө, жумадан жумага кайталанган тапшырмаларыңыз барбы? Мисалы, отчетторду жазуу. Сиз маалыматтарды сурайсыз, аны талдайсыз, визуализациялайсыз (графиктерди, диаграммаларды түзөсүз), анан аны жетекчисиңизге жөнөтөсүз. Бирок мунун баары автоматташтырылган болсочу?
Бул окуу куралында биз Telegram үчүн отчетту автоматташтырууга жардам бере турган бот түзөбүз. Эң сонун нерсе, программанын бардыгы 50 сап коддон турат! Эгер сиз Telegram үчүн ботту биринчи жолу түзүп жатсаңыз, анда муну да окушуңуз керек .
Skillbox сунуштайт: Практикалык курс .
Биз эсиңизге салабыз: "Хабрдын" бардык окурмандары үчүн - "Habr" промо-кодун колдонуу менен каалаган Skillbox курсуна катталганда 10 000 рубль арзандатуу.
Келиңиз баштайлы
Китепканаларды орнотуу
Биз колдонобуз Google BigQueryден маалымат алуу үчүн. , и маалыматыңызды визуализациялоого жардам берет. даяр маалыматтарды Telegramга жөнөтөт.
pip3 орнотуу google-cloud-bigquery matplotlib numpy pandas python-telegram-bot
Google BigQuery API туташтырылууда
Кызматты колдонгубуз келсе, Google BigQuery API'син туташтырышыбыз керек. Бул үчүн биз барабыз жана жаңы долбоорду түзүү (же учурдагыны тандоо).
Башкаруу панелинен APIS ЖАНА КЫЗМАТТАРДЫ ИШТЕТҮҮ дегенди тандап, BigQuery API издеңиз.

API туташтыруу үчүн Иштетүү тандаңыз.

Каттоо эсебинин ачкычын түзүңүз
кайра баралы , Каттоо тактасын тандаңыз, Эсептик дайындарды түзүү жана Кызмат эсебинин ачкычы.
Андан кийин - Жаңы кызмат эсеби, жана Кызмат эсебинин аты талаасына атын киргизиңиз.
Рол ылдый түшүүчү тизмеден Долбоор > Ээси, анан Түзүүнү тандаңыз.

Автоматтык түрдө жүктөлө турган файл 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_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(суроо)
Андан кийин биз x огу үчүн дата маалымат тилкесин жана y огу үчүн total_posts тилкесин колдонобуз.
x = dataframe['date'].tolist()
y = dataframe['total_posts'].tolist()
Биз аны visualize_bar_chart функциясынын жардамы менен визуализациялап, сүрөт катары сактайбыз.
plt = visualize_bar_chart(x=x, x_label='Дата', y=y, y_label='Жалпы билдирүүлөр', title='Күндөлүк билдирүүлөр')
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 параметрин билишиңиз керек.
Биз колдонобуз жана териңиз / баштоо. Бот керектүү маалымат менен жооп берет, 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 буйругун тандоо менен.

Сиз даяр кодду дарегинен ала аласыз .
Skillbox сунуштайт:
- Эки жылдык практикалык курс .
- Онлайн курс .
- Практикалык жылдык курс .
Source: www.habr.com
