рд░реЛрдмреЛрдЯрд▓рд╛рдИ рд╕рд░рд▓ рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВ рдХрд╕рд░реА рдкреНрд░рддреНрдпрд╛рдпреЛрдЬрди рдЧрд░реНрдиреЗред Python рд░ Google BigQuery рдорд╛ рдмреЛрдЯ рд▓реЗрдЦреНрджреИ

рд░реЛрдмреЛрдЯрд▓рд╛рдИ рд╕рд░рд▓ рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВ рдХрд╕рд░реА рдкреНрд░рддреНрдпрд╛рдпреЛрдЬрди рдЧрд░реНрдиреЗред Python рд░ Google BigQuery рдорд╛ рдмреЛрдЯ рд▓реЗрдЦреНрджреИ

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

рдпрд╕ рдЯреНрдпреБрдЯреЛрд░рд┐рдпрд▓рдорд╛, рд╣рд╛рдореА рдПрдЙрдЯрд╛ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдмрдЯ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫреМрдВ рдЬрд╕рд▓реЗ рд░рд┐рдкреЛрд░реНрдЯрд┐рдЩрд▓рд╛рдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрд░реНрди рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫред рд░ рд╕рдмреИрднрдиреНрджрд╛ рд░рд╛рдореНрд░реЛ рдкрдХреНрд╖ рдХреЗ рд╣реЛ рднрдиреЗ, рд╕рдореНрдкреВрд░реНрдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗрд╡рд▓ релреж рд▓рд╛рдЗрдирдХреЛ рдХреЛрдб рд╣реБрдиреЗрдЫ! рдпрджрд┐ рддрдкрд╛рдИрдВ рдкрд╣рд┐рд▓реЛ рдкрдЯрдХ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдмрдЯ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдИрдВ рдпреЛ рдкрдирд┐ рдкрдвреНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рд╣реЛрд▓рд╛ред рдкреЛрд╕реНрдЯ.

Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ: рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо рд╕реНрдХреНрд░реНрдпрд╛рдЪрдмрд╛рдЯ рдкрд╛рдЗрдерди рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛.

рд╣рд╛рдореА рд╕рдореНрдЭрд╛рдЙрдБрдЫреМрдВ: рд╕рдмреИ Habr рдкрд╛рдардХрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдХреБрдиреИ рдкрдирд┐ Skillbox рдкрд╛рдареНрдпрдХреНрд░рдордорд╛ рднрд░реНрдирд╛ рдЧрд░реНрджрд╛ резреж,режрежреж рд░реВрдмрд▓ рдЫреБрдЯред

рд╕реБрд░реБ рдЧрд░реМрдВ

рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрджреИ

рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ рдЧреБрдЧрд▓-рдХреНрд▓рд╛рдЙрдб-рдмрд┐рдЧрдХреНрд╡реЗрд░реА рдЧреБрдЧрд▓ рдмрд┐рдЧрдХреНрд╡реЗрд░реАрдмрд╛рдЯ рдбреЗрдЯрд╛ рдкреБрди: рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиред matplotlib, рдЦрд╛рд▓реА ╨╕ рдкрд╛рдгреНрдбрд╛ рдбреЗрдЯрд╛ рдХрд▓реНрдкрдирд╛ рдЧрд░реНрди рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫред python-telegram-bot рд╕рдорд╛рдкреНрдд рднрдПрдХреЛ рдбреЗрдЯрд╛ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдордорд╛ рдкрдард╛рдЙрдиреЗрдЫред

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

рдЧреБрдЧрд▓ рдмрд┐рдЧрдХреНрд╡реЗрд░реА рдПрдкреАрдЖрдИ рдЬрдбрд╛рди рдЧрд░реНрджреИ

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

