เจฐเฉ‹เจฌเฉ‹เจŸ เจจเฉ‚เฉฐ เจธเจงเจพเจฐเจจ เจฐเจฟเจชเฉ‹เจฐเจŸเจพเจ‚ เจ•เจฟเจตเฉ‡เจ‚ เจธเฉŒเจ‚เจชเฉ€เจ†เจ‚ เจœเจพเจฃเฅค 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 เจกเจฟเจตเฉˆเจฒเจชเจฐเจธ เจ•เฉฐเจธเฉ‹เจฒ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฌเจฃเจพเจ“ (เจœเจพเจ‚ เจ‡เฉฑเจ• เจฎเฉŒเจœเฉ‚เจฆเจพ เจšเฉเจฃเฉ‹)เฅค

เจ•เฉฐเจŸเจฐเฉ‹เจฒ เจชเฉˆเจจเจฒ เจตเจฟเฉฑเจš, APIs เจ…เจคเฉ‡ เจธเฉ‡เจตเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฎเจฐเฉฑเจฅ เจšเฉเจฃเฉ‹ เจ…เจคเฉ‡ BigQuery API เจจเฉ‚เฉฐ เจฆเฉ‡เจ–เฉ‹เฅค

เจฐเฉ‹เจฌเฉ‹เจŸ เจจเฉ‚เฉฐ เจธเจงเจพเจฐเจจ เจฐเจฟเจชเฉ‹เจฐเจŸเจพเจ‚ เจ•เจฟเจตเฉ‡เจ‚ เจธเฉŒเจ‚เจชเฉ€เจ†เจ‚ เจœเจพเจฃเฅค Python เจ…เจคเฉ‡ Google BigQuery เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฌเฉ‹เจŸ เจฒเจฟเจ–เจฃเจพ

API เจจเฉ‚เฉฐ เจ•เจจเฉˆเจ•เจŸ เจ•เจฐเจจ เจฒเจˆ เจธเจฎเจฐเฉฑเจฅ เจšเฉเจฃเฉ‹เฅค

เจฐเฉ‹เจฌเฉ‹เจŸ เจจเฉ‚เฉฐ เจธเจงเจพเจฐเจจ เจฐเจฟเจชเฉ‹เจฐเจŸเจพเจ‚ เจ•เจฟเจตเฉ‡เจ‚ เจธเฉŒเจ‚เจชเฉ€เจ†เจ‚ เจœเจพเจฃเฅค Python เจ…เจคเฉ‡ Google BigQuery เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฌเฉ‹เจŸ เจฒเจฟเจ–เจฃเจพ

เจ‡เฉฑเจ• เจ–เจพเจคเจพ เจ•เฉเฉฐเจœเฉ€ เจฌเจฃเจพเจ“

เจšเจฒเฉ‹ เจซเจฟเจฐ เจคเฉ‹เจ‚ เจšเฉฑเจฒเฉ€เจ Google เจกเจฟเจตเฉˆเจฒเจชเจฐเจธ เจ•เฉฐเจธเฉ‹เจฒ, เจ•เฉเจฐเฉˆเจกเฉˆเจ‚เจธเจผเฉ€เจ…เจฒ เจŸเฉˆเจฌ, เจ•เฉเจฐเฉ€เจกเฉˆเจ‚เจธเจผเฉ€เจ…เจฒ เจฌเจฃเจพเจ“ เจ…เจคเฉ‡ เจธเจฐเจตเจฟเจธ เจ–เจพเจคเจพ เจ•เฉเฉฐเจœเฉ€ เจšเฉเจฃเฉ‹เฅค

เจซเจฟเจฐ - เจจเจตเจพเจ‚ เจธเฉ‡เจตเจพ เจ–เจพเจคเจพ, เจ…เจคเฉ‡ เจธเฉ‡เจตเจพ เจ–เจพเจคเจพ เจจเจพเจฎ เจ–เฉ‡เจคเจฐ เจตเจฟเฉฑเจš เจจเจพเจฎ เจฆเจฐเจœ เจ•เจฐเฉ‹เฅค

เจฐเฉ‹เจฒ เจกเจฐเจพเจช-เจกเจพเจ‰เจจ เจธเฉ‚เจšเฉ€ เจตเจฟเฉฑเจšเฉ‹เจ‚, เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ > เจฎเจพเจฒเจ• เจšเฉเจฃเฉ‹, เจซเจฟเจฐ เจฌเจฃเจพเจ“เฅค

เจฐเฉ‹เจฌเฉ‹เจŸ เจจเฉ‚เฉฐ เจธเจงเจพเจฐเจจ เจฐเจฟเจชเฉ‹เจฐเจŸเจพเจ‚ เจ•เจฟเจตเฉ‡เจ‚ เจธเฉŒเจ‚เจชเฉ€เจ†เจ‚ เจœเจพเจฃเฅค 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 เจฆเฉ€ เจšเฉ‹เจฃ เจ•เจฐเฉ‹เฅค

plp เจฆเฉ‡ เจคเฉŒเจฐ เจคเฉ‡ matplotlib.pyplot เจ‡เฉฐเจชเฉ‹เจฐเจŸ เจ•เจฐเฉ‹

เจธเจพเจจเฉ‚เฉฐ เจชเฉฐเจœ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐเจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจœเจฟเฉฑเจฅเฉ‡ 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 เจซเฉฐเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเฉ‹เฅค

เจกเฉ‡เจŸเจพเจซเฉเจฐเฉ‡เจฎ = query_to_bigquery(query)

เจซเจฟเจฐ เจ…เจธเฉ€เจ‚ x-เจงเฉเจฐเฉ‡ เจฒเจˆ เจฎเจฟเจคเฉ€ เจกเฉ‡เจŸเจพ เจ•เจพเจฒเจฎ, เจ…เจคเฉ‡ y-เจงเฉเจฐเฉ‡ เจฒเจˆ เจ•เฉเฉฑเจฒ_เจชเฉ‹เจธเจŸ เจ•เจพเจฒเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค

x = dataframe['date'].tolist()
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 เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจœเจพเจฃเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค

เจ…เจธเฉ€เจ‚ เจตเจฐเจคเจฆเฉ‡ เจนเจพเจ‚ userinfobot เจ…เจคเฉ‡ เจŸเจพเจˆเจช/เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ‹เฅค เจฌเฉ‹เจŸ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจฆเฉ‡ เจจเจพเจฒ เจœเจตเจพเจฌ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