เปเบเบปเปเบฒเบกเบตเบงเบฝเบเบเบตเปเปเบฎเบฑเบเบเปเบณเบกเบทเปเปเบฅเปเบงเบกเบทเปเบฅเบฐเบญเบฒเบเบดเบเบเป? เบเบปเบงเบขเปเบฒเบ, เบเบฒเบเบเบฝเบเบเบปเบเบฅเบฒเบเบเบฒเบ. เบเปเบฒเบเบฎเปเบญเบเบเปเบเปเปเบกเบนเบ, เบงเบดเปเบเบฒเบฐเบกเบฑเบ, เบเบดเบเบเบฐเบเบฒเบเบฒเบเบกเบฑเบ (เปเบฎเบฑเบเบเบฒเบ, เบเบฒเบเบฐเบฅเบฒเบ), เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบชเบปเปเบเปเบซเปเบเบฒเบเบเปเบฒเบเบเบญเบเบเปเบฒเบ. เปเบเปเบเบฐเปเบเบฑเบเปเบเบงเปเบเบเปเบฒเบเบฑเบเบซเบกเบปเบเบเบตเปเปเบกเปเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบ?
เปเบเบเบปเบเบชเบญเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเบฐเบชเปเบฒเบ bot เบชเปเบฒเบฅเบฑเบ Telegram เบเบตเปเบเบฐเบเปเบงเบเปเบซเปเบเบฒเบเบฅเบฒเบเบเบฒเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบ. เปเบฅเบฐเบชเบดเปเบเบเบตเป coolest เปเบกเปเบเบงเปเบฒเปเบเบเบเบฒเบเบเบฑเบเบซเบกเบปเบเบเบฐเบเบฐเบเบญเบเบเปเบงเบเบเบฝเบเปเบเป 50 เปเบชเบฑเปเบเบเบญเบเบฅเบฐเบซเบฑเบ! เบเปเบฒเบเปเบฒเบเบเปเบฒเบฅเบฑเบเบชเปเบฒเบ bot เบชเปเบฒเบฅเบฑเบ Telegram เปเบเบฑเบเบเบฑเปเบเบเปเบฒเบญเบดเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบเบงเบเบญเปเบฒเบเบญเบฑเบเบเบตเป
Skillbox เปเบเบฐเบเปเบฒ: เบซเบผเบฑเบเบชเบนเบเบเบฒเบเบเบฐเบเบดเบเบฑเบ
เบเบฑเบเบเบฑเบเบเบฐเบเบฒ Python เบเบฑเปเบเปเบเปเปเบฅเบตเปเบกเบเบปเปเบ .เบเบงเบเปเบฎเบปเบฒเปเบเบทเบญเบ: เบชเปเบฒเบฅเบฑเบเบเบนเปเบญเปเบฒเบเบเบฑเบเบซเบกเบปเบเบเบญเบ "Habr" - เบชเปเบงเบเบซเบผเบธเบ 10 rubles เปเบกเบทเปเบญเบฅเบปเบเบเบฐเบเบฝเบเปเบเบซเบผเบฑเบเบชเบนเบ Skillbox เปเบเบเปเบเปเบฅเบฐเบซเบฑเบเบชเบปเปเบเปเบชเบตเบก "Habr".
เปเบซเปเปเบฅเบตเปเบกเบเบปเปเบ
เบเบฒเบเบเบดเบเบเบฑเปเบเบซเปเบญเบเบชเบฐเบซเบกเบธเบ
เบเบงเบเปเบฎเบปเบฒเบเบฐเบเปเบฒเปเบเป
pip3 เบเบดเบเบเบฑเปเบ google-cloud-bigquery matplotlib numpy pandas python-telegram-bot
เบเบณเบฅเบฑเบเปเบเบทเปเบญเบกเบเปเป Google BigQuery API
เบเปเบฒเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเปเบเปเบเปเบฅเบดเบเบฒเบ, เบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเบทเปเบญเบกเบเปเป Google BigQuery API. เปเบเบทเปเบญเปเบฎเบฑเบเบชเบดเปเบเบเบตเป, เบเบงเบเปเบฎเบปเบฒเปเบเบซเบฒ
เปเบเปเบเบเบเบงเบเบเบธเบก, เปเบฅเบทเบญเบ ENABLE APIS AND SERVICES เปเบฅเบฐเบเบญเบเบซเบฒ BigQuery API.
เปเบฅเบทเบญเบ Enable เปเบเบทเปเบญเปเบเบทเปเบญเบกเบเปเป API.
เบชเปเบฒเบเบฅเบฐเบซเบฑเบเบเบฑเบเบเบต
เปเบซเปเปเบเบญเบตเบเบเบฑเปเบ
เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ - เบเบฑเบเบเบตเบเบฒเบเบเปเบฅเบดเบเบฒเบเปเบซเบกเป, เปเบฅเบฐเปเบชเปเบเบทเปเปเบเบเบทเปเบเบฑเบเบเบตเบเบฒเบเบเปเบฅเบดเบเบฒเบเบเบฒเบเบชเบฐเบซเบเบฒเบก.
เบเบฒเบโเบเบฑเบโเบเบตโเบฅเบฒเบโเบเบทเปโเปเบฅเบทเปเบญเบโเบฅเบปเบโเบเบปเบโเบเบฒเบโ, เปเบฅเบทเบญเบโเปเบญเบปเบฒโเปเบเบโเบเบฒเบโ> เปเบเบปเปเบฒโเบเบญเบโ, เบซเบผเบฑเบโเบเบฒเบโเบเบฑเปเบโเบชเปเบฒเบโ.
เปเบเบฅเปเบเบตเปเบเบฐเบเบทเบเบเบฒเบงเปเบซเบผเบเปเบเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบเปเบญเบตเปเบเบงเปเบฒ creds.json.
เบเบฑเปเบเบเปเบฒ GOOGLE_APPLICATION_CREDENTIALS, เบฅเบฐเบเบธเปเบชเบฑเปเบเบเบฒเบเปเบเบซเบฒ creds.json เปเบ terminal.
เบชเบปเปเบเบญเบญเบ GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]'
เบเปเบฒเบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบเปเบเปเบเบต, เบกเบฑเบเปเบเบฑเบเปเบงเบฅเบฒเบเบตเปเบเบฐเปเบฅเบตเปเบกเบเบปเปเบเบเบฒเบเบเบฝเบเปเบเบผเปเบเบผเบก.
เบเบฒเบเบชเปเบฒเบเปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบ
เบชเปเบฒเบฅเบฑเบเบเบฒเบเบชเบญเบเบเบงเบเปเบฎเบปเบฒเบเบฐเบเปเบฒเปเบเปเบเปเปเบกเบนเบเบเบฒเบ bigquery-public-data.stackoverflow, เบชเปเบฒเบฅเบฑเบเบเบปเบเบฅเบฒเบเบเบฒเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเบเบงเบเปเบฎเบปเบฒเบเบฐเปเบฅเบทเบญเบเปเบญเบปเบฒเบเปเบฒเบเบงเบเบชเบดเปเบเบเบดเบกเบเบฐเบเปเบฒเบงเบฑเบ.
เบเบธเบเบชเบดเปเบเบเบธเบเบขเปเบฒเบเปเบกเปเบเบเปเบญเบเบเปเบฒเบเบเปเบฒเบเบเบฒเบ.
เบชเบญเบเบเบฒเบกเบเบฒเบเบฐเบฅเบฒเบ -> Visualize the data -> Save the visualization -> เบชเบปเปเบเบฎเบนเบเบเบฒเบ
เปเบซเปเบชเปเบฒเบเบซเบเบถเปเบเบเบฑเบเบเบฑเบเปเบเบทเปเบญเบเปเบฒเบเบปเบเปเบเปเบฅเบฐเบซเบปเบงเบเปเป.
เบชเบญเบเบเบฒเบกเบซเบฒ BigQuery
เบเปเบฒเบญเบดเบเบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบปเปเบฒเบซเปเบญเบเบชเบฐเบซเบกเบธเบ.
เบเบฒเบ google.cloud import 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.
เบเปเบฒเปเบเบปเปเบฒ 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.
เบเบงเบเปเบฎเบปเบฒเปเบเป
เบเบญเบเบเบตเปเปเบซเปเบชเปเบฒเบเบเบฑเบเบเบฑเบ 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.
เบเบงเบเปเบฎเบปเบฒเปเบเบตเบเปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเปเบเบเบเบฒเบเปเบชเปเบเปเบฒเบชเบฑเปเบเปเบ terminal:
python3 main.py
เบเบฑเบเบซเบกเบปเบเปเบกเปเบเบเบฝเบกเบเปเบญเบก. เปเบเบเบฑเบเบเบธเบเบฑเบเบเบงเบเปเบฎเบปเบฒเบกเบตเบซเบธเปเบเบเบปเบเบเบตเปเบเบฐเบเบญเบเบเปเบงเบ 50 เปเบชเบฑเปเบเบฅเบฐเบซเบฑเบเบเบตเปเบชเปเบฒเบเบเบปเบเบฅเบฒเบเบเบฒเบเปเบเบเบเปเปเบกเบตเบเบฒเบเปเบเบเปเบเบเบเบญเบเบเบงเบเปเบฎเบปเบฒ.
เปเบซเปเบเบงเบเปเบเบดเปเบ bot
เบเปเบฒเบเบชเบฒเบกเบฒเบเปเบเปเบฎเบฑเบเบฅเบฐเบซเบฑเบเบชเปเบฒเปเบฅเบฑเบเบฎเบนเบเบเบตเป
Skillbox เปเบเบฐเบเปเบฒ:
- เบซเบผเบฑเบเบชเบนเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบชเบญเบเบเบต
"เบเปเบญเบเปเบเบฑเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒเปเบงเบฑเบ PRO" .- เบซเบผเบฑเบเบชเบนเบเบญเบญเบเปเบฅเบ
"เบเบฑเบเบเบฑเบเบเบฐเบเบฒ C# เบเบฒเบ 0" .- เบซเบผเบฑเบเบชเบนเบเบเบฒเบเบเบฐเบเบดเบเบฑเบ
"เบเบฑเบเบเบฑเบเบเบฐเบเบฒ PHP เบเบฒเบ 0 เปเบเบดเบ PRO" .
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com