
Ăske ou gen travay ki repete jou apre jou, semèn apre semèn? Pou egzanp, ekri rapò. Ou mande done, analize li, vizyalize li (fè graf, tablo), epi voye li bay bòs nan travay ou. Men, e si tout bagay sa yo te otomatik?
Nan leson patikilye sa a nou pral kreye yon bot pou Telegram ki pral ede otomatize rapò. Ak bagay ki pi fre se ke tout pwogram nan pral konpoze de sèlman 50 liy nan kòd! Si w ap kreye yon bot pou Telegram pou premye fwa, ou ta dwe li tou sa a .
Skillbox rekòmande: Kou pratik .
Nou raple: pou tout lektè "Habr" - yon rabè nan 10 rubles lè w ap enskri nan nenpòt kou Skillbox lè l sèvi avèk kòd pwomosyon "Habr".
An n kòmanse
Enstale bibliyotèk
Nou pral itilize pou jwenn done nan Google BigQuery. , и pral ede w vizyalize done ou yo. pral voye done yo fini bay Telegram.
pip3 enstale google-cloud-bigquery matplotlib numpy panda python-telegram-bot
Konekte Google BigQuery API
Si nou vle sèvi ak sèvis la, nou bezwen konekte API Google BigQuery. Pou fè sa nou ale nan epi kreye yon nouvo pwojè (oswa chwazi youn ki deja egziste).
Nan panèl kontwòl la, chwazi AKMET APIS AK SĂVIS epi chèche API BigQuery.

Chwazi Pèmèt pou konekte API a.

Kreye yon kle kont
Ann ale nan ankò , chwazi tab la kalifikasyon, Kreye kalifikasyon ak kle kont sèvis.
Lè sa a - Nouvo kont sèvis, epi antre non an nan non sèvis kont jaden an.
Soti nan lis drop-down Wòl, chwazi Pwojè> Pwopriyetè, Lè sa a, Kreye.

Fichye a ki pral telechaje otomatikman yo rele creds.json.
Mete GOOGLE_APPLICATION_CREDENTIALS, espesifye chemen an nan creds.json nan tèminal la.
ekspòte GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'
Si tout bagay ale byen, li lè pou kòmanse ekri pwogram nan.
Kreye yon aplikasyon
Pou leson patikilye a nou pral sèvi ak done ki soti nan bigquery-public-data.stackoverflow, pou rapò nou an nou pral chwazi kantite piblikasyon chak jou.
Li trè senp.
Demande tab la -> Vizyalize done yo -> Sove vizyalizasyon an -> Voye imaj la
Ann kreye yon fonksyon pou defini chak fil.
Rechèch nan BigQuery
Premye nou enpòte bibliyotèk la.
soti nan google.cloud enpòte bigquery
Nou kreye yon fonksyon ki rele query_to_bigquery, kote paramèt la se requête.
def query_to_bigquery(query):
client = bigquery.Client()
query_job = client.query(query)
result = query_job.result()
dataframe = result.to_dataframe()
return dataframeFonksyon sa a pral retounen demann lan kòm yon ankadreman done.
Vizyalize done yo
Pou rezoud pwoblèm sa a, chwazi matplotlib.
enpòte matplotlib.pyplot kòm plt
Nou bezwen senk paramèt, kote x se done aks x, x_label se tit la pou aks la, y se done aks y, y_label se tit la pou aks la, ak tit se tit la nan vizyalizasyon an antye.
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 pltSove imaj la
Koulye a, kite a sèvi ak de fonksyon yo kreye yon vizyalizasyon epi sove li.
Nou pral voye kantite pòs ki pibliye chak jou. Premye nou ekri yon demann.
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
"""Rekèt la ede kolekte done pou de semèn apati 2 desanm 2018.
Nou itilize dat sa a paske 2018-12-02 se dènye done ki anrejistre nan bigquery-public-data.stackoverflow.post_history, nan lòt ka ou ka itilize CURRENT_DATE() pou jwenn dènye done yo.
Rele fonksyon query_to_bigquery pou jwenn done yo.
dataframe = query_to_bigquery (rekèt)
Lè sa a, nou itilize kolòn done dat pou aks x la, ak kolòn total_posts pou aks y.
x = dataframe['dat'].tolist()
y = dataframe['total_posts'].tolist()
Nou visualize li lè l sèvi avèk fonksyon visualize_bar_chart epi sove li kòm yon imaj.
plt = visualize_bar_chart(x=x, x_label='Dat', y=y, y_label='Total Posts', title='Daily Posts')
plt.savefig('viz.png')
Nou vlope kòd sa a nan yon fonksyon ki rele 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')Voye yon imaj
Pou w ka voye yon rapò bay moun k ap resevwa a, ou bezwen konnen paramèt chat_id la.
Nou itilize epi tape / kòmanse. Bot la reponn ak enfòmasyon ki nesesè yo, chat_id genyen nan jaden id la.
Koulye a, ann kreye fonksyon send_image. Li pral sèvi ak fonksyon get_and_save_image pou rekipere epi sove imaj la. Lè sa a, nou voye tout bagay nan kontak ki kòrèk la.
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'))Pwogram prensipal la
Finalman, nou kreye yon lòt fonksyon, prensipal, pou lanse aplikasyon an. Pa bliye chanje YOUR_TOKEN pou bot la.
Sonje byen: pwogram sa a pral voye imaj la otomatikman nan moman ou presize a. Pa egzanp, nou pral voye yon rapò a nèf nan maten chak jou.
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()Kòm yon rezilta, aplikasyon nou an pral sanble sa a:
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()Sove fichye a epi rele li main.py.
Nou lanse aplikasyon an lè nou antre kòmandman an nan tèminal la:
python3 main.py
Tout pare. Koulye a, nou gen yon robo ki gen 50 liy kòd ki jenere rapò san entèvansyon nou an.
Ann tcheke bot la pa chwazi / voye kòmandman an.

Ou ka jwenn kòd la fini nan .
Skillbox rekòmande:
- Dezan kou pratik .
- Kou sou entènèt .
- Kou pratik pou ane .
Sous: www.habr.com
