Ana içeriğe geç

Veri Bilimi için 8 Faydalı Kabuk Komutu

Veri bilimciler neredeyse her gün hangi kabuk komutlarını kullanıyor? Bu eğitimde keşfedin ve nasıl kullanacağınızı öğrenin!
· 12 dk. oku

Yapay Zeka ile Keşfedin

Hem sayıca hem de boyut olarak büyük dosyaları hızlıca analiz etmek, değiştirmek ve işlemek zorunda olduğunuz pek çok senaryo vardır. Ancak dosyalar genellikle metin tabanlı Virgülle Ayrılmış Değerler (CSV) dosyalarıdır. Bunları Excel, LibreOffice veya OpenOffice gibi standart hesap tabloları ile açmak makinenin belleğini aşırı yükler. Ayrıca, çok sayıda dosyayı tek bir yığında işlemek, beklenmedik bir dosya anomalisi nedeniyle birkaç saat sonra sık sık başarısız olur.

Kaçınılmaz olarak donmuş ekranlarda, yeniden başlatmalarda ve uzun bekleyişlerde çok zaman harcarsınız.

Oysa bu görevlerin çoğu birkaç satır kodla yapılabilir. Dahası, birkaç basit kabuk komut satırına aşina olmak, zaman kazandırmada ve hayal kırıklığını azaltmada uzun yol kat etmenizi sağlar.

Bu yazıda neredeyse her gün kullandığım bazı kabuk komutlarına genel bir bakış sunacağım. Umarım faydalı bulursunuz.

kabuk veri bilimi

Hızlı Notlar

Not edin ki farklı kabuk türleri (bash, zsh, ...) vardır; bash en yaygınıdır çünkü OS X ve büyük Linux dağıtımlarında varsayılan kabuktur. Zsh (ve Oh My Zsh) popüler ve güçlü bir alternatiftir. Bu blog yazısındaki kabuk komutları OS X (macOS) üzerinde bash ile test edilmiştir ve diğer kabuklar ve ortamlarda da çalışmalıdır.

Aşağıdaki örneklerin tümü UCI Makine Öğrenimi deposundaki, "Census Income" olarak da bilinen ve burada bulunan adult veri kümesine dayanmaktadır. Bu veri kümesi, nüfus sayımı verilerine göre gelirin yılda \$50K'ı aşıp aşmadığını tahmin etmek için yaygın olarak kullanılır. 48842 satır ve 14 öznitelik ile, büyük bir veri kümesi değildir fakat örnekleri göstermek için yeterlidir. Veri .data uzantısıyla saklansa da iyi biçimlendirilmiş bir CSV dosyasıdır. Takip etmek için veri kümesini indirmekten çekinmeyin!

wc ile Sayma

Yeni bir metin tabanlı dosya verildiğinde, içinde kaç satır olduğunu bilmek isteyebilirsiniz. Bu, kelime sayacı wc -l komutuyla yapılabilir:

$ wc -l adult.data
  32562 adult.data

Bu, adult.data dosyasının 32562 satır içerdiğini söyler. -l bayrağı, wc'ye satırları saymasını söyler. Ancak wc'yi -w bayrağını kullanarak kelimeleri saymak için de kullanabilirsiniz.

$ wc -w adult.data
  488415 adult.data

adult.data dosyası yaklaşık 500 bin kelime içeriyor.

wc komutu, basit bir ls -l komutunun çıktısını wc'ye girdi olarak kullanarak bir dizindeki dosya sayısını da sayabilir. Bir komutun çıktısını boru sembolü | ile başka bir komuta girdi olarak kullanmak, pipelining olarak adlandırılan kullanışlı bir kabuk desenidir. Bu yazı boyunca birkaç örnekte göreceksiniz.

Şimdi çok sayıda dosyanın bulunduğu bir klasöre sahip olduğunuzu varsayın. Aşağıdaki komut size tam olarak kaç dosya içerdiğini söyleyecektir:

$ ls -l <folder> | wc -l
 508

Joker karakterler ve alt klasörler eklemeye başladığınızda wc için daha pek çok kullanım vardır.

Şimdi adult.data dosyanıza dönelim ve head komutuyla ilk satırlara bakalım. Varsayılan olarak head 10 satır verir; -n bayrağını kullanarak çıktıyı ilk 2 satırla sınırlayabilirsiniz.

