เบงเบดเบ—เบตเบเบฒเบ™เบกเบญเบšเบซเบกเบฒเบเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบ‡เปˆเบฒเบเป†เปƒเบซเป‰เบเบฑเบšเบซเบธเปˆเบ™เบเบปเบ™. เบเบฒเบ™เบ‚เบฝเบ™ bot เปƒเบ™ Python เปเบฅเบฐ Google BigQuery

เบงเบดเบ—เบตเบเบฒเบ™เบกเบญเบšเบซเบกเบฒเบเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบ‡เปˆเบฒเบเป†เปƒเบซเป‰เบเบฑเบšเบซเบธเปˆเบ™เบเบปเบ™. เบเบฒเบ™เบ‚เบฝเบ™ bot เปƒเบ™ Python เปเบฅเบฐ Google BigQuery

เป€เบˆเบปเป‰เบฒเบกเบตเบงเบฝเบเบ—เบตเปˆเป€เบฎเบฑเบ”เบŠเป‰เบณเบกเบทเป‰เปเบฅเป‰เบงเบกเบทเป‰เบฅเบฐเบญเบฒเบ—เบดเบ”เบšเป? เบ•เบปเบงเบขเปˆเบฒเบ‡, เบเบฒเบ™เบ‚เบฝเบ™เบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™. เบ—เปˆเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ‚เปเป‰เบกเบนเบ™, เบงเบดเป€เบ„เบฒเบฐเบกเบฑเบ™, เบˆเบดเบ™เบ•เบฐเบ™เบฒเบเบฒเบ™เบกเบฑเบ™ (เป€เบฎเบฑเบ”เบเบฒเบŸ, เบ•เบฒเบ•เบฐเบฅเบฒเบ‡), เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบชเบปเปˆเบ‡เปƒเบซเป‰เบ™เบฒเบเบˆเป‰เบฒเบ‡เบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เปเบ•เปˆเบˆเบฐเป€เบ›เบฑเบ™เปเบ™เบงเปƒเบ”เบ–เป‰เบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เปเบกเปˆเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”?

เปƒเบ™เบšเบปเบ”เบชเบญเบ™เบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเป‰เบฒเบ‡ bot เบชเปเบฒเบฅเบฑเบš Telegram เบ—เบตเปˆเบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบเบฒเบ™เบฅเบฒเบเบ‡เบฒเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”. เปเบฅเบฐเบชเบดเปˆเบ‡เบ—เบตเปˆ coolest เปเบกเปˆเบ™เบงเปˆเบฒเป‚เบ„เบ‡เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฐเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบžเบฝเบ‡เปเบ•เปˆ 50 เป€เบชเบฑเป‰เบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”! เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เบชเป‰เบฒเบ‡ bot เบชเปเบฒเบฅเบฑเบš Telegram เป€เบ›เบฑเบ™เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบ„เบงเบ™เบญเปˆเบฒเบ™เบญเบฑเบ™เบ™เบตเป‰ เป‚เบžเบ”.

Skillbox เปเบ™เบฐเบ™เปเบฒ: เบซเบผเบฑเบเบชเบนเบ”เบžเบฒเบเบ›เบฐเบ•เบดเบšเบฑเบ” เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ Python เบ•เบฑเป‰เบ‡เปเบ•เปˆเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™.

เบžเบงเบเป€เบฎเบปเบฒเป€เบ•เบทเบญเบ™: เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบญเปˆเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡ "Habr" - เบชเปˆเบงเบ™เบซเบผเบธเบ” 10 rubles เป€เบกเบทเปˆเบญเบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เปƒเบ™เบซเบผเบฑเบเบชเบนเบ” Skillbox เป‚เบ”เบเปƒเบŠเป‰เบฅเบฐเบซเบฑเบ”เบชเบปเปˆเบ‡เป€เบชเบตเบก "Habr".

เปƒเบซเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™

เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰ google-cloud-bigquery เป€เบžเบทเปˆเบญเป€เบญเบปเบฒเบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบ Google BigQuery. matplotlib, เบšเปเปˆเปเบ™เปˆเบ™เบญเบ™ ะธ เปเบต เปเบžเบ™เบ”เบฒ เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เป€เบซเบฑเบ™เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป„เบ”เป‰. python-telegram-bot เบˆเบฐเบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบชเปเบฒเป€เบฅเบฑเบ”เบฎเบนเบšเป„เบ›เบซเบฒ Telegram.

pip3 เบ•เบดเบ”เบ•เบฑเป‰เบ‡ google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

เบเบณเบฅเบฑเบ‡เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ Google BigQuery API

เบ–เป‰เบฒเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰เบšเปเบฅเบดเบเบฒเบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ Google BigQuery API. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเป„เบ›เบซเบฒ Google Developers Console เปเบฅเบฐเบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™เปƒเบซเบกเปˆ (เบซเบผเบทเป€เบฅเบทเบญเบเบญเบฑเบ™เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง).

