Ana içeriğe geç

Python ve R'de SQL Sorguları Nasıl Çalıştırılır - Eğitim

Veri analizi ve veritabanı yönetimi için Python ve R'de SQL sorgularını çalıştırmanın kolay ve etkili yollarını öğrenin.
· 13 dk. oku

Yapay Zeka ile Keşfedin

SQL Nedir

Yapılandırılmış Sorgu Dili (SQL), çeşitli veri analizi görevlerini yürütmek için kullanılan en yaygın dildir. Ayrıca ilişkisel bir veritabanını yönetmek için de kullanılır; örneğin: tablolar eklemek, değerleri kaldırmak ve veritabanını optimize etmek. Basit bir ilişkisel veritabanı birbiriyle bağlantılı birden fazla tablodan oluşur ve her tablo satırlar ve sütunlardan meydana gelir.

Ortalama bir teknoloji şirketi her gün milyonlarca veri noktası üretir. Mevcut sistemi iyileştirmek veya yeni bir ürün geliştirmek için veriyi kullanabilmeleri adına sağlam ve etkili bir depolama çözümü gerekir. MySQL, PostgreSQL ve SQLite gibi bir ilişkisel veritabanı; sağlam veritabanı yönetimi, güvenlik ve yüksek performans sağlayarak bu sorunları çözer.

SQL'in temel işlevleri

  • Bir veritabanında yeni tablolar oluşturma
  • Bir veritabanına karşı sorgular çalıştırma
  • Bir veritabanından veri alma
  • Bir veritabanına kayıt ekleme
  • Bir veritabanındaki kayıtları güncelleme
  • Bir veritabanından kayıt silme
  • Herhangi bir veritabanını optimize etme

SQL, teknoloji sektöründe iş bulmanıza yardımcı olacak, talebi yüksek bir beceridir. Meta, Google ve Netflix gibi şirketler, SQL veritabanlarından bilgi çıkarıp yenilikçi çözümler üretebilen veri profesyonellerini sürekli arıyor. SQL'in temellerini DataCamp'teki Introduction to SQL eğitimini alarak öğrenebilirsiniz.

Neden SQL'i Python ve R ile kullanmalısınız?

SQL, şirketin performansını keşfetmemize, müşteri davranışlarını anlamamıza ve pazarlama kampanyalarının başarı metriklerini izlememize yardımcı olabilir. Çoğu veri analisti, iş zekâsı görevlerinin büyük kısmını SQL sorguları çalıştırarak gerçekleştirebilir; peki neden PoweBI, Python ve R gibi araçlara ihtiyaç duyarız? SQL sorgularını kullanarak geçmişte neler olduğunu söyleyebilirsiniz, ancak geleceğe yönelik projeksiyonları tahmin edemezsiniz. Bu araçlar, mevcut performans ve potansiyel büyüme hakkında daha fazlasını anlamamıza yardımcı olur.

Python ve R; ileri düzey istatistiksel analizler çalıştırmaya, makine öğrenmesi modelleri kurmaya, veri API'leri oluşturmaya ve nihayetinde şirketlerin KPI'ların ötesinde düşünmesine yardımcı olan çok amaçlı dillerdir. Bu eğitimde, SQL veritabanlarına bağlanmayı, veritabanlarını doldurmayı ve SQL sorgularını Python ve R kullanarak çalıştırmayı öğreneceğiz.

Not: SQL'e yeni başlıyorsanız, SQL sorguları yazmanın temellerini anlamak için SQL beceri yolunu tamamlayın.

Python Eğitimi

Python eğitimi; çeşitli veritabanlarına (MySQL ve SQLite) bağlanmanın temellerini, tablolar oluşturmayı, kayıt eklemeyi, sorgular çalıştırmayı ve Pandas'ın read_sql fonksiyonunu öğrenmeyi kapsayacaktır.

Kurulum

Veritabanına SQLAlchemy kullanarak bağlanabiliriz; ancak bu eğitimde, veritabanında sorgular çalıştırmak için yerleşik Python paketi SQLite3'ü kullanacağız. SQLAlchemy, birleşik bir API sunarak her türlü veritabanını destekler. SQLAlchemy hakkında daha fazla bilgi edinmek ve diğer veritabanlarıyla nasıl çalıştığını öğrenmek istiyorsanız, Introduction to Databases in Python kursuna göz atın.

