แžšแž”แŸ€แž”แž•แŸ’แž‘แŸแžšแžšแž”แžถแž™แž€แžถแžšแžŽแŸแžŸแžถแž˜แž‰แŸ’แž‰แž‘แŸ…แž˜แž“แžปแžŸแŸ’แžŸแž™แž“แŸ’แžแŸ” แž€แžถแžšแžŸแžšแžŸแŸแžš bot แž“แŸ…แž€แŸ’แž“แžปแž„ Python แž“แžทแž„ Google BigQuery

แžšแž”แŸ€แž”แž•แŸ’แž‘แŸแžšแžšแž”แžถแž™แž€แžถแžšแžŽแŸแžŸแžถแž˜แž‰แŸ’แž‰แž‘แŸ…แž˜แž“แžปแžŸแŸ’แžŸแž™แž“แŸ’แžแŸ” แž€แžถแžšแžŸแžšแžŸแŸแžš bot แž“แŸ…แž€แŸ’แž“แžปแž„ Python แž“แžทแž„ Google BigQuery

แžแžพโ€‹แžขแŸ’แž“แž€โ€‹แž˜แžถแž“โ€‹แž€แžทแž…แŸ’แž…แž€แžถแžšโ€‹แžŠแŸ‚แž›โ€‹แž’แŸ’แžœแžพโ€‹แž˜แŸ’แžแž„โ€‹แž‘แŸ€แžโ€‹แž–แžธโ€‹แž˜แžฝแž™โ€‹แžแŸ’แž„แŸƒโ€‹แž‘แŸ…โ€‹แž˜แžฝแž™โ€‹แžŸแž”แŸ’แžแžถแž แŸโ€‹แžฌโ€‹แž‘แŸ? แžงแž‘แžถแž แžšแžŽแŸแž€แžถแžšแžŸแžšแžŸแŸแžšแžšแž”แžถแž™แž€แžถแžšแžŽแŸแŸ” แžขแŸ’แž“แž€แžŸแŸ’แž“แžพแžŸแžปแŸ†แž‘แžทแž“แŸ’แž“แž“แŸแž™ แžœแžทแž—แžถแž‚แžœแžถ แžŸแŸ’แžšแž˜แŸƒแž˜แžพแž›แžœแžถ (แž’แŸ’แžœแžพแž€แŸ’แžšแžถแž แŸ’แžœ แž‚แŸ†แž“แžผแžŸแžแžถแž„) แž แžพแž™แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€แž•แŸ’แž‰แžพแžœแžถแž‘แŸ…แž…แŸ…แž แŸ’แžœแžถแž™แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แŸ” แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž…แžปแŸ‡แž™แŸ‰แžถแž„แžŽแžถแž”แžพแžขแŸ’แžœแžธแŸ—แž‘แžถแŸ†แž„แžขแžŸแŸ‹แž“แŸแŸ‡แžแŸ’แžšแžผแžœแž”แžถแž“แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžท?

แž“แŸ…แž€แŸ’แž“แžปแž„แž˜แŸแžšแŸ€แž“แž“แŸแŸ‡ แž™แžพแž„แž“แžนแž„แž”แž„แŸ’แž€แžพแž bot แžŸแž˜แŸ’แžšแžถแž”แŸ‹ Telegram แžŠแŸ‚แž›แž“แžนแž„แž‡แžฝแž™แž’แŸ’แžœแžพแžšแž”แžถแž™แž€แžถแžšแžŽแŸแžŠแŸ„แž™แžŸแŸ’แžœแŸแž™แž”แŸ’แžšแžœแžแŸ’แžแžทแŸ” แž แžพแž™แžขแŸ’แžœแžธแžŠแŸ‚แž›แž–แžทแžŸแŸแžŸแž”แŸ†แž•แžปแžแž“แŸ„แŸ‡แž‚แžบแžแžถแž€แž˜แŸ’แž˜แžœแžทแž’แžธแž‘แžถแŸ†แž„แž˜แžผแž›แž“แžนแž„แž˜แžถแž“แž€แžผแžŠแžแŸ’แžšแžนแž˜แžแŸ‚ 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 แž แžพแž™แž”แž„แŸ’แž€แžพแžแž‚แž˜แŸ’แžšแŸ„แž„แžแŸ’แž˜แžธ (แžฌแž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž‚แž˜แŸ’แžšแŸ„แž„แžŠแŸ‚แž›แž˜แžถแž“แžŸแŸ’แžšแžถแž”แŸ‹)แŸ”