เปƒเบ™เปเบœเบ‡เบ„เบงเบšเบ„เบธเบก, เป€เบฅเบทเบญเบ ENABLE APIS AND SERVICES เปเบฅเบฐเบŠเบญเบเบซเบฒ BigQuery API.

เบงเบดเบ—เบตเบเบฒเบ™เบกเบญเบšเบซเบกเบฒเบเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบ‡เปˆเบฒเบเป†เปƒเบซเป‰เบเบฑเบšเบซเบธเปˆเบ™เบเบปเบ™. เบเบฒเบ™เบ‚เบฝเบ™ bot เปƒเบ™ Python เปเบฅเบฐ Google BigQuery

เป€เบฅเบทเบญเบ Enable เป€เบžเบทเปˆเบญเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ API.

เบงเบดเบ—เบตเบเบฒเบ™เบกเบญเบšเบซเบกเบฒเบเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบ‡เปˆเบฒเบเป†เปƒเบซเป‰เบเบฑเบšเบซเบธเปˆเบ™เบเบปเบ™. เบเบฒเบ™เบ‚เบฝเบ™ bot เปƒเบ™ Python เปเบฅเบฐ Google BigQuery

เบชเป‰เบฒเบ‡เบฅเบฐเบซเบฑเบ”เบšเบฑเบ™เบŠเบต

เปƒเบซเป‰เป„เบ›เบญเบตเบเบ„เบฑเป‰เบ‡ Google Developers Console, เป€เบฅเบทเบญเบเปเบ–เบšเบ‚เปเป‰เบกเบนเบ™เบ›เบฐเบˆเปเบฒเบ•เบปเบง, เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบ›เบฐเบˆเปเบฒเบ•เบปเบงเปเบฅเบฐเบฅเบฐเบซเบฑเบ”เบšเบฑเบ™เบŠเบตเบšเปเบฅเบดเบเบฒเบ™.

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ - เบšเบฑเบ™เบŠเบตเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปƒเบซเบกเปˆ, เปเบฅเบฐเปƒเบชเปˆเบŠเบทเปˆเปƒเบ™เบŠเบทเปˆเบšเบฑเบ™เบŠเบตเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบžเบฒเบเบชเบฐเบซเบ™เบฒเบก.

เบˆเบฒเบโ€‹เบšเบฑเบ™โ€‹เบŠเบตโ€‹เบฅเบฒเบโ€‹เบŠเบทเปˆโ€‹เป€เบฅเบทเปˆเบญเบ™โ€‹เบฅเบปเบ‡โ€‹เบšเบปเบ”โ€‹เบšเบฒเบ”โ€‹, เป€เบฅเบทเบญเบโ€‹เป€เบญเบปเบฒโ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹> เป€เบˆเบปเป‰เบฒโ€‹เบ‚เบญเบ‡โ€‹, เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ™เบฑเป‰เบ™โ€‹เบชเป‰เบฒเบ‡โ€‹.

เบงเบดเบ—เบตเบเบฒเบ™เบกเบญเบšเบซเบกเบฒเบเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบ‡เปˆเบฒเบเป†เปƒเบซเป‰เบเบฑเบšเบซเบธเปˆเบ™เบเบปเบ™. เบเบฒเบ™เบ‚เบฝเบ™ bot เปƒเบ™ Python เปเบฅเบฐ Google BigQuery

เป„เบŸเบฅเปŒเบ—เบตเปˆเบˆเบฐเบ–เบทเบเบ”เบฒเบงเป‚เบซเบผเบ”เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เป€เบญเบตเป‰เบ™เบงเปˆเบฒ 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.

เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ userinfobot เปเบฅเบฐเบžเบดเบก /start. bot เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™, 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'))

เป‚เบ„เบ‡เบเบฒเบ™เบ•เบปเป‰เบ™เบ•เป

เบชเบธเบ”เบ—เป‰เบฒเบ, เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบซเบ™เป‰เบฒเบญเบทเปˆเบ™, เบ•เบปเป‰เบ™เบ•เป, เป€เบžเบทเปˆเบญเป€เบ›เบตเบ”เบ•เบปเบงเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™. เบขเปˆเบฒเบฅเบทเบกเบ›เปˆเบฝเบ™ 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 เบˆเบฒเบเบ™เบตเป‰เป‚เบ”เบเบเบฒเบ™เป€เบฅเบทเบญเบเบ„เปเบฒเบชเบฑเปˆเบ‡ /send.

เบงเบดเบ—เบตเบเบฒเบ™เบกเบญเบšเบซเบกเบฒเบเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบ‡เปˆเบฒเบเป†เปƒเบซเป‰เบเบฑเบšเบซเบธเปˆเบ™เบเบปเบ™. เบเบฒเบ™เบ‚เบฝเบ™ bot เปƒเบ™ Python เปเบฅเบฐ Google BigQuery

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบฅเบฐเบซเบฑเบ”เบชเปเบฒเป€เบฅเบฑเบ”เบฎเบนเบšเบ—เบตเปˆ GitHub เบ‚เบญเบ‡เบ‚เป‰เบญเบ.

Skillbox เปเบ™เบฐเบ™เปเบฒ:

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™