كيفية بناء روبوت لأتمتة مهامك الطائشة باستخدام Python و Google BigQuery

الصورة من قبل لوكاس من Pexels

هل لديك مهام متكررة؟ شيء تفعله بانتظام ، كل أسبوع أو حتى كل يوم؟ قد تكون التقارير إحدى مهامك الأسبوعية أو اليومية. يمكنك الاستعلام عن البيانات أو طلبها ، والقيام ببعض التصورات ، ثم تقديمها إلى رئيسك في العمل. ماذا لو بدلاً من القيام بذلك يدويًا ، كان عليك أتمتة ذلك حتى لا تضطر إلى فعل الأشياء المملة ، ويمكنك استخدام وقتك الثمين للقيام بأشياء أخرى؟

في هذا البرنامج التعليمي ، سنقوم بإنشاء Telegram Bot الذي سيقوم بأتمتة الأجزاء المملّة من الإبلاغ عن عملك. أوه ، وهل ذكرت أنه لن يستغرق أكثر من 50 سطرًا من التعليمات البرمجية لإنشاءه؟ ؛)

إذا كانت هذه هي المرة الأولى التي تنشئ فيها Telegram Bot ، فقد ترغب في قراءة هذه المشاركة أولاً.

ابدء

1. تثبيت المكتبات

سنستخدم google-cloud-bigquery للاستعلام عن البيانات من Google BigQuery. سوف matplotlib ، numpy والباندا تساعدنا في التصور البيانات. سيرسل python-telegram-bot صورة التصور من خلال Telegram Chat.

pip3 تثبيت google-cloud-bigquery matplotlib numpy pandas python-telegram-bot

2. تمكين Google BigQuery API

نحتاج إلى تمكين Google BigQuery API أولاً إذا كنا نريد استخدام الخدمة.

انتقل إلى Google Developers Console وقم بإنشاء مشروع جديد (أو حدد المشروع الذي لديك).

في لوحة معلومات المشروع ، انقر فوق تمكين APIS والخدمات ، وابحث عن BigQuery API.

انقر فوق "تمكين" لتمكين API.

3. إنشاء مفتاح حساب الخدمة

إذا كنا نريد استخدام خدمات Google Cloud مثل Google BigQuery ، فنحن بحاجة إلى مفتاح حساب خدمة. هذا يشبه أوراق اعتمادنا لاستخدام خدمات Google.

انتقل إلى Google Developers Console ، وانقر فوق علامة تبويب بيانات الاعتماد ، واختر إنشاء بيانات اعتماد وانقر فوق مفتاح حساب الخدمة.

اختر حساب خدمة جديد ، في حقل اسم حساب الخدمة ، أدخل اسمًا.

من القائمة المنسدلة "الأدوار" ، حدد Project> Owner ، ثم انقر فوق "إنشاء".

هناك ملف .json سيتم تنزيله تلقائيًا ، وقم بتسميته باسم creds.json.

عيّن GOOGLE_APPLICATION_CREDENTIALS بمسار ملف creds.json الخاص بنا في الجهاز الطرفي.

تصدير GOOGLE_APPLICATION_CREDENTIALS = '[PATH_TO_CREDS.JSON]'

كل شيء يجب أن يكون جيدا الآن ، لقد حان الوقت لكتابة برنامجنا.

اكتب البرنامج

سنقوم بكتابة البرنامج الذي سيقوم باستعلام البيانات من BigQuery (نفترض أن البيانات مخزنة هناك). ثم سنقوم بتصور البيانات وحفظها كصورة. سيتم بعد ذلك إرسال الصورة من خلال Telegram Chat.

في هذا البرنامج التعليمي ، نستخدم مجموعة بيانات bigquery-public-data.stackoverflow ، وسنتخذ بيانات إجمالي المشاركات اليومية لتقريرنا.

سير العمل في برنامجنا بسيط للغاية:

الاستعلام عن الجدول -> تخيل البيانات -> حفظ التصور -> إرسال الصورة

دعونا نجعل وظيفة واحدة لتحديد كل تدفق.

1. الاستعلام عن BigQuery

استيراد المكتبة أولاً.

من google.cloud استيراد طلب استفسار

قم بإنشاء دالة تسمى query_to_bigquery والتي تأخذ الاستعلام كمعلمة.

def query_to_bigquery (استعلام):
    العميل = bigquery.Client ()
    query_job = client.query (استعلام)
    النتيجة = query_job.result ()
    قاعدة البيانات = result.to_dataframe ()
    عودة dataframe

هذه الوظيفة سوف ترجع البيانات كصيغة بيانات.

2. تصور البيانات

نحن نستخدم matplotlib لتصور البيانات.

استيراد matplotlib.pyplot كما PLT

نحن نأخذ خمس معلمات هي x كبيانات المحور س ، x_label كاسم تسمية المحور س ، ص كبيانات المحور ص ، y_label كاسم تسمية المحور ص ، والعنوان كعنوان مرئي لدينا.

def visualize_bar_chart (x، x_label، y، y_label، title):
    plt.title (العنوان)
    plt.xlabel (X_LABEL)
    plt.ylabel (Y_LABEL)
    الفهرس = np.arange (len (x))
    plt.xticks (الفهرس ، x ، حجم الخطوط = 5 ، الدوران = 30)
    شريط plt.bar (الفهرس ، y)
    العودة الثابتة والمتنقلة

3. حفظ الصورة

دعنا نستخدم الدالتين المذكورتين أعلاه لإنشاء تصور ثم حفظ الصورة.

كما ذكرت من قبل ، نريد أن نرسل بيانات إجمالي المشاركات اليومية. اكتب الاستعلام أولاً.

استعلام = "" "
        تاريخ SELECT DATE (create_date) ، COUNT (*) total_posts
        من `bigquery-public-data.stackoverflow.post_history`
        مجموعة BY 1
        تاريخ الاستحقاق> DATE_SUB ("2018-12-02" ، فترة 14 يومًا)
        الترتيب حسب 1
        "" "

لاحظ أنه في الاستعلام أعلاه ، يكون تاريخ HAVING> DATE_SUB ('2018-12-02' ، INTERVAL 14 DAY) يعني أننا نريد أن نجمع البيانات التي تبدأ قبل 14 يومًا من 2018-1202.

نستخدم هذا التاريخ لأن 2018-12-02 هو آخر البيانات المسجلة في bigquery-public-data.stackoverflow.post_history ، في حالات مختلفة قد ترغب في استخدام CURRENT_DATE () بدلاً من ذلك حتى تحصل على أحدث البيانات.

استدعاء query_to_bigquery وظيفة للحصول على البيانات.

dataframe = query_to_bigquery (استعلام)

استخدم عمود التاريخ كبيانات المحور س ، وعمود total_posts كبيانات المحور ص.

x = dataframe ['date']. tolist ()
y = dataframe ['total_posts']. tolist ()

تصور البيانات باستخدام دالة visualize_bar_chart ، ثم احفظها كصورة.

plt = visualize_bar_chart (x = x، x_label = 'Date'، y = y، y_label = 'إجمالي المشاركات'، title = 'مشاركات يومية')
plt.savefig ( 'viz.png')

لف هذا الكود في وظيفة تسمى get_and_save_image.

def get_and_save_image ():
    استعلام = "" "
            تاريخ SELECT DATE (create_date) ، COUNT (*) total_posts
            من `bigquery-public-data.stackoverflow.post_history`
            مجموعة BY 1
            تاريخ الاستحقاق> DATE_SUB ("2018-12-02" ، فترة 14 يومًا)
            الترتيب حسب 1
            "" "
    dataframe = query_to_bigquery (استعلام)
    x = dataframe ['date']. tolist ()
    y = dataframe ['total_posts']. tolist ()
    plt = visualize_bar_chart (x = x، x_label = 'Date'، y = y، y_label = 'إجمالي المشاركات'، title = 'مشاركات يومية')
    plt.savefig ( 'viz.png')

4. إرسال الصورة

لكي نتمكن من إرسالها إلى الشخص المناسب ، نحتاج إلى معرفة chat_id الخاص بهم لأن هذا أحد المعلمات المطلوبة.

انتقل إلى userinfobot ثم اكتب / start. سيرد الروبوت بمعلومات المستخدم الخاصة بنا ، و chat_id الخاص بنا هو الرقم الموجود في حقل المعرف.

قم بعمل وظيفة تسمى send_image. ستتصل هذه الوظيفة بوظيفة get_and_save_image أولاً للحصول على التصور وحفظه ، ثم ترسله إلى الشخص الذي تم إعلان chat_id به في متغير chat_id.

def send_image (الروبوت ، التحديث):
    get_and_save_image ()
    chat_id = 'CHAT_ID_RECEIVER'
    bot.send_photo (chat_id = chat_id ، photo = open ('viz.png' ، 'rb'))

5. البرنامج الرئيسي

أخيرًا ، قم بإنشاء وظيفة أخرى تسمى الرئيسية لتشغيل برنامجنا. لا تنسَ تغيير YOUR_TOKEN برمز الروبوت الخاص بك.

تذكر أن هذا البرنامج سيرسل الصورة تلقائيًا بناءً على اليوم والوقت الذي حددناه.

على سبيل المثال ، في هذا البرنامج التعليمي ، سنضبطه على الساعة 9:00 صباحًا كل يوم.

def main ():
    محدث = محدث ('YOUR_TOKEN')
    updater.job_queue.run_daily (send_image، time = datetime.datetime.strptime ('9:00 AM'، '٪ I:٪ M٪ p'). time () ، أيام = (0،1،2،3،4 ، 5،6))
    updater.start_polling ()
    updater.idle ()
إذا __name__ == '__main__':
    الأساسية()

في النهاية ، يجب أن يبدو الرمز الخاص بك كما يلي:

احفظ الملف وقم بتسميته main.py.

قم بتشغيل البرنامج عن طريق كتابة هذا الأمر في المحطة.

python3 main.py

عظيم! الآن لديك مولد تقرير تلقائي مدمج مع ما لا يزيد عن 50 سطرًا من التعليمات البرمجية - رائع حقًا؟

اذهب للتحقق من الروبوت في هنا ، واكتب الأمر / send لمعرفة مثال تصور الصورة.

توضح الصورة أدناه التصور الذي سيرسله الروبوت. يمكنك الآن الجلوس والاسترخاء والانتظار حتى يقوم الروبوت بإرسال التقرير إليك يوميًا :)

يمكنك زيارة GitHub الخاص بي للحصول على الكود ، ويرجى عدم التردد في الاتصال وترك رسالة في ملفي الشخصي Linkedin إذا كنت تريد أن تسأل عن أي شيء.

يرجى ترك تعليق إذا كنت تعتقد أن هناك أي أخطاء في التعليمات البرمجية أو الكتابة.

إذا كنت مهتمًا بعلوم البيانات أو التعلم الآلي ، فقد ترغب في قراءة مشاركتي في بناء محلل المعنويات.

مرة أخرى ، شكرا لك ونتمنى لك التوفيق! :)