рд░реЛрдмреЛрдЯрд▓рд╛ рд╕рд╛рдзреЗ рдЕрд╣рд╡рд╛рд▓ рдХрд╕реЗ рд╕реЛрдкрд╡рд╛рдпрдЪреЗ. 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 рдХрдиреЗрдХреНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рдЬрд╛ рдЧреВрдЧрд▓ рдбреЗрд╡реНрд╣рд▓рдкрд░реНрд╕ рдХрдиреНрд╕реЛрд▓ рдЖрдгрд┐ рдПрдХ рдирд╡реАрди рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░рд╛ (рдХрд┐рдВрд╡рд╛ рд╡рд┐рджреНрдпрдорд╛рди рдирд┐рд╡рдбрд╛).

рдирд┐рдпрдВрддреНрд░рдг рдкреЕрдиреЗрд▓рдордзреНрдпреЗ, APIs рдЖрдгрд┐ рд╕реЗрд╡рд╛ рд╕рдХреНрд╖рдо рдХрд░рд╛ рдирд┐рд╡рдбрд╛ рдЖрдгрд┐ BigQuery API рд╢реЛрдзрд╛.

рд░реЛрдмреЛрдЯрд▓рд╛ рд╕рд╛рдзреЗ рдЕрд╣рд╡рд╛рд▓ рдХрд╕реЗ рд╕реЛрдкрд╡рд╛рдпрдЪреЗ. Python рдЖрдгрд┐ Google BigQuery рдордзреНрдпреЗ рдмреЙрдЯ рд▓рд┐рд╣рд┐рдд рдЖрд╣реЗ

API рдХрдиреЗрдХреНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рдХреНрд╖рдо рдХрд░рд╛ рдирд┐рд╡рдбрд╛.

рд░реЛрдмреЛрдЯрд▓рд╛ рд╕рд╛рдзреЗ рдЕрд╣рд╡рд╛рд▓ рдХрд╕реЗ рд╕реЛрдкрд╡рд╛рдпрдЪреЗ. Python рдЖрдгрд┐ Google BigQuery рдордзреНрдпреЗ рдмреЙрдЯ рд▓рд┐рд╣рд┐рдд рдЖрд╣реЗ

рдЦрд╛рддреЗ рдХреА рддрдпрд╛рд░ рдХрд░рд╛

рдЪрд▓рд╛ рдкреБрдиреНрд╣рд╛ рдЬрд╛рдКрдпрд╛ рдЧреВрдЧрд▓ рдбреЗрд╡реНрд╣рд▓рдкрд░реНрд╕ рдХрдиреНрд╕реЛрд▓, рдХреНрд░реЗрдбреЗрдиреНрд╢рд┐рдпрд▓реНрд╕ рдЯреЕрдм рдирд┐рд╡рдбрд╛, рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рддрдпрд╛рд░ рдХрд░рд╛ рдЖрдгрд┐ рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рдХреА.

рдирдВрддрд░ - рдирд╡реАрди рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ, рдЖрдгрд┐ рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рдирд╛рд╡ рдлреАрд▓реНрдбрдордзреНрдпреЗ рдирд╛рд╡ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рд╛.

рд░реЛрд▓ рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреАрдордзреВрди, рдкреНрд░рдХрд▓реНрдк > рдорд╛рд▓рдХ рдирд┐рд╡рдбрд╛, рдирдВрддрд░ рддрдпрд╛рд░ рдХрд░рд╛.

рд░реЛрдмреЛрдЯрд▓рд╛ рд╕рд╛рдзреЗ рдЕрд╣рд╡рд╛рд▓ рдХрд╕реЗ рд╕реЛрдкрд╡рд╛рдпрдЪреЗ. 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-рдЕрдХреНрд╖рд╛рд╕рд╛рдареА рдПрдХреВрдг_рдкреЛрд╕реНрдЯ рд╕реНрддрдВрдн рд╡рд╛рдкрд░рддреЛ.

x = рдбреЗрдЯрд╛рдлреНрд░реЗрдо['date'].tolist()
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 рдордзреНрдпреЗ рдмреЙрдЯ рд▓рд┐рд╣рд┐рдд рдЖрд╣реЗ

рдЖрдкрдг рд╕рдорд╛рдкреНрдд рдХреЛрдб рдпреЗрдереЗ рдорд┐рд│рд╡реВ рд╢рдХрддрд╛ рдорд╛рдЭреЗ GitHub.

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ:

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