Önceki yazılarımızda Star Wars ve FourSquare için uygulama ara yüzlerini (API, Application Programming Interface) kullanmayı görmüştük. API’ları kullanarak çeşitli kaynaktan verilere erişmek, bu verilerle uygulama geliştirmek mümkün. Özellikle hava durumu, sosyal medya ya da demografik veriler gibi kaynaklar, modellerinizde sadece iç kaynaklı verilerle açıklayamayacağınız değişiklikleri anlamanızı sağlayabileceği için yararlı.
Bu yazıda da hava durumu ile ilgili hizmetler sunan Weather Underground sitesinin API’ını kullanmayı öğreneceğiz. Hava durumunun satışlar ve ruh hali üzerine etkilerini araştıran bir çok makale var. Weather Underground, güncel hava durumunun yanında 3 ve 10 günlük tahminler ve (kısıtlı da olsa) geçmiş hava durumu verisine de sahip.
Weather Underground API’ını kullanmak için web sayfasından bir kullanıcı oluşturmak yeterli. Ancak ücretsiz olan Developer
tipi hesap için günlük limit 500 sorgu, dakikalık limit ise 10 sorgu. Sorgu limitini arttırmak için ödeme yaparak farklı statüdeki kullanıcı hesapları alabilirsiniz.
API bir çok programlama diliyle kullanılabiliyor. API dokümantasyonu çok açıklayıcı değil ancak Twitter
ve Foursquare
gibi API’ların aksine güçlü bir destek hizmetleri var ve sorularınız için kullanıcı forumlarını kullanabilirsiniz.
Planlar ve kullanıcı limitlerini aşağıda görebilirsiniz.
from IPython.display import Image
Image('WU_API.png')
Kullanıcınızı oluşturduktan sonra Weather Underground size bir kullanıcı anahtarı (key) sağlıyor. Bu anahtarı sorgu adreslerine eklemeniz gerekecek.
İlk olarak, gerekli kütüphaneleri yükleyelim. Bu kütüphaneler API sorgusunun cevabını almak ve veriyi JSON formatına çevirmek için gerekli.
import urllib.request as request
import json
Hava Durumu
Kullanıcı oluşturduktan sonra API anahtarını ve lokasyonu kullanarak ilk sorgumuzu yapalım. Veri formatı JSON, verideki anahtarları öğrenmek için dokümantasyonu kullanabilirsiniz.
İlk sorguyu içeren aşağıdaki adreste
- ‘xxxx’ benim gizlediğim anahtarımı,
conditions
yaptığımız sorgu tipini (farklı sorgu tipleri de göreceğiz),Turkey/İstanbul
da sorgulamak istediğimiz yeri belirtiyor.
Kısaca sorgu, İstanbul’un güncel hava durumunu sorguluyor. Sorgunun sonuna json
şeklinde uzantı da eklememiz gerekiyor.
# xxxx yerine kendi anahtarınızı girmeniz gerekiyor.
f = request.urlopen('http://api.wunderground.com/api/xxxx/conditions/q/Turkey/Istanbul.json')
# Aldığımız yanıtı JSON formatına çevirip, formatlıyoruz.
json_string = f.read()
parsed_json = json.loads(json_string)
print(json.dumps(parsed_json, indent = 4))
f.close()
Döndürülen veride aşağıdaki kalemler var:
response
: Döndürülen cevabın durumunu burada bulabilirsiniz. Alacağınız hataları buradan kontrol edebilirsiniz.current_observation
şu anki hava durumu altında aşağıdaki bilgiler var:display_location
veobservation_location
hava durumu sorgusunun yapıldığı ve ölçümün alındığı yerin bilgilerini içeriyor.- Sıcaklık, nem, rüzgar, basınç, buğulanma sıcaklığı, görüş, radyasyon, UV, yağış gibi hava durumu bilgileri de veriliyor.
Tahmin / 10 Günlük Tahmin
Hava durumu tahminlerine forecast
sorgusuyla erişebiliriz. forecast
yarım günlük tahminler şeklinde önümüzdeki üç günü tahmin ediyor. Daha uzun süreli tahmin için ise forecast10day
sorgusunu kullanabilirsiniz. Hava durumu tahmini aynı zamanda simpleforecast
anahtarının altında da bulunmakta. Buradaki veriler tablo formatına daha yakın.
f = request.urlopen('http://api.wunderground.com/api/xxxx/forecast/q/Turkey/Istanbul.json')
json_string = f.read()
parsed_json = json.loads(json_string)
print('Metin halindeki hava durumu tahmini')
print(json.dumps(parsed_json['forecast']['txt_forecast']['forecastday'][3], indent = 4))
Şimdi bir de simpleforecast
altındaki tahmine bakalım. Göreceğiniz gibi tahmin sıcaklık, yağış, rüzgar gibi konularda çeşitli veriler içeriyor.
print('Rakamlarla hava durumu tahmini')
print(json.dumps(parsed_json['forecast']['simpleforecast']['forecastday'][0], indent = 4))
f.close()
Geçmiş Hava Durumu Verisi
Geçmiş dataya history
sorgusu ile erişmek mümkün. Örnek olarak Ataşehir’e yakın bir istasyonun verisini çekebiliriz. Bunun için iki parametreye ihtiyacımız var:
- Ölçümün yapıldığı yer bilgisi olarak kullanacağımız pws’nin (private weather station, kişisel ölçüm istasyonu) kodu (pws:IISTANBU81),
- Tarih bilgisi. Tarih bilgisini url’ye eklememiz gerekecek. 31 Aralık 2017 tarihindeki hava durumuna erişmek için sorgumuzda
history_20171231
değerini kullanacağız.
Aşağıdaki sorgu o gün içindeki gözlemleri döndürüyor. Saat saat hava durumunu elde etsek de, yağış gibi veriler geçmiş veri kümelerinde bulunmuyor. Veri kümesi saat saat yapılan bütün gözlemleri içerdiğinden sadece ilk gözleme bakalım.
f = request.urlopen('http://api.wunderground.com/api/xxxx/history_20171231/q/pws:IISTANBU81.json')
json_string = f.read()
parsed_json = json.loads(json_string)
print(json.dumps(parsed_json['history']['observations'][0], indent = 4))
f.close()
Gözlem yerel saatle 00:07’de yapılmış. Yağış ve rüzgarla ilgili kimi kalemler veri de yer alsa da (precip_ratem
gibi) gözlem değerleri anlamlı durmuyor.
Belki ücretli planlarla detaylı geçmiş veriye ulaşmak mümkündür.
Diğer Sorgular
Weather Underground API’ını kullanarak hourly
ve hourly10day
sorgularıyla saatlik tahminlere, geolookup
ile istediğiniz yere yakın istasyonlara, currenthurricane
sorgusuyla fırtına bilgilerine, tide
sorgusuyla gelgit bilgilerine ve webcams
sorgusuyla istasyonların kamera görüntülerine ulaşmanız mümkün.
Saatlik hava durumu tahminiyle (hourly
) bir sonraki saate bakalım.
f = request.urlopen('http://api.wunderground.com/api/xxxx/hourly/q/pws:IISTANBU81.json')
json_string = f.read()
parsed_json = json.loads(json_string)
print('Tahmin zamanı')
print(json.dumps(parsed_json['hourly_forecast'][0]['FCTTIME']['pretty'], indent = 4))
zaman = parsed_json['hourly_forecast'][0]['FCTTIME']['pretty']
print('{} için sıcaklık'.format(zaman))
print(json.dumps(parsed_json['hourly_forecast'][0]['temp'], indent = 4))
print('{} için rüzgar hızı'.format(zaman))
print(json.dumps(parsed_json['hourly_forecast'][0]['wspd'], indent = 4))
print('{} için rüzgar yönü'.format(zaman))
print(json.dumps(parsed_json['hourly_forecast'][0]['wdir'], indent = 4))
f.close()
Kadıköy’e yakın kişisel hava durumu istasyonlarını (personal weather station, pws) görelim. Kadıköy’ün koordinatı olarak 40.992756, 29.024704 değerlerini alabiliriz.
f = request.urlopen('http://api.wunderground.com/api/xxxx/geolookup/q/40.992756,29.024704.json')
json_string = f.read()
parsed_json = json.loads(json_string)
print(json.dumps(parsed_json['location']['nearby_weather_stations']['pws'], indent = 4))
f.close()
1 ile 6 km mesafede dört istasyon olduğunu görüyoruz. İstasyonların id değerlerini başka sorgular için kullanmanız mümkün.
Bu yazının Jupyter Notebook dosyasına GitHub dizinimiz üzerinden ulaşabilirsiniz.
Merhaba , yazınız için teşekkür ederiz.