Skip to content

Profile Coefficients

muradinc edited this page Dec 22, 2025 · 1 revision

Profil Katsayıları Sorgulama Rehberi

Profil katsayıları, elektrik tüketiminin zaman içindeki dağılımını gösteren çarpanlardır. Bu katsayılar, belirli bir dönem için saatlik tüketim dağılımını hesaplamak için kullanılır.

İçindekiler

Giriş

Profil Katsayıları Nedir?

Profil katsayıları, elektrik tüketiminin gün içindeki saatlik dağılımını temsil eden çarpan değerleridir. Bu katsayılar:

  • Tek Zamanlı okuma tipi için: Tüm saatlerin katsayıları toplandığında yaklaşık 1.0 değerine ulaşır
  • Üç Zamanlı okuma tipi için: Tüm saatlerin katsayıları toplandığında yaklaşık 3.0 değerine ulaşır

Kullanım Senaryoları

Profil katsayıları şu durumlarda kullanılır:

  • Elektrik tüketim tahminleri yapılırken
  • Faturalandırma hesaplamalarında
  • Enerji planlaması yapılırken
  • Tüketim analizlerinde

Kavramlar

Okuma Tipleri

Tek Zamanlı (id: 3)

  • Tüm gün boyunca aynı tarifeden elektrik tüketen aboneler
  • Katsayıların toplamı yaklaşık 1.0'dır
  • Basit tüketim profilleri için kullanılır

Üç Zamanlı (id: 1)

  • Gün içinde farklı zaman dilimlerinde farklı tarifelerden elektrik tüketen aboneler
  • Katsayıların toplamı yaklaşık 3.0'dır
  • Karmaşık tüketim profilleri için kullanılır

Dağıtım Organizasyonları

Türkiye'de elektrik dağıtımı, farklı bölgelerde faaliyet gösteren dağıtım şirketleri tarafından yapılır. Her organizasyonun kendi tüketim profilleri ve katsayıları bulunur.

Abone Grupları

Her dağıtım organizasyonu için farklı abone grupları tanımlanmıştır:

  • Mesken: Konut tüketimi
  • Ticarethane: Ticari işletmeler
  • Sanayi: Endüstriyel tüketim
  • Tarımsal Sulama: Tarım sektörü
  • Aydınlatma: Sokak ve alan aydınlatması

Her grup için Alçak Gerilim (AG) ve Orta Gerilim (OG) seviyelerinde ayrı profil katsayıları bulunur.

Adım Adım Kullanım

1. Kimlik Doğrulama

Öncelikle EPİAŞ API üzerinden işlem yapabilmek için kimlik doğrulaması gereklidir:

import epint as ep

ep.set_auth("kullanici_adiniz", "sifreniz")
ep.set_mode("prod")  # veya "test"

2. Okuma Tipi Listeleme

Sayaç okuma tiplerini listeleyen servis. Profil katsayıları sorgulamasında kullanılacak okuma tipini belirlemek için kullanılır.

read_types = ep.seffaflik._meter_reading_type()
print(read_types)

Dönen Değerler:

id name
3 Tek Zamanlı
1 Üç Zamanlı

Kod Örneği:

# Okuma tiplerini al
read_types = ep.seffaflik._meter_reading_type()

# Tek zamanlı okuma tipi ID'sini bul
tek_zamanli_id = next(r['id'] for r in read_types if r['name'] == 'Tek Zamanlı')
print(f"Tek Zamanlı ID: {tek_zamanli_id}")  # 3

# Üç zamanlı okuma tipi ID'sini bul
uc_zamanli_id = next(r['id'] for r in read_types if r['name'] == 'Üç Zamanlı')
print(f"Üç Zamanlı ID: {uc_zamanli_id}")  # 1

3. Dağıtım Organizasyonları Listeleme

Belirli bir dönem için profil katsayısı verisi bulunan dağıtım organizasyonlarını listeleyen servis.

orgs = ep.seffaflik.multiple_factor_distribution(period='2026-01-01')
print(orgs)

Parametreler:

  • period (string, zorunlu): Sorgulanacak dönem (format: 'YYYY-MM-DD')

Dönen Değerler:

id name
1005 ADM ELEKTRİK DAĞITIM A.Ş.(ED)
1006 AKDENİZ ELEKTRİK DAĞITIM A.Ş.(ED)
1004 AKEDAŞ ELEKTRİK DAĞITIM A.Ş.(ED)
1012 ARAS ELEKTRİK DAĞITIM A.Ş.(ED)
1010 BAŞKENT ELEKTRİK DAĞITIM A.Ş.(ED)
1023 BOĞAZİÇİ ELEKTRİK DAĞITIM A.Ş.(ED)
1007 DİCLE ELEKTRİK DAĞITIM A.Ş.(ED)
1008 FIRAT ELEKTRİK DAĞITIM A.Ş.(ED)
1024 GDZ ELEKTRİK DAĞITIM A.Ş.(ED)
1011 KAYSERİ VE CİVARI ELEKTRİK T.A.Ş.(ED)
1021 MERAM ELEKTRİK DAĞITIM A.Ş.(ED)
1014 OSMANGAZİ ELEKTRİK DAĞITIM A.Ş.(ED)
1013 SAKARYA ELEKTRİK DAĞITIM A.Ş.(ED)
1017 TOROSLAR ELEKTRİK DAĞITIM A.Ş.(ED)
1022 TRAKYA ELEKTRİK DAĞITIM A.Ş.(ED)
1016 ULUDAĞ ELEKTRİK DAĞITIM A.Ş.(ED)
1015 VAN GÖLÜ ELEKTRİK DAĞITIM A.Ş.(ED)
1019 YEŞİLIRMAK ELEKTRİK DAĞITIM A.Ş.(ED)
1020 ÇAMLIBEL ELEKTRİK DAĞITIM A.Ş.(ED)
1018 ÇORUH ELEKTRİK DAĞITIM A.Ş(ED)
1009 İSTANBUL ANADOLU YAKASI ELEKTRİK DAĞITIM A.Ş.(ED)

Kod Örneği:

from datetime import datetime

# Belirli bir dönem için organizasyonları al
period = '2026-01-01'
orgs = ep.seffaflik.multiple_factor_distribution(period=period)

# Organizasyonları listeleyelim
print(f"{period} dönemi için {len(orgs)} organizasyon bulundu:")
for org in orgs:
    print(f"  - {org['name']} (ID: {org['id']})")

# Belirli bir organizasyonu bulalım
kayseri_org = next((o for o in orgs if 'KAYSERİ' in o['name']), None)
if kayseri_org:
    print(f"\nKayseri organizasyon ID: {kayseri_org['id']}")

4. Abone Grubu Listeleme

Seçilen dağıtım organizasyonu için mevcut abone gruplarını listeleyen servis. Her abone grubu, farklı tüketim profiline sahip aboneleri temsil eder.

# Örnek: Kayseri ve Civarı Elektrik için abone grupları
dist_id = 1011  # KAYSERİ VE CİVARI ELEKTRİK T.A.Ş.(ED)
profile_groups = ep.seffaflik.multiple_factor_profile_group(
    period='2026-01-01',
    distId=dist_id
)
print(profile_groups)

Parametreler:

  • period (string, zorunlu): Sorgulanacak dönem (format: 'YYYY-MM-DD')
  • distId (integer, zorunlu): Dağıtım organizasyonu ID'si (önceki adımdan alınır)

Dönen Değerler:

id name
0 Alternatif
35 Sanayi-AG
36 Sanayi-OG
73 Ticarethane - AG
86 Tarımsal Sulama - OG
87 Ticarethane - OG
88 Tarımsal Sulama - AG
89 Mesken - AG
90 Mesken - OG
155 Aydınlatma - KIRŞEHİR
157 Aydınlatma - KONYA
165 Aydınlatma - NEVŞEHİR
166 Aydınlatma - NİĞDE
183 Aydınlatma - AKSARAY
185 Aydınlatma - KARAMAN

Açıklama:

  • AG: Alçak Gerilim
  • OG: Orta Gerilim
  • Her organizasyon için farklı abone grupları bulunabilir

Kod Örneği:

# Organizasyon ID'sini al
dist_id = 1011  # Kayseri

# Abone gruplarını al
period = '2026-01-01'
profile_groups = ep.seffaflik.multiple_factor_profile_group(
    period=period,
    distId=dist_id
)

# Abone gruplarını kategorilere ayıralım
mesken_gruplari = [g for g in profile_groups if 'Mesken' in g['name']]
ticarethane_gruplari = [g for g in profile_groups if 'Ticarethane' in g['name']]
sanayi_gruplari = [g for g in profile_groups if 'Sanayi' in g['name']]

print(f"Mesken grupları: {len(mesken_gruplari)}")
print(f"Ticarethane grupları: {len(ticarethane_gruplari)}")
print(f"Sanayi grupları: {len(sanayi_gruplari)}")

