āϕ⧀āĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āϰ⧋āĻŦāϟāϕ⧇ āϏāĻžāϧāĻžāϰāĻŖ āĻĒā§āϰāϤāĻŋāĻŦ⧇āĻĻāύ āĻ…āĻ°ā§āĻĒāĻŖ āĻ•āϰāĻŦ⧇āύāĨ¤ Python āĻāĻŦāĻ‚ Google BigQuery-āĻ āĻāĻ•āϟāĻŋ āĻŦāϟ āϞ⧇āĻ–āĻž

āϕ⧀āĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āϰ⧋āĻŦāϟāϕ⧇ āϏāĻžāϧāĻžāϰāĻŖ āĻĒā§āϰāϤāĻŋāĻŦ⧇āĻĻāύ āĻ…āĻ°ā§āĻĒāĻŖ āĻ•āϰāĻŦ⧇āύāĨ¤ Python āĻāĻŦāĻ‚ Google BigQuery-āĻ āĻāĻ•āϟāĻŋ āĻŦāϟ āϞ⧇āĻ–āĻž

āφāĻĒāύāĻžāϰ āĻ•āĻŋ āĻāĻŽāύ āĻ•āĻžāϜ āφāϛ⧇ āϝāĻž āĻĻāĻŋāύ⧇āϰ āĻĒāϰ āĻĻāĻŋāύ, āϏāĻĒā§āϤāĻžāĻšā§‡āϰ āĻĒāϰ āϏāĻĒā§āϤāĻžāĻš āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤāĻŋ āĻ•āϰ⧇? āϝ⧇āĻŽāύ āϰāĻŋāĻĒā§‹āĻ°ā§āϟ āϞ⧇āĻ–āĻžāĨ¤ āφāĻĒāύāĻŋ āĻĄā§‡āϟāĻžāϰ āϜāĻ¨ā§āϝ āĻ…āύ⧁āϰ⧋āϧ āĻ•āϰ⧁āύ, āĻāϟāĻŋ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ āĻ•āϰ⧁āύ, āĻāϟāĻŋ āĻ•āĻ˛ā§āĻĒāύāĻž āĻ•āϰ⧁āύ (āĻ—ā§āϰāĻžāĻĢ, āϚāĻžāĻ°ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ) āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ āφāĻĒāύāĻžāϰ āĻŦāϏ⧇āϰ āĻ•āĻžāϛ⧇ āĻĒāĻžāĻ āĻžāύāĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻāχ āϏāĻŦ āϝāĻĻāĻŋ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧ āĻšāϝāĻŧ?

āĻāχ āϟāĻŋāωāĻŸā§‹āϰāĻŋāϝāĻŧāĻžāϞ⧇ āφāĻŽāϰāĻž āĻŸā§‡āϞāĻŋāĻ—ā§āϰāĻžāĻŽā§‡āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻŦāϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻŦ āϝāĻž āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧ āϰāĻŋāĻĒā§‹āĻ°ā§āϟāĻŋāĻ‚ āĻ•āϰāϤ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰāĻŦ⧇āĨ¤ āĻāĻŦāĻ‚ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻ­āĻžāϞ āϜāĻŋāύāĻŋāϏ āĻšāϞ āϝ⧇ āĻĒ⧁āϰ⧋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ 50 āϞāĻžāχāύ āϕ⧋āĻĄ āύāĻŋāϝāĻŧ⧇ āĻ—āĻ āĻŋāϤ āĻšāĻŦ⧇! āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ āĻŸā§‡āϞāĻŋāĻ—ā§āϰāĻžāĻŽā§‡āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻŦāϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āύ, āϤāĻŦ⧇ āφāĻĒāύāĻžāϰ āĻāϟāĻŋāĻ“ āĻĒāĻĄāĻŧāĻž āωāϚāĻŋāϤ āĻĒā§‹āĻ¸ā§āϟ.

Skillbox āϏ⧁āĻĒāĻžāϰāĻŋāĻļ āĻ•āϰ⧇: āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻ• āϕ⧋āĻ°ā§āϏ āĻ¸ā§āĻ•ā§āĻ°ā§āϝāĻžāϚ āĻĨ⧇āϕ⧇ āĻĒāĻžāχāĻĨāύ āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāϰ⧀.

āφāĻŽāϰāĻž āĻŽāύ⧇ āĻ•āϰāĻŋāϝāĻŧ⧇ āĻĻāĻŋāĻšā§āĻ›āĻŋ: "Habr"-āĻāϰ āϏāĻ•āϞ āĻĒāĻžāĻ āĻ•āĻĻ⧇āϰ āϜāĻ¨ā§āϝ - "Habr" āĻĒā§āϰāϚāĻžāϰāĻŽā§‚āϞāĻ• āϕ⧋āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϝ⧇āϕ⧋āύ⧋ Skillbox āϕ⧋āĻ°ā§āϏ⧇ āύāĻĨāĻŋāϭ⧁āĻ•ā§āϤ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ 10 āϰ⧁āĻŦ⧇āϞ āĻ›āĻžāĻĄāĻŧāĨ¤

āϚāϞ āĻļ⧁āϰ⧁ āĻ•āϰāĻŋ

āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇

āφāĻŽāϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦā§‹ google-Cloud-bigquery Google BigQuery āĻĨ⧇āϕ⧇ āĻĄā§‡āϟāĻž āĻĒ⧇āϤ⧇āĨ¤ matplotlib, āĻ…āϏāĻžāĻĄāĻŧ и āĻĒāĻžāĻ¨ā§āĻĄāĻžāϏ āφāĻĒāύāĻžāϕ⧇ āφāĻĒāύāĻžāϰ āĻĄā§‡āϟāĻž āĻ•āĻ˛ā§āĻĒāύāĻž āĻ•āϰāϤ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰāĻŦ⧇āĨ¤ āĻĒāĻžāχāĻĨāύ-āĻŸā§‡āϞāĻŋāĻ—ā§āϰāĻžāĻŽ-āĻŦāϟ āϏāĻŽāĻžāĻĒā§āϤ āĻĄā§‡āϟāĻž āĻŸā§‡āϞāĻŋāĻ—ā§āϰāĻžāĻŽā§‡ āĻĒāĻžāĻ āĻžāĻŦ⧇āĨ¤

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 āĻŦāϞāĻž āĻšāϝāĻŧāĨ¤

āϟāĻžāĻ°ā§āĻŽāĻŋāύāĻžāϞ⧇ creds.json-āĻāϰ āĻĒāĻĨ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰ⧇ GOOGLE_APPLICATION_CREDENTIALS āϏ⧇āϟ āĻ•āϰ⧁āύāĨ¤

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 āĻĢāĻžāĻ‚āĻļāύ⧇ āĻ•āϞ āĻ•āϰ⧁āύāĨ¤

āĻĄā§‡āϟāĻžāĻĢā§āϰ⧇āĻŽ = query_to_bigquery(āϕ⧋āϝāĻŧ⧇āϰāĻŋ)

āϤāĻžāϰāĻĒāϰ⧇ āφāĻŽāϰāĻž x-āĻ…āĻ•ā§āώ⧇āϰ āϜāĻ¨ā§āϝ āϤāĻžāϰāĻŋāĻ– āĻĄā§‡āϟāĻž āĻ•āϞāĻžāĻŽ āĻāĻŦāĻ‚ y-āĻ…āĻ•ā§āώ⧇āϰ āϜāĻ¨ā§āϝ total_posts āĻ•āϞāĻžāĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŋāĨ¤

x = āĻĄā§‡āϟāĻžāĻĢā§āϰ⧇āĻŽ['āϤāĻžāϰāĻŋāĻ–']āĨ¤āĻŸā§‹āϞāĻŋāĻ¸ā§āϟ()
y = āĻĄā§‡āϟāĻžāĻĢā§āϰ⧇āĻŽ['total_posts'].tolist()

āφāĻŽāϰāĻž visualize_bar_chart āĻĢāĻžāĻ‚āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāϟāĻŋāϕ⧇ āĻ•āĻ˛ā§āĻĒāύāĻž āĻ•āϰāĻŋ āĻāĻŦāĻ‚ āĻāϟāĻŋāϕ⧇ āĻāĻ•āϟāĻŋ āϚāĻŋāĻ¤ā§āϰ āĻšāĻŋāϏāĻžāĻŦ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻŋāĨ¤

plt = visualize_bar_chart(x=x, x_label='date', y=y, y_label='āĻŽā§‹āϟ āĻĒā§‹āĻ¸ā§āϟ', 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 āĻāĻŦāĻ‚ āϟāĻžāχāĻĒ āĻ•āϰ⧁āύ/āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύāĨ¤ āĻŦāϟ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āϤāĻĨā§āϝ āĻĻāĻŋāϝāĻŧ⧇ āϏāĻžāĻĄāĻŧāĻž āĻĻ⧇āϝāĻŧ, 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 āϞāĻžāχāύ⧇āϰ āϕ⧋āĻĄ āϰāϝāĻŧ⧇āϛ⧇ āϝāĻž āφāĻŽāĻžāĻĻ⧇āϰ āĻšāĻ¸ā§āϤāĻ•ā§āώ⧇āĻĒ āĻ›āĻžāĻĄāĻŧāĻžāχ āϰāĻŋāĻĒā§‹āĻ°ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤

āĻāϰ āĻŦāϟ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻž āϝāĻžāĻ• āĻāĻ–āĻžāύ⧇ āĻĨ⧇āϕ⧇/send āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧇āĨ¤

āϕ⧀āĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āϰ⧋āĻŦāϟāϕ⧇ āϏāĻžāϧāĻžāϰāĻŖ āĻĒā§āϰāϤāĻŋāĻŦ⧇āĻĻāύ āĻ…āĻ°ā§āĻĒāĻŖ āĻ•āϰāĻŦ⧇āύāĨ¤ Python āĻāĻŦāĻ‚ Google BigQuery-āĻ āĻāĻ•āϟāĻŋ āĻŦāϟ āϞ⧇āĻ–āĻž

āφāĻĒāύāĻŋ āϏāĻŽāĻžāĻĒā§āϤ āϕ⧋āĻĄ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύ āφāĻŽāĻžāϰ āĻ—āĻŋāϟāĻšāĻžāĻŦ.

Skillbox āϏ⧁āĻĒāĻžāϰāĻŋāĻļ āĻ•āϰ⧇:

āωāĻ¤ā§āϏ: www.habr.com

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster