Python ile Enerji Analizi (barissanli.com/python)

Baslangic
Python'a Giris - Petrol fiyat modeli
Gelecek/Futures fiyatları indirme
Kisa kodlama: Monte Carlo ile Pi hesabi
Oil price analysis(English)
Kayitzinciri(blockchain) Proof of work
Petrol fiyat analizi
Monte Carlo ile Petrol fiyat tahmini
Enerji depolama simulasyonu
Turkiye araba projeksiyonu
pythongiris1

Python'a Giriş 1: Basit Bir Petrol Petrol Arz-Talep Modeli

Python öğrenmek isteyenler için ardı arkası bitmeyen dilin özellikleri, kavramlar kafaları karıştırabilmektedir. Enerji sektöründe çalışanlar için bence dilin tüm özelliklerini baştan vererek can sıkmaya gerek yok.

Bu derste sırası ile

  • if
  • for
  • print
  • list

komutlarını inceleyeceğiz. Sanırım basit bir dünya modeli için bu yeterli...

Python 3 kullanacağız.

Daha sonra ise modelimizi grafik ve veri çerçeveleri ile bir üst seviyeye taşımaya çalışacağız.

Python'un kıllıkları

Python'da kod yazarken form/estetik önemlidir. Yani kodun görünüşünün de güzel olması zorlanır. Eğer uymazsanız indentation hataları verir. Bazen oldukça sorun olabilir.

Bu indentation yani girintiler, aynı zamanda döngülerin ne kadar devam ettiğini de belirler. Mesela bir for döngüsünden hemen sonra girinti verilir. Vermezseniz kod çalışmaz, hata verir. Girintiyi sonlandırdığınız satıra kadar for döngüsü çalışır.

Örneğin for, if vs gibi işlemleren sonra boşluk vermeyerek bir KASITLI HATA oluşturalım.

In [1]:
for i in range(1,3):
print(i)
  File "<ipython-input-1-11fefe468865>", line 2
    print(i)
        ^
IndentationError: expected an indented block

Doğrusu

In [ ]:
for i in range(1,10):
    print(i,end=",")  # burada 1,2,3....., yazılacak. range'in son elemanı kullanılmaz
print("Son") # döngü girintinin bitirildiği satıra kadar çalışır. Bu satır döngü tamamlandıktan sonra çalışacak

Değişkenler ve Fonksiyonlar

Python'da (diğer programlama dillerinde olduğu gibi) tüm kurgu değişkenler ve fonksiyonlar üzerine kuruludur. (Nesne temelli programlama konusuna hiç değinmiyoruz)

  • Değişkenler : bunlar diziler şeklinde olabileceği gibi tekil de olabilirler. Örneğin x=3 veya [3,4,5] gibi
  • Fonksiyonlar : Fonksiyonlar ise () taşırlar mesela print("merhaba") gibi

Konumuz enerji olduğundan değişken olarak bir petrol fiyatı tanımlayarak ekrana çıktı üretelim.

Petrol fiyatını 60 olarak brent adlı değişkene yükleyeceğiz, daha sonra ise print komutu ile ekrana çıktı vereceğiz

In [2]:
brent=60
In [3]:
print(brent)
60

print komutunda istersek ,(virgül) ile değişik karakter katarlarını arka arkaya ekleyebilir, hatta değişkenlerle de karıştırabiliriz.

In [4]:
print("Brent fiyatı=",brent)
Brent fiyatı= 60

if yani eğer işlemleri

Programlamanın en basit iki bileşeninden biri karar argümanlarıdır. Yani eğer

Bir petrol modeli yapacak isek, en önemli komutumuz eğer yani if olacaktır. Çünkü petrol dinamikleri fiyat seviyelerine bağımlıdır.

  • Petrol pahalı ise (eğer/if) tüketim düşer, üretim artar
  • Petrol ucuz ise (eğer/if) tüketim artar, üretim düşer

Peki neye göre pahalı veya ucuz? Model kabulü olarak

  • Petrol fiyatlarında referans noktayı 60 $/varil ($/v)
  • Petrol üretim ve tüketimini de birbirine eşit olarak 100 milyon varil / gün (mv/g)