แž“แŸ…แž€แŸ’แž“แžปแž„แž•แŸ’แž‘แžถแŸ†แž„แž”แž‰แŸ’แž‡แžถ แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ แž”แžพแž€ APIS แž“แžทแž„ SERVICES แž แžพแž™แžšแž€แž˜แžพแž› BigQuery APIแŸ”

แžšแž”แŸ€แž”แž•แŸ’แž‘แŸแžšแžšแž”แžถแž™แž€แžถแžšแžŽแŸแžŸแžถแž˜แž‰แŸ’แž‰แž‘แŸ…แž˜แž“แžปแžŸแŸ’แžŸแž™แž“แŸ’แžแŸ” แž€แžถแžšแžŸแžšแžŸแŸแžš bot แž“แŸ…แž€แŸ’แž“แžปแž„ Python แž“แžทแž„ Google BigQuery

แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ แžขแž“แžปแž‰แŸ’แž‰แžถแž แžŠแžพแž˜แŸ’แž”แžธแž—แŸ’แž‡แžถแž”แŸ‹ API แŸ”

แžšแž”แŸ€แž”แž•แŸ’แž‘แŸแžšแžšแž”แžถแž™แž€แžถแžšแžŽแŸแžŸแžถแž˜แž‰แŸ’แž‰แž‘แŸ…แž˜แž“แžปแžŸแŸ’แžŸแž™แž“แŸ’แžแŸ” แž€แžถแžšแžŸแžšแžŸแŸแžš bot แž“แŸ…แž€แŸ’แž“แžปแž„ Python แž“แžทแž„ Google BigQuery

แž”แž„แŸ’แž€แžพแžแžŸแŸ„แž‚แžŽแž“แžธ

แžแŸ„แŸ‡แž‘แŸ…แž˜แŸ’แžแž„แž‘แŸ€แž Google Developers Consoleแž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž•แŸ’แž‘แžถแŸ†แž„แž–แŸแžแŸŒแž˜แžถแž“แžŸแž˜แŸ’แž„แžถแžแŸ‹ แž”แž„แŸ’แž€แžพแžแž–แŸแžแŸŒแž˜แžถแž“แžŸแž˜แŸ’แž„แžถแžแŸ‹ แž“แžทแž„แžŸแŸ„แž‚แžŽแž“แžธแžŸแŸแžœแžถแž€แž˜แŸ’แž˜แŸ”

แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€ - แž‚แžŽแž“แžธแžŸแŸแžœแžถแž€แž˜แŸ’แž˜แžแŸ’แž˜แžธ แž แžพแž™แž”แž‰แŸ’แž…แžผแž›แžˆแŸ’แž˜แŸ„แŸ‡แž€แŸ’แž“แžปแž„แž”แŸ’แžšแžขแž”แŸ‹แžˆแŸ’แž˜แŸ„แŸ‡แž‚แžŽแž“แžธแžŸแŸแžœแžถแž€แž˜แŸ’แž˜แŸ”

แž–แžธแž”แž‰แŸ’แž‡แžธแž‘แž˜แŸ’แž›แžถแž€แŸ‹แž…แžปแŸ‡ แžแžฝแž“แžถแž‘แžธ แž‡แŸ’แžšแžพแžŸแžšแžพแžŸ แž‚แž˜แŸ’แžšแŸ„แž„ > แž˜แŸ’แž…แžถแžŸแŸ‹ แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€แž”แž„แŸ’แž€แžพแžแŸ”

