Как Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ простыС ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ Ρ€ΠΎΠ±ΠΎΡ‚Ρƒ. ПишСм Π±ΠΎΡ‚Π° Π½Π° Python ΠΈ Google BigQuery

Как Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ простыС ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ Ρ€ΠΎΠ±ΠΎΡ‚Ρƒ. ПишСм Π±ΠΎΡ‚Π° Π½Π° Python ΠΈ Google BigQuery

Π•ΡΡ‚ΡŒ Π»ΠΈ Ρƒ вас Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‚ΡΡ ΠΈΠ·ΠΎ дня Π² дСнь, ΠΈΠ· Π½Π΅Π΄Π΅Π»ΠΈ Π² нСдСлю? НапримСр, написаниС ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ². Π’Ρ‹ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚Π΅ Π°Π½Π°Π»ΠΈΠ·, Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ (Π΄Π΅Π»Π°Π΅Ρ‚Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ, Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹), Π° Π·Π°Ρ‚Π΅ΠΌ отправляСтС Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΈΠΊΡƒ. Но Ρ‡Ρ‚ΠΎ, Ссли всС это Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ?

Π’ этом Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π»Π΅ ΠΌΡ‹ создадим Π±ΠΎΡ‚Π° для Telegram, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Ρ‡Π΅Ρ‚Π½ΠΎΡΡ‚ΡŒ. А самоС классноС β€” вся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ всСго ΠΈΠ· 50 строк ΠΊΠΎΠ΄Π°! Если Π²Ρ‹ создаСтС Π±ΠΎΡ‚Π° для Telegram Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅, Ρ‚ΠΎ стоит ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ Π²ΠΎΡ‚ этот пост.

Skillbox Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚: ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ курс Python-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ с нуля.

НапоминаСм: для всСх Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ Β«Π₯Π°Π±Ρ€Π°Β» β€” скидка 10 000 Ρ€ΡƒΠ±Π»Π΅ΠΉ ΠΏΡ€ΠΈ записи Π½Π° любой курс Skillbox ΠΏΠΎ ΠΏΡ€ΠΎΠΌΠΎΠΊΠΎΠ΄Ρƒ Β«Π₯Π°Π±Ρ€Β».

ΠŸΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Π΅ΠΌ

УстанавливаСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ google-cloud-bigquery для получСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Google BigQuery. matplotlib, numpy ΠΈ pandas ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅. python-telegram-bot ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² Telegram.

pip3 install google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Google BigQuery API

Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сСрвис, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Google BigQuery API. Для этого ΠΈΠ΄Π΅ΠΌ Π² Google Developers Console ΠΈ создаСм Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ (ΠΈΠ»ΠΈ ΠΆΠ΅ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ).

Π’ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ENABLE APIS AND SERVICES ΠΈ ΠΈΡ‰Π΅ΠΌ BigQuery API.

Как Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ простыС ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ Ρ€ΠΎΠ±ΠΎΡ‚Ρƒ. ПишСм Π±ΠΎΡ‚Π° Π½Π° Python ΠΈ Google BigQuery

Π’Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Enable для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ API.

Как Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ простыС ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ Ρ€ΠΎΠ±ΠΎΡ‚Ρƒ. ПишСм Π±ΠΎΡ‚Π° Π½Π° Python ΠΈ Google BigQuery

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠ»ΡŽΡ‡ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π°

Π‘Π½ΠΎΠ²Π° отправляСмся Π² Google Developers Console, Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Π²ΠΊΠ»Π°Π΄ΠΊΡƒ Credentials, Create credentials ΠΈ Service account key.

Π—Π°Ρ‚Π΅ΠΌ β€” New service account, ΠΈ Π² ΠΏΠΎΠ»Π΅ Service account name Π²Π²ΠΎΠ΄ΠΈΠΌ имя.

Из Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ списка Role Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Project > Owner, Π·Π°Ρ‚Π΅ΠΌ Create.

Как Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ простыС ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ Ρ€ΠΎΠ±ΠΎΡ‚Ρƒ. ПишСм Π±ΠΎΡ‚Π° Π½Π° Python ΠΈ Google BigQuery

Π€Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌ 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.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ userinfobot ΠΈ Π½Π°Π±ΠΈΡ€Π°Π΅ΠΌ /start. Π‘ΠΎΡ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ, chat_id содСрТится Π² ΠΏΠΎΠ»Π΅ 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 строк ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΡ‚Ρ‡Π΅Ρ‚Π½ΠΎΡΡ‚ΡŒ Π±Π΅Π· нашСго Π²ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Π±ΠΎΡ‚Π° ΠΎΡ‚ΡΡŽΠ΄Π°, Π²Ρ‹Π±Ρ€Π°Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ /send.

Как Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ простыС ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ Ρ€ΠΎΠ±ΠΎΡ‚Ρƒ. ПишСм Π±ΠΎΡ‚Π° Π½Π° Python ΠΈ Google BigQuery

Π“ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ΄ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π² ΠΌΠΎΠ΅ΠΌ GitHub.

Skillbox Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com