alıyoruz.

İlk eğer komutumuz, bir tüketici davranışı.

  • Eğer brent fiyatı 60$/v'den yüksek ise ekrana "Fiyat yüksek" yaz
In [5]:
brent=60
In [6]:
if brent>60:
    print("Fiyat yüksek")

Ekrana hiç birşey yazılmadı, çünkü brent fiyatı 60 dolar olarak tanımladığımızdan, eğer döngüsü çalışmaz. brent'i 61$/v 'e eşitleyerek tekrar deneyelim

In [7]:
brent=61
if brent>60:
    print("Fiyat yüksek")
Fiyat yüksek

Modelin Teknik Detayları

OPEC raporuna yayınlanan son verilerden modelimizin diğer detaylarını da ekleyelim

  • Dünya petrol üretimi ve tüketimi dengede 100 mv/g,
  • Dünya petrol dengesinde iki ana blok oluşturalım

    • Petrol üreticileri
      • OPEC : Petrol üreten ülkeler karteli
      • nOPEC: Diğer petrol üreticileri
    • Petrol tüketicileri
      • OECD : Gelişmiş ülkeler. Bu ülkelerin talep artışı/düşüşü çok düşük
      • nOECD(non OECD): Gelişmekte olan ülkeler. Bu ülkelerin talep artışı ve düşüşü de çok daha yüksek
  • Buradan dünya petrol dengesini oluşturacağız

    • OPEC+ nOPEC = toplam üretim
    • OECD+ nOECD = toplam tüketim
  • Üretim ve tüketim dengesizliğinde petrol fiyatını aşağı veya yukarı yönlü hareket ettirecek

    • Bir hassasiyet parametresi ile petrol fiyat hareketlerinin arz-talep dengesizliğine tepkisini ayarlayacağız

Modelin Programlanması

En son OPEC raporundan verileri alalım..

  • OPEC üretimi 32 mv/g
  • OPEC harici üretim e 68 mv/g
In [8]:
opec_uretim=32
nopec_uretim=68
  • OECD tüketimi 30 mv/g
  • OECD haricindeki gelişmekte olan ülkelerin tüketimi de 70 mv/g
In [9]:
oecd_tuketim=30
noecd_tuketim=70

Tüm modelin ana bileşeni olan petrol_fiyati değişkenini tanımlayalım

In [10]:
petrol_fiyati=60

İlk eğer(if) komutumuzda, petrol 60$/v'in altında ise:

  • OPEC üretimini az düşür
  • OPEC harici üretimi daha çok düşür (Çünkü ABD üretimi fiyata daha çok tepki veriyor olabilir)
  • OECD tüketimi fiyata göre çok düşük hareket eder
  • Gelişmekte olan ülkelerde ise (noecd) tüketim fiyata daha büyük bir tepki verir.

İstatistiki bilgi olması açısından dünya petrol talebi tahminlerinde talep uzun dönemde yıldan yıla 1.2 mv/g bir artış gösterir.

In [11]:
if petrol_fiyati<60:
    opec_uretim=opec_uretim-0.3   # eğer 60 $'ın altında petrol fiyatı var ise OPEC üretimi 0.3 mv/g düşer
    nopec_uretim=nopec_uretim-0.5
    
    oecd_tuketim=oecd_tuketim+0.01
    noecd_tuketim=noecd_tuketim+0.4

Şimdi ise petrol 60$/v'in üzerinde ise üretim ve tüketimin nasıl değişeceğini yazalım

  • OPEC ve nOPEC üretimi artar. nOPEC'in ki daha çok artar (ABD üretimi daha hızlı devreye girecektir)
  • OECD tüketimi az, gelişmekte olan ülkelerin talebi ise daha büyük bir hareket yapacaktır
In [12]:
if petrol_fiyati>60:
    opec_uretim=opec_uretim+0.3
    nopec_uretim=nopec_uretim+0.5
    
    oecd_tuketim=oecd_tuketim-0.01
    noecd_tuketim=noecd_tuketim-0.4