5. Profil Katsayıları Sorgulama

Belirtilen dönem, organizasyon, abone grubu ve okuma tipi için saatlik profil katsayılarını döndüren servis.

import pandas as pd

# Örnek: Kayseri ve Civarı Elektrik, Ticarethane - OG grubu, Üç Zamanlı okuma tipi için
profiles = ep.seffaflik.multiple_factor_data(
    period='2026-01-01',
    distId=1011,  # Kayseri
    subscriberProfileGroup=87,  # Ticarethane - OG
    meterReadingType=1  # Üç Zamanlı
)

# Sonuçları DataFrame'e dönüştürüp ilk 10 satırı göster
df = pd.DataFrame(profiles.get('items', []))
print(df.head(10))

Parametreler:

  • period (string, zorunlu): Sorgulanacak dönem (format: 'YYYY-MM-DD')
  • distId (integer, zorunlu): Dağıtım organizasyonu ID'si
  • subscriberProfileGroup (integer, zorunlu): Abone grubu ID'si
  • meterReadingType (integer, zorunlu): Okuma tipi ID'si (1: Üç Zamanlı, 3: Tek Zamanlı)

Dönen Değerler:

period time multiplier
2026-01-01 00:00:00+03:00 2026-01-01 00:00:00+03:00 0.00393844
2026-01-01 01:00:00+03:00 2026-01-01 01:00:00+03:00 0.00388684
2026-01-01 02:00:00+03:00 2026-01-01 02:00:00+03:00 0.00363215
2026-01-01 03:00:00+03:00 2026-01-01 03:00:00+03:00 0.00368697
2026-01-01 04:00:00+03:00 2026-01-01 04:00:00+03:00 0.00383668
2026-01-01 05:00:00+03:00 2026-01-01 05:00:00+03:00 0.00440733
2026-01-01 06:00:00+03:00 2026-01-01 06:00:00+03:00 0.00273154
2026-01-01 07:00:00+03:00 2026-01-01 07:00:00+03:00 0.00274974
2026-01-01 08:00:00+03:00 2026-01-01 08:00:00+03:00 0.00290296
2026-01-01 09:00:00+03:00 2026-01-01 09:00:00+03:00 0.00289851

Açıklama:

  • period: Sorgulanan dönem
  • time: Saatlik zaman damgası (24 saatlik veri döner)
  • multiplier: O saat için profil katsayısı (çarpan değeri)

Not: Profil katsayıları, bir günlük toplam tüketimin saatlik dağılımını temsil eder. Okuma tipi tek zamanlı seçildiğinde, tüm saatlerin katsayıları toplandığında toplam değerin yaklaşık 1.0 olması beklenir. Okuma tipi üç zamanlı seçildiğinde ise, bu toplam yaklaşık 3.0 değerine yakın olur.

Detaylı Örnekler

Örnek 1: Basit Kullanım

import epint as ep
import pandas as pd

# Kimlik doğrulama
ep.set_auth("kullanici_adi", "sifre")

# Parametreler
period = '2026-01-01'
dist_id = 1011  # Kayseri
profile_group_id = 87  # Ticarethane - OG
reading_type_id = 1  # Üç Zamanlı

# Profil katsayılarını çek
result = ep.seffaflik.multiple_factor_data(
    period=period,
    distId=dist_id,
    subscriberProfileGroup=profile_group_id,
    meterReadingType=reading_type_id
)

# DataFrame'e dönüştür
df = pd.DataFrame(result.get('items', []))

# Katsayıların toplamını kontrol et
toplam = df['multiplier'].sum()
print(f"Katsayıların toplamı: {toplam:.6f}")  # Yaklaşık 3.0 olmalı

# İlk 5 satırı göster
print(df.head())

Örnek 2: Tüm Saatler İçin Görselleştirme

import epint as ep
import pandas as pd
import matplotlib.pyplot as plt

# Profil katsayılarını çek
result = ep.seffaflik.multiple_factor_data(
    period='2026-01-01',
    distId=1011,
    subscriberProfileGroup=87,
    meterReadingType=1
)

df = pd.DataFrame(result.get('items', []))

# Zaman sütununu datetime'a çevir
df['time'] = pd.to_datetime(df['time'])
df['hour'] = df['time'].dt.hour