MySQL, dünyanın en popüler veritabanı motorudur ve Youtube, Paypal, LinkedIn ve GitHub gibi şirketler tarafından yaygın şekilde kullanılır. Burada veritabanına nasıl bağlanacağımızı öğreneceğiz. MySQL'i kullanmanın geri kalan adımları, SQLite3 paketiyle benzerlik gösterir.

Önce '!pip install mysql' komutuyla mysql paketini kurun ve ardından kullanıcı adınızı, şifrenizi ve veritabanı adınızı vererek yerel bir veritabanı motoru oluşturun.

import mysql.connector as sql

conn = sql.connect(
  host="localhost",
  user="abid",
  password="12345",
  database="datacamp_python"
)

Benzer şekilde, sqlite3.connect fonksiyonunu kullanarak bir SQLite veritabanı oluşturabilir veya yükleyebiliriz. SQLite, kendi kendine yeten, sıfır yapılandırma gerektiren ve sunucusuz bir veritabanı motorunu uygulayan bir kütüphanedir. DataLab ile uyumludur; bu nedenle yerel ana makine hatalarından kaçınmak için projede bunu kullanacağız.

import sqlite3
import pandas as pd

conn= sqlite3.connect("datacamp_python.db")

Veritabanı Oluşturma

Bu bölümde, COVID-19'un havaalanı trafiğine etkisi veri setini, CC BY-NC-SA 4.0 lisansı kapsamında, SQLite veritabanımıza nasıl yükleyeceğimizi öğreneceğiz. Ayrıca, sıfırdan tablo oluşturmayı da göreceğiz.

Görsel kaynağı: Kaggle Veri Seti

Havaalanı trafiği veri seti, 1 Şubat 2020 ile 15 Mart 2020 arasındaki temel dönem süresince trafik hacminin yüzdesinden oluşur. Pandas'ın read_csv fonksiyonunu kullanarak bir CSV dosyası yükleyecek ve ardından to_sql fonksiyonunu kullanarak veri çerçevesini SQLite tablomuzun içine aktaracağız. to_sql fonksiyonu bir tablo adı (String) ve SQLite motoruna bağlantı gerektirir.

data = pd.read_csv("data/covid_impact_on_airport_traffic.csv")


data.to_sql(
            'airport',             # Name of the sql table
            conn,                 # sqlite.Connection or sqlalchemy.engine.Engine
            if_exists='replace'
           )

Şimdi, hızlı bir SQL sorgusu çalıştırarak başarılı olup olmadığımızı test edeceğiz. Bir sorgu çalıştırmadan önce, aşağıdaki kod bloğunda gösterildiği gibi sorguları yürütmemize yardımcı olacak bir imleç (cursor) oluşturmamız gerekir. Tek bir bağlantı içinde aynı veritabanında birden fazla imlece sahip olabilirsiniz.

Bizim durumumuzda, SQL sorgusu airport tablosundan üç sütun ve beş satır döndürdü. İlk satırı görüntülemek için cursor.fetchone() kullanacağız.

cursor = conn.cursor()
cursor.execute("""SELECT Date, AirportName, PercentOfBaseline  
                  FROM airport
                  LIMIT 5""")
cursor.fetchone()


>>> ('2020-04-03', 'Kingsford Smith', 64)

Kalan kayıtları görüntülemek için cursor.fetchall() kullanacağız. Havaalanı veri seti, birkaç satır kodla veritabanına başarıyla yüklendi.

cursor.fetchall()

>>> [('2020-04-13', 'Kingsford Smith', 29),
     ('2020-07-10', 'Kingsford Smith', 54),
     ('2020-09-02', 'Kingsford Smith', 18),
     ('2020-10-31', 'Kingsford Smith', 22)]

Şimdi sıfırdan bir tablo oluşturmayı ve örnek değerler ekleyerek doldurmayı öğrenelim. id (tamsayı, birincil anahtar, otomatik artan), name (metin) ve subject (metin) sütunlarına sahip bir studentinfo tablosu oluşturacağız.

Not: SQLite söz dizimi biraz farklıdır. Bu eğitimde geçen SQL sorgularını anlamak için SQLite kısa kılavuzuna göz atmanız önerilir.

cursor.execute("""
                CREATE TABLE studentinfo
                (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                name TEXT,
                subject TEXT
                )
                 """)