$ head -n 2 adult.data
39, State-gov, 77516, Bachelors, 13, Never-married, Adm-clerical, Not-in-family, White, Male, 2174, 0, 40, United-States, <=50K
50, Self-emp-not-inc, 83311, Bachelors, 13, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 13, United-States, <=50K

Ve dosyada bir başlık satırı olmadığını fark edersiniz. Sütun adları dosyanın içinde değil. cat komutunu kullanarak iki dosyayı birleştirip başlık satırını ekleyebilirsiniz.

Dosyaları cat ile Birleştirme

cat komutu bir dosyanın içeriğini standart çıktıya (terminalinize) yazar. Ayrıca bir dizi dosyayı birleştirmek için de kullanılabilir. cat file_1.csv file_2.csv > target_file.csv komutu, hem file_1.csv hem de file_2.csv içeriğini target_file.csv dosyasında birleştirir; file_2.csv'yi file_1.csv'nin sonuna ekler.

Başlık dosyası orijinal veri kümesinde yok ve bunu oluşturmanız gerekiyor. Bunu yapmak için, virgülle ayrılmış sütun adları listesini header.csv dosyasına echo ile yazarsınız.

$ echo "age,workclass,fnlwgt,education,education-num,marital-status,occupation,relationship,race,sex,capital-gain,capital-loss,native-country,class" > header.csv

Bu örnekte, cat çıktısını adult.csv dosyasına boşaltmak için kabuk yönlendirme karakteri > kullandınız. >, dosya yoksa oluşturur, varsa içeriğini tamamen değiştirir. Sembolü iki kez kullanmak >>, mevcut bir dosyaya yeni içeriği ekler ve içeriğini silmez.

Şimdi header.csv dosyasını adult.data dosyasının başına ekleyelim. Aynı zamanda, adult.data'yı adult.csv olarak yeniden adlandırırsınız çünkü sonuçta bu bir CSV biçimli dosyadır.

$ cat header.csv adult.data > adult.csv

adult.csv'nin ilk satırının sütun adlarını içerdiğini şu komutla kontrol edin:

$ head -n 1 adult.csv
age,workclass,fnlwgt,education,education-num,marital-status,occupation,relationship,race,sex,capital-gain,capital-loss,native-country,class
39, State-gov, 77516, Bachelors, 13, Never-married, Adm-clerical, Not-in-family, White, Male, 2174, 0, 40, United-States, <=50K

Bir Dosyayı sed ile Değiştirme

Bir diğer sık veri madenciliği senaryosu, dosya bozuk ya da kötü biçimlendirilmiş olduğunda (örneğin UTF-8 olmayan karakterler veya yanlış yere konmuş virgül) ortaya çıkar. Bu dosyayı sed komutunu kullanarak aslında açmadan düzeltebilirsiniz.

Genel sed deseni şöyledir

$ sed "s/<string to replace>/<string to replace it with>/g" <source_file> > <target_file>.

adult.csv veri kümesi, eksik değeri belirtmek için ? karakterini kullanır. Bu karakteri sed ile daha uygun bir varsayılan değerle değiştirebilirsiniz. Boş dize, bir eksik değerin göstergesi olarak tercih edilir; çünkü veriyi bir Pandas DataFrame'ine yüklerken NaN olarak yorumlanır.

$ grep ", ?," adult.csv | wc -l
2399

Bu, ? ile gösterilen en az bir eksik değeri olan 2399 satırın sayımını verir. Aşağıdaki komut, ? içeren tüm sütunları boş bir dizeyle değiştirecektir. Yalnızca ? içeren ve ardından bir boşluk gelen tüm hücreler artık gerçekten boş olacaktır.

$ sed "s/, ?,/,,/g" adult.csv >  adult.csv

Veri kümesinin başka yerlerinde bulunabilecek geçerli soru işaretlerini değiştirmemek için kaynak ve hedef dizelerde sütun ayırıcı , kullandığınıza dikkat edin.

Büyük Bir Dosyadan Alt Küme Oluşturma

