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

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

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

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

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

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

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

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

рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ 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 рдЬрдбрд╛рди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпреЛ рдЧрд░реНрди рд╣рд╛рдореА рдЬрд╛рдиреНрдЫреМрдВ рдЧреБрдЧрд▓ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рдХрдиреНрд╕реЛрд▓ рд░ рдирдпрд╛рдБ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН (рд╡рд╛ рдЕрд╡рд╕реНрдерд┐рдд рдПрдХ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН)ред

рдирд┐рдпрдиреНрддреНрд░рдг рдкреНрдпрд╛рдирд▓рдорд╛, рдПрдкреАрдЖрдИрдПрд╕ рд░ рд╕реЗрд╡рд╛рд╣рд░реВ рд╕рдХреНрд╖рдо рдЧрд░реНрдиреБрд╣реЛрд╕реН рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ 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 рдЫрд╛рдиреНрдиреБрд╣реЛрд╕реНред

plt рдХреЛ рд░реВрдкрдорд╛ matplotlib.pyplot рдЖрдпрд╛рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН

рд╣рд╛рдореАрд▓рд╛рдИ рдкрд╛рдБрдЪ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдЪрд╛рд╣рд┐рдиреНрдЫ, рдЬрд╣рд╛рдБ 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-axis рдХреЛ рд▓рд╛рдЧрд┐ рдорд┐рддрд┐ рдбреЗрдЯрд╛ рд╕реНрддрдореНрдн, рд░ y-axis рдХреЛ рд▓рд╛рдЧрд┐ total_posts рд╕реНрддрдореНрдн рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВред

x = dataframe['date'].tolist()
y = рдбрд╛рдЯрд╛рдлреНрд░реЗрдо['total_posts'].tolist()

рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ 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 рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдЬрд╛рдиреНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

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

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

python3 main.py

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

рдмреЛрдЯ рдЬрд╛рдБрдЪ рдЧрд░реМрдВ рдпрд╣рд╛рдБ рджреЗрдЦрд┐/ рдкрдард╛рдЙрдиреБрд╣реЛрд╕реН рдЖрджреЗрд╢ рдЪрдпрди рдЧрд░реЗрд░ред

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

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

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди