R ile NOAA üzerinden internet'ten Türkiye Şehirlerinin Sıcaklık verilerini İndirmek Barış Sanlı, www.barissanli.com , barissanli2@gmail.com Komutlar: library(noaa) Enerji analizlerindeki en temel parametrelerden biri sıcaklıktır. Internet'te bir çok kaynakta ücretsiz sıcaklık verisi olmasına rağmen, bunları R üzerinden indirerek, işlemler yapmak, kodlama ve biraz da sabır istemektedir. Bu makalede R ile NOAA (ABD Ulusal Oşinografi ve Atmosfer kurumunun)'ın herkese açık sisteminden verileri indirerek, biraz işlem yapıp, sonra da grafiklemeyi deneyeceğiz. Amaç: Ankara için 2016 ve 2017 birer yıllık sıcaklık değerlerinin grafiklenmesi NOAA'dan Giriş Anahtarı Almak NOAA hizmetini ücretsiz vermesine rağmen sizden bir email isteyerek, bu anahtarı oraya göndermektedir. 2017 Kasım ayı itibari ile bu sayfa https://www.ncdc.noaa.gov/cdo-web/token adresindedir.
Sonra yukarıdaki alana adını yazdığınız emaile aşağıdaki gibi bir posta geliyor. Ben kendi mail ve anahtarımı resimden sildim ama email ve Token'ın karşısında veriler var.
"rnoaa" kütüphanesinin kurulması Ardından R ekranında, (Rstudio veya R veya jupyter'de) bir sefere mahsus, NOAA verilerine erişim imkanı sağlayacak olan "rnoaa" kütüphanesini sisteme kurmak gerekiyor
Tüm kütüphane kurulduktan sonra, eğer sorun yok ise (error vs), şimdi kütüphaneyi kullanmaya geçebilirsiniz. rnoaa'nın kullanımı Kütüphaneyi devreye almak için library(rnoaa) yazmanız yeterli
tokenX diye benim "XXXX..." atadığım değişkene ise size gelen anahtarı yazın. Eğer anahtar yok ise veri de yok. Her komutun sonunda, anahtarımızı eklemek zorundayız yoksa veri çekemeyiz. Ben kendi anahtarıma tokenX ismini verdim. Veri Yapısı rnoaa'yı anlamak biraz zaman alabiliyor. Dünya üzerinde yerleşim yerleri var, şehirler gibi, bu yerleşim yerlerinde ise bazen 1 bazen 10'larca hava durumu istasyonları var. Bu istasyonlardaki verilerin sınıflandırıldığı verisetleri ve bu verisetlerinde veritipleri var. Mesela Ankara ( CITY:TU000005 ) 'daki (GHCND:TUM00017130) istasyonunda, "GHCND" veri tabanı altında günlük en düşük sıcaklıklar "TMIN" var. Yani hiyerarşiye dikkat. Fakat önce şehirleri bir görelim Yerleşimleri Listelemek Eğer herşey yolunda olursa önce alfabetik sıralamaya göre ilk 1000 yerleşim yeri ismini indirelim ve bunu ids isimli değişkene depolayalım.
Yerleşim yeri verileri şimdi ids isimli değişkende, ids değişkeninin başlangıcına bir göz atalım. "head(ids) komutu ile"
Türkiye'deki Şehirlerin Olduğu Sütunları Bulmak Listede yok yok, fakat biz daha çok Türkiye'dekiler ile ilgileneceğimizden. Yukarıdaki tabloya dikkat edilirse, "name" sütununda şehrin ismi ve ülke kodu var. Türkiye'nin ülke kodu TU, yani tüm listede isim sütununda ", TU" olan satırları ayıklamak Türkiye'deki yerleşim isimlerini verecektir. Bunun için de "grepl" komutu ile ", TU" olan yerleşimleri ayırıyoruz.
İsim listesine bakınca kendi aradığım "Ankara, TU"'yu ve onun kimlik kodu olan "id" sütunundaki "CITY:TU000005"' görülüyor. Lokasyonu belirledikten sonra bu lokasyondaki istasyonları bilmemiz gerekiyor. Yani Ankara'nın kimliği CITY:TU000005 ama buradaki istasyonlar birden fazla olabilir. Bu yerleşimdeki istasyonların isimlerini sormamız gerekiyor. Çünkü sıcaklık verilerini istasyona göre çekeceğiz Ankara'daki Havadurumu İstasyonunun kodu
normalde "stations" verisindeki "data" alt değişkeninde (stations$data)'da benim ekran'da bir alt satıra kaymış olan "id" sütununda GHCND:TUM00017130 isimli istasyon kodunu görebilirsiniz. Peki Ankara ( CITY:TU000005 ) 'daki (GHCND:TUM00017130) istasyonu ile ilgili hangi verilerin ulaşılabileceğini, depolandığını sorgulayalım. İstasyona Ait Verisetleri Bunun için ncdc_datasets komutunda stationid = "GHCND:TUM00017139" da yazabiliriz.
Sonuç aynı olacaktır.
Bu istasyon için 3 tane veri tabanına erişim imkanı vardır bunlar: • GHCND : Günlük özetler (tarihi olarak) • GSOM : Aylık özetler • GSOY : Yıllık özetler Bu noktaya gelince elimizde Ankara'da istasyon için 3 veri tabanı verisi olduğunu gördük. Fakat bu veritabanlarındaki veri başlıkları neler? İstasyondaki Verisetindeki Veri Değişkenleri Bunun içinde stationid de verdiğimiz istasyonun GHCND veri tabanında yer alan veri başlıklarını ncdc_datatypes ile sorgulayacağız:
Görüldüğü üzere bu istasyonda 5 veri var, PRCP (yağış), SNWD(kar kalınlığı), TAVG(ortalama sıcaklık), TMAX(en yüksek sıcaklık), TMIN(minimum sıcaklık) Veriyi İndirmek Şimdi ise bu istasyondaki, GHCND verisetindeki TMIN verisini belirtilen tarihler arasında metric olarak okuyalım(Unutmayın tek seferde en fazla 1000 tane indirebilirsiniz): Bunun için "ncdc" komutunda: • datasetid ile GHCND verisetini • stationid'de daha önce Ankara için istasyon verisini değişkenden veya doğrudan el ile "GHCND:TUM00017130" • datatypeid 'de minimum sıcaklık anlamını taşıyan "TMIN" • startdate başlangıç tarihi (YIL-AY-GÜN) • enddate bitiş tarihi • token anahtarımız tokenX • units ile metrik birimleri (yoksa fahrenheit gelir) • limit ile de veri miktarını sınırlıyoruz, ben hep limit=1000 kullanıyorum, maksimum'a kadar veri çekmek için
bu çektiğimiz veriyi "mintemp" değişkenine atalım. Eğer sorun yok ise "mintemp" değişkenine kısaca bakalım Bunun için "head(mintemp)" yazmamız yeterli.
Görüldüğü üzere mintemp içinde data alt kümesinde 8 sütun veri var. mintemp$data[,4] "value" sütunundaki tüm verilere eşittir. Burada dikkat edilmesi gereken birşey var. İstasyon verisinde ondalık değer kullanılmadığından söz konusu değerin 10'a bölünmesi gerekir. O yüzden 4.sütundaki tüm verileri 10'da 1'i ile değiştireceğiz: Bunun için "mintemp$data[,4]<-(mintemp$data[,4])/10" komutu yeterli olacaktır.
Şimdi bu gerçek değişkenin bir de grafiğini görelim. Yani 2016 Kasım'dan 2017 Kasım'a Ankara'daki istasyonun ölçtüğü minimum sıcaklıklar nasıl değişmiş. Grafiklemek Bunun için rnoaa kütüphaniesindeki: • ncdc_plot komutuna mintemp verisini girerek istediğimiz verinin grafiğini elde edebiliriz.
İşi biraz daha geliştirelim hem 2015-2016 hem 2016-2017 Kasım'dan Kasıma sıcaklık grafiğini çıkaralım. Bunun için gerekli verileri de "mintemp2016" değişkenine atıp, yine değerleri 10'a bölelim.
Şimdi hem son 1 yıldaki hem de ondan önceki yılın verisini birlikte çizdirelim
Veriler elimizde olduğu için ister histogram yapar, ister matematiksel olacak işlem yapabiliriz. İyi çalışmalar, önerilerinizi bekliyorum
Tüm KOD
#Tüm kod library(rnoaa) tokenX<-"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" ids<-ncdc_locs(locationcategoryid='CITY', sortfield='name', sortorder='asc',token=tokenX, limit=1000) head(ids) # Türkiye'deki istasyonlarda ismin sonrasında , TU var. bu satırları görelim grep ile ids$data[grepl(pattern=", TU",x=ids$data[,3])==TRUE,] ncdc_datasets( token=tokenX, locationid = 'CITY:TU000005' ) # ncdc_datatypes(stationid = stations$data$id[1], datasetid = "GHCND", token=tokenX) ncdc_datatypes(stationid = "GHCND:TUM00017130", datasetid = "GHCND", token=tokenX) mintemp<-ncdc(datasetid = "GHCND", stationid = stations$data$id[1], datatypeid = "TMIN", startdate = "2016-11-10", enddate = "2017-11-09", token=tokenX, units="metric", limit=1000) mintemp$data[,4]<-(mintemp$data[,4])/10 ncdc_plot(mintemp) |