ื•ื•ื™ ืฆื• ื“ืขืœืึทื’ื™ื™ื˜ ืคึผืฉื•ื˜ ืจื™ืคึผืึธืจืฅ ืฆื• ืึท ืจืึธื‘ืึธื˜. ืžื™ืจ ืฉืจื™ื™ึทื‘ืŸ ืึท ื‘ืึธื˜ ืื™ืŸ Python ืื•ืŸ Google BigQuery

ื•ื•ื™ ืฆื• ื“ืขืœืึทื’ื™ื™ื˜ ืคึผืฉื•ื˜ ืจื™ืคึผืึธืจืฅ ืฆื• ืึท ืจืึธื‘ืึธื˜. ืžื™ืจ ืฉืจื™ื™ึทื‘ืŸ ืึท ื‘ืึธื˜ ืื™ืŸ Python ืื•ืŸ Google BigQuery

ืฆื™ ืื™ืจ ื”ืึธื‘ืŸ ื˜ืึทืกืงืก ื•ื•ืึธืก ืื™ื‘ืขืจื—ื–ืจืŸ ื˜ืึธื’ ื ืึธืš ื˜ืึธื’, ื•ื•ืึธืš ื ืึธืš ื•ื•ืึธืš? ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืฉืจื™ื™ื‘ืŸ ืจื™ืคึผืึธืจืฅ. ืื™ืจ ื‘ืขื˜ืŸ ื“ืึทื˜ืŸ, ืึทื ืึทืœื™ื™ื– ืขืก, ื•ื•ื™ื–ืฉื•ื•ืึทืœื™ื™ื– ืขืก (ืžืึทื›ืŸ ื’ืจืึทืคืก, ื˜ืฉืึทืจืฅ) ืื•ืŸ ืฉื™ืงืŸ ืขืก ืฆื• ื“ื™ื™ืŸ ื‘ืึทืœืขื‘ืึธืก. ืื‘ืขืจ ื•ื•ืึธืก ืื•ื™ื‘ ืึทืœืข ื“ืขื ืื™ื– ืึธื˜ืึทืžื™ื™ื˜ื™ื“?

ืื™ืŸ ื“ืขื ื˜ื•ื˜ืึธืจื™ืึทืœ, ืžื™ืจ ื•ื•ืขืœืŸ ืฉืึทืคึฟืŸ ืึท ื‘ืึธื˜ ืคึฟืึทืจ ื˜ืขืœืขื’ืจืึทื ื•ื•ืึธืก ื•ื•ืขื˜ ื”ืขืœืคึฟืŸ ืึธื˜ืึทืžื™ื™ื˜ ืจื™ืคึผืึธืจื˜ื™ื ื’. ืื•ืŸ ื“ื™ ืงื•ืœืึทืกื˜ ื–ืึทืš ืื™ื– ืึทื– ื“ื™ ื’ืื ืฆืข ืคึผืจืึธื’ืจืึทื ื•ื•ืขื˜ ืฆื•ื ื•ื™ืคืฉื˜ืขืœื  ื–ื™ืš ืคื•ืŸ ื‘ืœื•ื™ื– 50 ืฉื•ืจื•ืช ืคื•ืŸ ืงืึธื“! ืื•ื™ื‘ ืื™ืจ ืฉืึทืคึฟืŸ ืึท ื‘ืึธื˜ ืคึฟืึทืจ ื˜ืขืœืขื’ืจืึทื ืคึฟืึทืจ ื“ื™ ืขืจืฉื˜ืขืจ ืžืึธืœ, ืื™ืจ ื–ืึธืœ ืื•ื™ืš ืœื™ื™ืขื ืขืŸ ื“ืขื ืคึผืึธืกื˜ืŸ.

Skillbox ืจืขืงืึทืžืขื ื“ื–: ืคึผืจืึทืงื˜ื™ืฉ ืงื•ืจืก ืคึผื™ื˜ื”ืึธืŸ ื“ืขื•ื•ืขืœืึธืคึผืขืจ ืคึฟื•ืŸ ืงืจืึทืฆืŸ.

ืžื™ืจ ื“ืขืจืžืึธื ืขืŸ ืื™ืจ: ืคึฟืึทืจ ืึทืœืข ืœื™ื™ืขื ืขืจ ืคื•ืŸ "ื”ื‘ืจ" - ืึท ืึทืจืึธืคึผืจืขื›ืขื ืขืŸ ืคื•ืŸ 10 ืจื•ื‘ืœ ื•ื•ืขืŸ ืื™ืจ ืคืึทืจืฉืจื™ื™ึทื‘ืŸ ืื™ืŸ ืงื™ื™ืŸ ืกืงื™ืœื‘ืึธืงืก ืงื•ืจืก ื ื™ืฆืŸ ื“ื™ ืคึผืขืจืžืึธื•ืฉืึทื ืึทืœ ืงืึธื“ "ื”ื‘ืจ".

