ملاحظات عالم البيانات: الأدوات الصغيرة كبيرة



في أغلب الأحيان ، في عمل اختصاصي البيانات ، يتعين علي نقل البيانات من عرض إلى آخر ، تجميعي ، يؤدي إلى نفس الدقة وتنظيف البيانات ، وتحميل النتائج ، وإفراغها ، وتحليلها ، وتنسيقها ، وإرسالها (والتي ، بشكل عام ، هي أيضًا بيانات في شكل ما). هناك دائمًا خطأ ما في البيانات ويجب دفعها سريعًا ذهابًا وإيابًا - والأهم من ذلك كله ، تساعدني أدوات Unix المساعدة الكلاسيكية والأدوات الصغيرة ولكن الفخورة في هذا: سنتحدث عنها اليوم.



واليوم سيكون هناك مجموعة مختارة من الأمثلة والمواقف التي يتعين علي استخدامها فيها. كل ما تم وصفه هنا وأدناه هو تجربة ذاتية حقيقية وبالطبع يختلف من شخص لآخر ، ولكن ربما يكون مفيدًا لشخص ما.



الأدوات - تعلم الأدوات - كل ما هو مكتوب شخصي ويستند فقط إلى الخبرة الشخصية: لقد ساعدني ، وربما يساعدك أيضًا.



قبل أن تبدأ في القراءة ، نذكرك أن لعبتنا لـ kulkhatskers جارية ، حيث يمكنك كسب المال ...


Zsh و oh-my-zsh - بعد كل هذه السنوات في Bash!



كما أتذكر الآن ، كان عمري 17 عامًا وقمت بتثبيت Linux. محطة وباش. وبطريقة ما ، كانت bash دائمًا جزءًا من العملية وتجسد بالنسبة لي العمل الفعلي في المحطة. بعد 12 عامًا من تخرجي لدرجة الدكتوراه ، انتهى بي المطاف في شركة حيث كان هناك مستند تمهيدي ، وللمرة الأولى صادفت نبات الخشخاش وقررت أن أتبعه.



وها! التنقل المريح في المجلد ، والإكمال التلقائي البشري ، ومؤشر git ، والسمات ، والمكونات الإضافية ، ودعم بيئة افتراضية للبيثون ، وما إلى ذلك - أنا الآن جالس في الجهاز ولا أشعر بسعادة غامرة!





نضع zsh ، حيث عادة ما تضع كل شيء وتنتقل إلى oh-my-zsh (في الواقع ، هذا تجميع شعبي من الوصفات التي تعمل خارج الصندوق وإضافة دعم للمكونات الإضافية والسمات وما إلى ذلك). يمكنك أن تأخذه هنا . ويمكنك أيضًا وضع موضوع (حسنًا ، على سبيل المثال). هنا ل عرض خير الاحتمالات. مأخوذة من هذه المقالة هنا.



خطوط الأنابيب





يعد خط الأنابيب أحد أفضل تصاميم المحطات. بعبارات بسيطة ، يسمح لك بتوصيل مخرجات أحد الأوامر بمدخلات أمر آخر ، وهو مثال تطبيق بسيط مأخوذ حرفيًا من مهمة كنت أقوم بها منذ يومين.



كان من الضروري محاكاة مشكلة في لغة واحدة لحل المشكلات الاندماجية ، كل شيء بدأ من المحطة وعرض في شكل غير قابل للقراءة على الإطلاق من النص عن طريق وضع رمز بسيط | - مداخل موصلة ومخرجات تدعم التنسيق:



| python.py format.py



تتمثل المهمة اليومية الأكثر إثارة للاهتمام في تقييم بعض المعلمات أو الخصائص من البيانات التي تم تحميلها ، كقاعدة عامة ، هذه سلسلة من عمليات التحقق السريعة من أن القيم المطلوبة في مكان ما على الخادم مع البيانات تعمل بشكل جيد - على سبيل المثال ، نريد أن نفهم ما لدينا مع المحلل اللغوي و تعرف على عدد المجموعات الفريدة التي يتم جمعها في جميع ملفات json - يجب أن تنمو هذه المعلمة بشكل كافٍ بشكل طبيعي بمرور الوقت:



cat data/*groups* | jq .group | uniq | wc -l


سنتحدث أكثر عن كل واحد منهم ، لكن الفكرة العامة واضحة بالفعل:



  • cat - (اختصار للتسلسل) يطبع محتويات الملفات مع كلمة "group" في الاسم من البيانات / المجلد
  • jq - يمزق حقل "المجموعة" من json
  • uniq - يترك فقط مجموعات فريدة
  • wc - يحسب المفتاح -l الخطوط ، أي عدد المجموعات 


والآن سنلقي نظرة فاحصة على مرحاض.



WC هي أداة صغيرة ولكنها فخورة لعد الأسطر والكلمات والمزيد.



wc - يمكنه قراءة الكلمات والخطوط والحروف والبايت وأقصى طول للسطر بسرعة ، وكل ذلك باستخدام مفاتيح بسيطة:



  • —bytes
  • —chars
  • —words
  • —lines
  • —max-line-length
     

يبدو أن هذا أمر تافه ، ولكن اتضح أنه غالبًا ما يكون ضروريًا ومريحًا بشكل لا يصدق.



للاستخدام اليومي ، دعنا نقدر بسرعة مقدار البيانات التي جمعناها (هنا سطر واحد ، سجل واحد):





مزيد من التفاصيل هنا .



Ack / grep



تمت كتابة الآلاف من الكتيبات والمقالات عنهم ، لكن لا يسعني إلا أن أذكر - إنهم يمزقون النص مع النظاميين ولغة الاستعلام الخاصة بهم وفقًا للنمط. بشكل عام ، يبدو لي أن ack أكثر ملاءمة وأسهل في الاستخدام خارج الصندوق ، لذلك سيكون هنا:



مثال: العثور بسرعة على تواجد الكلمة (مفتاح "-w") ga2m (نوع النموذج) ، غير حساس لحالة الأحرف (key -i) في ملفات مصدر Python :





JQ - تحليل json في سطر الأوامر



التوثيق .



JQ هو بصراحة grep / ack لـ json (وإن كان ذلك بلمسة من sed و awk - حول الأخير لاحقًا) - في الواقع ، محلل بسيط لسطر json و json في سطر الأوامر ، لكن في بعض الأحيان يكون مناسبًا للغاية - بطريقة ما اضطررت إلى تحليل أرشيف wikidata بتنسيق bz2 ، يزن حوالي 100 جيجابايت وحوالي 0.5 تيرابايت غير مضغوط.



كان من الضروري نسخ المراسلات بين عدة مجالات منه ، والتي اتضح أنها تتم ببساطة شديدة على جهاز بدون أي حمل عمليًا على وحدة المعالجة المركزية والذاكرة ، إليكم الأمر ذاته الذي استخدمته: 



bzcat data/latest-all.json.bz2  | jq —stream 'select((.[0][1] == "sitelinks" and (.[0][2]=="enwiki" or .[0][2] =="ruwiki") and .[0][3] =="title") or .[0][1] == "id")' | python3 scripts/post_process.py "output.csv"


لقد كان خط الأنابيب بأكمله هو الذي أنشأ التعيين المطلوب ، حيث نرى كل شيء يعمل في وضع الدفق: 



  • قراءة bzcat جزء من الأرشيف وأعطى jq
  • jq باستخدام مفتاح -stream ينتج النتيجة فورًا ويمررها إلى المعالج (تمامًا كما هو الحال مع المثال الأول) في Python
  • داخليًا ، يعد المعالج اللاحق آلة حالة بسيطة


في المجموع ، خط أنابيب معقد يعمل في وضع التدفق على البيانات الضخمة (0.5 تيرابايت) ، بدون موارد كبيرة ومصنوع من خط أنابيب بسيط واثنين من الأدوات. أنصح بالتسجيل في وقت فراغك.



fzf - مكتشف ضبابي



الشيء الأكثر ملاءمة (خاصةً داخل wim): يبحث سريعًا في الملفات ، وهو مناسب لمشروع كبير - خاصةً عندما يكون لديك العديد منها. كقاعدة عامة ، تحتاج إلى البحث بسرعة عن الملفات بكلمة معينة في مشروع كبير: لقد انغمست في مشروع جديد ، والذي يتضمن عدة مستودعات كبيرة ، وكمهمة تمهيدية كنت بحاجة إلى إضافة نموذج بسيط واحد إلى النطاق المتاح في النظام وكنت بحاجة إلى ذلك بسرعة ابحث عن ملفاتك باستخدام الكلمة الأساسية ga2m واعمل عن طريق القياس مع "كتل التعليمات البرمجية" الأخرى - قم بتحرير أحدهما أو الآخر بسرعة - وهنا يأتي fzf للإنقاذ جيدًا:





ارتباط بالمستودع .



AWK



يأتي الاسم من الأحرف الأولى لمنشئي Aho و Weinberger و Kernighan: في الواقع ، لغة برمجة نصية لمعالجة بيانات جدول النص - تطبق أنماط التحويل على كل سطر من الملف.



كقاعدة عامة ، إنها مثالية للتحويلات السريعة لمرة واحدة ، على سبيل المثال ، لدينا مجموعة بيانات مجمعة يدويًا في شكل tsv ، وتلقى المعالج jsonl كمدخلات وكان يتوقع حقل "theme" إضافي ، والذي لم يكن موجودًا في الملف المصدر (مطلوب لبعض الأشياء التي لم تكن مهمة للحسابات الحالية) - في المجموع ، تمت كتابة سطر واحد بسيط:



cat groups.tsv | awk '{ printf "{\"group\": \"%s\", \"theme\": \"manual\" }\n", $1  }' > group.jsonl




في الواقع ، أخذ ملفًا ولف كل سطر في json بالحقول اللازمة.



رابط من البرنامج التعليمي .



wget - أداة تنزيل سطر أوامر متعددة الاستخدامات



يجب أن تقوم البرامج النصية وخطوط الأنابيب بانتظام بسحب وتنزيل شيء ما من مكان ما - ولا يفشل wget: يمكنه التنزيل وتسجيل الدخول والوكلاء وملفات تعريف الارتباط ، وإلى جانب http (s) ، يمكنه إجراء بروتوكول نقل الملفات.



السكين السويسري في التنزيل.



HSTR - البحث في سجل الأوامر ، بوجه بشري



محفوظات القيادة: hstr بشكل



منتظم يجب أن أبحث عن شيء ما في محفوظات الأوامر:



  • "كان علي فعل ذلك بالفعل"
  • "ما هي المفاتيح التي يبدأ بها X؟"
  • "لكن يمكن إعادة استخدام هذه القطعة"


لذلك ، من الأهمية بمكان أن يكون لدي بحث جيد ومريح في تاريخ الأوامر ، بينما يقوم hstr بعمله بالكامل:







مفيد ولكن غير مدرج



في النهاية ، أود أن أذكر أنه من المفيد - ولكن مع الاستعانة بمقال منفصل للموضوع - من المفيد أن ننظر: 



  • ssh + tmux + vim (neo ، plugins ، إلخ)
  • المعرفة الأساسية لسطر الأوامر git + git hooks
  • Data pipeline construction make/just
  • Python virtual environments
  • Docker





All Articles