Şimdi ise tüm üretimi toplayarak, toplam_uretim; tüm tüketimi de toplayarak toplam_tuketim değişkenlerine atayalım.
Ardından print komutu ile bu değişkenleri yazdıracağız

In [13]:
toplam_uretim= opec_uretim+ nopec_uretim
toplam_tuketim= oecd_tuketim + noecd_tuketim

print("Petrol üretimi:", toplam_uretim)
print("Petrol tüketimi:", toplam_tuketim)
Petrol üretimi: 100
Petrol tüketimi: 100

Gördüğümüz gibi 60 $/v'de petrol fiyatları dengede, talep de 100 mv/g'de

Modelin kilit noktası

Modelimizin kilit noktası petrol fiyatının değiştiği, fiyat hareketini belirleyen formül olacak.
Formül kısaca arz ve talep farkının hassasiyet oranı ile çarpımını fiyattan çıkarıyor.

  • Eğer arz farzla ise petrol fiyatı düşüyor
  • Eğer talep fazla ise petrol fiyatı çıkıyor

Yani ters yönlü bir hareket var.

In [14]:
# fiyat hareketi
hassasiyet=5
petrol_fiyati=petrol_fiyati-(toplam_uretim- toplam_tuketim)*hassasiyet

UYARI Kafayı karıştıran nokta eşitliğin iki tarafında da petrol_fiyati olması. (Değişkenlerde Avrupa latin karakter kullanın fiyatı yazarsanız sorun olabilir). Oysa, petrol fiyatını al, çarp-çıkar ve güncelle demek.
Örneğin: a=3 olsun,
a=a+1 komutunu çalıştırdıktan sonra a'daki değer 4 olur

Simulasyon Döngüsü için for

Petrol fiyatı bir değerin altında veya üstünde ise üretim ve tüketim artacak-azalacak. Ama bunu ardışık yıllar halinde bir simulasyon ile çalıştırmazsak tek tek shift+enter(çalıştır) ile saatlerce satır çalıştırmamız gerekir.

Her programlama dilinin olmazsa olmazı for burada yardımımıza yetişiyor.

  • Genel olarak for şu şekilde kullanılyor: for değişken in sayılar dizisi:

Örneğin bir dizi içerisindeki tüm elemanları tek tek yazdırmak için

In [15]:
for veri in [8,9,10]:
    print(veri)
8
9
10

Aynı şekilde 1'den 3'e kadar sayıları yazdırmak için

In [16]:
for veri in range(1,4):
    print(veri)
1
2
3

Bu verileri yan yana yazdırmak için ise print'e son bir değişken olarak end= " " atıyoruz.

In [17]:
for veri in range(1,4):
    print(veri,end=" ")
1 2 3 

Kısaca range komutu, range(başla, bitir, adım) şeklinde tanımlanabilir. Hiçbir zaman bitir de tanımlı son sayı üretilmez. O limittir

Modelimizi 2030'a kadar 1'er yıl ara ile çalıştıracak isek
range(2019,2031,1) yazmamız yeterli, end=" " ile de yan yana yazmasını sağlayacağız

In [18]:
for i in range(2019, 2031, 1): #range(basla, bitis, adım)
    print(i, end=" ")
2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 

Tüm Modeli bir araya getirmek

Kısaca modelimizde yukarıda yazdığımız kod dizinlerini bir araya getirip tek bir girişte çalıştıracağız.

Modelin bölümleri şu şekilde:

  1. Başlangıç değerlerini ve değişkenlerini yükle
  2. Simulasyon için for döngüsünü kur
    1. Petrol fiyatları 60 dolar/varilin altı için değişim formülleri
    2. Petrol fiyatları 60 dolar/varilin üstü için değişim formülleri
    3. Toplam üretim ve tüketimi hesapla
    4. Fiyat formülünü çalıştır
    5. Ekrana yaz
In [19]:
# 1. Başlangıç değerlerini ve değişkenlerini yükle

petrol_fiyati=70
opec_uretim=32
nopec_uretim=68

oecd_tuketim=30
noecd_tuketim=70