ื’ืขื˜ื™ื ื’ ืึทืจืึธืคึผ

ื™ื ืกื˜ืึธืœื™ื ื’ ืœื™ื™ื‘ืจืขืจื™ื–

ืžื™ืจ ื•ื•ืขืœืŸ ื ื•ืฆืŸ ื’ื•ื’ืœ-ื•ื•ืึธืœืงืŸ-ื‘ื™ื’ืงื•ื•ืขืจื™ ืฆื• ื‘ืึทืงื•ืžืขืŸ ื“ืึทื˜ืŸ ืคึฟื•ืŸ Google BigQuery. ืžืึทื˜ืคึผืœืึธื˜ืœื™ื‘, ื’ืขืœื™ื™ืžื˜ ะธ pandas ื•ื•ืขื˜ ื”ืขืœืคึฟืŸ ืื™ืจ ื•ื•ื™ื–ืฉื•ื•ืึทืœื™ื™ื– ื“ื™ื™ืŸ ื“ืึทื˜ืŸ. ืคึผื™ื˜ื”ืึธืŸ-ื˜ืขืœืขื’ืจืึทื-ื‘ืึธื˜ ื•ื•ืขื˜ ืฉื™ืงืŸ ื“ื™ ืคืึทืจื˜ื™ืง ื“ืึทื˜ืŸ ืฆื• ื˜ืขืœืขื’ืจืึทื.

pip3 ื™ื ืกื˜ืึทืœื™ืจืŸ Google-cloud-bigquery ืžืึทื˜ืคึผืœืึธื˜ืœื™ื‘ ื ื•ืคึผื™ ืคึผืึทื ื“ืึทืก ืคึผื™ื˜ื”ืึธืŸ-ื˜ืขืœืขื’ืจืึทื-ื‘ืึธื˜

ืงืึทื ืขืงื˜ื™ื ื’ Google BigQuery API

ืื•ื™ื‘ ืžื™ืจ ื•ื•ื™ืœืŸ ืฆื• ื ื•ืฆืŸ ื“ื™ ืกืขืจื•ื•ื™ืก, ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืคืึทืจื‘ื™ื ื“ืŸ ื“ื™ Google BigQuery API. ืฆื• ื˜ืึธืŸ ื“ืึธืก ืžื™ืจ ื’ื™ื™ืŸ ืฆื• Google ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืงืึทื ืกืึธื•ืœ ืื•ืŸ ืฉืึทืคึฟืŸ ืึท ื ื™ื™ึทืข ืคึผืจื•ื™ืขืงื˜ (ืึธื“ืขืจ ืื•ื™ืกืงืœื™ื™ึทื‘ืŸ ืึท ื™ื’ื–ื™ืกื˜ื™ื ื’ ืื™ื™ื ืขืจ).

ืื™ืŸ ื“ื™ ืงืึธื ื˜ืจืึธืœ ื˜ืึทืคืœื™ืข, ืกืขืœืขืงื˜ื™ืจืŸ ื’ืขื‘ืŸ ืึทืคึผืคึผืก ืื•ืŸ ืกืขืจื•ื•ื™ืกืขืก ืื•ืŸ ืงื•ืง ืคึฟืึทืจ BigQuery API.

ื•ื•ื™ ืฆื• ื“ืขืœืึทื’ื™ื™ื˜ ืคึผืฉื•ื˜ ืจื™ืคึผืึธืจืฅ ืฆื• ืึท ืจืึธื‘ืึธื˜. ืžื™ืจ ืฉืจื™ื™ึทื‘ืŸ ืึท ื‘ืึธื˜ ืื™ืŸ Python ืื•ืŸ Google BigQuery

ืกืขืœืขืงื˜ื™ืจืŸ ื’ืขื‘ืŸ ืฆื• ืคืึทืจื‘ื™ื ื“ืŸ ื“ื™ ืึทืคึผื™.

ื•ื•ื™ ืฆื• ื“ืขืœืึทื’ื™ื™ื˜ ืคึผืฉื•ื˜ ืจื™ืคึผืึธืจืฅ ืฆื• ืึท ืจืึธื‘ืึธื˜. ืžื™ืจ ืฉืจื™ื™ึทื‘ืŸ ืึท ื‘ืึธื˜ ืื™ืŸ 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 ืึทืจื™ื™ึทื ืคื™ืจ ื‘ื™ื’ืงื•ื•ืขืจื™

