Power BI, Python ve R betiklerini üç yerde çalıştırabilir: veri kaynağı olarak, Power Query’de dönüştürme adımı olarak ve rapor tuvalinde görsel olarak. Bu, istatistik ve makine öğrenmesi kütüphanelerini rapora getirir. Ama her betik bir bağımlılık ve bir sınır demektir. Bu derste ne zaman kullanılacağını ve nerede duracağını göreceksin. (Kesit Power BI tarayıcıda Python çalıştıramaz; kodlar okumak ve kendi bilgisayarında denemek içindir.)
Kurulum
- Bilgisayarına Python (python.org dağıtımı önerilir) ya da R kur.
- Python için en az iki paket:
pip install pandas matplotlib. Power BI veriyi yalnızca pandas veri çerçevesi (DataFrame) olarak alır ve verir. - Desktop’ta Dosya → Seçenekler ve ayarlar → Seçenekler → Python betiği oluşturma (R için “R betiği oluşturma”): Python giriş dizinini seç.
python.exe’yi doğrudan çalıştırır. Ek ortam ayarı isteyen dağıtımlar (Conda gibi) çalışmayabilir; o durumda Desktop’ı ortamın komut isteminden başlatmak gerekir.Betik veri kaynağı olarak
Giriş → Veri al → Diğer → Python betiği. Betikte oluşturduğun her DataFrame, Gezgin’de bir tablo olarak görünür. Örnek: bir API’den ya da dosyadan gelen veriyi pandas ile hazırlamak.
import pandas as pd
kampanya = pd.DataFrame({
"Kampanya": ["Okula Dönüş", "Yaz Festivali", "Yılbaşı"],
"Baslangic": pd.to_datetime(["2024-08-20", "2024-06-01", "2024-12-15"]),
"Butce": [40000, 25000, 60000],
})
# Gezginde "kampanya" adlı bir tablo görünür
Sınırlar: 30 dakikadan uzun süren betik zaman aşımına uğrar; kullanıcıdan girdi bekleyen komutlar betiği durdurur; iç içe tablolar desteklenmez; çalışma dizini ayarlıyorsan tam yol yazmalısın.
Power Query’de betik adımı
Power Query’de Dönüştür → Python betiği çalıştır. Sorgunun o anki tablosu betiğe dataset adlı bir DataFrame olarak gelir. Örnek: bölgesi boş müşterilerde eksik değeri şehirden tamamlamak, kalanları “Bilinmiyor” yapmak.
import pandas as pd
sehir_bolge = {"İstanbul": "Marmara", "Ankara": "İç Anadolu", "İzmir": "Ege"}
df = dataset.copy()
df["Bolge"] = df["Bolge"].fillna(df["Sehir"].map(sehir_bolge))
df["Bolge"] = df["Bolge"].fillna("Bilinmiyor")
# zaman serisinde boşluğu bir sonraki değerle doldurmak: df["Kur"] = df["Kur"].bfill()
Bunun için Python gerekmez: aynı iş Power Query’de birleştirme (Merge) ve “Değeri değiştir” adımlarıyla da yapılır ve sorgu katlamayı bozmaz. Python’ı, Power Query’nin yapamadığı işler için sakla: istatistiksel eksik değer tahmini (ör. regresyonla doldurma), metin madenciliği, kümeleme.
Python ve R görselleri
Görselleştirmeler bölmesinde Py ya da R simgesini seç, betik görsellerini etkinleştir ve alanları Değerler kutusuna sürükle. Power BI bu alanlardan dataset adlı bir veri çerçevesi oluşturur. Dikkat: alanlar tablo görseli gibi gruplanır, tekrar eden satırlar bir kez gelir; her satırı istiyorsan benzersiz bir alan (ör. SatirNo) ekle.
import seaborn as sns
import matplotlib.pyplot as plt
# Değerler: Kanal, Kategori, Net Satış
pivot = dataset.pivot_table(index="Kategori", columns="Kanal",
values="Net Satış", aggfunc="sum")
sns.heatmap(pivot, annot=True, fmt=".0f", cmap="Blues")
plt.title("Kategori × kanal net satış")
plt.show()
# R görseli: aynı ısı haritası ggplot2 ile library(ggplot2) ggplot(dataset, aes(x = Kanal, y = Kategori, fill = `Net Satış`)) + geom_tile() + scale_fill_gradient(low = "white", high = "steelblue")
Görsel bir resimdir: üzerine gelince araç ipucu çıkmaz, tıklayınca başka görselleri filtrelemez. Diğer görsellerden gelen filtre ve vurgulamaya ise tepki verir. Çoğu ısı haritası için matris + koşullu biçimlendirme yeterlidir ve etkileşimlidir; “Koşullu biçimlendirme ve KPI'lar” dersine bak.
Sınırlar (Learn’e göre)
| Konu | Sınır |
|---|---|
| Görsele gelen veri | En çok 150.000 satır (fazlası kesilir, görselde uyarı çıkar); Desktop’ta en çok 250 MB girdi |
| Zaman aşımı | Desktop’ta görsel betiği 5 dakika; Service’te görsel başına 1 dakika |
| Service’teki yük | Sıkıştırılmış veri + betik en çok 30 MB |
| Paketler (Service) | Python 3.11 ve R 4.3.3 çalışma zamanı; yalnızca listede olan, PyPI/CRAN’da yayımlanmış açık kaynak paketler (pandas, matplotlib, seaborn, scikit-learn, ggplot2, corrplot…). Ağ bağlantısı kuran paketler engellenir. |
| Lisans | Service’te betik görseli oluşturmak için Pro ya da PPU; görüntüleme için Fabric/Premium çalışma alanı da yeterli olabilir. Fabric’in olmadığı bölgelerde ve egemen bulutlarda Service’te desteklenmez. |
| Paylaşım | Web’de yayımla (Publish to web) desteklemez; 2026 itibarıyla “müşterilerin için ekle” (app owns data) senaryosunda da destek sona eriyor. |
| Çözünürlük | Görseller 72 DPI; sütun adları yeniden adlandırılsa da betik özgün adları görür. |
Ne zaman DAX ya da Power Query yeterli?
| İş | Önerilen | Neden? |
|---|---|---|
| Eksik değeri sabit ya da eşleme ile doldurmak | Power Query | Katlanabilir, ağ geçidi gerektirmez. |
| Eksik değer sayımı, veri kalitesi kartı | DAX | Dilimleyiciyle değişir, etkileşimlidir. |
| Korelasyon, z-skoru, doğrusal eğilim | DAX | Formülü bilinen istatistikler DAX’ta yazılır (“İleri istatistik” dersi). |
| Kümeleme, regresyon modeli, metin analizi | Python/R (tercihen Fabric not defteri) | Kütüphane gerekir; sonuç tablo olarak modele gelir. |
| Özel istatistik grafiği (yoğunluk, çift grafik) | Python/R görseli | Yerleşik görsel yoksa; etkileşim beklenmiyorsa. |
Örneğin Python’da df["Indirim"].corr(df["Adet"]) ile bulunan Pearson korelasyonu DAX’ta da yazılabilir; üstelik dilimleyiciyle değişir:
İndirim-Adet Korelasyonu = VAR T = FILTER(Satislar, Satislar[Durum] <> "İptal") VAR OrtX = AVERAGEX(T, Satislar[Indirim]) VAR OrtY = AVERAGEX(T, Satislar[Adet]) VAR Kov = SUMX(T, (Satislar[Indirim] - OrtX) * (Satislar[Adet] - OrtY)) VAR SX = SQRT(SUMX(T, (Satislar[Indirim] - OrtX) ^ 2)) VAR SY = SQRT(SUMX(T, (Satislar[Adet] - OrtY) ^ 2)) RETURN DIVIDE(Kov, SX * SY)
Bizim modelde sonuç yaklaşık −0,02: indirim ile satılan adet arasında neredeyse hiç doğrusal ilişki yok. Elektronik’te sonuç boş döner, çünkü o kategoride indirim hiç değişmiyor (standart sapma 0, DIVIDE boş döndürür).