# 2. Simulasyon için **for** döngüsünü kur

for yil in range(2019,2031,1):

    # A. Petrol fiyatları 60 dolar/varilin altı için değişim formülleri
    # petrol fiyatları 60 doların altında ise
    if petrol_fiyati<60:
        opec_uretim=opec_uretim-0.3   # eğer 60 $'ın altında petrol fiyatı var ise OPEC üretimi 0.3 mv/g düşer
        nopec_uretim=nopec_uretim-0.5
    
        oecd_tuketim=oecd_tuketim+0.01
        noecd_tuketim=noecd_tuketim+0.4
     
    
    # B. Petrol fiyatları 60 dolar/varilin üstü için değişim formülleri
    # Petrol fiyatları 60 doların üzerinde ise
    if petrol_fiyati>60:
        opec_uretim=opec_uretim+0.3
        nopec_uretim=nopec_uretim+0.5
    
        oecd_tuketim=oecd_tuketim-0.01
        noecd_tuketim=noecd_tuketim-0.4 
    
    
    # C. Toplam üretim ve tüketimi hesapla

    toplam_uretim= opec_uretim+ nopec_uretim
    toplam_tuketim= oecd_tuketim + noecd_tuketim
    
    # D. Fiyat formülünü çalıştır

    hassasiyet=5
    petrol_fiyati=petrol_fiyati-(toplam_uretim- toplam_tuketim)*hassasiyet
    
    # E. Ekrana yaz
    
    print("Yıl=",yil, "  Petrol fiyatı",petrol_fiyati, end=" ")
    print("Toplam uretim=",toplam_uretim," Toplam tuketim=",toplam_tuketim)
    
Yıl= 2019   Petrol fiyatı 63.94999999999996 Toplam uretim= 100.8  Toplam tuketim= 99.58999999999999
Yıl= 2020   Petrol fiyatı 51.84999999999988 Toplam uretim= 101.6  Toplam tuketim= 99.17999999999998
Yıl= 2021   Petrol fiyatı 45.79999999999984 Toplam uretim= 100.8  Toplam tuketim= 99.58999999999999
Yıl= 2022   Petrol fiyatı 45.79999999999984 Toplam uretim= 100.0  Toplam tuketim= 100.0
Yıl= 2023   Petrol fiyatı 51.84999999999995 Toplam uretim= 99.19999999999999  Toplam tuketim= 100.41000000000001
Yıl= 2024   Petrol fiyatı 63.9500000000001 Toplam uretim= 98.39999999999999  Toplam tuketim= 100.82000000000002
Yıl= 2025   Petrol fiyatı 70.00000000000021 Toplam uretim= 99.19999999999999  Toplam tuketim= 100.41000000000001
Yıl= 2026   Petrol fiyatı 70.00000000000021 Toplam uretim= 100.0  Toplam tuketim= 100.0
Yıl= 2027   Petrol fiyatı 63.95000000000017 Toplam uretim= 100.8  Toplam tuketim= 99.58999999999999
Yıl= 2028   Petrol fiyatı 51.850000000000094 Toplam uretim= 101.6  Toplam tuketim= 99.17999999999998
Yıl= 2029   Petrol fiyatı 45.800000000000054 Toplam uretim= 100.8  Toplam tuketim= 99.58999999999999
Yıl= 2030   Petrol fiyatı 45.800000000000054 Toplam uretim= 100.0  Toplam tuketim= 100.0

Sonuç

Python ile enerji analizine giriş dersi olarak, artık gına gelmiş "hello world" örnekleri yerine, az komutlu, azcık aritmetik bir örneğin daha faydalı olacağını düşünerek, 22 satırda basit bir petrol arz-talep modeli hesapladık.

Sonuçları doğru olmasa da, programlama veya modelleme açısından değişkenler, fonksiyonlar ve aritmetik kullanımı adına faydalı olabilir.

Python'u daha güçlü yapan veri analiz uygulamalarına ise diğer derslerde değineceğiz.

Barış Sanlı, 23 Mart 2019 [barissanli2@gmail.com]

barissanli.com/python