เชฐเซ‹เชฌเซ‹เชŸเชจเซ‡ เชธเชฐเชณ เช…เชนเซ‡เชตเชพเชฒเซ‹ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเซ‹เช‚เชชเชตเชพ. Python เช…เชจเซ‡ Google BigQuery เชฎเชพเช‚ เชฌเซ‹เชŸ เชฒเช–เชตเซเช‚

เชฐเซ‹เชฌเซ‹เชŸเชจเซ‡ เชธเชฐเชณ เช…เชนเซ‡เชตเชพเชฒเซ‹ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเซ‹เช‚เชชเชตเชพ. Python เช…เชจเซ‡ Google BigQuery เชฎเชพเช‚ เชฌเซ‹เชŸ เชฒเช–เชตเซเช‚

เชถเซเช‚ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชเชตเชพ เช•เชพเชฐเซเชฏเซ‹ เช›เซ‡ เชœเซ‡ เชฆเชฐเชฐเซ‹เชœ, เช…เช เชตเชพเชกเชฟเชฏเชพ เชชเช›เซ€ เช…เช เชตเชพเชกเชฟเชฏเชพเชจเซเช‚ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชจ เช•เชฐเซ‡ เช›เซ‡? เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช…เชนเซ‡เชตเชพเชฒเซ‹ เชฒเช–เชตเชพ. เชคเชฎเซ‡ เชกเซ‡เชŸเชพเชจเซ€ เชตเชฟเชจเช‚เชคเซ€ เช•เชฐเซ‹, เชคเซ‡เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเซ‹, เชคเซ‡เชจเซ‡ เชตเชฟเชเซเชฏเซเช…เชฒเชพเชˆเช เช•เชฐเซ‹ (เช—เซเชฐเชพเชซ, เชšเชพเชฐเซเชŸ เชฌเชจเชพเชตเซ‹), เช…เชจเซ‡ เชชเช›เซ€ เชคเซ‡เชจเซ‡ เชคเชฎเชพเชฐเชพ เชฌเซ‹เชธเชจเซ‡ เชฎเซ‹เช•เชฒเซ‹. เชชเชฐเช‚เชคเซ เชœเซ‹ เช† เชฌเชงเซเช‚ เชธเซเชตเชฏเช‚เชธเช‚เชšเชพเชฒเชฟเชค เชนเซ‹เชค เชคเซ‹?

เช† เชŸเซเชฏเซเชŸเซ‹เชฐเซ€เชฏเชฒเชฎเชพเช‚ เช†เชชเชฃเซ‡ เชŸเซ‡เชฒเชฟเช—เซเชฐเชพเชฎ เชฎเชพเชŸเซ‡ เชเช• เชฌเซ‹เชŸ เชฌเชจเชพเชตเซ€เชถเซเช‚ เชœเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เชฐเซ€เชชเซ‹เชฐเซเชŸเซ€เช‚เช—เชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเชถเซ‡. เช…เชจเซ‡ เชธเซŒเชฅเซ€ เชธเชฐเชธ เชตเชพเชค เช เช›เซ‡ เช•เซ‡ เช†เช–เชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚ เช•เซ‹เชกเชจเซ€ เชฎเชพเชคเซเชฐ 50 เชฒเซ€เชŸเซ€เช“ เชนเชถเซ‡! เชœเซ‹ เชคเชฎเซ‡ เชชเชนเซ‡เชฒเซ€เชตเชพเชฐ เชŸเซ‡เชฒเชฟเช—เซเชฐเชพเชฎ เชฎเชพเชŸเซ‡ เชฌเซ‹เชŸ เชฌเชจเชพเชตเซ€ เชฐเชนเซเชฏเชพ เช›เซ‹, เชคเซ‹ เชคเชฎเชพเชฐเซ‡ เช† เชชเชฃ เชตเชพเช‚เชšเชตเซเช‚ เชœเซ‹เชˆเช เชชเซ‹เชธเซเชŸ.

เชธเซเช•เชฟเชฒเชฌเซ‹เช•เซเชธ เชญเชฒเชพเชฎเชฃ เช•เชฐเซ‡ เช›เซ‡: เชชเซเชฐเซ‡เช•เซเชŸเชฟเช•เชฒ เช•เซ‹เชฐเซเชธ เชถเชฐเซ‚เช†เชคเชฅเซ€ เชชเชพเชฏเชฅเซ‹เชจ เชกเซ‡เชตเชฒเชชเชฐ.