# Grafik çiz
plt.figure(figsize=(12, 6))
plt.plot(df['hour'], df['multiplier'], marker='o')
plt.xlabel('Saat')
plt.ylabel('Profil Katsayısı')
plt.title('Günlük Profil Katsayıları Dağılımı')
plt.grid(True)
plt.xticks(range(24))
plt.tight_layout()
plt.show()

Örnek 3: Birden Fazla Abone Grubu Karşılaştırma

import epint as ep
import pandas as pd

period = '2026-01-01'
dist_id = 1011
reading_type_id = 1

# Farklı abone grupları için katsayıları çek
gruplar = {
    'Mesken - AG': 89,
    'Ticarethane - OG': 87,
    'Sanayi - OG': 36
}

sonuclar = {}
for grup_adi, grup_id in gruplar.items():
    result = ep.seffaflik.multiple_factor_data(
        period=period,
        distId=dist_id,
        subscriberProfileGroup=grup_id,
        meterReadingType=reading_type_id
    )
    df = pd.DataFrame(result.get('items', []))
    df['time'] = pd.to_datetime(df['time'])
    df['hour'] = df['time'].dt.hour
    sonuclar[grup_adi] = df

# Karşılaştırma grafiği
import matplotlib.pyplot as plt

plt.figure(figsize=(14, 8))
for grup_adi, df in sonuclar.items():
    plt.plot(df['hour'], df['multiplier'], marker='o', label=grup_adi)

plt.xlabel('Saat')
plt.ylabel('Profil Katsayısı')
plt.title('Farklı Abone Grupları İçin Profil Katsayıları Karşılaştırması')
plt.legend()
plt.grid(True)
plt.xticks(range(24))
plt.tight_layout()
plt.show()

Toplu Veri Çekme

Tüm organizasyonlar, profil grupları ve okuma tipleri için katsayı verilerini toplu olarak çekmek için aşağıdaki fonksiyonu kullanabilirsiniz:

import pandas as pd
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
from typing import List, Dict, Any

