
แแพโแขแแแโแแถแโแแทแ
แแ
แแถแโแแแโแแแแพโแแแแโแแแโแแธโแแฝแโแแแแโแแ
โแแฝแโแแแแแถแ แโแฌโแแ? แงแแถแ แแแแแถแแแแแแแแแถแแแถแแแแ แขแแแแแแแพแแปแแแทแแแแแแ แแทแแถแแแถ แแแแแแแพแแแถ (แแแแพแแแแถแ แแ แแแแผแแแถแ) แ แพแแแแแแถแแแแแแแแพแแถแแ
แ
แ
แ แแแถแแแแแแขแแแแ แแแปแแแแแ
แปแแแแถแแแถแแพแขแแแธแแแถแแแขแแแแแแแแแผแแแถแแแแแแแแแแแแแแท?
แแ
แแแแปแแแแแแแแแ แแพแแแนแแแแแแพแ bot แแแแแถแแ Telegram แแแแแนแแแฝแแแแแพแแแถแแแถแแแแแแแแแแแแแแแแแแแทแ แ แพแแขแแแธแแแแแทแแแแแแแปแแแแแแบแแถแแแแแแทแแธแแถแแแแผแแแนแแแถแแแผแแแแแนแแแ 50 แแแแแถแแแแแปแแแแแ! แแแแแทแแแพแขแแแแแแแปแแแแแแพแ bot แแแแแถแแ Telegram แแถแแพแแแแแผแแแแ แขแแแแแแแฝแแแแขแถแแแถแแแแ .
Skillbox แแแแถแแ แแแแแแทแแแแถแแถแแแแแแแ .
แแพแแแแแนแแ แแแแแถแแแขแแแแขแถแแแถแแแขแแแแ "Habr" - แแถแแแแแ แปแแแแแแ 10 rubles แแ แแแแ แปแแแแแแแแแแปแแแแแแแทแแแแถ Skillbox แแถแแฝแแแแแแแแพแแแแแผแแแแแแแแแแแถแ "Habr" แ
แแแโแ แถแแแแแแพแ
แแถแแแแกแพแแแแแแถแแแ
แแพแแแนแแแแแพ แแพแแแแธแแแฝแแแถแแแทแแแแแแแแธ Google BigQuery แ , ะธ แแนแแแฝแแขแแแแฑแแแแพแแแพแแแทแแแแแแแแแแแขแแแแ แแนแแแแแแผแแแทแแแแแแแแแแแถแแแแแ แแแแ Telegram แ
pip3 แแแกแพแ google-cloud-bigquery matplotlib numpy pandas python-telegram-bot
แแแแปแแแแแถแแ Google BigQuery API
แแแแแทแแแพแแพแแ แแแแแแพแแแแถแแแแแแถแแแแ แแพแแแแแผแแแแแถแแ Google BigQuery APIแ แแพแแแแธแแแแพแแผแ แแแแแพแแแ แ แพแแแแแแพแแแแแแแแแแแธ (แฌแแแแพแแแพแแแแแแแแแแแแถแแแแแถแแ)แ
แแ แแแแปแแแแแถแแแแแแแถ แแแแพแแแพแ แแพแ APIS แแทแ SERVICES แ แพแแแแแพแ BigQuery APIแ

แแแแพแแแพแ แขแแปแแแแถแ แแพแแแแธแแแแถแแ API แ

แแแแแพแแแแแแแธ
แแแแแ แแแแแแแ แแแแพแแแพแแแแแถแแแแแแแแถแแแแแแถแแ แแแแแพแแแแแแแถแแแแแแถแแ แแทแแแแแแแธแแแแถแแแแแ
แแแแแถแแแแ - แแแแธแแแแถแแแแแแแแธ แ แพแแแแแ แผแแแแแแแแแแปแแแแแขแแแแแแแแแแแธแแแแถแแแแแ
แแธแแแแแธแแแแแถแแแ แปแ แแฝแแถแแธ แแแแพแแแพแ แแแแแแ > แแแ แถแแ แแแแแถแแแแแแแแแพแแ

แฏแแแถแแแแแแนแแแแแผแแแถแแแถแแแแแแแแแแแแแแแแแแแทแแแแผแแแถแแแแ แ
แแถ creds.json แ
แแแแแ GOOGLE_APPLICATION_CREDENTIALS แแแแแแแแถแแแแแแผแแแ แแถแแ creds.json แแ แแแแปแแแแแถแแธแแ
แแถแแ แแ 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 แแบแแถแ แแแแแพแแแแแแถแแแขแแแแ แ แพแแ แแแแแพแแแบแแถแ แแแแแพแแแแแถแแแพแแแพแแแถแแแแผแแ
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 แแพแแแแธแแแฝแแแถแแแทแแแแแแแ
dataframe = query_to_bigquery(แแแแฝแ)
แแแแแถแแแแแแพแแแแแพแแฝแแแแแทแแแแแแแแถแแแแทแ แแแแแแแแแถแแแขแแแแ x แแทแแแฝแแแ total_posts แแแแแถแแแขแแแแ y แ
x = dataframe['date'].tolist()
y = dataframe['total_posts'].tolist()
แแพแแแพแแแพแแแถแแแแแแแพแแปแแแถแ visualize_bar_chart แ แพแแแแแแถแแปแแแถแแถแแผแแแถแแ
plt = visualize_bar_chart(x=x, x_label='Date', y=y, y_label='Total Posts', title='แแแแแถแแแแแ
แถแแแแแ')
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 แ bot แแแแพแแแแแถแแฝแแแนแแแแแแแถแแ แถแแแถแ แ 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 แแแแแถแแแแแแผแแแแแแแแแพแแแแถแแแถแแแแแแแแแแถแแแถแแขแแแแแถแแแแแแแแแแพแแ
แแแแแทแแทแแแแแพแ bot แแแแแแแพแแแพแแแถแแแแแแแแถ / แแแแพแ

แขแแแแขแถแ
แแแฝแแแถแแแแแแผแแแแแแถแแแแแ
แแแแ
.
Skillbox แแแแถแแ
- แแแแแแทแแแแถแแถแแแแแแแแแแแแแแแธแแแแแถแ .
- แแแแแแทแแแแถแแถแแขแแธแแแบแแทแ .
- แแแแแแทแแแแถแแถแแแแแแแแแแแถแ .
แแแแแ: www.habr.com
