Sunday, May 20, 2018

Genel Makroekonomi - 2

Wednesday, May 16, 2018

Genel Makroekonomi - 1

Tuesday, May 15, 2018

Phi Korelasyon Katsayısı

Friday, March 30, 2018

Basit, Hızlı Diske Değer Yazma Okuma

Bir Python uygulaması için  basit, hızlı bir şekilde diske yazılabilen, ve istendiği zaman anahtar bazlı, tüm dosyayı hafızaya getirmeden hızlı şekilde okunabilen bir yapıya ihtiyaç vardı. Çözüm için önce Python'un sözlük (dictionary) yapısının diske yazılmasına izin veren çözümler akla geliyor, ki muhakkak o çerçevede pek çok çözüm var. Fakat bir çözüm var ki Python kurulumunun zaten içinde, tek bir dosyaya yönlendirilebilen depolaması mevcut, ve her yazımın diske gitmesini, ve hızlı okunabilmesini sağlıyor.

Bu yazılım sqlite3'ten başkası değil. Eğer az SQL yazmayı göze alırsak, ki bu dili tüm bilişimciler bilir, sqlite3 üstteki tüm ihtiyaçlara cevap verir. Test edelim,

import sqlite3
db = sqlite3.connect('/tmp/mydb.db')
import random

cursor = db.cursor()
cursor.execute('''CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT,
                  phone TEXT, email TEXT, password TEXT)
       ''')
db.commit()

cursor = db.cursor()
name1 = 'Andres'
phone1 = '3366858' 
email1 = 'user@example.com' + str(random.random())
password1 = '12345'
print (email1)
cursor.execute('''INSERT INTO users(name, phone, email, password)
                  VALUES(?,?,?,?)''', (name1,phone1, email1, password1))
db.commit()

Taban tek bir dosya, hangisi olacağını biz tanımladık, gayet basit.  Üstteki insert komutunu ardı ardına işletelim ve arada sırada /tmp/mydb.db dosyasına bakalım. Bu dosya içinde yaratılan farklı isimleri göreceğiz. Dosya büyüklüğünü kontrol etmek ise yaramayabilir çünkü sqlite taban dosyasını her yazimda degil, belli aralıklarla büyütüyor. 

Arada satır sayısını alttaki ile kontrol edebiliriz,

cursor = db.cursor()
cursor.execute('''SELECT count(*) FROM users''')
print (cursor.fetchone())

Taban iş bitince db.close ile kapatılır. Fakat düzgün kapatılmasa bile commit ile yazılanlar kaybolmayacaktır, yani süreç çökse, tekrar tabana dönsek en son yazdığımız satırı orada bulacağız. 

Bu tüm ihtiyaçları karşılıyor, farklı bir süreçte işleyen büyük bir taban değil, kurulmasına bile gerek yok zaten Python sürümünde var, ayrıca diske yazım var, hızlı okuma (herşeyi hafızaya getirmeden) destekleniyor. 

Monday, March 26, 2018

Veri Taban İçeriğini Gezmek

Eğer veri tabanı, içindeki tabloları, bu tablolardaki bazı verileri görmek istersek, GUİ araçları yerine bir jupyter not defteri üzerinden kod işletmeyi seçebiliriz. Taban erişimi için psycopg2 iş görür. Bağlantı aldıktan sonra (Postgresql olsun),

import psycopg2

conn = psycopg2.connect(
    host='[makina]',
    database='[taban]',
    user='[kullanici]',
    password='[sifre]',
    port=port
)

şu metotlarla taban içeriği gösterilebilir

import psycopg2

sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'"

def get_tables(con):
    """
    Tum tablolari goster
    """    
    cursor = con.cursor()
    res = []
    cursor.execute(sql)
    for table in cursor.fetchall():
        res.append(table)
    return res

def get_table_col_names(con, table_str):
    """
    Tablo kolon isimlerini al
    """
    col_names = []
    try:
        cur = con.cursor()
        cur.execute("select * from " + table_str + " LIMIT 0")
        for desc in cur.description:
            col_names.append(desc[0])        
        cur.close()
    except psycopg2.Error as e:
        print (e)
    return col_names

def get_sample(con, table_str):
    """
    Tablodan rasgele satirlar goster
    """
    res = []
    try:        
        cur = con.cursor()
        cur.execute("select * from " + table_str + " ORDER BY RANDOM() LIMIT 10")
        for x in cur: res.append(x)
        cur.close()
    except psycopg2.Error as e:
        print (e)
    return res

def get_count(con, table_str):
    """
    Tabloda kac satir var
    """    
    res = []
    try:        
        cur = con.cursor()
        cur.execute("select count(*) from " + table_str)
        res = cur.fetchone()
        cur.close()
    except psycopg2.Error as e:
        print (e)
    return res

Jupyter not defterinde bildiğimiz gibi etkileşimli (interactive) bir şekilde kod yazılabiliyor, bir hücrede yazılan kodu hemen işletip doküman içinde görüyoruz.. Eh böyle olunca üstteki çağrıları istedigimiz tablo üzerinde yapınca sanki GUİ araçından taban içeriğini gezmis oluyoruz.

Jupyter kurmak istemeyenler, direk markdown md dosyaları içinden üstteki işlemleri yapmak isteyenler (ve Emacs kullanıcıları) bizim eklentiyi kullanabilir.