Catatan Ilmuwan Data: Alat Kecil Itu Besar



Paling sering, dalam pekerjaan seorang ilmuwan data, saya harus mentransfer data dari satu tampilan ke tampilan lain, menggabungkan, mengarah ke perincian yang sama dan membersihkan data, memuat, membongkar, menganalisis, memformat, dan mengirim hasilnya (yang, secara umum, juga merupakan data dalam beberapa bentuk). Selalu ada sesuatu yang salah dengan datanya dan data tersebut perlu didorong bolak-balik dengan cepat - yang terpenting, utilitas Unix klasik dan kecil, tetapi alat yang membanggakan membantu saya dalam hal ini: kita akan membicarakannya hari ini.



Dan hari ini akan ada pilihan dengan contoh dan situasi di mana saya harus menggunakannya. Semua yang dijelaskan di sini dan di bawah ini adalah pengalaman subjektif yang nyata dan tentu saja berbeda untuk setiap orang, tetapi mungkin akan bermanfaat bagi seseorang.



Alat - pelajari alat - segala sesuatu yang tertulis bersifat subjektif dan hanya berdasarkan pengalaman pribadi: ini membantu saya, mungkin itu akan membantu Anda.



Sebelum Anda mulai membaca, kami mengingatkan Anda bahwa sekarang kami sedang memainkan permainan kami untuk kulkhackers , di mana Anda dapat memiliki waktu untuk memenangkan uang ...


Zsh dan oh-my-zsh - setelah bertahun-tahun di Bash!



Seperti yang saya ingat sekarang, saya berumur 17 tahun dan menginstal Linux. Terminal dan Bash. Dan entah bagaimana, pesta itu selalu menjadi bagian dari proses dan mempersonifikasikan bagi saya pekerjaan yang sebenarnya di terminal. 12 tahun setelah gelar PhD saya, saya berakhir di sebuah perusahaan di mana ada dokumen pengantar dan untuk pertama kalinya saya mendapatkan poppy dan saya memutuskan untuk mengikutinya.



Dan lihatlah! Navigasi folder yang nyaman, pelengkapan otomatis manusia, indikator git, tema, plugin, dukungan untuk lingkungan virtual untuk python, dll. - sekarang saya duduk di terminal dan saya tidak terlalu senang!





Kami meletakkan zsh, karena Anda biasanya meletakkan semuanya dan membuka oh-my-zsh (sebenarnya, ini adalah kumpulan resep tradisional yang bekerja di luar kotak dan menambahkan dukungan untuk plugin, tema, dll.). Anda bisa menerimanya di sini . Dan Anda juga bisa meletakkan tema (baik, misalnya). Berikut ini adalah sebuah demo yang baik dari kemungkinan. Diambil dari artikel ini di sini.



Saluran pipa





Salah satu desain terminal terbaik adalah saluran pipa. Secara sederhana, ini memungkinkan Anda untuk mengirim output dari satu perintah ke input yang lain, contoh aplikasi sederhana yang secara harfiah diambil dari tugas yang saya lakukan dua hari lalu.



Itu diperlukan untuk mensimulasikan tugas dalam satu bahasa untuk memecahkan masalah kombinatorial, semuanya dimulai dari terminal dan ditampilkan dalam bentuk yang benar-benar tidak terbaca dari teks dengan menempatkan ikon sederhana | - output input yang terhubung dan membuat dukungan pemformatan:



| python.py format.py



Tugas yang lebih menarik dan sehari-hari adalah mengevaluasi beberapa parameter atau karakteristik berdasarkan data yang diunggah, sebagai aturan, ini adalah serangkaian pemeriksaan cepat bahwa nilai yang diperlukan di suatu tempat di server dengan data berperilaku baik - misalnya, kami ingin memahami apa yang kami miliki dengan parser dan lihat berapa banyak grup unik yang dikumpulkan di semua file json - parameter ini secara alami akan tumbuh secara memadai dari waktu ke waktu:



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


Kami akan berbicara lebih banyak tentang masing-masing, tetapi gagasan umumnya sudah jelas:



  • cat - (kependekan dari concatenate) mencetak isi file dengan kata "group" pada nama dari data / folder
  • jq - merobek kolom "grup" dari json
  • uniq - hanya menyisakan grup unik
  • wc - dengan tombol -l menghitung baris, yaitu jumlah grup 


Dan sekarang kita akan melihat lebih dekat wc.



WC adalah utilitas kecil namun membanggakan untuk menghitung baris, kata, dan lainnya.



wc - dapat dengan cepat membaca kata, baris, huruf, byte, dan panjang baris maksimum, semuanya menggunakan tombol sederhana:



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

Tampaknya ini sepele, tetapi ternyata sangat sering diperlukan dan nyaman.



Penggunaan sehari-hari, mari kita dengan cepat memperkirakan berapa banyak data yang telah kita kumpulkan (ini satu baris, satu catatan):





