ProHoster > Log > Internett-nyheter > Hvordan delegere enkle rapporter til en robot. Skrive en bot i Python og Google BigQuery
Hvordan delegere enkle rapporter til en robot. Skrive en bot i Python og Google BigQuery
Har du oppgaver som gjentar seg dag etter dag, uke etter uke? For eksempel å skrive rapporter. Du ber om data, analyserer dem, visualiserer dem (lag grafer, diagrammer), og sender dem deretter til sjefen din. Men hva om alt dette var automatisert?
I denne opplæringen vil vi lage en bot for Telegram som vil hjelpe med å automatisere rapportering. Og det kuleste er at hele programmet vil bestå av kun 50 linjer med kode! Hvis du lager en bot for Telegram for første gang, bør du også lese denne post.
Vi minner om:for alle lesere av "Habr" - en rabatt på 10 000 rubler når du melder deg på et hvilket som helst Skillbox-kurs ved å bruke kampanjekoden "Habr".
Hvis vi vil bruke tjenesten, må vi koble til Google BigQuery API. For å gjøre dette går vi til Google Developers Console og opprett et nytt prosjekt (eller velg et eksisterende).
I kontrollpanelet velger du ENABLE APIS AND SERVICES og ser etter BigQuery API.
Velg Aktiver for å koble til API.
Opprett en kontonøkkel
La oss gå til igjen Google Developers Console, velg påloggingsfanen, Opprett påloggingsinformasjon og tjenestekontonøkkel.
Deretter - Ny tjenestekonto, og skriv inn navnet i feltet Tjenestekontonavn.
Fra rullegardinlisten Rolle velger du Prosjekt > Eier og deretter Opprett.
Filen som automatisk lastes ned heter creds.json.
Angi GOOGLE_APPLICATION_CREDENTIALS, spesifiser banen til creds.json i terminalen.
Denne funksjonen vil returnere forespørselen som en dataramme.
Visualisere data
For å løse dette problemet, velg matplotlib.
importer matplotlib.pyplot som plt
Vi trenger fem parametere, der x er x-aksedata, x_label er tittelen for aksen, y er y-aksedata, y_label er tittelen for aksen og tittel er tittelen på hele visualiseringen.
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
Lagre bildet
La oss nå bruke to funksjoner for å lage en visualisering og lagre den.
Vi vil sende antall publiserte innlegg daglig. Først skriver vi en forespørsel.
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
"""
Spørringen hjelper til med å samle inn data i to uker fra og med 2. desember 2018.
Vi bruker denne datoen fordi 2018-12-02 er de siste dataene registrert i bigquery-public-data.stackoverflow.post_history, i andre tilfeller kan du bruke CURRENT_DATE() for å få de nyeste dataene.
Ring query_to_bigquery-funksjonen for å få dataene.
dataramme = query_to_bigquery(query)
Deretter bruker vi datodatakolonnen for x-aksen, og total_posts-kolonnen for y-aksen.
x = dataramme['date'].tolist()
y = dataramme['total_posts'].tolist()
Vi visualiserer det ved å bruke visualize_bar_chart-funksjonen og lagrer det som et bilde.
Vi pakker denne koden inn i en funksjon kalt 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')
Send et bilde
For å sende en rapport til mottakeren må du kjenne til parameteren chat_id.
Vi bruker brukerinfobot og skriv /start. Boten svarer med nødvendig informasjon, chat_id finnes i id-feltet.
La oss nå lage send_image-funksjonen. Den vil bruke funksjonen get_and_save_image for å hente og lagre bildet. Og så sender vi alt til riktig kontakt.