ΠΡΡΡ Π»ΠΈ Ρ Π²Π°Ρ Π·Π°Π΄Π°ΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΡΡ ΠΈΠ·ΠΎ Π΄Π½Ρ Π² Π΄Π΅Π½Ρ, ΠΈΠ· Π½Π΅Π΄Π΅Π»ΠΈ Π² Π½Π΅Π΄Π΅Π»Ρ? ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΎΡΡΠ΅ΡΠΎΠ². ΠΡ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΠ΅ Π°Π½Π°Π»ΠΈΠ·, Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΠ΅ (Π΄Π΅Π»Π°Π΅ΡΠ΅ Π³ΡΠ°ΡΠΈΠΊΠΈ, Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΡ), Π° Π·Π°ΡΠ΅ΠΌ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΠ΅ Π½Π°ΡΠ°Π»ΡΠ½ΠΈΠΊΡ. ΠΠΎ ΡΡΠΎ, Π΅ΡΠ»ΠΈ Π²ΡΠ΅ ΡΡΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ?
Π ΡΡΠΎΠΌ ΡΡΡΠΎΡΠΈΠ°Π»Π΅ ΠΌΡ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π±ΠΎΡΠ° Π΄Π»Ρ Telegram, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΡΠ΅ΡΠ½ΠΎΡΡΡ. Π ΡΠ°ΠΌΠΎΠ΅ ΠΊΠ»Π°ΡΡΠ½ΠΎΠ΅ β Π²ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π±ΡΠ΄Π΅Ρ ΡΠΎΡΡΠΎΡΡΡ Π²ΡΠ΅Π³ΠΎ ΠΈΠ· 50 ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π°! ΠΡΠ»ΠΈ Π²Ρ ΡΠΎΠ·Π΄Π°Π΅ΡΠ΅ Π±ΠΎΡΠ° Π΄Π»Ρ Telegram Π²ΠΏΠ΅ΡΠ²ΡΠ΅, ΡΠΎ ΡΡΠΎΠΈΡ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ Π΅ΡΠ΅ Π²ΠΎΡ ΡΡΠΎΡ
Skillbox ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅Ρ: ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΊΡΡΡ
Python-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Ρ Π½ΡΠ»Ρ .ΠΠ°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ: Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉ Β«Π₯Π°Π±ΡΠ°Β» β ΡΠΊΠΈΠ΄ΠΊΠ° 10 000 ΡΡΠ±Π»Π΅ΠΉ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠΈ Π½Π° Π»ΡΠ±ΠΎΠΉ ΠΊΡΡΡ Skillbox ΠΏΠΎ ΠΏΡΠΎΠΌΠΎΠΊΠΎΠ΄Ρ Β«Π₯Π°Π±ΡΒ».
ΠΡΠΈΡΡΡΠΏΠ°Π΅ΠΌ
Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ
ΠΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
pip3 install google-cloud-bigquery matplotlib numpy pandas python-telegram-bot
ΠΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌ Google BigQuery API
ΠΡΠ»ΠΈ ΠΌΡ Ρ
ΠΎΡΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠ²ΠΈΡ, Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ Google BigQuery API. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΠ΄Π΅ΠΌ Π²
Π ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ ENABLE APIS AND SERVICES ΠΈ ΠΈΡΠ΅ΠΌ BigQuery API.
ΠΡΠ±ΠΈΡΠ°Π΅ΠΌ Enable Π΄Π»Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ API.
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠ»ΡΡ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ°
Π‘Π½ΠΎΠ²Π° ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ Π²
ΠΠ°ΡΠ΅ΠΌ β New service account, ΠΈ Π² ΠΏΠΎΠ»Π΅ Service account name Π²Π²ΠΎΠ΄ΠΈΠΌ ΠΈΠΌΡ.
ΠΠ· Π²ΡΠΏΠ°Π΄Π°ΡΡΠ΅Π³ΠΎ ΡΠΏΠΈΡΠΊΠ° Role Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ Project > Owner, Π·Π°ΡΠ΅ΠΌ Create.
Π€Π°ΠΉΠ», ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π°Π³ΡΡΠΆΠ°ΡΡΡΡ, Π½Π°Π·ΡΠ²Π°Π΅ΠΌ creds.json.
ΠΡΡΡΠ°Π²Π»ΡΠ΅ΠΌ GOOGLE_APPLICATION_CREDENTIALS, ΡΠΊΠ°Π·Π°Π² ΠΏΡΡΡ ΠΊ creds.json Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅.
export GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]’
ΠΡΠ»ΠΈ Π²ΡΠ΅ ΠΏΡΠΎΡΠ»ΠΎ Ρ ΠΎΡΠΎΡΠΎ, ΡΠ°ΠΌΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π½Π°ΡΠ°ΡΡ ΠΏΠΈΡΠ°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
ΠΠ»Ρ ΡΡΡΠΎΡΠΈΠ°Π»Π° ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· bigquery-public-data.stackoverflow, Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΎΡΡΠ΅ΡΠ° Π²ΡΠ±Π΅ΡΠ΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΡΡ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΉ.
ΠΡΠ΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ.
Query the table -> Visualize the data -> Save the visualization -> Send the image
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΎΠ΄Π½Ρ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°.
Query to BigQuery
Π‘Π½Π°ΡΠ°Π»Π° ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ.
from 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.
import matplotlib.pyplot as plt
ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², Π³Π΄Π΅ 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
"""
ΠΠ°ΠΏΡΠΎΡ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠΎΠ±ΡΠ°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π·Π° Π΄Π²Π΅ Π½Π΅Π΄Π΅Π»ΠΈ, Π½Π°ΡΠΈΠ½Π°Ρ Ρ 2 Π΄Π΅ΠΊΠ°Π±ΡΡ 2018 Π³ΠΎΠ΄Π°.
ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΡ Π΄Π°ΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ 2018-12-02 β ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π·Π°ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π² bigquery-public-data.stackoverflow.post_history, Π² Π΄ΡΡΠ³ΠΈΡ ΡΠ»ΡΡΠ°ΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ CURRENT_DATE () Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ°ΠΌΡΡ Π½ΠΎΠ²ΡΡ Π΄Π°Π½Π½ΡΡ .
ΠΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ query_to_bigquery Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ .
dataframe = query_to_bigquery(query)
ΠΠ°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡ Π΄Π°Π½Π½ΡΡ date Π΄Π»Ρ ΠΎΡΠΈ Ρ , Π° ΠΊΠΎΠ»ΠΎΠ½ΠΊΡ total_posts Π΄Π»Ρ ΠΎΡΠΈ Ρ.
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=’Daily Posts’)
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'))
ΠΠ»Π°Π²Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π΅ΡΠ΅ ΠΎΠ΄Π½Ρ ΡΡΠ½ΠΊΡΠΈΡ, main, Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ΅ Π·Π°Π±ΡΠ²Π°ΠΉΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ 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Β» .- ΠΠ½Π»Π°ΠΉΠ½-ΠΊΡΡΡ
Β«Π‘#-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Ρ 0Β» .- ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π³ΠΎΠ΄ΠΎΠ²ΠΎΠΉ ΠΊΡΡΡ
Β«PHP-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Ρ 0 Π΄ΠΎ PROΒ» .
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com