เช…เชฎเซ‡ เชฏเชพเชฆ เช•เชฐเชพเชตเซ€เช เช›เซ€เช: Habrเชจเชพ เชคเชฎเชพเชฎ เชตเชพเชšเช•เซ‹ เชฎเชพเชŸเซ‡ - Habr เชชเซเชฐเซ‹เชฎเซ‹ เช•เซ‹เชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซ‹เชˆเชชเชฃ เชธเซเช•เชฟเชฒเชฌเซ‹เช•เซเชธ เช•เซ‹เชฐเซเชธเชฎเชพเช‚ เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ 10 เชฐเซ‚เชฌเชฒ เชกเชฟเชธเซเช•เชพเช‰เชจเซเชŸ.

เชšเชพเชฒเซ‹, เชถเชฐเซ เช•เชฐเซ€เช

เชชเซเชธเซเชคเช•เชพเชฒเชฏเซ‹ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

เช…เชฎเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถเซเช‚ google-Cloud-bigquery Google BigQuery เชฎเชพเช‚เชฅเซ€ เชกเซ‡เชŸเชพ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡. matplotlib, เชจเชฟเชทเซเช•เชชเชŸ ะธ เชชเช‚เชกเชพเชธ เชคเชฎเชจเซ‡ เชคเชฎเชพเชฐเชพ เชกเซ‡เชŸเชพเชจเซ€ เช•เชฒเซเชชเชจเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเชถเซ‡. python-telegram-bot เชคเซˆเชฏเชพเชฐ เชกเซ‡เชŸเชพ เชŸเซ‡เชฒเชฟเช—เซเชฐเชพเชฎ เชชเชฐ เชฎเซ‹เช•เชฒเชถเซ‡.

pip3 เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹ google-Cloud-bigquery matplotlib numpy pandas python-telegram-bot

Google BigQuery API เชจเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชœเซ‹ เช†เชชเชฃเซ‡ เชธเซ‡เชตเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช, เชคเซ‹ เช…เชฎเชพเชฐเซ‡ Google BigQuery API เชจเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช†เชชเชฃเซ‡ เชœเชˆเช เช›เซ€เช Google Developers Console เช…เชจเซ‡ เชจเชตเซ‹ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเซ‹ (เช…เชฅเชตเชพ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เช›เซ‡ เชคเซ‡ เชชเชธเช‚เชฆ เช•เชฐเซ‹).

เช•เช‚เชŸเซเชฐเซ‹เชฒ เชชเซ‡เชจเชฒเชฎเชพเช‚, APIs เช…เชจเซ‡ เชธเซ‡เชตเชพเช“เชจเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเซ‹ เชชเชธเช‚เชฆ เช•เชฐเซ‹ เช…เชจเซ‡ BigQuery API เชฎเชพเชŸเซ‡ เชœเซเช“.

เชฐเซ‹เชฌเซ‹เชŸเชจเซ‡ เชธเชฐเชณ เช…เชนเซ‡เชตเชพเชฒเซ‹ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเซ‹เช‚เชชเชตเชพ. Python เช…เชจเซ‡ Google BigQuery เชฎเชพเช‚ เชฌเซ‹เชŸ เชฒเช–เชตเซเช‚

API เชจเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเซ‹ เชชเชธเช‚เชฆ เช•เชฐเซ‹.

เชฐเซ‹เชฌเซ‹เชŸเชจเซ‡ เชธเชฐเชณ เช…เชนเซ‡เชตเชพเชฒเซ‹ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเซ‹เช‚เชชเชตเชพ. Python เช…เชจเซ‡ Google BigQuery เชฎเชพเช‚ เชฌเซ‹เชŸ เชฒเช–เชตเซเช‚

เชเช•เชพเช‰เชจเซเชŸ เช•เซ€ เชฌเชจเชพเชตเซ‹

เชšเชพเชฒเซ‹ เชซเชฐเซ€ เชœเชˆเช Google Developers Console, เช“เชณเช–เชชเชคเซเชฐ เชŸเซ‡เชฌ เชชเชธเช‚เชฆ เช•เชฐเซ‹, เช“เชณเช–เชชเชคเซเชฐเซ‹ เชฌเชจเชพเชตเซ‹ เช…เชจเซ‡ เชธเซ‡เชตเชพ เชเช•เชพเช‰เชจเซเชŸ เช•เซ€.

