рдХреЗ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рджрд┐рди рдкрдЫрд┐, рд╣рдкреНрддрд╛ рдкрдЫрд┐ рд╣рдкреНрддрд╛ рджреЛрд╣реЛрд░реНрдпрд╛рдЙрдиреЗ рдХрд╛рд░реНрдпрд╣рд░реВ рдЫрдиреН? рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВ рд▓реЗрдЦреНрдиреЗред рддрдкрд╛рдЗрдБ рдбреЗрдЯрд╛ рдЕрдиреБрд░реЛрдз рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ, рдпрд╕рд▓рд╛рдИ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдпрд╕рд▓рд╛рдИ рдХрд▓реНрдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН (рдЧреНрд░рд╛рдлрд╣рд░реВ, рдЪрд╛рд░реНрдЯрд╣рд░реВ рдмрдирд╛рдЙрдиреБрд╣реЛрд╕реН), рд░ рддреНрдпрд╕рдкрдЫрд┐ рддрдкрд╛рдЗрдБрдХреЛ рдорд╛рд▓рд┐рдХрд▓рд╛рдИ рдкрдард╛рдЙрдиреБрд╣реЛрд╕реНред рддрд░ рдХреЗ рдпреЛ рд╕рдмреИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдерд┐рдпреЛ рднрдиреЗ?
рдпрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓рдорд╛ рд╣рд╛рдореА рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдордХреЛ рд▓рд╛рдЧрд┐ рдПрдЙрдЯрд╛ рдмреЛрдЯ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫреМрдВ рдЬрд╕рд▓реЗ рд░рд┐рдкреЛрд░реНрдЯрд┐рдЩрд▓рд╛рдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫред рд░ рд╕рдмреИ рднрдиреНрджрд╛ рд░рд╛рдореНрд░реЛ рдХреБрд░рд╛ рдпреЛ рд╣реЛ рдХрд┐ рд╕рдореНрдкреВрд░реНрдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛрдб рдХреЛ рдХреЗрд╡рд▓ 50 рд▓рд╛рдЗрдирд╣рд░реБ рд╕рдореНрдорд┐рд▓рд┐рдд рд╣реБрдиреЗрдЫ! рдпрджрд┐ рддрдкрд╛рдЗрдБ рдкрд╣рд┐рд▓реЛ рдкрдЯрдХ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдордХреЛ рд▓рд╛рдЧрд┐ рдмреЛрдЯ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рдпреЛ рдкрдирд┐ рдкрдвреНрдиреБ рдкрд░реНрдЫ
Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ: рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо
рд╕реНрдХреНрд░реНрдпрд╛рдЪрдмрд╛рдЯ рдкрд╛рдЗрдерди рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ .рд╣рд╛рдореА рд╕рдореНрдЭрд╛рдЙрдБрдЫреМрдВ: рд╕рдмреИ Habr рдкрд╛рдардХрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдХреБрдиреИ рдкрдирд┐ Skillbox рдкрд╛рдареНрдпрдХреНрд░рдордорд╛ рднрд░реНрдирд╛ рдЧрд░реНрджрд╛ резреж,режрежреж рд░реВрдмрд▓ рдЫреБрдЯред
рд╕реБрд░реБ рдЧрд░реМрдВ
рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрджреИ
рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ
pip3 google-cloud-bigquery matplotlib numpy pandas python-telegram-bot рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН
Google BigQuery API рдЬрдбрд╛рди рдЧрд░реНрджреИ
рдпрджрд┐ рд╣рд╛рдореА рд╕реЗрд╡рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВ рднрдиреЗ, рд╣рд╛рдореАрд▓реЗ Google BigQuery API рдЬрдбрд╛рди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпреЛ рдЧрд░реНрди рд╣рд╛рдореА рдЬрд╛рдиреНрдЫреМрдВ
рдирд┐рдпрдиреНрддреНрд░рдг рдкреНрдпрд╛рдирд▓рдорд╛, рдПрдкреАрдЖрдИрдПрд╕ рд░ рд╕реЗрд╡рд╛рд╣рд░реВ рд╕рдХреНрд╖рдо рдЧрд░реНрдиреБрд╣реЛрд╕реН рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ 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 рдирд╛рдордХ рдкреНрд░рдХрд╛рд░реНрдп рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ, рдЬрд╣рд╛рдБ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдХреНрд╡реЗрд░реА рд╣реЛред
def query_to_bigquery(query):
client = bigquery.Client()
query_job = client.query(query)
result = query_job.result()
dataframe = result.to_dataframe()
return dataframe
рдпреЛ рдкреНрд░рдХрд╛рд░реНрдпрд▓реЗ рдбреЗрдЯрд╛ рдлреНрд░реЗрдордХреЛ рд░реВрдкрдорд╛ рдЕрдиреБрд░реЛрдз рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдиреЗрдЫред
рджреГрд╢реНрдп рдбреЗрдЯрд╛
рдпреЛ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди, matplotlib рдЫрд╛рдиреНрдиреБрд╣реЛрд╕реНред
plt рдХреЛ рд░реВрдкрдорд╛ matplotlib.pyplot рдЖрдпрд╛рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН
рд╣рд╛рдореАрд▓рд╛рдИ рдкрд╛рдБрдЪ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдЪрд╛рд╣рд┐рдиреНрдЫ, рдЬрд╣рд╛рдБ x x-рдЕрдХреНрд╖ рдбреЗрдЯрд╛ рд╣реЛ, x_label рдЕрдХреНрд╖рдХреЛ рд▓рд╛рдЧрд┐ рд╢реАрд░реНрд╖рдХ рд╣реЛ, y-рдЕрдХреНрд╖ рдбреЗрдЯрд╛ рд╣реЛ, y_label рдЕрдХреНрд╖рдХреЛ рд▓рд╛рдЧрд┐ рд╢реАрд░реНрд╖рдХ рд╣реЛ, рд░ рд╢реАрд░реНрд╖рдХ рд╕рдореНрдкреВрд░реНрдг рджреГрд╢реНрдпрдХреЛ рд╢реАрд░реНрд╖рдХ рд╣реЛред
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 рдкреНрд░рдХрд╛рд░реНрдпрд▓рд╛рдИ рдХрд▓ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
рдбрд╛рдЯрд╛рдлреНрд░реЗрдо = query_to_bigquery(рдХреНрд╡реЗрд░реА)
рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА x-axis рдХреЛ рд▓рд╛рдЧрд┐ рдорд┐рддрд┐ рдбреЗрдЯрд╛ рд╕реНрддрдореНрдн, рд░ y-axis рдХреЛ рд▓рд╛рдЧрд┐ total_posts рд╕реНрддрдореНрдн рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВред
x = dataframe['date'].tolist()
y = рдбрд╛рдЯрд╛рдлреНрд░реЗрдо['total_posts'].tolist()
рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ 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 рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдЬрд╛рдиреНрди рдЖрд╡рд╢реНрдпрдХ рдЫред
рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМ
рдЕрдм 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 рдХрд▓ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
рд╣рд╛рдореА рдЯрд░реНрдорд┐рдирд▓рдорд╛ рдЖрджреЗрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реЗрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реБрд░реБ рдЧрд░реНрдЫреМрдВ:
python3 main.py
рд╕рдмреИ рддрдпрд╛рд░ рдЫред рдЕрдм рд╣рд╛рдореАрд╕рдБрдЧ рдХреЛрдбрдХреЛ 50 рд▓рд╛рдЗрдирд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рднрдПрдХреЛ рд░реЛрдмреЛрдЯ рдЫ рдЬрд╕рд▓реЗ рд╣рд╛рдореНрд░реЛ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдмрд┐рдирд╛ рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрджрдЫред
рдмреЛрдЯ рдЬрд╛рдБрдЪ рдЧрд░реМрдВ
рддрдкрд╛рдИрдВ рд╕рдорд╛рдкреНрдд рдХреЛрдб рдорд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ
Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ:
- рджреБрдИ рд╡рд░реНрд╖реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо
"рдо рдПрдХ рдкреНрд░реЛ рд╡реЗрдм рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рд╣реБрдБ" .- рдЕрдирд▓рд╛рдЗрди рдХреЛрд░реНрд╕
"0 рдмрд╛рдЯ C# рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛" .- рдПрдХ рд╡рд░реНрд╖рдХреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо
"0 рджреЗрдЦрд┐ PRO рдорд╛ PHP рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛" .
рд╕реНрд░реЛрдд: www.habr.com