Önce özete göz atDersin sonundaki özet, okumaya başlamadan önce yol haritası olarak.
- Veriyi bir betiğin içinden, kurumların uygulama programlama arayüzlerine istek göndererek çekmek, elle indirmenin hatalarını ortadan kaldırır ve analiz zincirinin ilk halkasını da kayıt altına alır.
- Dünya Bankası'nın gösterge servisi anahtarsız kullanılabilir; FRED'in API'si ve Merkez Bankası'nın EVDS servisi erişim anahtarı ister ve EVDS'de anahtar, adresin içinde değil isteğin başlığında gönderilir; anahtarlar betiğe yazılmaz, ortam değişkenlerinde saklanır.
- Sunucular cevaplarını çoğu zaman JSON biçiminde gönderir; her seri bir seri koduyla tanımlanır ve meta veri, serinin tanımını, birimini ve kaynağını gösterir; farklı kaynaklardaki aynı adlı rakamlar farklı ölçüler olabilir.
- FRED, 1990'ların başında yaklaşık 300 seriyle telefon hattıyla bağlanılan bir ilan panosu olarak başladı ve bugün yüz binlerce seriyi barındırıyor; veriler revize edildiği için her zaman en son sürümü gösteriyor.
- Croushore ile Stark, ekonometrik sonuçların veri sürümüne duyarlı olabileceğini gösterdi; Aruoba ise revizyonların ortalamasının sıfır olmadığını, büyük ve önceden tahmin edilebilir olduğunu buldu; bu yüzden çekilen her veri indirme tarihiyle birlikte saklanmalıdır.
Öğrenme çıktıları
- Hatırlama — Uygulama programlama arayüzünü, erişim anahtarını, JSON biçimini, seri kodunu, meta veriyi ve veri sürümünü tanımlar.
- Anlama — Verileri bir kurumun sitesinden elle indirmek yerine bir betiğin içinden çekmenin tekrarlanabilirlik açısından neden üstün olduğunu ve veri revizyonlarının indirme tarihini neden önemli kıldığını açıklar.
- Uygulama — Dünya Bankası'nın anahtarsız servisinden ve FRED'in dosya indirme adresinden Python ile veri çeker ve cevabı tabloya çevirir; Merkez Bankası'nın EVDS servisine ve FRED'in anahtarlı servisine erişim anahtarıyla istek gönderen kodu yazar.
- Analiz — Bir veri isteğinin başarısız olma nedenlerini, yani eksik ya da geçersiz anahtarı, zaman aşımını ve yanlış seri kodunu, sunucunun döndürdüğü mesajlardan teşhis eder.
Sezgi
Açılış
Bir iktisatçı her ay, yeni enflasyon rakamı açıklandığında aynı işi yapıyor: bir kurumun sitesine giriyor, doğru tabloyu buluyor, tarih aralığını seçiyor, dosyayı indiriyor, bilgisayarındaki eski dosyanın üstüne kopyalıyor ve grafiği yeniden çiziyor. Her seferinde yirmi dakika sürüyor ve her seferinde küçük bir hata yapma olasılığı var: yanlış tabloyu seçmek, bir satırı eksik kopyalamak, eski dosyayı yanlışlıkla silmek.
Aynı işi, birkaç satırlık bir kodla, kurumun sunucusuna doğrudan soru sorarak da yapabilir: «Bana şu serinin şu tarihten bugüne kadarki değerlerini gönder.» Sunucu cevabı makinenin okuyabileceği bir biçimde gönderir, kod onu bir veri çerçevesine dönüştürür ve grafik kendiliğinden güncellenir. İktisatçı ertesi ay yalnızca betiği yeniden çalıştırır.
Bu ders, iktisatçıların en sık başvurduğu üç kaynağı, TCMB'nin EVDS'sini, Amerikan FRED arşivini ve Dünya Bankası gösterge servisini ele alıyor ve bu kaynaklarla bir betiğin nasıl konuştuğunu gösteriyor.
Hikâye — Bir ilan panosundan yüz binlerce seriye
1990'ların başında, ABD Merkez Bankası sisteminin bölgesel bankalarından biri olan St. Louis Fed'in araştırma bölümü, uzun süredir sürdürdüğü bir geleneği yeni bir biçime taşıdı: para politikası kararlarını anlamaya yardım edecek parasal verileri kamuya sunmak. FRED'in yardım sayfalarındaki anlatıma göre, internet yaygınlaşmadan önce bu veriler, telefon hattıyla bağlanılan elektronik bir ilan panosu sisteminde liste hâlinde sunuluyordu. Veriler, yaklaşık 300 seriyi içeren kategorilere ayrılmıştı ve oradan büyüdü.
Aynı anlatıma göre FRED, büyük bir planın ya da stratejik bir hedefin parçası olarak başlamadı; zamanla, kendiliğinden büyüdü. Projenin içinde ya da kıyısında çalışan kişiler, veri tabanı için araçları bağımsız ve ihtiyaç duydukça geliştirdi. Örneğin 1995'te araştırma bölümünden bir çalışan, FRED'i resmî olarak internete taşıyacak kodu yazmaya karar verdi.
Bugün FRED, ulusal ve uluslararası, kamusal ve özel onlarca kaynaktan gelen yüz binlerce ekonomik zaman serisini barındırıyor. FRED'in anlatımı, veri tabanının her zaman bir serinin en son revize edilmiş sürümünü gösterdiğini de vurguluyor: ABD'nin ulusal hesaplar kurumu çeyreklik büyüme rakamını açıkladıktan sonra, sonraki aylarda bu rakamı yukarı ya da aşağı revize eder. Bir yıl önce indirilen büyüme serisi ile bugün indirilen aynı seri, aynı çeyrek için farklı rakamlar içerebilir.
Türkiye'de benzer bir işlevi TCMB'nin EVDS adlı sistemi üstleniyor; kısaltma, Elektronik Veri Dağıtım Sistemi'nden gelir. Faiz oranları, döviz kurları, para arzı, ödemeler dengesi ve fiyat endeksleri gibi binlerce seri, bu sistem üzerinden sunuluyor. Sistem zaman içinde yenilendi: eski adresler bugün yeni sürüme yönlendiriliyor ve 2024'ten itibaren programlarla yapılan isteklerde kullanıcının erişim anahtarını adresin içinde değil, isteğin başlık bilgisinde göndermesi gerekiyor. Veri kaynaklarının kuralları değişir; bu yüzden bir betiğin çalışmayı durdurduğunda, ilk bakılacak yer kaynağın güncel belgesidir.
Kavram
Programların birbirleriyle konuşmasını sağlayan yapının adı şudur.
Birçok kurum, API'sini kimin ne kadar kullandığını bilmek ister.
Sunucular cevaplarını çoğu zaman şu biçimde gönderir.
Bir veri tabanındaki her seri, bir kimlikle tanımlanır.
Serinin değerleri kadar, serinin kendisi hakkındaki bilgiler de önemlidir.
Son olarak, zaman içinde değişen verilerle ilgili kavram şudur.
Veri ve kanıt
Croushore ile Stark'ın vurguladığı nokta, veri çekmeyi öğrenen bir iktisatçı için doğrudan önemlidir. Bir çalışmanın sonucu, verinin hangi sürümüyle yapıldığına bağlı olabilir. Bugün FRED'den ya da EVDS'den indirilen bir seri, geçmişte bir karar verilirken karar vericinin önündeki seriyle aynı değildir. Bir merkez bankasının geçmişteki bir kararını değerlendirirken, o gün elde olan veriye bakmak gerekir; bugünkü revize edilmiş veriye bakmak, karar vericiye o gün bilmediği bir bilgiyi yüklemek olur.
İki çalışma birlikte okunduğunda, veri çekmenin yalnızca teknik bir iş olmadığı görülür. Aruoba'ya göre revizyonlar rastgele gürültü değildir: ilk açıklamalar sistematik olarak bir yöne sapabilir ve revizyonlar önceden tahmin edilebilir. Bu yüzden bir betik, yalnızca veriyi çekmemeli, verinin ne zaman çekildiğini de kaydetmelidir. İyi bir veri çekme betiği, çektiği her dosyayı indirme tarihiyle birlikte saklar; böylece aylar sonra aynı analiz, aynı veriyle yeniden yapılabilir.
Yaygın yanlış«Bir kurumun sitesinden indirilen veri kesindir ve değişmez.»
İstatistik kurumları verileri yeni bilgiler geldikçe ve yöntemler değiştikçe revize eder. Aruoba'nın gösterdiği gibi revizyonlar büyük ve sistematik olabilir. Aynı serinin farklı tarihlerde indirilen sürümleri farklı değerler içerebilir; bu yüzden indirme tarihi ya da veri sürümü her analizde kaydedilmelidir.
Yaygın yanlış«Erişim anahtarımı betiğe yazarsam işimi kolaylaştırır; zaten kimse görmez.»
Betikler paylaşılır, çevrimiçi kod depolarına yüklenir ve başkalarına gönderilir. Betiğe açıkça yazılmış bir anahtar, başkasının onu kullanmasına ve kullanım sınırlarının aşılmasına yol açabilir. Anahtar, betiğin dışında, örneğin bir ortam değişkeninde ya da paylaşılmayan ayrı bir dosyada tutulmalıdır.
Neden önemli?
Veriyi bir API'den çekmek, analizi baştan sona bir betikle yapmanın son eksik parçasıdır. Önceki derslerde, betiklerin analizi tekrarlanabilir kıldığını gördük; ama veri elle indirilip bir dosyaya kopyalanıyorsa, zincirin ilk halkası hâlâ elle yapılan, kaydı tutulmayan bir işlemdir. Veriyi betiğin içinden çekmek, bu halkayı da kayıt altına alır.
Bu yaklaşım, iktisatçının zamanını da korur. Merkez bankalarının ve bakanlıkların araştırma birimlerinde, her ay güncellenen yüzlerce seri, otomatik betiklerle çekilir, denetlenir ve raporlara aktarılır. Aynı iş elle yapıldığında hem günler alır hem de hataya açıktır. Otomatik raporlamayı bu kursun ilerleyen bir dersinde ayrıntılı olarak göreceğiz.
Türkiye'deki bir iktisatçı için EVDS, Türkiye verilerinin en kapsamlı ve güncel kaynaklarından biridir; FRED ve Dünya Bankası ise uluslararası karşılaştırmalar için vazgeçilmezdir. Üç kaynağın her birinin kendi kuralları, kodları ve erişim koşulları vardır ve bu kurallar zamanla değişir. Bu derste amaç, her birinin ayrıntılarını ezberlemek değil, herhangi bir veri kaynağının API'siyle çalışmayı mümkün kılan ortak mantığı kavramaktır.
Model
Çözümlü örnek — Dünya Bankası'ndan anahtarsız veri çekmek
Dünya Bankası'nın gösterge servisi erişim anahtarı istemez. Bir internet adresi, hangi ülkenin hangi göstergesinin istendiğini söyler; adresin sonuna eklenen parametreler de biçimi ve tarih aralığını belirler. Türkiye'nin yıllık reel GSYH büyümesini 2019–2023 için isteyelim. Python'da internet istekleri için requests paketi kullanılır.
import requests, pandas as pdurl = "https://api.worldbank.org/v2/country/TUR/indicator/NY.GDP.MKTP.KD.ZG"r = requests.get(url, params={"format": "json", "date": "2019:2023"}, timeout=60)meta, satirlar = r.json()
Sunucu iki parçalı bir JSON cevabı döndürür. İlk parça, sayfa sayısını, kayıt sayısını ve verinin son güncellenme tarihini içeren meta veridir; ikinci parça, her yıl için bir kayıt içeren listedir. Her kayıtta göstergenin ve ülkenin adı, yıl, değer ve birkaç başka alan bulunur. Veri çerçevesine dönüştürmek için her kayıttan yalnızca yılı ve değeri alırız.
df = pd.DataFrame([{"yil": int(s["date"]), "buyume": s["value"]} for s in satirlar]).sort_values("yil")
Bu satırlar 28 Eylül 2026'da çalıştırıldığında, meta veri serinin son güncellemesini 13 Temmuz 2026 olarak gösterdi ve yuvarlanmış değerler şöyle geldi: 2019'da 1,3, 2020'de 1,8, 2021'de 11,8, 2022'de 5,4 ve 2023'te 5,0. Yıllar sunucudan metin olarak geldiği için int ile sayıya çevirdik; cevaptaki sıra en yeni yıldan en eskiye doğru olduğu için de tabloyu yıla göre sıraladık. Aynı satırlar birkaç ay sonra çalıştırıldığında, revizyonlar yüzünden farklı değerler gelebilir.
Çözümlü örnek — Birden çok ülke ve uzun tablo
Aynı servis, birden çok ülkeyi tek istekte verebilir: ülke kodları noktalı virgülle ayrılır. Türkiye ile Almanya'nın tüketici fiyatlarıyla ölçülen yıllık enflasyonunu, FP.CPI.TOTL.ZG koduyla, 2021–2023 için isteyelim.
url = "https://api.worldbank.org/v2/country/TUR;DEU/indicator/FP.CPI.TOTL.ZG"r = requests.get(url, params={"format": "json", "date": "2021:2023", "per_page": 100}, timeout=60)meta, satirlar = r.json()df = pd.DataFrame([{"ulke": s["countryiso3code"], "yil": int(s["date"]), "enflasyon": s["value"]} for s in satirlar])
Ortaya çıkan tablo, önceki derste gördüğümüz düzenli biçimdedir: satırların her biri tek bir ülke-yıl çiftini taşır. 28 Eylül 2026'da çekilen yuvarlanmış değerler, Türkiye için 2021'de 19,6, 2022'de 72,3, 2023'te 53,9; Almanya için 3,1, 6,9 ve 5,9'du. per_page parametresi, tek sayfada kaç kayıt geleceğini belirler. Servis cevapları sayfalara böler; çok sayıda ülke ve yıl istendiğinde, meta verideki sayfa sayısına bakıp bütün sayfaları çekmek gerekir. Aksi hâlde betik, verinin yalnızca ilk sayfasını alır ve hiçbir hata vermez. Bu yüzden çekilen satır sayısını, meta verideki toplam kayıt sayısıyla karşılaştırmak basit ama etkili bir denetimdir: bu örnekte meta veri toplam 6 kayıt bildiriyor ve tablo da 6 satırdan oluşuyor.
Çözümlü örnek — Meta veriyi okumak
Bir seriyi çekmeden önce, onun tam olarak neyi ölçtüğünü öğrenmek gerekir. Dünya Bankası'nın servisi, bir göstergenin meta verisini de aynı biçimde verir; bu kez adreste ülke yoktur, yalnızca gösterge kodu vardır.
r = requests.get("https://api.worldbank.org/v2/indicator/FP.CPI.TOTL.ZG", params={"format": "json"}, timeout=60)bilgi = r.json()[1][0]print(bilgi["name"], bilgi["sourceNote"], bilgi["sourceOrganization"])
28 Eylül 2026'da dönen cevaba göre göstergenin adı tüketici fiyatlarıyla ölçülen yıllık yüzde enflasyondu. Tanımı, tüketici fiyat endeksiyle ölçülen enflasyonun, ortalama bir tüketicinin bir mal ve hizmet sepetini edinme maliyetindeki yıllık yüzde değişimi yansıttığını söylüyordu; kaynak kuruluş ise Uluslararası Para Fonu'nun Uluslararası Mali İstatistikler veri tabanıydı.
Bu bilgi önemlidir, çünkü Türkiye'de kamuoyunun en çok izlediği enflasyon rakamı, TÜİK'in her ay açıkladığı ve bir önceki yılın aynı ayına göre hesaplanan yıllık değişimdir; aralık ayında açıklanan rakam, yıl sonu enflasyonu olarak anılır. Uluslararası veri tabanlarındaki yıllık enflasyon serileri ise yıllık ortalama fiyat düzeyleri üzerinden hesaplanabilir. İki rakam, özellikle enflasyonun hızla değiştiği yıllarda, birbirinden belirgin biçimde farklı olabilir. Meta veriye bakmadan iki kaynaktan gelen rakamları karşılaştıran bir iktisatçı, aslında iki farklı ölçüyü karşılaştırdığını fark etmeyebilir. Bu yüzden her seri için tanımı, birimi ve kaynağı, veriyle birlikte kaydetmek iyi bir alışkanlıktır.
Çözümlü örnek — FRED'den dosya olarak indirmek
FRED, bir serinin tamamını virgülle ayrılmış bir metin dosyası olarak indirmeye de izin verir ve bu indirme için erişim anahtarı gerekmez. pandas, bir internet adresindeki bu tür bir dosyayı doğrudan okuyabilir.
u = pd.read_csv("https://fred.stlouisfed.org/graph/fredgraph.csv?id=UNRATE", parse_dates=["observation_date"])
Gelen tabloda iki sütun vardır: gözlem tarihi ve UNRATE, yani ABD'nin aylık işsizlik oranı. parse_dates, tarih sütununu metin olarak değil tarih tipinde okur. 28 Eylül 2026'da okunan seri 1948'in Ocak ayından başlıyordu ve 944 aylık gözlem içeriyordu. Aylık seriyi yıllık ortalamalara çevirmek için tarihi indeks yapıp yeniden örnekleriz.
yillik = u.set_index("observation_date")["UNRATE"].resample("YE").mean()
2019–2023 için yuvarlanmış yıllık ortalamalar 3,68, 8,10, 5,35, 3,65 ve 3,62'ydi; 2020'deki sıçrama salgının etkisidir. Bu satırdaki "YE", pandas'ın güncel sürümlerinde yıl sonu sıklığını gösteren koddur; eski sürümlerde farklı bir kod kullanılır. R'da aynı dosya read.csv ile okunur: read.csv("https://fred.stlouisfed.org/graph/fredgraph.csv?id=UNRATE").
Çözümlü örnek — Erişim anahtarını güvenle kullanmak
FRED'in API'si, dosya indirmeden daha fazla seçenek sunar, ama erişim anahtarı ister. Anahtarı betiğe yazmak yerine, işletim sisteminin ortam değişkenlerinde saklarız. Terminalde anahtarı FRED_API_KEY adıyla tanımladıktan sonra, Python'da onu şöyle okuruz.
import osanahtar = os.environ["FRED_API_KEY"]r = requests.get("https://api.stlouisfed.org/fred/series/observations", params={"series_id": "UNRATE", "api_key": anahtar, "file_type": "json"}, timeout=60)
R'da ortam değişkeni Sys.getenv("FRED_API_KEY") ile okunur. Anahtar tanımlanmamışsa ya da yanlışsa, sunucu açıklayıcı bir hata döndürür. Anahtarsız gönderilen bir istekte FRED, api_key değişkeninin tanımlanmadığını söyler; biçimi yanlış bir anahtarla gönderilen istekte ise anahtarın 32 karakterlik, küçük harfli ve harf ile rakamlardan oluşan bir dizi olması gerektiğini bildirir. Bu mesajlar, önceki derste gördüğümüz gibi, sorunun tam olarak ne olduğunu söyler. Betiği bir başkasıyla paylaştığınızda, o kişi kendi anahtarını kendi ortam değişkenine tanımlayarak aynı kodu çalıştırabilir; sizin anahtarınız hiçbir dosyada görünmez.
Çözümlü örnek — EVDS'ye anahtarı başlıkta göndermek
Merkez Bankası'nın EVDS servisinde istek adresi, seri kodunu, başlangıç ve bitiş tarihlerini gün-ay-yıl biçiminde ve cevap biçimini içerir; erişim anahtarı ise adresin içinde değil, isteğin başlık bilgisinde, key adıyla gönderilir. Örneğin ABD doları alış kurunun TP.DK.USD.A kodlu serisi için istek şöyle kurulur.
url = "https://evds3.tcmb.gov.tr/igmevdsms-dis/series=TP.DK.USD.A&startDate=01-01-2024&endDate=05-01-2024&type=json"r = requests.get(url, headers={"key": os.environ["EVDS_KEY"]}, timeout=60)- R:
httr::GET(url, httr::add_headers(key = Sys.getenv("EVDS_KEY")))
Başlıkta anahtar olmadan gönderilen bir istekte sunucu, key adlı zorunlu başlığın bulunmadığını söyleyen bir hata döndürür; geçersiz bir anahtarla gönderilen istekte ise anahtarın geçersiz olduğunu bildirir. Bu iki mesaj, bu satırlar yazılırken sunucuya gerçekten gönderilen isteklerle görüldü. Geçerli bir anahtarla dönen cevap, gözlemleri tarihleriyle birlikte içeren bir JSON listesidir ve Dünya Bankası örneğinde olduğu gibi bir veri çerçevesine dönüştürülür. EVDS'deki seri kodları, sistemin web arayüzünde bir seri seçildiğinde görüntülenir; kodun doğru yazılması, sonucun doğruluğu için kritiktir, çünkü benzer adlı birçok seri vardır.
Çözümlü örnek — Başarısız istekleri ele almak
İnternet istekleri her zaman başarılı olmaz: sunucu yoğun olabilir, bağlantı kopabilir ya da cevap gecikebilir. Bu ders hazırlanırken Dünya Bankası'na gönderilen bir istek, 20 saniyelik bekleme süresi dolduğu için zaman aşımı hatası verdi; aynı istek bekleme süresi 60 saniyeye çıkarılıp yeniden denendiğinde başarılı oldu. İyi bir betik, bu tür geçici hataları öngörür ve birkaç kez yeniden dener.
for deneme in range(3):try:r = requests.get(url, params=parametreler, timeout=60)r.raise_for_status()breakexcept requests.exceptions.RequestException as hata:print("Deneme", deneme + 1, "başarısız:", type(hata).__name__)time.sleep(5)
raise_for_status, sunucu bir hata kodu döndürdüyse, örneğin istek yetkisizse ya da adres yanlışsa, bunu Python'un yakalayabileceği bir hataya çevirir. try ve except blokları, hatayı yakalayıp betiğin çökmesini önler; time.sleep, bir sonraki denemeden önce beş saniye bekler. Python'da girinti, yani satır başındaki boşluklar, kodun hangi bloğa ait olduğunu belirler ve rastgele değiştirilemez. Kalıcı bir hata, örneğin yanlış bir seri kodu, yeniden denemeyle düzelmez; bu yüzden hata mesajını okumak her zaman ilk adımdır.
Birçok kurum, bir erişim anahtarıyla belirli bir süre içinde yapılabilecek istek sayısını da sınırlar. Yüzlerce seriyi bir döngüyle çeken bir betik, istekleri art arda ve beklemeden gönderirse bu sınıra takılabilir ve sunucu bir süre yeni istekleri reddedebilir. İstekler arasına kısa beklemeler koymak, çekilen verileri bir kez indirip dosyaya kaydetmek ve aynı veriyi her çalıştırmada yeniden istememek, hem kurumun sunucusuna hem de kendi betiğinize karşı saygılı bir çalışma biçimidir. Kurumların kullanım koşulları, bu sınırları ve verinin nasıl kullanılabileceğini açıklar.
Çözümlü örnek — İndirme tarihini kaydetmek
Croushore ile Stark'ın ve Aruoba'nın gösterdiği gibi, veriler revize edilir. Bu yüzden çekilen her veriyi, indirildiği tarihle birlikte saklamak gerekir. Python'da bugünün tarihini dosya adına ekleyerek bunu kolayca yapabiliriz.
from datetime import datedosya = f"buyume_{date.today()}.csv"df.to_csv(dosya, index=False)
28 Eylül 2026'da çalıştırıldığında dosyanın adı buyume_2026-09-28.csv olur. Başındaki f harfi, süslü parantez içindeki ifadenin değerinin metnin içine yerleştirilmesini sağlar. R'da aynı iş paste0("buyume_", Sys.Date(), ".csv") ve write.csv ile yapılır. Böylece aylar sonra bir sonucu yeniden üretmek gerektiğinde, o gün kullanılan veri elde olur. Analizde de her zaman en son indirilen dosyayı değil, analizin yapıldığı tarihteki dosyayı açıkça belirterek kullanmak, sonuçların tekrarlanabilirliğini güvence altına alır.
Çözümlü örnek — Hazır paketler
Bu derste API'lere doğrudan istek gönderdik, çünkü bu yol her veri kaynağında aynı mantıkla işler. Ama her kaynak için, bu işleri kolaylaştıran hazır paketler de vardır. Python'da Dünya Bankası için wbgapi, FRED için fredapi, EVDS için evds paketleri; R'da Dünya Bankası için WDI, FRED için fredr, Merkez Bankası verileri için CBRT paketleri bunlar arasındadır. Örneğin R'da WDI paketiyle aynı büyüme serisi şöyle çekilir.
- R:
WDI::WDI(country = "TR", indicator = "NY.GDP.MKTP.KD.ZG", start = 2019, end = 2023) - R:
fredr::fredr_set_key(Sys.getenv("FRED_API_KEY"))ve ardındanfredr::fredr(series_id = "UNRATE", observation_start = as.Date("2019-01-01"))
İki kolon işareti, bir paketin fonksiyonunu, paketi library ile yüklemeden doğrudan çağırmanın R'daki yoludur; kodu okuyan kişi, fonksiyonun hangi paketten geldiğini de görmüş olur.
Paketler zaman kazandırır, ama bir bedeli vardır: veri kaynağı kurallarını değiştirdiğinde, örneğin EVDS'nin anahtarı başlıkta istemeye başladığında, paketin de güncellenmesi gerekir. Güncellenmemiş bir paket çalışmayı durdurur. Doğrudan isteklerin mantığını bilen bir kullanıcı, böyle bir durumda sorunu teşhis edip kendi çözümünü yazabilir.
Modelin sınırları
Bu dersteki adresler, parametreler ve hata mesajları, 28 Eylül 2026'daki durumu yansıtıyor. Veri kurumları API'lerini zaman zaman değiştirir: adresler taşınır, parametre adları değişir, erişim koşulları sıkılaşır. EVDS'nin eski adreslerinin yeni sürüme yönlendirilmesi ve anahtarın başlığa taşınması bunun örnekleridir. Bir betik çalışmayı durdurduğunda, kaynağın güncel belgesine bakmak gerekir.
Python örnekleri, Dünya Bankası ve FRED sunucularına gerçekten istek gönderilerek denetlendi; erişim anahtarı gerektiren FRED API'si ve EVDS için ise yalnızca anahtarsız ve geçersiz anahtarlı isteklerin döndürdüğü hata mesajları görüldü. R karşılıkları ise, yerel kurulum bulunmadığından, denenmeden yazıldı. Bu derste verilen Türkiye ve Almanya rakamları, belirtilen tarihte çekilmiş sürümlerdir ve sonraki revizyonlarla değişebilir.
Uygulama
Özet kartı
- Veriyi bir betiğin içinden, kurumların uygulama programlama arayüzlerine istek göndererek çekmek, elle indirmenin hatalarını ortadan kaldırır ve analiz zincirinin ilk halkasını da kayıt altına alır.
- Dünya Bankası'nın gösterge servisi anahtarsız kullanılabilir; FRED'in API'si ve Merkez Bankası'nın EVDS servisi erişim anahtarı ister ve EVDS'de anahtar, adresin içinde değil isteğin başlığında gönderilir; anahtarlar betiğe yazılmaz, ortam değişkenlerinde saklanır.
- Sunucular cevaplarını çoğu zaman JSON biçiminde gönderir; her seri bir seri koduyla tanımlanır ve meta veri, serinin tanımını, birimini ve kaynağını gösterir; farklı kaynaklardaki aynı adlı rakamlar farklı ölçüler olabilir.
- FRED, 1990'ların başında yaklaşık 300 seriyle telefon hattıyla bağlanılan bir ilan panosu olarak başladı ve bugün yüz binlerce seriyi barındırıyor; veriler revize edildiği için her zaman en son sürümü gösteriyor.
- Croushore ile Stark, ekonometrik sonuçların veri sürümüne duyarlı olabileceğini gösterdi; Aruoba ise revizyonların ortalamasının sıfır olmadığını, büyük ve önceden tahmin edilebilir olduğunu buldu; bu yüzden çekilen her veri indirme tarihiyle birlikte saklanmalıdır.
Kavram sözlüğü
| Türkçe | İngilizce | Kısa tanım |
|---|---|---|
| Uygulama programlama arayüzü | Application programming interface | Bir programın bir sunucuya belirli kurallarla soru sorup cevap almasını sağlayan yapı |
| Erişim anahtarı | API key | Bir API'yi kullanmak için her istekle gönderilen kişiye özel kod |
| JSON | JavaScript Object Notation | Verileri adlandırılmış alanlar ve listeler biçiminde gösteren metin biçimi |
| Seri kodu | Series code | Bir veri tabanında bir zaman serisini tek başına tanımlayan kısa kod |
| Meta veri | Metadata | Bir serinin tanımı, birimi, kaynağı ve güncellenme tarihi gibi bilgiler |
| Veri sürümü | Data vintage | Bir veri serisinin belirli bir tarihte yayımlanmış hâli |
Kendini sına
- (Çıktı 1) Uygulama programlama arayüzü ile bir sitenin tarayıcıda gezilmesi arasındaki farkı açıkla. Erişim anahtarı neden bir parola gibi korunmalıdır?
- (Çıktı 2) Bir analizde kullanılan verinin indirme tarihini kaydetmek neden önemlidir? Croushore ile Stark'ın ve Aruoba'nın bulguları bu konuda ne söylüyor?
- (Çıktı 3) Dünya Bankası'nın servisinden Türkiye'nin NY.GDP.MKTP.KD.ZG kodlu serisini 2015–2020 için çekmek üzere Python'da hangi adresi ve parametreleri kullanırsın? Gelen JSON cevabının iki parçası nedir ve tabloya hangi alanları taşırsın?
- (Çıktı 3) FRED'in işsizlik serisini anahtarsız olarak pandas ile okuyan satırı yaz. Aylık seriyi yıllık ortalamalara çevirmek için ne yaparsın? EVDS'ye bir istek gönderirken erişim anahtarını nereye koyarsın?
- (Çıktı 4) Bir betik EVDS'ye istek gönderiyor ve sunucu, key adlı zorunlu başlığın bulunmadığını söylüyor. Başka bir seferde FRED, api_key değişkeninin 32 karakterlik bir dizi olması gerektiğini bildiriyor. Üçüncü bir seferde Dünya Bankası isteği zaman aşımına uğruyor. Her durumun nedeni nedir ve nasıl çözülür?
- (Çıktı 4) Ekipteki bir analist, Dünya Bankası'ndan çektiği Türkiye enflasyon rakamının TÜİK'in aralık ayında açıkladığı yıllık enflasyondan farklı olduğunu görüp «Dünya Bankası'nın verisi yanlış» diyor. Meta veri kavramını kullanarak bu farkın olası nedenini ve nasıl denetleneceğini açıkla.
Cevaplar
- Bir site tarayıcıda gezilirken insan okuması için hazırlanmış sayfalar görüntülenir ve veriler tıklanarak elle indirilir. Uygulama programlama arayüzünde ise bir program, belirli kurallara göre kurulmuş bir adrese istek gönderir ve cevabı, JSON gibi makinenin okuyabileceği bir biçimde alır; aynı istek her seferinde aynı biçimde tekrarlanabilir. Erişim anahtarı kişiye özeldir; başkasının eline geçerse onun adına istek gönderilebilir ve kullanım sınırları aşılabilir. Bu yüzden betiğe açıkça yazılmamalı, ortam değişkeninde ya da paylaşılmayan bir dosyada saklanmalıdır.
- İstatistik kurumları verileri revize ettiği için, aynı serinin farklı tarihlerde indirilen sürümleri farklı değerler içerebilir. Croushore ile Stark, önemli ampirik sonuçların ve politika analizlerinin farklı veri sürümlerine karşı duyarlı olabileceğini gösterdi. Aruoba ise revizyonların ortalamasının sıfır olmadığını, özgün değişkenlere göre büyük olduğunu ve ilk açıklama anındaki bilgilerle tahmin edilebildiğini buldu. İndirme tarihi kaydedilmezse, aynı analiz aylar sonra yeniden yapıldığında farklı bir sonuç çıkabilir ve farkın nedeni anlaşılamaz.
- Adres https://api.worldbank.org/v2/country/TUR/indicator/NY.GDP.MKTP.KD.ZG, parametreler ise format için json ve date için 2015:2020'dir; requests.get ile, bir bekleme süresiyle birlikte gönderilir. Gelen cevabın ilk parçası, sayfa sayısını, toplam kayıt sayısını ve son güncelleme tarihini içeren meta veridir; ikinci parçası her yıl için bir kayıt içeren listedir. Veri çerçevesi için her kayıttan date alanını, sayıya çevirerek yıl olarak, value alanını ise değer olarak alırız ve tabloyu yıla göre sıralarız.
- pd.read_csv("https://fred.stlouisfed.org/graph/fredgraph.csv?id=UNRATE", parse_dates=["observation_date"]) satırı seriyi okur. Yıllık ortalamalar için tarih sütunu indeks yapılır ve seri resample ile yıllık sıklıkta yeniden örneklenip ortalaması alınır. EVDS'de erişim anahtarı adresin içine değil, isteğin başlık bilgisine key adıyla konur; Python'da requests.get'in headers parametresiyle, R'da httr paketinin add_headers fonksiyonuyla gönderilir.
- İlk durumda anahtar isteğin başlığında gönderilmemiştir; muhtemelen adresin içine konmuştur ya da hiç eklenmemiştir. Çözüm, anahtarı key adıyla başlığa eklemektir. İkinci durumda FRED'e gönderilen anahtar yanlış biçimdedir; anahtarın doğru kopyalandığı ve ortam değişkeninin doğru okunduğu denetlenmelidir. Üçüncü durum geçici bir bağlantı ya da sunucu sorunudur; bekleme süresini uzatmak ve birkaç kez, aralarında bekleyerek yeniden denemek genellikle çözer.
- İki rakam farklı ölçüler olabilir. TÜİK'in aralık ayında açıkladığı yıllık enflasyon, aralık ayı fiyat endeksinin bir önceki yılın aralık ayına göre değişimidir. Uluslararası veri tabanlarındaki yıllık enflasyon ise yıllık ortalama fiyat düzeyleri üzerinden hesaplanmış olabilir; enflasyonun hızla değiştiği yıllarda bu iki ölçü belirgin biçimde ayrılır. Denetlemek için Dünya Bankası göstergesinin meta verisine, yani tanımına ve kaynağına bakılmalı, sonra TÜİK'in aynı tanıma karşılık gelen yıllık ortalama değişimiyle karşılaştırılmalıdır. Farkın nedeni büyük olasılıkla bir hata değil, tanım farkıdır.
İleri okuma
- Dean Croushore, Tom Stark (2001). «A Real-Time Data Set for Macroeconomists». Journal of Econometrics 105(1). Veri sürümleri ve ampirik sonuçların sağlamlığı.
- S. Borağan Aruoba (2008). «Data Revisions Are Not Well Behaved». Journal of Money, Credit and Banking 40(2–3). Makroekonomik veri revizyonlarının özellikleri.
- Federal Reserve Bank of St. Louis. «What is FRED?». FRED yardım sayfaları. FRED'in tarihçesi, veri kapsamı ve revizyon politikası.
- Türkiye Cumhuriyet Merkez Bankası. EVDS kullanıcı dokümanları ve web servis kılavuzu, evds3.tcmb.gov.tr. Seri kodları, parametreler ve erişim anahtarının kullanımı.
Sonraki derse köprü
Bu derste çektiğimiz veriler görece temizdi: Dünya Bankası'nın ve FRED'in sunucuları düzgün biçimlendirilmiş, eksiksiz tablolar gönderdi. Gerçek analizlerde ise veriler çoğu zaman eksik değerler, tutarsız biçimler, yinelenen kayıtlar ve birbirine uymayan kodlarla gelir. Sıradaki ders veri temizlemeyi ele alıyor. Eksik değerler nasıl bulunur ve hangi durumda atlanır, hangi durumda doldurulur? Farklı tarih ve sayı biçimleri, yinelenen satırlar ve farklı kaynaklardan gelen tabloların ortak bir anahtarla birleştirilmesi nasıl yönetilir?