Power BI’da Tarih Tablosu ve Akıllı Zaman Fonksiyonları
Herkese merhaba. Bu ayki yazımızda Power BI’da tarih tablosu ve akıllı zaman fonksiyonlarını inceleyeceğiz.
Neredeyse tüm veri modellerinde tarih tablosu vardır, çünkü satış gibi veriler zamana bağlı sıklıkla incelenir. Örneğin geçen yıla göre satışlar ne kadar arttı, geçen yılın aynı dönemine göre satışlarım nasıl, dün ne kadar sattım, vs. Bunun gibi analizler çoğu şirkette önemlidir, çünkü bu artış-azalışlara göre şirketler aksiyon alırlar. Bu analizleri Power BI’da yapabilmek için ise önce tarih tablosu ve ardından akıllı zaman fonksiyonlarıyla metrikler oluşturulur.
Tarih-zaman fonksiyonları genel olarak “Tarih” veri tipindeki bir sütuna ait diğer bilgileri verir. Örneğin “Today()”, bugünün tarihini, “Year(Today())”, bugünün ait olduğu yılı verir.
Akıllı zaman fonksiyonları ise bir metriğin farklı zamanlardaki değerlerini bulmamızı sağlar. Örneğin bir satış metriğinin bir sene önceki değerini, ya da aylık satışın 1 sene önce aynı dönemindeki değerini bizlere söyler. Satış adetlerinin geçen yıla göre artıp azalış oranını merak ediyorsak, elimizde iki metrik olmalıdır: bu yılki satışlar ve geçen yılki satışlar. Burada geçen yılki satışları akıllı zaman fonksiyonlarıyla buluyoruz.
İlk önce tarih tablosu oluşturacağız. Örnek yapmak için bir önceki yazıda yer alan modeli kullanacağım. Hatırlayacağınız üzere, modelde veri ilişkilerini anlatmıştık. Bu sefer aynı modele bir tarih boyut tablosu ekleyeceğiz. Bunu yaparken de DAX formülleri yazacağız.
İlk önce “Modelleme” kısmından “Yeni Tablo” diyoruz ve tablomuzun ilk sütununu oluşturmak için “Calendar” fonksiyonunu kullanacağız. Bu fonksiyon, verdiğimiz iki tarih arasındaki tüm tarihlerden oluşan bir sütun verir bizlere. Tarihler statik olarak verilebilir, dinamik olarak da verilebilir. Dinamikten kasıt, modeldeki tarih sütunlarının referans olarak verilmesidir.
Bizim modelimizde bir adet sipariş tarihi bulunmakta, bunun minimum ve maksimum değerleri arasındaki tarihleri içeren bir sütun oluşturuyoruz. Burada dinamik olarak tarihleri vermemizin nedeni, veri olmayan tarihleri görmek istemememizdir. Örneğin bizim satışlarımız 2011 yılından itibaren başlıyorsa minimum tarih olarak 2011’i vermeliyiz. Formülün uygulanışı aşağıdaki şekildedir.
Şekil 1: Calendar fonksiyonu
Calendar fonksiyonunun dışında bir de CalendarAuto() fonksiyonu bulunmakta. Bu fonksiyonun “Calendar” fonksiyonundan farkı, model içerisinde hesaplanmış sütunlar hariç tüm sütunları bulması ve bu sütunlardaki minimum ve maksimum yıllara göre her yıl için 365 günü içeren tek sütunluk bir tablo oluşturmasıdır.
Bu şekilde en küçük ve en büyük sipariş tarihlerimiz arasındaki tüm tarihleri almış olduk. Bundan sonra diğer fonksiyonlara geçelim. Bu tarihin yıl, ay, gün ve çeyrek kısımlarını çıkaralım. Bunun için kullanacağımız fonksiyonlar “Year()”, “Month()”, “Day()” ve “Quarter()” olacak. Bu üç fonksiyonun da ortak yönü, içlerine tarih sütun adı almalarıdır. Uygulanışını görelim.
Şekil 2: Yıl, gün ve ay fonksiyonları
Hafta ile ilgili fonksiyonlara göz atalım. Yılın kaçıncı haftası olduğunu belirlemek için “WeekNum()” ve haftanın kaçıncı gün olduğunu belirlemek için “Weekday()” fonksiyonlarını kullanacağız. Bu fonksiyonların kendilerine has özelliği, Pazartesi veya Pazar günlerinin hafta başı olmasına göre kendilerini ayarlamalarıdır. Örneğin Pazar gününü hafta başı kabul edersek numaralandırmayı Pazar gününe, Pazartesi hafta başıdır dersek Pazartesi gününe göre yapar. Aşağıdaki görüntüde formülün açık hali verilmiştir.
Ekstra bir örnek olarak haftanın kapanış gününü ekleyelim. Bunun için Şekil-4’teki gibi bir formül yazacağız. Güne haftanın kaçıncı günü ise onu 7’den çıkarıp ekleyecek.
Şekil 3: Hafta fonksiyonları
Şekil 4: Haftanın kapanış günü
Ay ve günü rakamsal olarak elde ettik. Bunların isim karşılıklarını da “Format” fonksiyonu ile bulacağız. “Format” fonksiyonu, belirtilen biçime göre verdiğimiz sütunu metne dönüştüren bir formül. Bu formül ile para birimleri, tarih-saat gibi sütunları istediğimiz şekilde metin olarak alabiliriz. Format fonksiyonunun kullanımıyla ilgili doküman bilgisini yazının sonunda paylaşacağım. Örnek olarak ay ve gün adlarını bu fonksiyonla alalım.
Şekil 5: Format fonksiyonu ile gün ve ay adlarının alınması
Veriler incelenirken sıklıkla ay-yıl bilgisi beraber eksenlerde görülmek isteniyor. Bu amaçla, ilk önce yıl ve ay rakamlarını birleştireceğiz, ardından ay adı ve yıl sütununu oluşturacağız ve bu sütunu da yıl-ay sütununa göre sıralayacağız. Amacımız, grafikte ay-yıl bilgisinin sıralı bir şekilde eksende yer alması.
Yıl-ay bilgisini aşağıdaki formül ile oluşturuyoruz.
Yıl-ay = Format(Tarih[OrderDate], “yyyy-mm”)
Ardından ay adı ve yılı metin olarak birleştirip “Sütuna göre sırala” özelliğini kullanarak yıl-ay sütununa göre sıralıyoruz.
Şekil 6: Ay-yıl sütununun sıralanması
Tarih tablosunu bu şekilde oluşturduktan sonra, akıllı zaman fonksiyonlarına geçelim. Bu fonksiyonlar, yazının başında dediğimiz gibi hesaplanmış bir metriğin (örneğin satış adedi, stok adedi, ciro vs.) farklı zamanlardaki değerlerini bulmamızı sağlar. Bu fonksiyonların tam listesi ve ne işe yaradıkları ile ilgili yazının sonundaki kaynakçadan yararlanabilirsiniz. Biz burada en sık kullanılanlardan örneklerimizi yapacağız.
İlk önce Power BI’da tablo görseli oluşturalım ve yıl, ay, satış değerlerini gösterelim. Ardından akıllı zaman fonksiyonlarından biri olan “PreviousMonth()” ile bir önceki ayın satışlarını hesaplayalım. Bu fonksiyon içine tarih sütunu alıyor, ilgili satırdaki aydan bir önceki ayın tüm tarihlerini döndürüyor. Ardından satış metriğini bu tarihler için hesaplıyor. Bu fonksiyonun yıl ve gün bazında da karşılıkları bulunmakta, bu fonksiyonlar da “PreviousDay()” ve “PreviousYear()” şeklinde. Aynı şekilde içlerine tarih sütunu alıyorlar.
Şekil 7: PreviousMonth fonksiyonu ile bir önceki ay satışlarının hesaplanması
Bir sonraki örneğimiz yılların aynı dönemlerinin satışlarını karşılaştırmak üzerine olacak. Örneğin satış değerimizin yanına bir önceki yıl aynı dönemdeki satışı getirmek istiyoruz, bunun için “SamePeriodLastYear()” adlı fonksiyonu kullanacağız. Bu fonksiyon sayesinde örneğin 2012 Mayıs ayındaki satışın yanına 2011 Mayıs satışını getirebileceğiz. Aşağıdaki görüntüde görülebileceği üzere, bu fonksiyon da tarih alıyor ve bir yıl geriye gidip aynı dönemin tarihlerini döndürüyor, metriği de bu tarihler için hesaplıyor.
Şekil 8: Geçen yıl aynı dönem satışlarının görüntülenmesi
Şimdi de kümülatif satışları hesaplayalım. Amacımız, aylık bazda her günkü satışları kümülatif olarak görebileceğimiz bir metrik oluşturmak. Örneğin 2011 Haziran ayındaki satışları gün gün toplayıp 2011 Temmuz ayına geçtiğinde baştan başlayacak. Bunun için “DatesMtd()” fonksiyonunu kullanacağız. Bu fonksiyon, ilgili ay içinde ay başından bugüne kadar olan tarihleri döndürüp metriği o tarihler için hesaplıyor.
Şekil 9: Aylık bazda günlük kümüle satışların hesaplanması
Son örneğimiz “ParallelPeriod()” üzerine olacak. Bu fonksiyon ile belirlediğimiz sayı kadar dönem ileriye veya geriye gidip metriğimizi o döneme göre hesaplayabiliyoruz. Örneğin ay ve satış değerlerinin yanına 6 ay önceki satış değerini getirmek istiyoruz. Bunun anlamı, 6 ay geriye gidip o aydaki satışı istiyorum demek. Bunun için ilgili fonksiyon içine önce tarih sütununu verip, ardından sayısal olarak ileri veya geri gitmek istediğimizi belirtiyoruz. Aylık, yıllık veya çeyreklik hangi bazda yer değiştirmek istiyorsak bunu son kısımda belirtiyoruz, biz örneğimizde aylık geriye gittik.
Tabloda görüleceği üzere, satış değerleri 2011 Kasım ayında başlıyor çünkü veri modelimizdeki satışlar 2011 Mayıs’ta başlıyor. Mayıs’tan 6 ay sonraki Kasım ayında da Mayıs satışını görüyoruz.
Şekil 10: ParallelPeriod ile 6 ay önceki satışların hesaplanması
Bu yazıda tarih tablosu oluşturmayı ve akıllı zaman fonksiyonlarından da en çok kullanılan 4 tanesini ele almaya çalıştık. Yazıya son verirken tarih tablosu ile ilgili dikkat edilmesi gereken iki noktayı da belirtelim.
- Tarih tablosu gün seviyesinde olmalıdır. İlgili yıla ait tüm tarihleri içermelidir ve bu tarihler arasında atlama olmamalıdır.
- Akıllı zaman fonksiyonları kullanılırken tarih sütunu, oluşturduğumuz tarih tablosundan çağırılmalıdır. Bu kullanım performansa olumlu etki eder.
Bir sonraki yazımızda dinamik seçim oluşturma, “Drillthrough” ve “Drilldown” özelliklerini göreceğiz.
Herkese keyifli okumalar!
Kaynakça
https://docs.microsoft.com/tr-tr/dax/format-function-dax
https://www.mssqltips.com/sqlservertip/4857/creating-a-date-dimension-table-in-power-bi/
https://docs.microsoft.com/tr-tr/dax/time-intelligence-functions-dax