
Għandek kompiti li jirrepetu jum wara jum, ġimgħa wara ġimgħa? Per eżempju, bil-miktub rapporti. Titlob id-dejta, tanalizzaha, viżivaha (agħmel graffs, charts), u mbagħad ibgħatha lill-imgħallem tiegħek. Imma x'jiġri jekk dan kollu kien awtomatizzat?
F'dan it-tutorja se noħolqu bot għal Telegram li se jgħin biex awtomat ir-rappurtar. U l-iktar ħaġa sabiħa hija li l-programm kollu se jikkonsisti biss minn 50 linja ta 'kodiċi! Jekk qed toħloq bot għal Telegram għall-ewwel darba, allura għandek taqra dan ukoll .
Skillbox jirrakkomanda: Kors prattiku .
Infakkrukom: għall-qarrejja kollha ta '"Habr" - skont ta' 10 rublu meta tirreġistra fi kwalunkwe kors ta 'Skillbox billi tuża l-kodiċi promozzjonali "Habr".
Ejja nibdew
Installazzjoni ta' libreriji
Aħna nużaw biex tikseb data minn Google BigQuery. , и se jgħinek Ħares id-data tiegħek. se tibgħat id-data lesta lil Telegram.
pip3 installa google-cloud-bigquery matplotlib numpy pandas python-telegram-bot
Konnessjoni ta' Google BigQuery API
Jekk irridu nużaw is-servizz, irridu nikkonnettjaw il-Google BigQuery API. Biex nagħmlu dan immorru u toħloq proġett ġdid (jew agħżel wieħed eżistenti).
Fil-pannell tal-kontroll, agħżel ENABLE APIS AND SERVICES u fittex BigQuery API.

Agħżel Ippermettiet biex tikkonnettja l-API.

Oħloq ċavetta tal-kont
Ejja mmorru għal darb'oħra , agħżel it-tab tal-Kredenzjali, Oħloq kredenzjali u ċavetta tal-kont tas-Servizz.
Imbagħad - Kont tas-servizz ġdid, u daħħal l-isem fil-qasam Isem tal-kont tas-servizz.
Mil-lista drop-down Rwol, agħżel Proġett > Sid, imbagħad Oħloq.

Il-fajl li se jitniżżel awtomatikament jissejjaħ creds.json.
Issettja GOOGLE_APPLICATION_CREDENTIALS, billi tispeċifika t-triq għal creds.json fit-terminal.
esporta GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'
Jekk kollox mar tajjeb, wasal iż-żmien li tibda tikteb il-programm.
Ħolqien ta' applikazzjoni
Għat-tutorja se nużaw dejta minn bigquery-public-data.stackoverflow, għar-rapport tagħna se nagħżlu n-numru ta 'pubblikazzjonijiet ta' kuljum.
Kollox huwa pjuttost sempliċi.
Mistoqsija t-tabella -> Ħares id-dejta -> Issejvja l-viżwalizzazzjoni -> Ibgħat l-immaġni
Ejja noħolqu funzjoni waħda biex tiddefinixxi kull ħajta.
Mistoqsija lil BigQuery
L-ewwel aħna jimportaw il-librerija.
minn google.cloud import bigquery
Noħolqu funzjoni msejħa query_to_bigquery, fejn il-parametru huwa query.
def query_to_bigquery(query):
client = bigquery.Client()
query_job = client.query(query)
result = query_job.result()
dataframe = result.to_dataframe()
return dataframeDin il-funzjoni tirritorna t-talba bħala qafas tad-dejta.
Viżwalizzazzjoni tad-data
Biex issolvi din il-problema, agħżel matplotlib.
importazzjoni matplotlib.pyplot bħala plt
Għandna bżonn ħames parametri, fejn x hija d-dejta tal-assi x, x_label huwa t-titlu għall-assi, y hija d-dejta tal-assi y, y_label huwa t-titlu għall-assi, u t-titlu huwa t-titlu tal-viżwalizzazzjoni kollha.
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 pltIssejvja l-immaġni
Issa ejja nużaw żewġ funzjonijiet biex noħolqu viżwalizzazzjoni u ssalvaha.
Aħna se nibagħtu n-numru ta 'postijiet ippubblikati kuljum. L-ewwel niktbu talba.
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
"""Il-mistoqsija tgħin biex tiġbor id-dejta għal ġimgħatejn li jibdew mit-2 ta’ Diċembru 2018.
Aħna nużaw din id-data għaliex 2018-12-02 hija l-aħħar data rreġistrata fi bigquery-public-data.stackoverflow.post_history, f'każijiet oħra tista' tuża CURRENT_DATE() biex tikseb l-aktar data ġdida.
Ċempel il-funzjoni query_to_bigquery biex tikseb id-dejta.
dataframe = query_to_bigquery (mistoqsija)
Imbagħad nużaw il-kolonna tad-data tad-data għall-assi x, u l-kolonna total_posts għall-assi y.
x = dataframe['data'].tolist()
y = dataframe['total_posts'].tolist()
Aħna nħarsuha billi tuża l-funzjoni visualize_bar_chart u nissejvjaha bħala immaġini.
plt = visualize_bar_chart(x=x, x_label='Data', y=y, y_label='Total Posts', title='Daily Posts')
plt.savefig('viz.png')
Aħna nagħlaq dan il-kodiċi f'funzjoni msejħa 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')Ibgħat immaġini
Sabiex tibgħat rapport lir-riċevitur, trid tkun taf il-parametru chat_id.
Aħna nużaw u tip /start. Il-bot jirrispondi bl-informazzjoni meħtieġa, chat_id jinsab fil-qasam id.
Issa ejja noħolqu l-funzjoni send_image. Se tuża l-funzjoni get_and_save_image biex tirkupra u tissejvja l-immaġni. U mbagħad nibagħtu kollox lill-kuntatt korrett.
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'))Programm ewlieni
Fl-aħħarnett, noħolqu funzjoni oħra, prinċipali, biex iniedu l-applikazzjoni. Tinsiex tibdel YOUR_TOKEN għall-bot.
Ftakar: dan il-programm jibgħat l-immaġni awtomatikament fil-ħin li tispeċifika. Pereżempju, nibagħtu rapport fid-disgħa ta’ filgħodu kuljum.
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()Bħala riżultat, l-applikazzjoni tagħna se tidher bħal din:
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()Issejvja l-fajl u sejjaħlu main.py.
Inniedu l-applikazzjoni billi ndaħħlu l-kmand fit-terminal:
python3 main.py
Kollox lest. Issa għandna robot magħmul minn 50 linja ta 'kodiċi li jiġġenera rapporti mingħajr l-intervent tagħna.
Ejja niċċekkjaw il-bot billi tagħżel il-kmand /send.

Tista 'tikseb il-kodiċi lest fuq .
Skillbox jirrakkomanda:
- Kors prattiku ta' sentejn .
- Kors onlajn .
- Kors prattiku tas-sena .
Sors: www.habr.com
