ProHoster > блог > Навіны інтэрнэту > Як дэлегаваць простыя справаздачы робату. Пішам бота на Python і Google BigQuery
Як дэлегаваць простыя справаздачы робату. Пішам бота на Python і Google BigQuery
Ці ёсць у вас задачы, якія паўтараюцца дзень пры дні, з тыдня ў тыдзень? Напрыклад, напісанне справаздач. Вы запытваеце дадзеныя, праводзіце аналіз, візуалізуеце (робіце графікі, дыяграмы), а затым адпраўляеце начальніку. Але што, калі ўсё гэта аўтаматызаваць?
У гэтым тутарыяле мы створым робата для Telegram, які дапаможа аўтаматызаваць справаздачнасць. А самае класнае - уся праграма будзе складацца ўсяго з 50 радкоў кода! Калі вы ствараеце робата для Telegram упершыню, то варта прачытаць яшчэ вось гэты пост.
Калі мы жадаем выкарыстаць сэрвіс, трэба падлучыць Google BigQuery API. Для гэтага ідзем у Google Developers Console і ствараем новы праект (ці ж выбіраемы існы).
У кантрольнай панэлі выбіраемы ENABLE APIS AND SERVICES і шукаем BigQuery API.
Выбіраемы Enable для падлучэння API.
Ствараем ключ акаўнта
Зноў адпраўляемся ў Google Developers Console, выбіраемы ўкладку Credentials, Create credentials і Service account key.
Затым - New service account, і ў поле Service account name уводны імя.
З выпадальнага спісу Role выбіраемы Project > Owner, затым Create.
Файл, які будзе аўтаматычна загружацца, завем creds.json.
Выстаўляем GOOGLE_APPLICATION_CREDENTIALS, паказаўшы шлях да creds.json у тэрмінале.
Гэтая функцыя верне запыт у выглядзе фрэйма дадзеных.
Візуалізуем дадзеныя
Для рашэння гэтай задачы выбіраемы matplotlib.
імпартаваць matplotlib.pyplot як plt
Нам трэба пяць параметраў, дзе x – дадзеныя па восі х, x_label – назва для восі, y – дадзеныя восі y, y_label – назва для восі і title – загаловак усёй візуалізацыі.
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(query)
Затым выкарыстоўваем калонку дадзеных date для восі х, а калонку total_posts для восі у.
x = dataframe['date'].tolist()
y = dataframe['total_posts'].tolist()
Візуалізуем пры дапамозе функцыі visualize_bar_chart і захоўваем у выглядзе малюнка.
Абарочваем гэты код у функцыю пад назвай 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 і набіраем /start. Бот адказвае патрэбнай інфармацыяй, chat_id утрымоўваецца ў поле id.
Цяпер ствараем функцыю send_image. Яна будзе задзейнічаць функцыю get_and_save_image для атрымання і захавання выявы. А затым ужо адпраўляем усё правільнаму кантакту.