
рдХреЗ рддрдкрд╛рдИрдВрд╕рдБрдЧ рджрд┐рдирджрд┐рдиреИ, рд╣рдкреНрддрд╛ рд╣рдкреНрддрд╛рд╕рдореНрдо рджреЛрд╣реЛрд░рд┐рдиреЗ рдХрд╛рдорд╣рд░реВ рдЫрдиреН? рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд░рд┐рдкреЛрд░реНрдЯ рд▓реЗрдЦреНрдиреЗред рддрдкрд╛рдИрдВ рдбреЗрдЯрд╛ рдЕрдиреБрд░реЛрдз рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ, рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ, рдХрд▓реНрдкрдирд╛ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ (рдЧреНрд░рд╛рдл рд░ рдЪрд╛рд░реНрдЯрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ), рд░ рддреНрдпрд╕рдкрдЫрд┐ рдЖрдлреНрдиреЛ рд╣рд╛рдХрд┐рдорд▓рд╛рдИ рдкрдард╛рдЙрдиреБрд╣реБрдиреНрдЫред рддрд░ рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдпреА рд╕рдмреИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрд░реНрдиреБрднрдпреЛ рднрдиреЗ рдХреЗ рд╣реБрдиреНрдЫ?
рдпрд╕ рдЯреНрдпреБрдЯреЛрд░рд┐рдпрд▓рдорд╛, рд╣рд╛рдореА рдПрдЙрдЯрд╛ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдмрдЯ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫреМрдВ рдЬрд╕рд▓реЗ рд░рд┐рдкреЛрд░реНрдЯрд┐рдЩрд▓рд╛рдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрд░реНрди рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫред рд░ рд╕рдмреИрднрдиреНрджрд╛ рд░рд╛рдореНрд░реЛ рдкрдХреНрд╖ рдХреЗ рд╣реЛ рднрдиреЗ, рд╕рдореНрдкреВрд░реНрдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗрд╡рд▓ релреж рд▓рд╛рдЗрдирдХреЛ рдХреЛрдб рд╣реБрдиреЗрдЫ! рдпрджрд┐ рддрдкрд╛рдИрдВ рдкрд╣рд┐рд▓реЛ рдкрдЯрдХ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдмрдЯ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдИрдВ рдпреЛ рдкрдирд┐ рдкрдвреНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рд╣реЛрд▓рд╛ред .
Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ: рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо .
рд╣рд╛рдореА рд╕рдореНрдЭрд╛рдЙрдБрдЫреМрдВ: рд╕рдмреИ Habr рдкрд╛рдардХрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдХреБрдиреИ рдкрдирд┐ Skillbox рдкрд╛рдареНрдпрдХреНрд░рдордорд╛ рднрд░реНрдирд╛ рдЧрд░реНрджрд╛ резреж,режрежреж рд░реВрдмрд▓ рдЫреБрдЯред
рд╕реБрд░реБ рдЧрд░реМрдВ
рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрджреИ
рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ рдЧреБрдЧрд▓ рдмрд┐рдЧрдХреНрд╡реЗрд░реАрдмрд╛рдЯ рдбреЗрдЯрд╛ рдкреБрди: рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиред , ╨╕ рдбреЗрдЯрд╛ рдХрд▓реНрдкрдирд╛ рдЧрд░реНрди рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫред рд╕рдорд╛рдкреНрдд рднрдПрдХреЛ рдбреЗрдЯрд╛ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдордорд╛ рдкрдард╛рдЙрдиреЗрдЫред
pip3 рдЧреБрдЧрд▓-рдХреНрд▓рд╛рдЙрдб-рдмрд┐рдЧрдХреНрд╡реЗрд░реА рдореНрдпрд╛рдЯрдкреНрд▓рдЯрд▓рд┐рдм рдирдореНрдкреА рдкрд╛рдгреНрдбрд╛ рдкрд╛рдЗрдерди-рдЯреЗрд▓реАрдЧреНрд░рд╛рдо-рдмреЛрдЯ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН
рдЧреБрдЧрд▓ рдмрд┐рдЧрдХреНрд╡реЗрд░реА рдПрдкреАрдЖрдИ рдЬрдбрд╛рди рдЧрд░реНрджреИ
рдпрджрд┐ рд╣рд╛рдореА рд╕реЗрд╡рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ рднрдиреЗ, рд╣рд╛рдореАрд▓реЗ Google BigQuery API рдорд╛ рдЬрдбрд╛рди рдЧрд░реНрдиреБрдкрд░реНрдЫред рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рдЬрд╛рдиреБрд╣реЛрд╕реН рд░ рдирдпрд╛рдБ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН (рд╡рд╛ рдЕрд╡рд╕реНрдерд┐рдд рдПрдЙрдЯрд╛ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН)ред
рдирд┐рдпрдиреНрддреНрд░рдг рдкреНрдпрд╛рдирд▓рдорд╛, ENABLE API AND SERVICES рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ 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 рдирд╛рдордХ рдПрдЙрдЯрд╛ рдкреНрд░рдХрд╛рд░реНрдп рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ, рдЬрд╣рд╛рдБ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ query рд╣реЛред
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-рдЕрдХреНрд╖ рдбреЗрдЯрд╛ рд╣реЛ, 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
"""рдХреНрд╡реЗрд░реАрд▓реЗ рдбрд┐рд╕реЗрдореНрдмрд░ реи, реирежрезрео рджреЗрдЦрд┐ рд╕реБрд░реБ рд╣реБрдиреЗ рджреБрдИ рд╣рдкреНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдбреЗрдЯрд╛ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдЫред
рд╣рд╛рдореА рдпреЛ рдорд┐рддрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ рдХрд┐рдирднрдиреЗ реирежрезрео-резреи-режреи bigquery-public-data.stackoverflow.post_history рдорд╛ рд░реЗрдХрд░реНрдб рдЧрд░рд┐рдПрдХреЛ рдкрдЫрд┐рд▓реНрд▓реЛ рдбреЗрдЯрд╛ рд╣реЛ, рдЕрдиреНрдпрдерд╛ рддрдкрд╛рдИрдВрд▓реЗ рдирд╡реАрдирддрдо рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди CURRENT_DATE() рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╣рд╛рдореА query_to_bigquery рдкреНрд░рдХрд╛рд░реНрдпрд▓рд╛рдИ рдХрд▓ рдЧрд░реНрдЫреМрдВред
рдбрд╛рдЯрд╛рдлреНрд░реЗрдо = query_to_bigquery(query)
рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА x-рдЕрдХреНрд╖рдХреЛ рд▓рд╛рдЧрд┐ рдорд┐рддрд┐ рд╕реНрддрдореНрдн рд░ y-рдЕрдХреНрд╖рдХреЛ рд▓рд╛рдЧрд┐ total_posts рд╕реНрддрдореНрдн рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВред
x = рдбреЗрдЯрд╛рдлреНрд░реЗрдо['рдорд┐рддрд┐'].рдЯреЛрд▓рд┐рд╕реНрдЯ()
y = рдбреЗрдЯрд╛рдлреНрд░реЗрдо['рдХреБрд▓_рдкреЛрд╕реНрдЯрд╣рд░реВ'].рдЯреЛрд▓рд┐рд╕реНрдЯ()
рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ visualize_bar_chart рдкреНрд░рдХрд╛рд░реНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрд▓реНрдкрдирд╛ рдЧрд░реНрдЫреМрдВ рд░ рдпрд╕рд▓рд╛рдИ рдЫрд╡рд┐рдХреЛ рд░реВрдкрдорд╛ рдмрдЪрдд рдЧрд░реНрдЫреМрдВред
plt = visualize_bar_chart(x=x, x_label='рдорд┐рддрд┐', y=y, y_label='рдХреБрд▓ рдкреЛрд╕реНрдЯрд╣рд░реВ', рд╢реАрд░реНрд╖рдХ='рджреИрдирд┐рдХ рдкреЛрд╕реНрдЯрд╣рд░реВ')
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 рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдЬрд╛рдиреНрдиреБ рдЖрд╡рд╢реНрдпрдХ рдЫред
рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМ рд░ /start рдЯрд╛рдЗрдк рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдмреЛрдЯрд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реАрдХреЛ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджрд┐рдиреНрдЫ, 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 рдирд╛рдо рджрд┐рдиреБрд╣реЛрд╕реНред
рдЯрд░реНрдорд┐рдирд▓рдорд╛ рдирд┐рдореНрди рдЖрджреЗрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реЗрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН:
рдкрд╛рдЗрдердирей рдореЗрди.рдкрд╛рдЗ
рд╕рдмреИ рддрдпрд╛рд░ рдЫред рдЕрдм рд╣рд╛рдореАрд╕рдБрдЧ релреж рд▓рд╛рдЗрдирдХреЛ рдХреЛрдб рднрдПрдХреЛ рдмреЛрдЯ рдЫ, рдЬрд╕рд▓реЗ рд╣рд╛рдореНрд░реЛ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдмрд┐рдирд╛ рдиреИ рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрдЫред
рдмрдЯ рдЬрд╛рдБрдЪ рдЧрд░реМрдВ , /send рдЖрджреЗрд╢ рдЪрдпрди рдЧрд░реЗрд░ред

рддрдкрд╛рдИрдВрд▓реЗ рд╕рдорд╛рдкреНрдд рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ .
Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ:
- рджреБрдИ рд╡рд░реНрд╖реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо .
- рдЕрдирд▓рд╛рдЗрди рдХреЛрд░реНрд╕ .
- рдПрдХ рд╡рд░реНрд╖рдХреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо .
рд╕реНрд░реЛрдд: www.habr.com
