рд░реЛрдмреЛрдЯ рдХреЛ рд╕рд░рд▓ рд░рд┐рдкреЛрд░реНрдЯ рдХреИрд╕реЗ рд╕реМрдВрдкреЗрдВред Python рдФрд░ Google BigQuery рдореЗрдВ рдПрдХ рдмреЙрдЯ рд▓рд┐рдЦрдирд╛

рд░реЛрдмреЛрдЯ рдХреЛ рд╕рд░рд▓ рд░рд┐рдкреЛрд░реНрдЯ рдХреИрд╕реЗ рд╕реМрдВрдкреЗрдВред Python рдФрд░ Google BigQuery рдореЗрдВ рдПрдХ рдмреЙрдЯ рд▓рд┐рдЦрдирд╛

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рджрд┐рди-рдкреНрд░рддрд┐рджрд┐рди, рд╕рдкреНрддрд╛рд╣-рджрд░-рд╕рдкреНрддрд╛рд╣ рджреЛрд╣рд░рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рд┐рдкреЛрд░реНрдЯ рд▓рд┐рдЦрдирд╛. рдЖрдк рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ (рдЧреНрд░рд╛рдлрд╝, рдЪрд╛рд░реНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ), рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ рдЕрдкрдиреЗ рдмреЙрд╕ рдХреЛ рднреЗрдЬрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдпрд╣ рд╕рдм рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣реЛ?

рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╣рдо рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЙрдЯ рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдФрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХреЛрдб рдХреА рдХреЗрд╡рд▓ 50 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реЛрдВрдЧреА! рдЕрдЧрд░ рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рдмреЙрдЯ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдпрд╣ рднреА рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдкрдж.

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ: рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдкрд╛рдпрдерди рдбреЗрд╡рд▓рдкрд░.

рдЕрдиреБрд╕реНрдорд╛рд░рдХ: "рд╣реИрдмрд░" рдХреЗ рд╕рднреА рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП - "рд╣реИрдмрд░" рдкреНрд░рдЪрд╛рд░ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рдирд╛рдорд╛рдВрдХрди рдХрд░рддреЗ рд╕рдордп 10 рд░реВрдмрд▓ рдХреА рдЫреВрдЯред

рд╢реБрд░реВ рдХрд░рдирд╛

рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рд╕реНрдерд╛рдкрдирд╛

рд╣рдо рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВрдЧреЗ рдЧреВрдЧрд▓-рдХреНрд▓рд╛рдЙрдб-рдмрд┐рдЧрдХреНрд╡реЗрд░реА Google BigQuery рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП. matplotlib, numpy ╨╕ рдкрд╛рдВрдбрд╛ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдореЗрдВ рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХрд░реЗрдЧрд╛. рдЕрдЬрдЧрд░-рдЯреЗрд▓реАрдЧреНрд░рд╛рдо-рдмреЙрдЯ рддреИрдпрд╛рд░ рдбреЗрдЯрд╛ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдХреЛ рднреЗрдЬ рджреЗрдЧрд╛ред

pip3 рдЧреВрдЧрд▓-рдХреНрд▓рд╛рдЙрдб-рдмрд┐рдЧрдХреНрд╡реЗрд░реА рдореИрдЯрдкреНрд▓реЛрдЯрд▓рд┐рдм, рд╕реБрдиреНрди рдкрд╛рдВрдбрд╛, рдкрд╛рдпрдерди-рдЯреЗрд▓реАрдЧреНрд░рд╛рдо-рдмреЙрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ

Google BigQuery API рдХрдиреЗрдХреНрдЯ рд╣реЛ рд░рд╣рд╛ рд╣реИ

рдпрджрд┐ рд╣рдо рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ Google BigQuery API рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдЬрд╛рддреЗ рд╣реИрдВ Google рдбреЗрд╡рд▓рдкрд░ рдХрдВрд╕реЛрд▓ рдФрд░ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ (рдпрд╛ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдХреЛ рдЪреБрдиреЗрдВ)ред

рдирд┐рдпрдВрддреНрд░рдг рдХрдХреНрд╖ рдореЗрдВ, API рдФрд░ рд╕реЗрд╡рд╛рдПрдБ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ рдЪреБрдиреЗрдВ рдФрд░ BigQuery API рджреЗрдЦреЗрдВред

рд░реЛрдмреЛрдЯ рдХреЛ рд╕рд░рд▓ рд░рд┐рдкреЛрд░реНрдЯ рдХреИрд╕реЗ рд╕реМрдВрдкреЗрдВред Python рдФрд░ Google BigQuery рдореЗрдВ рдПрдХ рдмреЙрдЯ рд▓рд┐рдЦрдирд╛

рдПрдкреАрдЖрдИ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рдХрд░реЗрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред

рд░реЛрдмреЛрдЯ рдХреЛ рд╕рд░рд▓ рд░рд┐рдкреЛрд░реНрдЯ рдХреИрд╕реЗ рд╕реМрдВрдкреЗрдВред 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

рд╣рдореЗрдВ рдкрд╛рдВрдЪ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ 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 рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЫрд╡рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред

рдкреАрдПрд▓рдЯреА = рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝_рдмрд╛рд░_рдЪрд╛рд░реНрдЯ(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')

рдПрдХ рдЫрд╡рд┐ рднреЗрдЬреЗрдВ

рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЛ рд░рд┐рдкреЛрд░реНрдЯ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЪреИрдЯ_рдЖрдИрдбреА рдкреИрд░рд╛рдореАрдЯрд░ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред

рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ userinfobot рдФрд░ /рдкреНрд░рд╛рд░рдВрдн рдЯрд╛рдЗрдк рдХрд░реЗрдВред рдмреЙрдЯ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдЪреИрдЯ_рдЖрдИрдбреА рдЖрдИрдбреА рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рд╣реИред

рдЕрдм рдЖрдЗрдП рд╕реЗрдВрдб_рдЗрдореЗрдЬ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВред рдпрд╣ рдЫрд╡рд┐ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП 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 рдореЗрдВ рдПрдХ рдмреЙрдЯ рд▓рд┐рдЦрдирд╛

рдЖрдк рддреИрдпрд╛рд░ рдХреЛрдб рдпрд╣рд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдореЗрд░рд╛ рдЧрд┐рдЯрд╣рдм.

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