Wednesday, September 26, 2012

Postgresql ile Yuzdelik (Percentile) Hesabi

Eger bir olcutun dagilimi tek tepeli ve simetrik degilse, ortalama (mean) ve standart sapma (std deviation) bize uc noktalar (outliers) ve hakiki ortalama degerler hakkinda iyi sonuclar vermeyebilir. Bu durumlarda yuzdelikler (percentile) hesabi daha iyidir, ki medyan kavrami burada devreye girer, medyan 50. yuzdeliktir.

Postgresql ile bu hesabi yapmak icin, mesela dellstore2 verisinde

select totalamount, ntile(20) over (order by totalamount) as cume from orders

kullanilabilir. Bu ilk basamak, PG analitik ntile .. over komutunu kullandi. Bu komut tum satirlari totalamount'a gore siralayarak onlari 20 yuzdelikten birine atayacak.

Eger mesela 95. yuzdeligin en buyuk degerini istersek (ki mesela bu degeri bir uc nokta olarak kabul etmeyi secebiliriz, ve bu degerden buyuk her degeri gurultu, asiri buyuk deger, vs. gibi kabul edebiliriz), o zaman

select max(totalamount) AS max_var from
(
  select totalamount, ntile(20) over (order by totalamount) as cume from orders
) as tmp where cume = 19


kullanilabilir. Ustteki sorgu 410.41 dondurur. Eger "ortalamadan iki standart sapma uzagi" hesabini yaparsak (ki bu hesabinda uc nokta hesabi oldugu kabul edilir), o zaman

select avg(totalamount)+2*stddev(totalamount) from orders

ve

464.19

degeri gelecek. Goruldugu gibi arada buyuk fark var.



Monday, September 17, 2012

SVD ile Kumeleme

Wednesday, September 5, 2012

Postgis ve Mesafe Hesabi

Enlem ve boylam iceren iki kordinate arasindaki mesafeyi Postgis'e nasil hesaplattiririz? Diyelim ki enlem (latitude) ve boylam (longitude) numerik bazli iki ayri kolonda duruyor. Bu durumda bu iki kolonu alip onu PG'in anlayabilecegi bir kordinat formatina cevirmek lazim, sonra st_distance ile mesafe hesabi yapmak.

select ...,
st_distance(GeomFromEWKT('SRID=4326;POINT(' || lat1 || ' ' || lng1 || ')'),
            GeomFromEWKT('SRID=4326;POINT(' || lat2 || ' ' || lng2 || ')'))

from tablo ...

Sonuc kilometre olarak gelecek. Konu hakkinda bazi hizli bilgiler: kordinatlardan en azindan kuzey yarimkure icin 40'li, 50'li olan sayi enlem (latitude) icindir. Ingilizce olan kelimeyi hatirlamanin bir yolu "lower your latitude to change your attitude (guneye gittikce havanin sicaklasmasindan hareketle)". Neyse -  eger bir kordinati map.google.com uzerinde hemen kontrol etmek isterseniz, oraya boylam, enlem sirasinda girmek gerekiyor. 


Monday, September 3, 2012

Basit Web Sunucusu - SimpleHTTPServer

Eger hizli bir sekilde, acil ihtiyaclar icin bir Web sunucusu baslatmak isterseniz, SimpleHTTPServer bu is icin bicilmis kaftan. Sadece su satirlar ile herhangi bir dizindeki dosyalar servis edilebilir. Mesela..

import sys
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler

HandlerClass = SimpleHTTPRequestHandler
ServerClass  = BaseHTTPServer.HTTPServer
Protocol     = "HTTP/1.0"

if sys.argv[1:]:
    port = int(sys.argv[1])
else:
    port = 8080
server_address = ('[IP ADRESI]', port)

HandlerClass.protocol_version = Protocol
httpd = ServerClass(server_address, HandlerClass)

sa = httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
httpd.serve_forever()
 

Bu kadar. Olagan port degeri 8080, ama istenilen baska bir port numarasi arguman olarak gecilebilir. Eger bu script'i baslattigimiz dizinde mesela bir index.html var ise, aynen normal Web sunucularinin yaptigi gibi o dizin ziyaret edilir edilmez otomatik olarak servis edilecektir.

Bir puf nokta: ustteki script, komut satirindan baslatildiktan sonra, bunu yapan Unix kullanicisinin sistem disina cikmasi (logout) olayina hassas, o yuzden python ibaresinin basina nohup komutunun eklenmesi lazim.

Biz yukaridaki script'i bir ana siteyi bakima aldigimizda (ki site kendine has apayri baska bir Web altyapisi kullaniyor) hizli bir sekilde "simdi mesguluz sonra gelin" mesajini gostermek icin kullaniyoruz. Ana sitenin ayni IP ve port numarasi uzerinden hemen bir SimpleHTTPServer baslatiyoruz, ve ana siteye gelen kullanicilar bu basit sunucunun servis ettigi mesaji goruyorlar.