Diyelim ki 30 milyondan fazla satıra sahip bir dosyayla uğraşıyorsunuz. Python veya R betiğinizi yazarken, tüm veri kümesini belleğe yüklemek zorunda kalmamak için iş akışınızı yalnızca orijinal büyük dosyanın bir örneklemi üzerinde test etmek isteyeceksiniz. Orijinal veri kümesinden bir alt örnek oluşturmak için head ve tail kombinasyonunu kullanabilirsiniz.

  • head dosyaların ilk kısmını çıktı verir;
  • tail dosyaların son kısmını çıktı verir

Daha önce gördüğünüz gibi, bu komutlar çıktıdaki satır sayısını kısıtlayan --lines anlamına gelen -n bayrağını alır. tail ayrıca, dosyanın sonuna satırlar eklendikçe eklenen verileri çıktılayan ve özellikle tail -f <logfile> kullanarak betikleriniz çalışırken günlük dosyalarını izlemek için kullanışlı olan --follow anlamına gelen -f bayrağını da alır.

Boru sembolü |'i head ve tail ile karıştırarak, kaynak dosyanın içinden belirli sayıda satır çıkarabilir ve içeriği bir alt küme dosyasına aktarabilirsiniz. Örneğin, 100. satırdan başlayarak 20 satır çıkarmak için:

$ head -n 120 adult.csv | tail -n 20 > adult_sample.csv

Önce head ile first_line + number_of_lines kadar satır aldığınıza ve ardından tail ile number_of_lines kadarını seçtiğinize dikkat edin. Genel alt küme komutu şöyledir:

$ head -n <total_lines> <source_file> | tail -n <number_of_lines> > <target_file>

burada total_lines = first_line + number_of_lines. Ancak, yeni örneklenen dosyanız artık başlık satırını içermiyor. Daha önce oluşturduğumuz header.csv dosyasıyla alt küme dosyasını cat kullanarak birleştirip başlığı nasıl geri ekleyeceğimizi zaten biliyoruz:

$ cat adult_sample.csv header.csv > adult_sample_with_header.csv

cat kullanırken kaynaklardan biriyle aynı ada sahip bir dosyayı hedef olarak kullanmanın beklenmedik dosya içeriğine yol açacağını unutmayın; bu nedenle adult\_sample.csv kaynak dosya adını hedef olarak kullanmadınız ve bunun yerine adult\_sample\_with\_header.csv adlı yeni bir dosya oluşturdunuz. cat komutunun çıktısı olarak yeni bir dosya oluşturmak daha iyidir.

Yinelenenleri uniq ile Bulma

uniq komutuyla bir dosyadaki bitişik tekrar eden satırları bulabilirsiniz. uniq birkaç bayrak alır; en kullanışlı olanları şunlardır:

  • uniq -c: her satıra tekrar sayısını ekler;
  • uniq -d: yalnızca yinelenen satırları çıktı verir; ve
  • uniq -u: yalnızca benzersiz satırları çıktı verir.

Ancak uniq akıllı bir komut değildir. Satırlar bitişik değilse tekrarlar tespit edilmez. Bu da önce dosyayı sort etmeniz gerektiği anlamına gelir. Bu komut adult.csv içindeki yinelenen satırların sayısını hesaplar.

$ sort adult.csv | uniq -d | wc -l
23

ve 23 tekrar olduğunu gösterir. Aşağıdaki komut, tekrar sayıları eklenmiş tüm satırların çıktısını alır, tersine sıralar ve ilk 3 tekrar eden satırı verir:

$ sort adult.csv | uniq -c | sort -r | head -n 3
3 25, Private, 195994, 1st-4th, 2, Never-married, ...
2 90, Private, 52386, Some-college, 10, Never-married, ...
2 49, Self-emp-not-inc, 43479, Some-college, 10, Married-civ-spouse, ...

Farklı bayraklarla sort ve uniq'i birleştirerek elde edilebilecek pek çok güçlü seçenek vardır. Bu komutları daha fazla keşfetmek için man sort ve man uniq'i kullanın.

Sütunları cut ile Seçme

CSV dosyaları ve kabuk komutlarıyla ilgili harika olan şey, belirli bir sütunu seçmek için cut kullanarak sütun düzeyinde de çalışabilmenizdir. cut iki ana bayrak alır: sütun ayırıcısını belirtmek için -d ve üzerinde çalışmak istediğiniz sütunları belirtmek için -f. Aşağıdaki örnekte, workclass kategorik değişkeninin (sütun 2) aldığı benzersiz değer sayısını bulmak için cut kullanırsınız.

