Rastgele Rakam Üretme (Sorunu)!

Daha önce başıma geldiğinde sadece notunu alıp sonradan yazmayı unuttuğum -sinir bozucu- bir durum dün tekrar başıma gelince sıcağı sıcağına yazayım dedim! Projelerde tablolara bazen rastgele (random)  rakamlar içeren sütunlar ekleme ihtiyacı oluyor. Örneğin henüz verisi doldurulmamış rakamsal bilgi içeren bir sütun oluyor çekeceğiniz tabloda, boş veriyle çalışmaktansa rastgele rakamlar türetmeyi tercih ediyorsunuz.

Power BI 'da rastgele rakamları iki farklı yerde üretebiliriz: DAX ile ya da Power Query (M dili) ile. Genel olarak prensibim şu, eğer verinin şekli şemaliyle uğraştığımı düşünüyorsam bunu Power Query tarafında yapmayı tercih ediyorum.

** Eğitimlerde üstüne basa basa da şunu söylüyorum genelde: Power Query tarafında kompleks hesaplamalara mümkün mertebe girmeyin, Group By yapıp bir şeyleri aggregate etmeye zorunlu kalmadıkça kalkışmayın vs. Veriyi olabildiğince lazım olan detay seviyesinde (granularity deniyor buna da) çekmeye çalışıp hesap kitap işini DAX tarafında yapmaya çalışın. Bu sadece genel bir prensip, bana ait bir tercih, her zaman 100% böyle yapın diyemem. Gerekçem de şu, nihayetinde Power Query'de yaptığımız hareketler eğer nizami bir veritabanıyla çalışıyorsak ya query folding ile veri kaynağına sorgu gönderiyor, ya da kendi istemci makinanın gücünü kullanıyor. Her durumda veri kaynağıyla haberleşiyorsunuz. Oysa veriyi import ettikten sonra DAX tarafında yapacağımız her şey hafızaya çıkıyor! Hafıza da genelde network'lerden daha hızlı!

PowerQuery'de -ya da M dilinde- rastgele rakam üretmemizi sağlayacak 3 tane fonksiyon var: List.Random, Number.Random ve Number.RandomBetween. İlki -List.Random- adı üzerinde bir liste yaratarak çalışıyor, ki listeleri kullanabilmek için genelde tablolara çevirmek gerekiyor. Rastgele sayı içeren bir liste oluşturmaya bugüne kadar çok fazla ihtiyaç duymadığım için bunu en sonra bırakacağım. Kalan ikisiyle başlayalım.

Modeldeki "Kategoriler" tablosuna,  Add Column –> Custom Column  diyerek her iki fonksiyonla da birer sütun ekliyorum.

İlkini Number.Random ile ekleyelim.

İkincisini de Number.RandomBetween ile ekleyelim.

Number.Random 0-1 arasında bir sayı üretiyor, Number.RandomBetween'de ise başlangıç ve bitiş aralığını biz verebiliyoruz.

Sütunları ekleyince çıkan sonuç sürpriz! Her satırda aynı rastgele rakamlar var. Üstelik oluşan sütunların tipi de rakamsal bir tip değil, ABC-123, yani sütun tipine karar verememiş!


Bu bir "bug" mu yoksa "by design" bir durum mu karar veremedim, ama bu sonucu istemediğimiz kesin!

Bunu çözmenin yollarından biri tabloya bir  Indeks sütunu eklemek ! Bu indeks sütununu da rastgele sayı üreten sütunu oluşturmadan önce -ve bazen sonrasında da- eklemek! Add Column –> Index Column diyerek sütun eklendiğinde sorun çözülmüş gözüküyor!


Malesef sorun bitmemiş olabilir! Sütun tipini ABC-123'ten rakamsal bir tipe çevirince durum gene aynı hale geliyor!

Çareyi sütun tipini rakamsala çevirmeden önce ikinci bir indeks sütunu daha yaratarak çözebildim!


İki farklı laptop'ta aynı şeyleri yaptığımda şunu tecrübe ettim. Birinde sadece tek bir indeks sütunu yaratmak yeterli geldi. Üstelik bunu rastgele sayılar içeren sütunun öncesinde veya sonrasında yapmam bir şey farkettirmedi. Her durumda da çalıştı. Diğer laptop'ta ise iki kez indeks sütunu oluşturmak durumunda kaldım! Garip bir durum ve stabilliği düşük bir çözüm malesef. Sizin tecrübeniz farklıysa yorumlarda paylaşın lütfen.

Daha garantili ve stabil çalışan çözüm ise şu : Formüle, tablomuzda bulunan nümerik sütunlardan birini eklemek ve çıkarmak! Veya sadece eklemek, sadece çıkarmak! İndeks sütunu yaratmaya gerek kalmadan çalışıyor.

 


 Bu +- işlemini fonksiyonun parantezi içerisinde yaparsanız sorun yok . Fakat fonksiyonun parantezi dışında yaparsanız çalışmıyor! Bu durumda ya sadece ekleme yapmanız lazım ya da sadece çıkarma. Bilginiz olsun!

Unutmadan ufak bir not daha ekleyeyim: Bu rastgele rakamlar dosyanızın her "refresh"'inde değişecek! Engelleyecek bir mekanizma bu iki fonksiyonda da yok!

List.Random 'da böyle bir durum, yani aynı rakamların çıkması gibi bir durum yok!

 List.Random ( Kaç tane rastgele sayı üreteceğiz , Kaynak numarası )  şeklinde bir yazıma sahip. Kaynak numarası (seed) opsiyonel bir parametre, rastgele rakamları üretmek için arka planda kullanılan bir başlangıç sayısı gibi. Böylelikle her defasında -yani her refresh'te- rakamların değişmemesini sağlayabilirsiniz.

Aşağıdaki gibi yeni bir boş soru formülüne List.Random (….) yazmak listeyi oluşturmak için yeterli.


Devamında da "To Table" deyip tabloya çevirince sorunsuz çalışıyor. Dediğim gibi böyle bir ihtiyaç daha önce hiç duymadığım için aklıma çok anlamlı bir örnek gelmiyor açıkçası.

İki yer var demiştim kullanabileceğimiz : DAX veya PowerQuery. DAX 'ta da benzer işlevi görecek iki tane fonksiyon var. RAND veya RANDBETWEEN. RAND, 0-1 arasında RANDBETWEEN ise bizim verdiğimiz iki rakam arasında rastgele sayı üretecek. Her iki fonksiyonun da PowerQuery tarafındaki gibi sorunları yok!  Direkt çalışıyorlar!  "Veriyle uğraştığımı düşünüyorsam PowerQuery'yi tercih ediyorum" 'a bir şey daha eklemek lazım gibi: + Duruma Bağlı!

Yazıdaki modeli indirebilirsiniz.

Sadece kayıtlı üyeler görebilir. Giriş veya Üyelik için login.