เชชเช›เซ€ - เชจเชตเซเช‚ เชธเชฐเซเชตเชฟเชธ เชเช•เชพเช‰เชจเซเชŸ, เช…เชจเซ‡ เชธเชฐเซเชตเชฟเชธ เชเช•เชพเช‰เชจเซเชŸ เชจเชพเชฎ เชซเซ€เชฒเซเชกเชฎเชพเช‚ เชจเชพเชฎ เชฆเชพเช–เชฒ เช•เชฐเซ‹.

เชฐเซ‹เชฒ เชกเซเชฐเซ‹เชช-เชกเชพเช‰เชจ เชธเซ‚เชšเชฟเชฎเชพเช‚เชฅเซ€, เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ > เชฎเชพเชฒเชฟเช• เชชเชธเช‚เชฆ เช•เชฐเซ‹, เชชเช›เซ€ เชฌเชจเชพเชตเซ‹.

เชฐเซ‹เชฌเซ‹เชŸเชจเซ‡ เชธเชฐเชณ เช…เชนเซ‡เชตเชพเชฒเซ‹ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเซ‹เช‚เชชเชตเชพ. Python เช…เชจเซ‡ Google BigQuery เชฎเชพเช‚ เชฌเซ‹เชŸ เชฒเช–เชตเซเช‚

เชซเชพเช‡เชฒ เชœเซ‡ เช†เชชเชฎเซ‡เชณเซ‡ เชกเชพเช‰เชจเชฒเซ‹เชก เชฅเชถเซ‡ เชคเซ‡เชจเซ‡ creds.json เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

GOOGLE_APPLICATION_CREDENTIALS เชธเซ‡เชŸ เช•เชฐเซ‹, เชŸเชฐเซเชฎเชฟเชจเชฒเชฎเชพเช‚ creds.jsonเชจเซ‹ เชฎเชพเชฐเซเช— เชธเซเชชเชทเซเชŸ เช•เชฐเซ‹.

GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]' เชจเชฟเช•เชพเชธ เช•เชฐเซ‹

เชœเซ‹ เชฌเชงเซเช‚ เชฌเชฐเชพเชฌเชฐ เชฅเชฏเซเช‚, เชคเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเช–เชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเชตเชพเชจเซ‹ เชธเชฎเชฏ เช›เซ‡.

เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฌเชจเชพเชตเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

เชŸเซเชฏเซเชŸเซ‹เชฐเซ€เชฏเชฒ เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ bigquery-public-data.stackoverflow เชจเชพ เชกเซ‡เชŸเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถเซเช‚, เช…เชฎเชพเชฐเชพ เชฐเชฟเชชเซ‹เชฐเซเชŸ เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ เชฆเซˆเชจเชฟเช• เชชเซเชฐเช•เชพเชถเชจเซ‹เชจเซ€ เชธเช‚เช–เซเชฏเชพ เชชเชธเช‚เชฆ เช•เชฐเซ€เชถเซเช‚.

เชฌเชงเซเช‚ เชเช•เชฆเชฎ เชธเชฐเชณ เช›เซ‡.

เช•เซ‹เชทเซเชŸเช•เชจเซ€ เช•เซเชตเซ‡เชฐเซ€ -> เชกเซ‡เชŸเชพเชจเซ€ เช•เชฒเซเชชเชจเชพ เช•เชฐเซ‹ -> เชตเชฟเชเซเชฏเซเชฒเชพเช‡เชเซ‡เชถเชจ เชธเชพเชšเชตเซ‹ -> เช›เชฌเซ€ เชฎเซ‹เช•เชฒเซ‹

เชšเชพเชฒเซ‹ เชฆเชฐเซ‡เช• เชฅเซเชฐเซ‡เชกเชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เชซเช‚เช•เซเชถเชจ เชฌเชจเชพเชตเซ€เช.

BigQuery เชจเซ‡ เช•เซเชตเซ‡เชฐเซ€

เชชเซเชฐเชฅเชฎ เช†เชชเชฃเซ‡ เชชเซเชธเซเชคเช•เชพเชฒเชฏ เช†เชฏเชพเชค เช•เชฐเซ€เช เช›เซ€เช.

google.cloud เชฎเชพเช‚เชฅเซ€ 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 เชซเช‚เช•เซเชถเชจ เชชเชฐ เช•เซ‰เชฒ เช•เชฐเซ‹.

เชกเซ‡เชŸเชพเชซเซเชฐเซ‡เชฎ = เช•เซเชตเซ‡เชฐเซ€_เชฅเซ€_เชฌเชฟเช—เช•เซเชตเซ‡เชฐเซ€(เช•เซเชตเซ‡เชฐเซ€)

เชชเช›เซ€ เช†เชชเชฃเซ‡ x-เช…เช•เซเชท เชฎเชพเชŸเซ‡ เชคเชพเชฐเซ€เช– เชกเซ‡เชŸเชพ เช•เซ‰เชฒเชฎ เช…เชจเซ‡ y-เช…เช•เซเชท เชฎเชพเชŸเซ‡ เช•เซเชฒ_เชชเซ‹เชธเซเชŸ เช•เซ‰เชฒเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช.

x = เชกเซ‡เชŸเชพเชซเซเชฐเซ‡เชฎ['เชคเชพเชฐเซ€เช–'].เชŸเซ‹เชฒเชฟเชธเซเชŸ()
y = เชกเซ‡เชŸเชพเชซเซเชฐเซ‡เชฎ['total_posts'].tolist()

เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ visualize_bar_chart เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชตเชฟเชเซเชฏเซเช…เชฒเชพเชˆเช เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชˆเชฎเซ‡เชœ เชคเชฐเซ€เช•เซ‡ เชธเซ‡เชต เช•เชฐเซ€เช เช›เซ€เช.

plt = เชตเชฟเชเซเชฏเซเช…เชฒเชพเชˆเช_เชฌเชพเชฐ_เชšเชพเชฐเซเชŸ(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 เชชเชฐเชฟเชฎเชพเชฃ เชœเชพเชฃเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เช…เชฎเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฎเชพเชนเชฟเชคเซ€ เชฌเซ‹เชŸ เช…เชจเซ‡ เชŸเชพเชˆเชช เช•เชฐเซ‹/เชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเซ‹. เชฌเซ‹เชŸ เชœเชฐเซ‚เชฐเซ€ เชฎเชพเชนเชฟเชคเซ€ เชธเชพเชฅเซ‡ เชœเชตเชพเชฌ เช†เชชเซ‡ เช›เซ‡, 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 เช•เซ‰เชฒ เช•เชฐเซ‹.

เช…เชฎเซ‡ เชŸเชฐเซเชฎเชฟเชจเชฒเชฎเชพเช‚ เช†เชฆเซ‡เชถ เชฆเชพเช–เชฒ เช•เชฐเซ€เชจเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชถเชฐเซ‚ เช•เชฐเซ€เช เช›เซ€เช:

python3 main.py

เชฌเชงเซเช‚ เชคเซˆเชฏเชพเชฐ เช›เซ‡. เชนเชตเซ‡ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เช•เซ‹เชกเชจเซ€ 50 เชฒเซ€เชŸเซ€เช“ เชงเชฐเชพเชตเชคเซ‹ เชฐเซ‹เชฌเซ‹เชŸ เช›เซ‡ เชœเซ‡ เช…เชฎเชพเชฐเชพ เชนเชธเซเชคเช•เซเชทเซ‡เชช เชตเชฟเชจเชพ เชฐเชฟเชชเซ‹เชฐเซเชŸเซเชธ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡.

เชšเชพเชฒเซ‹ เชฌเซ‹เชŸ เชคเชชเชพเชธเซ€เช เช…เชนเซ€เช‚เชฅเซ€/send เช†เชฆเซ‡เชถ เชชเชธเช‚เชฆ เช•เชฐเซ€เชจเซ‡.

เชฐเซ‹เชฌเซ‹เชŸเชจเซ‡ เชธเชฐเชณ เช…เชนเซ‡เชตเชพเชฒเซ‹ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเซ‹เช‚เชชเชตเชพ. Python เช…เชจเซ‡ Google BigQuery เชฎเชพเช‚ เชฌเซ‹เชŸ เชฒเช–เชตเซเช‚

เชคเชฎเซ‡ เชธเชฎเชพเชชเซเชค เช•เซ‹เชก เชชเชฐ เชฎเซ‡เชณเชตเซ€ เชถเช•เซ‹ เช›เซ‹ เชฎเชพเชฐเซเช‚ GitHub.

เชธเซเช•เชฟเชฒเชฌเซ‹เช•เซเชธ เชญเชฒเชพเชฎเชฃ เช•เชฐเซ‡ เช›เซ‡:

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