Basit bir SQLite sorgusu çalıştırarak veritabanına kaç tablo eklediğimizi kontrol edelim.

cursor.execute("""
                SELECT name
                FROM sqlite_master
                WHERE type='table'
                 """)
cursor.fetchall()

>>> [('airport',), ('studentinfo',)]

Sorguları Çalıştırma

Bu bölümde, studentinfo tablosuna değerler ekleyecek ve basit SQL sorguları çalıştıracağız. INSERT INTO kullanarak studentinfo tablosuna tek bir satır ekleyebiliriz.

Değer eklemek için, execute fonksiyonuna bir sorgu ve değer argümanı sağlamamız gerekir. Fonksiyon, verdiğimiz değerlerle "?" girişlerini doldurur.

query = """
            INSERT INTO studentinfo
            (name, subject)
            VALUES (?, ?)
        """
value = ("Marry", "Math")
cursor.execute(query,value)

Yukarıdaki sorguyu birden fazla kayıt ekleyerek tekrarlayın.

query = """
           INSERT INTO studentinfo
           (name, subject)
           VALUES (?, ?)
        """
values = [("Abid", "Stat"),
          ("Carry", "Math"),
          ("Ali","Data Science"),
          ("Nisha","Data Science"),
          ("Matthew","Math"),
          ("Henry","Data Science")]

cursor.executemany(query,values)

Kaydı doğrulama zamanı. Bunu yapmak için, subject değeri Data Science olan satırları döndürecek basit bir SQL sorgusu çalıştıracağız.

cursor.execute("""
                SELECT *
                FROM studentinfo
                WHERE subject LIKE 'Data Science'
                 """)
cursor.fetchall()

>>> [(4, 'Ali', 'Data Science'),
     (5, 'Nisha', 'Data Science'),
     (7, 'Henry', 'Data Science')]

DISTINCT subject komutu, subject sütunlarında bulunan benzersiz değerleri görüntülemek için kullanılır. Bizim örneğimizde Math, Stat ve Data Science.

cursor.execute("SELECT DISTINCT subject from studentinfo")
cursor.fetchall()

>>> [('Math',), ('Stat',), ('Data Science',)]

Tüm değişiklikleri kaydetmek için commit() fonksiyonunu kullanacağız. Commit olmadan, makine yeniden başlatıldıktan sonra veriler kaybolur.

conn.commit()

Pandas ile SQL

Bu bölümde, SQLite veritabanından verileri nasıl çıkarıp tek satır kodla bir Pandas veri çerçevesine dönüştüreceğimizi öğreneceğiz. read_sql, yalnızca SQL sorguları çalıştırmaktan fazlasını sunar. Bunu, indeks sütunları ayarlamak, tarih ve saati ayrıştırmak, değer eklemek ve sütun adlarını filtrelemek için kullanabiliriz. Python'da veri içe aktarma hakkında daha fazla bilgi edinmek için kısa bir DataCamp kursu alın.

read_sql iki argüman gerektirir: bir SQL sorgusu ve SQLite motoruna bağlantı. Çıktı, airport tablosunda PercentOfBaseline değeri 20'den büyük olan ilk beş satırı içerir.

data_sql_1 = pd.read_sql("""
                        SELECT Date,City,PercentOfBaseline
                        FROM airport
                        WHERE PercentOfBaseline > 20
                        ORDER BY Date DESC
                        """,
                        conn)
print(data_sql_1.head())

         Date          City  PercentOfBaseline
0  2020-12-02        Sydney                 27
1  2020-12-02      Santiago                 48
2  2020-12-02       Calgary                 99
3  2020-12-02  Leduc County                100
4  2020-12-02      Richmond                 86

Pandas entegrasyonu ile ilişkisel veritabanlarında veri analizi yapmak daha kolay hale geldi. Bu verileri ayrıca değerleri tahmin etmek ve karmaşık istatistiksel analizler yürütmek için de kullanabiliriz.

plot fonksiyonu, PercentOfBaseline sütununun histogramını görselleştirmek için kullanılır.

data_sql_1.plot(y="PercentOfBaseline",kind="hist");

Benzer şekilde, değerleri en üst 20 ile sınırlayıp bir zaman serisi çizgi grafiği görüntüleyebiliriz.

