ProHoster > Блог > интернет жаңалықтары > Қарапайым есептерді роботқа қалай тапсыруға болады. Біз Python және Google BigQuery-де бот жазамыз
Қарапайым есептерді роботқа қалай тапсыруға болады. Біз Python және Google BigQuery-де бот жазамыз
Күн сайын, апта сайын қайталанатын тапсырмаларыңыз бар ма? Мысалы, есептер жазу. Сіз деректерді сұрайсыз, оны талдайсыз, визуализациялайсыз (графиктерді, диаграммаларды жасайсыз), содан кейін оны бастығыңызға жібересіз. Бірақ мұның бәрі автоматтандырылған болса ше?
Бұл оқулықта біз Telegram үшін есеп беруді автоматтандыруға көмектесетін бот жасаймыз. Ең кереметі, бүкіл бағдарлама тек 50 код жолынан тұрады! Егер сіз Telegram үшін бірінші рет бот жасап жатсаңыз, оны да оқып шығуыңыз керек пошта.
Біз еске саламыз:«Хабрдың» барлық оқырмандары үшін - «Habr» жарнамалық кодын пайдаланып кез келген Skillbox курсына жазылу кезінде 10 000 рубль көлемінде жеңілдік.
Егер біз қызметті пайдаланғымыз келсе, Google BigQuery API қосуымыз керек. Мұны істеу үшін біз барамыз Google Developers Console және жаңа жобаны жасаңыз (немесе барын таңдаңыз).
Басқару тақтасында API AND SERVICES ҚОСУ опциясын таңдап, BigQuery API іздеңіз.
API қосу үшін Қосу опциясын таңдаңыз.
Тіркелгі кілтін жасаңыз
Қайтадан барайық Google Developers Console, Тіркелгі деректері қойындысын, Тіркелгі деректерін жасау және Қызмет тіркелгісі кілтін таңдаңыз.
Содан кейін - Жаңа қызмет тіркелгісі және атын Қызмет тіркелгісі аты өрісіне енгізіңіз.
Рөл ашылмалы тізімінен Жоба > Ие, одан кейін Жасау тармағын таңдаңыз.
Автоматты түрде жүктелетін файл creds.json деп аталады.
Терминалдағы creds.json жолын көрсете отырып, GOOGLE_APPLICATION_CREDENTIALS орнатыңыз.
Бұл функция сұрауды деректер кадры ретінде қайтарады.
Деректерді визуализациялау
Бұл мәселені шешу үшін 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 функциясына қоңырау шалыңыз.
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 идентификатор өрісінде қамтылған.
Енді send_image функциясын жасайық. Ол кескінді шығарып алу және сақтау үшін get_and_save_image функциясын пайдаланады. Содан кейін біз бәрін дұрыс контактіге жібереміз.