แแแฅแแ แแแแแแแแแแ, แ แแแแแแแช แแแแ แแแแ แงแแแแแแฆแ, แแแแ แแแแ แแแแ แแจแ? แแแแแแแแแ, แแแฎแกแแแแแแแแก แฌแแ แ. แแฅแแแ แแแฎแแแ แแแแแชแแแแแก, แแแแแแแแแแ, แแฎแแแแ แแแ แแแแฃแแแแแแชแแแก (แจแแแแแแแแ แแ แแคแแแแแ, แแแแแ แแแแแ) แแ แจแแแแแ แฃแแแแแแแ แแฅแแแแก แฃแคแ แแกแก. แแแแ แแ แ แ แแแฎแแแแ, แแฃ แแก แงแแแแแคแแ แ แแแขแแแแขแแแแ แแแฃแแแ?
แแ แขแฃแขแแ แแแแจแ แฉแแแ แจแแแฅแแแแ แแแขแก Telegram-แแกแแแแก, แ แแแแแแช แแแแแฎแแแ แแแแ แแแแแ แแจแแก แแแขแแแแขแแแแชแแแจแ. แแ แงแแแแแแ แแแแแ แ แแก แแ แแก, แ แแ แแแแแ แแ แแแ แแแ แจแแแแแแ แแแแแก แแฎแแแแ 50 แฎแแแแกแแแ! แแฃ แแแ แแแแแ แฅแแแแ แแแขแก Telegram-แแกแแแแก, แแแจแแ แแกแแช แฃแแแ แฌแแแแแแฎแแ
Skillbox แแแ แฉแแแ: แแ แแฅแขแแแฃแแ แแฃแ แกแ
แแแแแแแก แแแแแแแแแ แ แแฃแแแแแ .แจแแแแฎแกแแแแแ: "Habr"-แแก แงแแแแ แแแแแฎแแแแแกแแแแก - แคแแกแแแแแแแ 10 แ แฃแแแแแแ Skillbox-แแก แแแแแกแแแแ แแฃแ แกแแ แฉแแ แแชแฎแแแกแแก "Habr" แกแแ แแแแแแ แแแแแก แแแแแงแแแแแแ.
แฒแแแแฌแงแแ
แแแแแแแแแแแแแก แแแงแแแแแ
แฉแแแ แแแแแแแงแแแแแ
pip3 แแแแแแกแขแแแแ แ google-cloud-bigquery matplotlib numpy pandas python-telegram-bot
แแแแแแแแ แแแแก Google BigQuery API-แก แแแแแแจแแ แแแ
แแฃ แแแแแแ แกแแ แแแกแแก แแแแแงแแแแแ, แฃแแแ แแแแฃแแแแจแแ แแ Google BigQuery API. แแแแกแแแแแก แฉแแแ แแแแแแแแ แ
แแแ แแแแก แแแแแแจแ แแแ แฉแแแ ENABLE APIS AND 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 import 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 แคแฃแแฅแชแแแก แแแแแชแแแแแแก แแแกแแฆแแแแ.
แแแแแชแแแแ แฉแแ แฉแ = query_to_bigquery (แจแแแแแฎแแ)
แจแแแแแ แฉแแแ แแแงแแแแแ แแแ แแฆแแก แแแแแชแแแแแแก แกแแแขแก x-แฆแแ แซแแกแแแแก, แฎแแแ total_posts แกแแแขแก y-แฆแแ แซแแกแแแแก.
x = แแแแแชแแแแ แฉแแ แฉแ['แแแ แแฆแ'].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 แแแ แฉแแแ:
- แแ แฌแแแแแ แแ แแฅแขแแแฃแแ แแฃแ แกแ
"แแ แแแ PRO แแแ แแแแแแแแแ แ" .- แแแแแแ แแฃแ แกแ
"C# แแแแแแแแแ แ 0-แแแ" .- แแ แแฅแขแแแฃแแ แฌแแแก แแฃแ แกแ
"PHP แแแแแแแแแ แ 0-แแแ PRO-แแแ" .
แฌแงแแ แ: www.habr.com