data_sql_2 = pd.read_sql("""
                        SELECT Date,City,PercentOfBaseline
                        FROM airport
                        WHERE PercentOfBaseline > 20
                        ORDER BY Date DESC
                        LIMIT 20
                        """,
                        conn)


data_sql_2.plot(x="Date",y="PercentOfBaseline",kind="line");

Son olarak, kaynakları serbest bırakmak için bağlantıyı kapatacağız. Çoğu paket bunu otomatik olarak yapar, ancak değişiklikleri tamamladıktan sonra bağlantıları kapatmak tercih edilir.

conn.close()

R Eğitimi

Python eğitimindeki tüm görevleri R kullanarak yineleyeceğiz. Eğitim; bağlantılar oluşturmayı, tablolar yazmayı, satır eklemeyi, sorgular çalıştırmayı ve dplyr ile veri analizini içerir.

Kurulum

DBI paketi, MariaDB, Postgres, Duckdb ve SQLite gibi en popüler veritabanlarına bağlanmak için kullanılır. Örneğin, RMySQL paketini kurun ve kullanıcı adı, parola, veritabanı adı ve ana makine adresi sağlayarak bir veritabanı oluşturun.

install.packages("RMySQL")
library(RMySQL)
conn = dbConnect(
                MySQL(),
                user = 'abid',
                password = '1234',
                dbname = 'datacamp_R',
                host = 'localhost'
                )

Bu eğitimde, bir ad ve SQLite fonksiyonu sağlayarak bir SQLite veritabanı oluşturacağız.

library(RSQLite)
library(DBI)
library(tidyverse)

conn = dbConnect(SQLite(), dbname = 'datacamp_R.db')

Veritabanı Oluşturma

tidyverse kütüphanesini içe aktararak dplyr, ggplot ve varsayılan veri setlerine erişeceğiz.

dbWriteTable fonksiyonu bir data.frame alır ve onu SQL tablosuna ekler. Üç argüman alır: SQLite bağlantısı, tablonun adı ve veri çerçevesi. dbReadTable ile tablonun tamamını görüntüleyebiliriz. İlk 6 satırı görmek için head kullandık.

dbWriteTable(conn, "cars", mtcars)
head(dbReadTable(conn, "cars"))

    mpg    cyl    disp    hp    drat    wt    qsec    vs    am    gear    carb
1    21.0    6    160    110    3.90    2.620    16.46    0    1    4    4
2    21.0    6    160    110    3.90    2.875    17.02    0    1    4    4
3    22.8    4    108    93    3.85    2.320    18.61    1    1    4    1
4    21.4    6    258    110    3.08    3.215    19.44    1    0    3    1
5    18.7    8    360    175    3.15    3.440    17.02    0    0    3    2
6    18.1    6    225    105    2.76    3.460    20.22    1    0    3    1

dbExecute, herhangi bir SQLite sorgusunu yürütmemize olanak tanır; bu nedenle idcard adlı bir tablo oluşturmak için bunu kullanacağız.

Veritabanındaki tablo adlarını görüntülemek için dbListTables kullanacağız.

dbExecute(conn, 'CREATE TABLE idcard (id int, name text)')
dbListTables(conn)

>>> 'cars''idcard'

idcard tablosuna tek bir satır ekleyelim ve sonuçları görüntülemek için dbGetQuery kullanalım.

Not: dbGetQuery bir sorgu çalıştırır ve kayıtları döndürür; dbExecute ise SQL sorgusu çalıştırır ancak herhangi bir kayıt döndürmez.

dbExecute(conn, "INSERT INTO idcard (id,name)\
                 VALUES(1,'love')")
dbGetQuery(conn,"SELECT * FROM idcard")


id    name
1    love

Şimdi iki satır daha ekleyip dbReadTable kullanarak sonuçları görüntüleyeceğiz.