def tum_organizasyon_katsayilari(
    ep,
    period: str,
    max_workers: int = 10,
    max_retries: int = 3,
    retry_delay: float = 1.0
) -> pd.DataFrame:
    """
    Tüm organizasyonlar, profil grupları ve okuma tipleri için katsayı verilerini çeker.

    Args:
        ep: epint örneği
        period (str): Hangi dönem için veri çekilecek (örn: '2026-01-01')
        max_workers (int): Paralel çalışacak worker sayısı
        max_retries (int): Maksimum tekrar denemesi (hata halinde)
        retry_delay (float): Hatalı denemede sonraki deneme aralığı (saniye)

    Returns:
        pd.DataFrame: datetime, org_name, org_id, profile_name, profile_id,
                     reading_type_name, reading_type_id, coef alanları ile tablo
    """

    print(f"[*] Organizasyonlar listeleniyor...")
    orgs = ep.seffaflik.multiple_factor_distribution(period=period)
    reading_types = ep.seffaflik.data_multiple_factor_reading()
    print(f"[*] {len(orgs)} organizasyon bulundu")
    print(f"[*] {len(reading_types)} okuma tipi bulundu")

    # Her organizasyonun gruplarını çek
    for org in orgs:
        print(f"[+] {org.get('name')} (Id: {org.get('id')})")
        org["groups"] = ep.seffaflik.multiple_factor_profile_group(
            period=period, distributionId=org.get("id")
        )
        print(f"    → {len(org['groups'])} profil grubu çekildi")

    # Görevleri oluştur
    gorevler = []
    for org in orgs:
        for grup in org["groups"]:
            for read_type in reading_types:
                gorevler.append({
                    "org_id": org["id"],
                    "org_name": org["name"],
                    "profile_id": grup["id"],
                    "profile_name": grup["name"],
                    "reading_type_id": read_type["id"],
                    "reading_type_name": read_type["name"],
                })

    toplam_gorev = len(gorevler)
    print(f"\n[*] Toplam {toplam_gorev} çekim görevi hazırlandı. Paralel çalışıyor (max_workers={max_workers})...")

    # Tek görev çekme, retry'lı
    def tek_gorevi_cek(task: Dict[str, Any]) -> Dict[str, Any]:
        for attempt in range(max_retries):
            try:
                result = ep.seffaflik.multiple_factor_data(
                    period=period,
                    distid=task["org_id"],
                    meterreadtype=task["reading_type_id"],
                    profileGroup=task["profile_id"]
                )
                return {
                    "success": True,
                    "task": task,
                    "data": result.get("items", []),
                    "attempt": attempt + 1
                }
            except Exception as e:
                if attempt < max_retries - 1:
                    print(f"[!] Hata ({attempt+1}/{max_retries}): {task['org_name']} | {task['profile_name']} | {task['reading_type_name']} : {e}")
                    time.sleep(retry_delay)
                else:
                    print(f"[✗] BAŞARISIZ: {task['org_name']} | {task['profile_name']} | {task['reading_type_name']} : {e}")
                    return {
                        "success": False,
                        "task": task,
                        "error": str(e),
                        "attempt": max_retries
                    }
        return None

    results = []
    tamamlanan = 0
    hatali = 0
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        futures = {executor.submit(tek_gorevi_cek, t): t for t in gorevler}
        for future in as_completed(futures):
            sonuc = future.result()
            results.append(sonuc)
            tamamlanan += 1
            if sonuc["success"]:
                task = sonuc["task"]
                kayit_sayisi = len(sonuc["data"])
                print(f"[✓] ({tamamlanan}/{toplam_gorev}) {task['org_name']} | {task['profile_name']} | {task['reading_type_name']} ({kayit_sayisi} kayıt deneme={sonuc['attempt']})")
            else:
                hatali += 1

    # DataFrame'e aktar
    print(f"\n[*] DataFrame oluşturuluyor...")
    rows = []
    for sonuc in results:
        if sonuc and sonuc["success"]:
            task = sonuc["task"]
            for item in sonuc["data"]:
                rows.append({
                    "datetime": item.get("time") or item.get("period"),
                    "org_name": task["org_name"],
                    "org_id": task["org_id"],
                    "profile_name": task["profile_name"],
                    "profile_id": task["profile_id"],
                    "reading_type_name": task["reading_type_name"],
                    "reading_type_id": task["reading_type_id"],
                    "coef": item.get("multiplier")
                })
    df = pd.DataFrame(rows)
    if not df.empty:
        df = df.sort_values(by=["datetime", "org_id", "profile_id", "reading_type_id"]).reset_index(drop=True)

    print(f"\n{'='*70}")
    print(f"[*] Özet")
    print(f"    Toplam görev: {toplam_gorev}")
    print(f"    Başarı: {tamamlanan - hatali}")
    print(f"    Başarısız: {hatali}")
    print(f"    Başarı oranı: {(100*(tamamlanan-hatali)/toplam_gorev):.2f}%")
    print(f"    Satır Sayısı: {len(df)}")
    print(f"{'='*70}\n")

    if hatali > 0:
        print("[!] Başarısız çekimler:")
        for sonuc in results:
            if sonuc and not sonuc["success"]:
                task = sonuc["task"]
                print(f"    - {task['org_name']} / {task['profile_name']} / {task['reading_type_name']}")
        print()
    return df

# Kullanım örneği
if __name__ == "__main__":
    period = '2026-01-01'
    df = tum_organizasyon_katsayilari(
        ep=ep,
        period=period,
        max_workers=10,
        max_retries=3,
        retry_delay=1.0
    )
    print("DataFrame İlk 10 Satır:")
    print(df.head(10))
    print(f"\nDataFrame Shape: {df.shape}")
    print(f"\nKolon Listesi: {df.columns.tolist()}")

Sık Sorulan Sorular

Katsayıların toplamı neden tam olarak 1.0 veya 3.0 değil?

Profil katsayıları, gerçek tüketim verilerinden hesaplanır ve yuvarlama hataları nedeniyle tam olarak 1.0 veya 3.0 olmayabilir. Genellikle 0.99-1.01 veya 2.98-3.02 aralığında olması normaldir.

Hangi dönemler için veri mevcuttur?

Profil katsayıları genellikle gelecek dönemler için de hesaplanır. Mevcut dönemler için multiple_factor_distribution servisini çağırarak hangi dönemler için veri olduğunu kontrol edebilirsiniz.

Farklı organizasyonlar için aynı abone grubu ID'leri farklı mı?

Evet, her organizasyon için abone grubu ID'leri farklı olabilir. Bu nedenle her organizasyon için ayrı ayrı multiple_factor_profile_group servisini çağırarak doğru ID'leri almanız gerekir.

Veri çekme işlemi ne kadar sürer?

Tek bir profil katsayısı sorgusu genellikle 1-2 saniye sürer. Tüm organizasyonlar için toplu veri çekme işlemi, paralel çalışma sayısına bağlı olarak 10-30 dakika sürebilir.

İlgili Konular