Ana içeriğe geç
Kesit Power BI
Orta · Analiz

Power BI’da Python ve R

Python/R betiğini veri kaynağı ve Power Query adımı olarak kullanmak, Python ve R görselleri, kurulum, Service’teki sınırlar ve aynı işin DAX ya da Power Query ile ne zaman daha iyi yapılacağı.

Uygulamada aç, 7 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

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

  1. Bilgisayarına Python (python.org dağıtımı önerilir) ya da R kur.
  2. 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.
  3. 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ç.
Conda ortamlarıPower BI, seçtiğin dizindeki 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.

Service’te yenilemePython ya da R betiği içeren bir sorgunun Service’te zamanlanmış yenilemesi için betiğin çalıştığı bilgisayara kişisel mod ağ geçidi (personal gateway) kurulmalı ve o bilgisayarda Python yüklü olmalı. Ayrıca betikle aynı sorgudaki tüm veri kaynaklarının gizlilik düzeyi Genel (Public) olmalı. Kurumsal ortamda bu çoğu zaman kabul edilemez; betiği Fabric not defterine ya da kaynağa taşımak daha sağlıklıdır.

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)

KonuSınır
Görsele gelen veriEn ç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ükSı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.
LisansService’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şımWeb’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ükGö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?

İşÖnerilenNeden?
Eksik değeri sabit ya da eşleme ile doldurmakPower QueryKatlanabilir, ağ geçidi gerektirmez.
Eksik değer sayımı, veri kalitesi kartıDAXDilimleyiciyle değişir, etkileşimlidir.
Korelasyon, z-skoru, doğrusal eğilimDAXFormülü bilinen istatistikler DAX’ta yazılır (“İleri istatistik” dersi).
Kümeleme, regresyon modeli, metin analiziPython/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örseliYerleş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).

Alıştırmalara geç (7)