Python ile Şeffaflık Platformu Web Servis Kullanımı

Kütüphaneler (Packages)

In [1]:
# Web servis üzerinden istek yapabilmesi için gerekli kütüphane 
import requests
# İstek sonrası elde edilen verinin düzenlenmesi ve işlenmesi için gerekli kütüphane
import pandas as pd

İstek Başlıkları (Headers)

Şeffaflık Platformu Web Servis isteklerinde istek başlıkları ile birlikte kabul edilecek olan veri tipi (accept) ve kimlik doğrulama (x-ibm-client-id) bilgileri gönderilmelidir. Kimlik doğrulama için gerekli istemci taniticisi (clint id) şeffaflık platformu web servis kaydı yapılarak temin edilmelidir.

Şeffaflık Platformu Web Servis Kullanım İzni Nasıl Alınır?

In [2]:
headers = {
    'x-ibm-client-id': "Tanımlanmış_İstemci_Tanıcısı",
    'accept': "application/json"
}

Piyasa Takas Fiyatı İsteği (Requests)

Piyasa Takas Fiyatı (PTF) sorgulamasının yapılabilmesi için ilgili url kullanılmalıdır. Yapılacak olan diğer sorgulamalar için gerekli url'lere Şeffaflık Platformu Web Sitesinden ulaşılabilir.

In [3]:
ptf_url = "https://api.epias.com.tr/epias/exchange/transparency/market/day-ahead-mcp?startDate={}&endDate={}"
resp = requests.get(ptf_url.format("2019-01-01","2019-01-31"), headers=headers)
resp.raise_for_status()

İstek Yanıtı (Response)

İsteğin başarılı olması durumunda veri json formatında elde edilmektedir.

In [8]:
json_data = resp.json()
json_data
Out[8]:
{'resultCode': '0',
 'resultDescription': 'success',
 'body': {'dayAheadMCPList': [{'date': '2019-01-01T00:00:00.000+0300',
    'price': 100.38},
   {'date': '2019-01-01T01:00:00.000+0300', 'price': 96.72},
   {'date': '2019-01-01T02:00:00.000+0300', 'price': 81.6},
   {'date': '2019-01-01T03:00:00.000+0300', 'price': 38.58},
   {'date': '2019-01-01T04:00:00.000+0300', 'price': 11.52},
   {'date': '2019-01-01T05:00:00.000+0300', 'price': 11.14},
   {'date': '2019-01-01T06:00:00.000+0300', 'price': 11.14},
   {'date': '2019-01-01T07:00:00.000+0300', 'price': 24.37},
   {'date': '2019-01-01T08:00:00.000+0300', 'price': 34.5},
   {'date': '2019-01-01T09:00:00.000+0300', 'price': 45.21},
   {'date': '2019-01-01T10:00:00.000+0300', 'price': 71.54},
                            .
                            .
                            .
   {'date': '2019-01-31T13:00:00.000+0300', 'price': 200.99},
   {'date': '2019-01-31T14:00:00.000+0300', 'price': 249.49},
   {'date': '2019-01-31T15:00:00.000+0300', 'price': 249.49},
   {'date': '2019-01-31T16:00:00.000+0300', 'price': 200.99},
   {'date': '2019-01-31T17:00:00.000+0300', 'price': 265.42},
   {'date': '2019-01-31T18:00:00.000+0300', 'price': 320.32},
   {'date': '2019-01-31T19:00:00.000+0300', 'price': 280},
   {'date': '2019-01-31T20:00:00.000+0300', 'price': 280},
   {'date': '2019-01-31T21:00:00.000+0300', 'price': 198.97},
   {'date': '2019-01-31T22:00:00.000+0300', 'price': 220},
   {'date': '2019-01-31T23:00:00.000+0300', 'price': 217.99}],
  'statistics': [{'date': '2019-01-01T00:00:00.000+0300',
    'min': 11.14,
    'max': 291.52,
    'average': 121.02,
    'weightedAverage': 127.88,
    'summary': None},
   {'date': '2019-01-02T00:00:00.000+0300',
    'min': 32.65,
    'max': 299.52,
    'average': 228.76,
    'weightedAverage': 246.52,
    'summary': None},
                  .
                  .
                  .
   {'date': '2019-01-30T00:00:00.000+0300',
    'min': 10.01,
    'max': 320.87,
    'average': 207.77,
    'weightedAverage': 216.57,
    'summary': None},
   {'date': '2019-01-31T00:00:00.000+0300',
    'min': 99.99,
    'max': 320.32,
    'average': 208.6,
    'weightedAverage': 213.31,
    'summary': None}]}}

Verinin İşlenmesi (DataFrame)

Verinin okunabilirliğinin arttırılması ve veri üzerinde gerekli düzenleme ve işlemlerin yapılabilmesi için pandas kütüphanesi kullanılabilir.

In [9]:
df = pd.DataFrame(json_data["body"]["dayAheadMCPList"])
df.head()
Out[9]:
date price
0 2019-01-01T00:00:00.000+0300 100.38
1 2019-01-01T01:00:00.000+0300 96.72
2 2019-01-01T02:00:00.000+0300 81.60
3 2019-01-01T03:00:00.000+0300 38.58
4 2019-01-01T04:00:00.000+0300 11.52

Tarih ve saat bilgileri date kolonuna apply methodu uygulanarak elde edilebilir.

In [10]:
df["Tarih"] = df["date"].apply(lambda x : pd.to_datetime(x[:10]))
df["Saat"] = df["date"].apply(lambda x : int(x[11:13]))
In [11]:
df.head()
Out[11]:
date price Tarih Saat
0 2019-01-01T00:00:00.000+0300 100.38 2019-01-01 0
1 2019-01-01T01:00:00.000+0300 96.72 2019-01-01 1
2 2019-01-01T02:00:00.000+0300 81.60 2019-01-01 2
3 2019-01-01T03:00:00.000+0300 38.58 2019-01-01 3
4 2019-01-01T04:00:00.000+0300 11.52 2019-01-01 4

Tarih ve saat kolonları ayrıştırıldığı için date kolonu kaldırılabilir.

In [12]:
df.drop(columns=["date"],inplace=True)
In [13]:
df.head()
Out[13]:
price Tarih Saat
0 100.38 2019-01-01 0
1 96.72 2019-01-01 1
2 81.60 2019-01-01 2
3 38.58 2019-01-01 3
4 11.52 2019-01-01 4

Kolonlar tekrar adlandırılabilir ve kolonlar tekrardan sıralanadırılabilir.

In [14]:
df.columns = ["PTF", "Tarih", "Saat"]
df = df[["Tarih","Saat","PTF"]]
df.head()
Out[14]:
Tarih Saat PTF
0 2019-01-01 0 100.38
1 2019-01-01 1 96.72
2 2019-01-01 2 81.60
3 2019-01-01 3 38.58
4 2019-01-01 4 11.52