Friday, June 28, 2013

Oracle SQL ile Orneklemek (Sampling)

SELECT ifadesi ile tum satirlar (where ile filtrenenleri tabii) almak yerine, o kume icinden 10000 satirlik bir orneklem (sample) almak icin alttaki ifade kullanilir,

exec dbms_random.initialize(17809465);

select
kolon1,
kolon2,
...
FROM [tablo]
where 1=1
and ...
and rownum<10000
..
order by dbms_random.random
;

Cagri initialize ne ise yarar? Bu fonksiyona ayni tohum (seed) degeri verilirse (rasgele sayi uretme literaturunu bilenlere bu kavram tanidik gelecektir), o deger ile yapilan bir rasgele islem arka arkaya isletilse bile hep ayni "rasgele degerleri" dondurur (ya da ustteki ornekte hep ayni rasgele satirlari geri getirir). Eger tohum verilmeseydi ustteki cagri her seferinde farkli degerleri geri getirecekti.

Bunun faydasi, kodumuzda hata ararken hep ayni veriyle islem yaptigimizdan emin olabilmemiz (hep ayni tohumu kullanarak), boylece veriye donuk farkliliklarla ugrasmaya ihtiyac kalmamasi. Sayi 17809465 yerine herhangi, yeterince buyuk baska bir sayi kullanilabilir.

Eger farkli cagrilarda farkli veri istersek, bir sonraki cagrida tohum degerini degistiririz, ve farkli rasgele sonuclar aliriz.

Wednesday, June 26, 2013

Bash, Surec Idaresi

Komut satirindan surec kontrolu, idaresi gibi isler icin Unix bash'in guzel ozellikleri var. Bash icin bir script'i sh script.sh ile degil bash script.sh olarak isletmek gerekli. Mesela

set -m # Enable Job Control
for (( i = 0; i < $2; i++ ))
do
    cmd="baz komut "
    cmd+=" ";cmd+=$2;cmd+=" ";cmd+=$i
    if [ $1 == "secim1" ]; then
        xterm -hold -e $cmd &
    fi
    if [ $1 == "secim2" ]; then
        $cmd &
    fi
done
wait
echo "hepsi tamam"

...

Ustteki script icinde surec kontrolu (job control) icin -m en basta tanimlanmali.

Diyelim ki bu script'e verilen birinci secenek (yani $1) ile bir string veriyoruz, ve string uzerinde if..else irdelemesi yapilarak script farkli seyler yapabiliyor. Ayrica baz bir komuta ek string'leri dinamik olarak ekleyerek dinamik bir komut olusturabiliyoruz. Isletmek icin mesela

bash test.sh secim1 2

Ikinci secenek ile (yani $2) ile bir sayi veriyoruz diyelim, bu sayi kadar bir dongu baslatabiliriz, ve dongude her indis icin baska "alt komutlari" arka planda isletebiliriz. Birinci secenek her komut icin xterm baslatmak, ya da pur arka planda "sessiz olarak" isletmeyi kontrol ediyor olabilir.

Bash surec kontrolunun guzel tarafi, mesela wait komutu ile bu arka plana atilmis tum surecler bitene kadar ana script'in bekleyebilme ozelligidir. Belki tum alt komutlar bitince bazi ek birlestirme, vs. islemleri yapilacaktir. Onlari yapmanin en uygun yeri burasi, yani hemen wait sonrasi. Bunu test etmek icin su script'e bakalim

set -m # Enable Job Control
echo "1 saniye bekle..."
sleep 1 &
echo "3 saniye bekle..."
sleep 3 &
wait
echo "hepsi tamam"


Bu script isletilence 3 saniye bekleme olacaktir, 1 saniyelik "uyku (sleep)" komutu bitmis olsa bile 3 saniyelik olanin bitmesi beklenecektir. Ve (and), yani & isareti bilindigi gibi Unix'te bir komutu arka plana atmaya / isletmeye yarar (background process).

Friday, June 7, 2013

Not Defteri Icinde R

iPython not defterleri icinde R kodu bile kullanmak mumkun. Bazi puf noktalar / uzak durulmasi gereken seyler: Mesela read.csv metoduna ek parametre (mesela ayrac -seperator-) gecilmesi not defterini rahatsiz edebiliyor, o zaman olagan (default) ayrac hep kullanilabilir, ki bu virgul isareti.

Ornek bir kullanim asagida

In [1]:
%load_ext rmagic

In [31]:
%R -n -d myData myData <- read.csv('dosya.csv')

In [*]:
%%R
library(rpart)
tree <- rpart(y ~ kolon1 + kolon2, method="class", data=myData)

In [ ]:
%%R
library(rpart.plot)
rpart.plot(tree,type=4, extra=1)

Magic (buyu) kullanimi not defterlerinin pek cok ek ozelligi cagirabilmesini sagliyor, su anda sql icin bile bir magic eklemesi var mesela.

iPython ortami hakikaten bilim, veri analizi, vb. kullanimlar icin ideal bir ortam haline geliyor.