рдирд┐рдпрдиреНрддреНрд░рдг рдкреНрдпрд╛рдирд▓рдорд╛, ENABLE API AND SERVICES рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ 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 рдирд╛рдордХ рдПрдЙрдЯрд╛ рдкреНрд░рдХрд╛рд░реНрдп рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ, рдЬрд╣рд╛рдБ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ 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 рднрдиреЗрдХреЛ рдЕрдХреНрд╖рдХреЛ рд▓рд╛рдЧрд┐ рд╢реАрд░реНрд╖рдХ рд╣реЛ, рд░ title рднрдиреЗрдХреЛ рд╕рдореНрдкреВрд░реНрдг рджреГрд╢реНрдпрдХреЛ рд╢реАрд░реНрд╖рдХ рд╣реЛред

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
        """

рдХреНрд╡реЗрд░реАрд▓реЗ рдбрд┐рд╕реЗрдореНрдмрд░ реи, реирежрезрео рджреЗрдЦрд┐ рд╕реБрд░реБ рд╣реБрдиреЗ рджреБрдИ рд╣рдкреНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдбреЗрдЯрд╛ рд╕рдЩреНрдХрд▓рди рдЧрд░реНрдЫред

рд╣рд╛рдореА рдпреЛ рдорд┐рддрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ рдХрд┐рдирднрдиреЗ реирежрезрео-резреи-режреи bigquery-public-data.stackoverflow.post_history рдорд╛ рд░реЗрдХрд░реНрдб рдЧрд░рд┐рдПрдХреЛ рдкрдЫрд┐рд▓реНрд▓реЛ рдбреЗрдЯрд╛ рд╣реЛ, рдЕрдиреНрдпрдерд╛ рддрдкрд╛рдИрдВрд▓реЗ рдирд╡реАрдирддрдо рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди CURRENT_DATE() рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╣рд╛рдореА query_to_bigquery рдкреНрд░рдХрд╛рд░реНрдпрд▓рд╛рдИ рдХрд▓ рдЧрд░реНрдЫреМрдВред

рдбрд╛рдЯрд╛рдлреНрд░реЗрдо = query_to_bigquery(query)

рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА x-рдЕрдХреНрд╖рдХреЛ рд▓рд╛рдЧрд┐ рдорд┐рддрд┐ рд╕реНрддрдореНрдн рд░ y-рдЕрдХреНрд╖рдХреЛ рд▓рд╛рдЧрд┐ total_posts рд╕реНрддрдореНрдн рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВред

x = рдбреЗрдЯрд╛рдлреНрд░реЗрдо['рдорд┐рддрд┐'].рдЯреЛрд▓рд┐рд╕реНрдЯ()
y = рдбреЗрдЯрд╛рдлреНрд░реЗрдо['рдХреБрд▓_рдкреЛрд╕реНрдЯрд╣рд░реВ'].рдЯреЛрд▓рд┐рд╕реНрдЯ()

рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ visualize_bar_chart рдкреНрд░рдХрд╛рд░реНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрд▓реНрдкрдирд╛ рдЧрд░реНрдЫреМрдВ рд░ рдпрд╕рд▓рд╛рдИ рдЫрд╡рд┐рдХреЛ рд░реВрдкрдорд╛ рдмрдЪрдд рдЧрд░реНрдЫреМрдВред

plt = 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')

рдЫрд╡рд┐ рдкрдард╛рдЙрдБрджреИ

рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛рд▓рд╛рдИ рд░рд┐рдкреЛрд░реНрдЯ рдкрдард╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ chat_id рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдЬрд╛рдиреНрдиреБ рдЖрд╡рд╢реНрдпрдХ рдЫред

рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд╛рдирдХрд╛рд░реАрдмреЛрдЯ рд░ /start рдЯрд╛рдЗрдк рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдмреЛрдЯрд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реАрдХреЛ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджрд┐рдиреНрдЫ, chat_id 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 рдирд╛рдо рджрд┐рдиреБрд╣реЛрд╕реНред

рдЯрд░реНрдорд┐рдирд▓рдорд╛ рдирд┐рдореНрди рдЖрджреЗрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реЗрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

рдкрд╛рдЗрдердирей рдореЗрди.рдкрд╛рдЗ

рд╕рдмреИ рддрдпрд╛рд░ рдЫред рдЕрдм рд╣рд╛рдореАрд╕рдБрдЧ релреж рд▓рд╛рдЗрдирдХреЛ рдХреЛрдб рднрдПрдХреЛ рдмреЛрдЯ рдЫ, рдЬрд╕рд▓реЗ рд╣рд╛рдореНрд░реЛ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдмрд┐рдирд╛ рдиреИ рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрдЫред

рдмрдЯ рдЬрд╛рдБрдЪ рдЧрд░реМрдВ рдпрд╣рд╛рдБ рджреЗрдЦрд┐, /send рдЖрджреЗрд╢ рдЪрдпрди рдЧрд░реЗрд░ред

рд░реЛрдмреЛрдЯрд▓рд╛рдИ рд╕рд░рд▓ рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВ рдХрд╕рд░реА рдкреНрд░рддреНрдпрд╛рдпреЛрдЬрди рдЧрд░реНрдиреЗред Python рд░ Google BigQuery рдорд╛ рдмреЛрдЯ рд▓реЗрдЦреНрджреИ

рддрдкрд╛рдИрдВрд▓реЗ рд╕рдорд╛рдкреНрдд рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдореЗрд░реЛ GitHub.

Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ:

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

DDoS рд╕реБрд░рдХреНрд╖рд╛, VPS VDS рд╕рд░реНрднрд░рд╣рд░реВ рднрдПрдХрд╛ рд╕рд╛рдЗрдЯрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рднрд░рдкрд░реНрджреЛ рд╣реЛрд╕реНрдЯрд┐рдЩ рдЦрд░рд┐рдж рдЧрд░реНрдиреБрд╣реЛрд╕реН ЁЯФе DDoS рд╕реБрд░рдХреНрд╖рд╛, VPS VDS рд╕рд░реНрднрд░рд╣рд░реВ рд╕рд╣рд┐рддрдХреЛ рднрд░рдкрд░реНрджреЛ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реЛрд╕реНрдЯрд┐рдЩ рдХрд┐рдиреНрдиреБрд╣реЛрд╕реН | ProHoster