Repository navigation
Profile Coefficients
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.
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
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
- 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
- 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
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.
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.
Ö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"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}") # 1Belirli 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']}")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)}")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.
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())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()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()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()}")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.
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.
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.
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.
- API Referansı - Tüm API metodlarını keşfedin
- Örnekler - Daha fazla kullanım örneği
- Sorun Giderme - Karşılaşabileceğiniz sorunlar ve çözümleri