dbExecute(conn,"INSERT INTO idcard (id,name)\
                VALUES(2,'Kill'),(3,'Game')
               ")
dbReadTable(conn,'idcard')


id    name
1    love
2    Kill
3    Game

dbCreateTable, zahmetsizce tablo oluşturmamıza olanak tanır. Üç argüman gerektirir; bağlantı, tablonun adı ve bir karakter vektörü veya bir data.frame. Karakter vektörü adlardan (sütun adları) ve değerlerden (tipler) oluşur. Bizim durumumuzda, başlangıç yapısını oluşturmak için varsayılan bir nüfus data.frame'i sağlayacağız.

dbCreateTable(conn,'population',population)
dbReadTable(conn,'population')

country    year    population

Ardından, population tablosuna değerler eklemek için dbAppendTable kullanacağız.

dbAppendTable(conn,'population',head(population))
dbReadTable(conn,'population')

country    year    population
Afghanistan    1995    17586073
Afghanistan    1996    18415307
Afghanistan    1997    19021226
Afghanistan    1998    19496836
Afghanistan    1999    19987071
Afghanistan    2000    20595360

Sorguları Çalıştırma

Tüm veri analitiği görevlerimiz için dbGetQuery kullanacağız. Basit bir sorgu çalıştırmayı deneyelim ve sonra diğer fonksiyonlar hakkında daha fazla şey öğrenelim.

dbGetQuery(conn,"SELECT * FROM idcard")

id    name
1    love
2    Kill
3    Game

Ayrıca beygir gücünü filtrelemek ve sınırlı sayı ve sütun göstermek için karmaşık bir SQL sorgusu da çalıştırabilirsiniz.

dbGetQuery(conn, "SELECT mpg,hp,gear\
                  FROM cars\
                  WHERE hp > 50\
                  LIMIT 5")


mpg    hp    gear
21.0    110    4
21.0    110    4
22.8    93    4
21.4    110    3
18.7    175    3

Tabloları kaldırmak için dbRemoveTable kullanın. Artık idcard tablosunu başarıyla kaldırdığımızı görebiliyoruz.

dbRemoveTable(conn,'idcard')
dbListTables(conn)
>>> 'cars''population'

Tabloları daha iyi anlamak için, belirli bir tablodaki sütun adlarını görüntüleyecek olan dbListFields'ı kullanacağız.

dbListFields(conn, "cars")


>>> 'mpg''cyl''disp''hp''drat''wt''qsec''vs''am''gear''carb'

dplyr ile SQL

Bu bölümde, dplyr kullanarak tabloları okuyacak ve ardından filter, select ve collect kullanarak sorgular çalıştıracağız. Eğer SQL söz dizimini öğrenmek istemiyor ve tüm görevleri saf R ile gerçekleştirmek istiyorsanız, bu yöntem sizin için uygundur. Aşağıda gösterildiği gibi cars tablosunu çektik, gear ve mpg ile filtreledik ve ardından üç sütun seçtik.

cars_results <-
  tbl(conn, "cars") %>%
  filter(gear %in% c(4, 3),
         mpg >= 14,
         mpg <= 21) %>%
  select(mpg, hp, gear) %>%
  collect()
cars_results

mpg    hp    gear
21.0    110    4
21.0    110    4
18.7    175    3
18.1    105    3
14.3    245    3
...   ...   ...

Filtrelenmiş veri çerçevesini kullanarak ggplot ile bir kutu grafiği (boxplot) gösterebiliriz.

ggplot(cars_results,aes(fill=as.character(gear), y=mpg)) +
  geom_boxplot()

Ya da gear sayısına göre bölünmüş bir facet nokta grafiği görüntüleyebiliriz.

ggplot(cars_results,
  aes(mpg, ..count.. ) ) +
  geom_point(stat = "count", size = 4) +
  coord_flip()+
  facet_grid( as.character(gear) ~ . )

Sonuç

Bu eğitimde, Python ve R ile SQL sorguları çalıştırmanın, veritabanları oluşturmanın, tablolar eklemenin ve SQL sorgularıyla veri analizi yapmanın önemini öğrendik. Ayrıca, Pandas ve dplyr'ın tek satır kodla sorgu çalıştırmamıza nasıl yardımcı olduğunu gördük.

SQL, teknolojiyle ilgili tüm işler için öğrenilmesi gereken bir beceridir. Kariyerinize veri analisti olarak başlıyorsanız, iki ay içinde Data Analyst with SQL Server kariyer yolunu tamamlamanızı öneririz. Bu kariyer yolu, SQL sorguları, sunucular ve kaynak yönetimi hakkında bilmeniz gereken her şeyi öğretecektir.

Bu eğitimde kullanılan tüm betikleri ücretsiz olarak çalıştırabilirsiniz:

Konular

İlgili