Lebih lengkapnya di sini .



Ack / grep



Ribuan manual dan artikel telah ditulis tentang mereka, tetapi saya tidak bisa tidak menyebutkan - mereka merobek teks dengan tetap dan bahasa kueri mereka sendiri sesuai dengan polanya. Secara umum, menurut saya ack lebih ramah dan lebih mudah digunakan di luar kotak, jadi itu akan ada di sini:



Contoh: dengan cepat menemukan kemunculan kata (kunci "-w") ga2m (tipe model), tidak peka huruf besar / kecil (key -i) di file sumber python :





JQ - parse json pada baris perintah



Dokumentasi .



JQ benar-benar grep / ack untuk json (meskipun dengan sentuhan sed dan awk - tentang yang terakhir nanti) - sebenarnya, parser sederhana untuk baris json dan json pada baris perintah, tetapi terkadang sangat mudah - entah bagaimana saya harus mengurai arsip wikidata dalam format bz2 beratnya sekitar 100GB dan sekitar 0,5TB tidak terkompresi.



Itu perlu untuk merobek korespondensi antara beberapa bidang darinya, yang ternyata dilakukan dengan sangat sederhana pada mesin dengan praktis tanpa beban pada CPU dan memori, berikut adalah perintah yang saya gunakan: 



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"


Pada dasarnya seluruh pipeline yang membuat pemetaan yang diperlukan, seperti yang kita lihat semuanya bekerja dalam mode streaming: 



  • bzcat membaca bagian dari arsip dan memberikan jq
  • jq dengan kunci -stream segera memberikan hasilnya dan meneruskannya ke postprocessor (seperti contoh pertama) dengan python
  • internal prosesor pos adalah mesin negara sederhana


Secara total, pipeline kompleks yang bekerja dalam mode streaming pada big data (0,5TB), tanpa sumber daya yang signifikan dan terbuat dari pipeline sederhana dan beberapa alat. Pasti akan merekomendasikan check out di waktu luang Anda.



fzf - pencari kabur



Hal yang paling nyaman (terutama di dalam wim): mencari file dengan cepat, yang sesuai untuk proyek besar - terutama bila Anda memiliki beberapa file. Sebagai aturan, Anda perlu mencari file dengan cepat dengan kata tertentu dalam proyek besar: Saya tenggelam dalam proyek baru, yang mencakup beberapa repositori besar dan sebagai tugas pengantar saya perlu menambahkan satu model sederhana ke bermacam-macam yang tersedia di sistem dan saya perlu cepat temukan file Anda menggunakan kata kunci ga2m dan lakukan analogi dengan "blok kode" lainnya - edit satu atau lainnya dengan cepat - di sini fzf membantu dengan sangat baik:





Tautkan ke repositori .



AWK



Namanya berasal dari huruf pertama pencipta Aho, Weinberger dan Kernighan: sebenarnya, bahasa skrip untuk memproses data tabel teks - ini menerapkan pola transformasi ke setiap baris file. Biasanya



, ini sangat ideal untuk transformasi satu kali yang cepat, misalnya, kami memiliki kumpulan data yang dikumpulkan dengan tangan dalam bentuk tsv , dan prosesor menerima jsonl sebagai masukan dan mengharapkan bidang "tema" tambahan, yang tidak ada dalam file sumber (diperlukan untuk beberapa hal yang tidak penting untuk kalkulasi saat ini) - secara total, satu baris sederhana telah ditulis:



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




Bahkan, dia mengambil file dan membungkus setiap baris dalam json dengan bidang yang diperlukan.



Tautan dari tutorial .



wget - pengunduh baris perintah serbaguna



Biasanya skrip dan pipeline harus menarik dan mendownload sesuatu dari suatu tempat - dan wget tidak gagal: ia dapat mendownload, log in, proxy, cookie, dan selain http (s), ia dapat melakukan ftp.



Pisau Swiss sedang diunduh.



HSTR - riwayat perintah pencarian, dengan wajah manusia



Riwayat perintah: hstr



Secara teratur saya harus mencari sesuatu di riwayat perintah:



  • "Saya sudah harus melakukannya"
  • "Dengan kunci apa X dimulai?"
  • "Tapi potongan ini bisa digunakan kembali"


Oleh karena itu, sangat penting bagi saya untuk melakukan pencarian yang baik dan nyaman dalam riwayat perintah, sementara hstr melakukan tugasnya sepenuhnya:







Berguna tapi tidak termasuk



Di bagian akhir, saya akan menyebutkan berguna - tetapi menarik artikel terpisah dari topik - berguna untuk melihat: 



  • Ssh + tmux + vim (neo, plugin, dll)
  • Pengetahuan dasar tentang baris perintah git + git hooks
  • Data pipeline construction make/just
  • Python virtual environments
  • Docker





All Articles