ืžื™ืจ ืžืึทื›ืŸ ืึท ืคึฟื•ื ืงืฆื™ืข ื’ืขืจื•ืคึฟืŸ 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.

ืึทืจื™ื™ึทื ืคื™ืจ ืžืึทื˜ืคึผืœืึธื˜ืœื™ื‘.ืคึผื™ืคึผืœืึธื˜ ื•ื•ื™ ืคึผืœื˜

ืžื™ืจ ื“ืึทืจืคึฟืŸ ืคื™ื ืฃ ืคึผืึทืจืึทืžืขื˜ืขืจืก, ื•ื•ื• x ืื™ื– ื“ื™ X-ืึทืงืก ื“ืึทื˜ืŸ, x_label ืื™ื– ื“ืขืจ ื˜ื™ื˜ืœ ืคึฟืึทืจ ื“ื™ ืึทืงืก, 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 (ืึธื ืคึฟืจืขื’)

ื“ืขืจื ืึธืš ืžื™ืจ ื ื•ืฆืŸ ื“ื™ ื“ืึทื˜ืข ื“ืึทื˜ืŸ ื–ื™ื™ึทืœ ืคึฟืึทืจ ื“ื™ X-ืึทืงืก, ืื•ืŸ ื“ื™ total_posts ื–ื™ื™ึทืœ ืคึฟืึทืจ ื“ื™ ื™-ืึทืงืก.

ืจืขื ื˜ื’ืขื  = ื“ืึทื˜ืึทืคืจืึทืžืข ['ื“ืึทื˜ืข']. ื˜ืึธืœื™ืกื˜ ()
y = ื“ืึทื˜ืึทืคืจืึทืžืข['total_posts'].tolist()

ืžื™ืจ ื•ื•ื™ื–ืฉื•ื•ืึทืœื™ื™ื– ืขืก ืžื™ื˜ ื“ื™ visualize_bar_chart ืคื•ื ืงืฆื™ืข ืื•ืŸ ืจืึทื˜ืขื•ื•ืขืŸ ืขืก ื•ื•ื™ ืึท ื‘ื™ืœื“.

plt = visualize_bar_chart (x=x, x_label='Datum', 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')

ืฉื™ืงืŸ ืึท ื‘ื™ืœื“

ืื™ืŸ ืกื“ืจ ืฆื• ืฉื™ืงืŸ ืึท ื‘ืึทืจื™ื›ื˜ ืฆื• ื“ื™ ื‘ืึทืงื•ืžืขืจ, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื•ื•ื™ืกืŸ ื“ืขื ื˜ืฉืึทื˜_ื™ื“ ืคึผืึทืจืึทืžืขื˜ืขืจ.

ืžื™ืจ ื ื•ืฆืŸ userinfobot ืื•ืŸ ื˜ื™ืคึผ / ืึธื ื”ื™ื™ื‘. ื“ืขืจ ื‘ืึธื˜ ืจื™ืกืคึผืึทื ื“ื– ืžื™ื˜ ื“ื™ ื ื™ื™ื˜ื™ืง ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข, 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 ืฉื•ืจื•ืช ืคื•ืŸ ืงืึธื“ ื•ื•ืึธืก ื“ื–ืฉืขื ืขืจื™ื™ืฅ ืจื™ืคึผืึธืจืฅ ืึธืŸ ืื•ื ื“ื–ืขืจ ืืจื™ื™ื ืžื™ืฉื•ื ื’.

ื–ืืœ ืก ื˜ืฉืขืง ื“ื™ ื‘ืึธื˜ ืคื•ื  ื“ืึทื ืขื˜ื“ื•ืจืš ืกืึทืœืขืงื˜ื™ื ื’ ื“ื™ / ืฉื™ืงืŸ ื‘ืึทืคึฟืขืœ.

ื•ื•ื™ ืฆื• ื“ืขืœืึทื’ื™ื™ื˜ ืคึผืฉื•ื˜ ืจื™ืคึผืึธืจืฅ ืฆื• ืึท ืจืึธื‘ืึธื˜. ืžื™ืจ ืฉืจื™ื™ึทื‘ืŸ ืึท ื‘ืึธื˜ ืื™ืŸ Python ืื•ืŸ Google BigQuery

ืื™ืจ ืงืขื ืขืŸ ื‘ืึทืงื•ืžืขืŸ ื“ื™ ืคืึทืจื˜ื™ืง ืงืึธื“ ื‘ื™ื™ึท ืžื™ื™ืŸ ื’ื™ื˜ื”ื•ื‘.

Skillbox ืจืขืงืึทืžืขื ื“ื–:

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’