ProHoster > Blog > интернет жаңылыктары > Жөнөкөй отчетторду роботко кантип тапшырса болот. Python жана Google BigQuery менен бот жазуу
Жөнөкөй отчетторду роботко кантип тапшырса болот. Python жана Google BigQuery менен бот жазуу
Күндөн күнгө, жумадан жумага кайталанган тапшырмаларыңыз барбы? Мисалы, отчетторду жазуу. Сиз маалыматтарды сурайсыз, аны талдайсыз, визуализациялайсыз (графиктерди, диаграммаларды түзөсүз), анан аны жетекчисиңизге жөнөтөсүз. Бирок мунун баары автоматташтырылган болсочу?
Бул окуу куралында биз Telegram үчүн отчетту автоматташтырууга жардам бере турган бот түзөбүз. Эң сонун нерсе, программанын бардыгы 50 сап коддон турат! Эгер сиз Telegram үчүн ботту биринчи жолу түзүп жатсаңыз, анда муну да окушуңуз керек кызмат.
Биз эсиңизге салабыз:"Хабрдын" бардык окурмандары үчүн - "Habr" промо-кодун колдонуу менен каалаган Skillbox курсуна катталганда 10 000 рубль арзандатуу.
Кызматты колдонгубуз келсе, Google BigQuery API'син туташтырышыбыз керек. Бул үчүн биз барабыз Google Иштеп чыгуучунун аймагы жана жаңы долбоорду түзүү (же учурдагыны тандоо).
Башкаруу панелинен APIS ЖАНА КЫЗМАТТАРДЫ ИШТЕТҮҮ дегенди тандап, BigQuery API издеңиз.
API туташтыруу үчүн Иштетүү тандаңыз.
Каттоо эсебинин ачкычын түзүңүз
кайра баралы Google Иштеп чыгуучунун аймагы, Каттоо тактасын тандаңыз, Эсептик дайындарды түзүү жана Кызмат эсебинин ачкычы.
Андан кийин - Жаңы кызмат эсеби, жана Кызмат эсебинин аты талаасына атын киргизиңиз.
Рол ылдый түшүүчү тизмеден Долбоор > Ээси, анан Түзүүнү тандаңыз.
Автоматтык түрдө жүктөлө турган файл creds.json деп аталат.
Терминалдагы creds.json жолун көрсөтүү менен GOOGLE_APPLICATION_CREDENTIALS коюңуз.
Бул функция сурамды маалымат алкагы катары кайтарат.
Маалыматтарды визуалдаштыруу
Бул маселени чечүү үчүн, matplotlib тандаңыз.
matplotlib.pyplot файлын plt катары импорттоо
Бизге беш параметр керек, мында 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 функциясына чалыңыз.
dataframe = query_to_bigquery(суроо)
Андан кийин биз x огу үчүн дата маалымат тилкесин жана y огу үчүн total_posts тилкесин колдонобуз.
x = dataframe['date'].tolist()
y = dataframe['total_posts'].tolist()
Биз аны visualize_bar_chart функциясынын жардамы менен визуализациялап, сүрөт катары сактайбыз.
Бул кодду 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 функциясын колдонот. Анан баарын туура байланышка жөнөтөбүз.