แžšแž”แŸ€แž”แž•แŸ’แž‘แŸแžšแžšแž”แžถแž™แž€แžถแžšแžŽแŸแžŸแžถแž˜แž‰แŸ’แž‰แž‘แŸ…แž˜แž“แžปแžŸแŸ’แžŸแž™แž“แŸ’แžแŸ” แž€แžถแžšแžŸแžšแžŸแŸแžš bot แž“แŸ…แž€แŸ’แž“แžปแž„ 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 แžŠแŸ‚แž›แž”แŸ‰แžถแžšแŸ‰แžถแž˜แŸ‰แŸ‚แžแŸ’แžšแž‚แžบ 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 แŸ”

แž“แžถแŸ†แž…แžผแž› 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 แž˜แžถแž“แž“แŸ…แž€แŸ’แž“แžปแž„แžœแžถแž›แž›แŸแžแžŸแž˜แŸ’แž‚แžถแž›แŸ‹แŸ”

แžฅแžกแžผแžœแž“แŸแŸ‡ แž…แžผแžšแž™แžพแž„แž”แž„แŸ’แž€แžพแžแž˜แžปแžแž„แžถแžš 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 แž”แž“แŸ’แž‘แžถแžแŸ‹แž“แŸƒแž€แžผแžŠแžŠแŸ‚แž›แž”แž„แŸ’แž€แžพแžแžšแž”แžถแž™แž€แžถแžšแžŽแŸแžŠแŸ„แž™แž‚แŸ’แž˜แžถแž“แž€แžถแžšแžขแž“แŸ’แžแžšแžถแž‚แž˜แž“แŸแžšแž”แžŸแŸ‹แž™แžพแž„แŸ”

แžแŸ„แŸ‡แž–แžทแž“แžทแžแŸ’แž™แž˜แžพแž› bot แž–แžธแž‘แžธแž“แŸแŸ‡แžŠแŸ„แž™แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแž–แžถแž€แŸ’แž™แž”แž‰แŸ’แž‡แžถ / แž•แŸ’แž‰แžพแŸ”

แžšแž”แŸ€แž”แž•แŸ’แž‘แŸแžšแžšแž”แžถแž™แž€แžถแžšแžŽแŸแžŸแžถแž˜แž‰แŸ’แž‰แž‘แŸ…แž˜แž“แžปแžŸแŸ’แžŸแž™แž“แŸ’แžแŸ” แž€แžถแžšแžŸแžšแžŸแŸแžš bot แž“แŸ…แž€แŸ’แž“แžปแž„ Python แž“แžทแž„ Google BigQuery

แžขแŸ’แž“แž€แžขแžถแž…แž‘แž‘แžฝแž›แž”แžถแž“แž›แŸแžแž€แžผแžŠแžŠแŸ‚แž›แž”แžถแž“แž”แž‰แŸ’แž…แž”แŸ‹แž“แŸ… GitHub แžšแž”แžŸแŸ‹แžแŸ’แž‰แžปแŸ†.

Skillbox แžŽแŸ‚แž“แžถแŸ†แŸ–

แž”แŸ’แžšแž—แž–: www.habr.com

แž‘แžทแž‰แž€แžถแžšแž”แž„แŸ’แž แŸ„แŸ‡แžŠแŸ‚แž›แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แž˜แžถแž“แž€แžถแžšแž€แžถแžšแž–แžถแžš DDoS, แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ VPS VDS ๐Ÿ”ฅ แž‘แžทแž‰แžŸแŸแžœแžถแž”แž„แŸ’แž แŸ„แŸ‡แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“แž‡แžถแž˜แžฝแž™แž“แžนแž„แž€แžถแžšแž€แžถแžšแž–แžถแžš DDoS แž“แžทแž„แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ VPS VDS | ProHoster