Önce workclass sütununu seçin ve doğru sütunu aldığınızı doğrulamak için head'e yönlendirin:

$ cut -d "," -f 2 adult.csv | head -3
workclass
State-gov
Self-emp-not-inc

Şimdi benzersizleri saymak için, cut çıktısını sıralayıp sonucu uniq -c'ye şu şekilde yönlendirirsiniz:

$  cut -d "," -f 2 adult.csv | sort | uniq -c
1837
 960  Federal-gov
2093  Local-gov
   7  Never-worked
22696  Private
1116  Self-emp-inc
2541  Self-emp-not-inc
1298  State-gov
  14  Without-pay
   1 workclass

Bu da örneğin 1837 adet boş değer olduğunu ve ana sınıfın açık ara Private sınıfı olduğunu, 22969 gözlemle yer aldığını söyler.

Yukarıdaki komut satırı, adult.csv verisini içeren bir DataFrame'e uygulanan value_counts() yöntemine benzer.

Döngüler

Şimdiye kadar çoğunlukla tek bir dosya üzerinde çalıştınız. Çok sayıda dosyayı yeniden adlandırmak, işlemek veya aktarmak için kabuk araç takımımıza döngüler eklemelisiniz. Bash kabuğunda döngünün genel biçimi şöyledir:

while true; do
    _do something_ ;
done

Bunu işe koşalım. Dosya adlarında boşluk bulunan 1000 dosyanız olduğunu ve her boşluğu bir alt çizgi "_" ile değiştirmek istediğinizi hayal edin.

replace_source=' '
replace_target='_'
for filename in ./*.csv; do
    new_filename=${filename//$replace_source/$replace_target}
    mv "$filename" "$new_filename"
done

Bu örnekte,

  • Önce boşluk ve alt çizgi karakterleri için yer tutucu olarak replace_source ve replace_target adında iki değişken tanımlarsınız
  • Geçerli klasördeki tüm *.csv dosyaları üzerinde döngü kurarsınız
  • her filename için, her boşluğu bir alt çizgiyle değiştirerek bir new_filename oluşturursunuz
  • ve mv komutuyla dosyayı mevcut adından yeni adıyla yeniden adlandırırsınız

Aslında, yalnızca bir dizindeki dosyalar üzerinde döngü kurmakla kalmadınız, aynı zamanda değişkenler de oluşturdunuz.

Değişkenler

Bu kabuk komutlarına girişe değişkenlerle son vereceksiniz. Kabukta değişken oluşturma basitçe şöyle yapılır

$ varname='<a string>'
$ varname=a number

Örneğin:

$ varname='Hello world'
$ varname=123.4

'=' işaretinin etrafında boşluk olmadığını unutmayın. var = '<a string>' çalışmaz. Değişken değerini döndürmek için basitçe echo edin:

$ echo $varname
123.4

Ve bir betikte kullanmak için, daha önce gördüğünüz gibi tırnak içine alın:

$ mv "$filename" "$new_filename"

Döngüler yazmak ve değişkenler kullanmak, daha karmaşık dosya işlemlerinin kapısını açar ve bu giriş yazısının kapsamının ötesinde olan kabuk betiklemesine geçit oluşturur. Ancak küçük başlayıp güveniniz arttıkça geliştirdiğinizde kabuk betikleme yeterince basittir.

Sonuç

Kabuk komut satırları, veri bilimci olarak günlük işinizde son derece kullanışlıdır. Keşfedilebilecek daha pek çok örnek ve kullanım durumu vardır. Ve göreceğiniz gibi, mevcut çok sayıda kabuk komutu ve ilgili bayrak kullanılarak belirli bir sonuca ulaşmanın genellikle farklı yolları vardır. Bu durumda işleri basit tutmak her zaman kazanan stratejidir.

Buradaki örneklerin, kabuk komutlarını veri işleme araç takımınıza entegre etmenize yardımcı olmasını umarım. Twitter üzerinden kabuk ipuçlarınızı benimle paylaşmaktan çekinmeyin: @alexip.

Bilgisayarınızda Veri Bilimi Ortamı Kurma eğitimimize göz atın.

Konular

İlgili