Python Array ve Dataframe İşlemleri

21 Oca

Python programlama dilinde dizi halindeki verilerin düzenlenmesi ve işlenmesi sırasında kullanılan numpy ve pandas kütüphaneleridir. Bu kütüphanedeki bazı özellikleri, iki boyutlu örnek Binance mum verileri ile incelenebilir.

import pandas as pd
import numpy as np

data =[
[1704812400000, '46792.27', '49873.00', '42765.00', '46764.01'],
[1704816000000, '46761.41', '49386.00', '23227.11', '46902.88'],
[1704819600000, '46903.83', '47973.00', '23419.63', '46711.45'],
[1704823200000, '46716.00', '48295.00', '10000.01', '46651.90'],
[1704826800000, '46640.50', '48610.00', '10000.01', '46878.98'],
[1704830400000, '46877.27', '48742.96', '10000.01', '46616.88'],
[1704834000000, '46616.50', '49084.00', '10000.01', '45465.18'],
[1704837600000, '45464.24', '48435.00', '23010.01', '46128.00'],
[1704841200000, '46128.00', '48435.00', '19000.00', '46146.32'],
[1704844800000, '46146.32', '48579.00', '10000.01', '45850.47'],
[1704848400000, '45850.47', '47644.00', '22821.01', '45927.79'],
[1704852000000, '45927.74', '47151.00', '12950.01', '45949.93'],
[1704855600000, '45939.45', '47984.00', '16567.21', '46117.10'],
[1704859200000, '46117.04', '48729.00', '10000.01', '45971.96'],
[1704862800000, '45965.99', '46504.00', '44337.00', '45975.73'],
[1704866400000, '45976.00', '46063.59', '10000.01', '45982.48'],
[1704870000000, '45982.48', '46216.51', '10000.01', '45768.47'],
[1704873600000, '45768.47', '46067.35', '45016.00', '45644.22'],
[1704877200000, '45645.89', '46893.14', '44288.00', '45614.43'],
[1704880800000, '45614.43', '45744.30', '45152.33', '45534.09']
]

pandas.Dataframe

Bu diziyi kolon isimleri ile bir dataframe haline getirmek için aşağıdaki komut kullanılır.

# Dataframe from array
df = pd.DataFrame(data, 
        columns=['timestamp', 'open', 'high', 'low', 'close'])

print(df)
             timestamp      open      high       low     close
0  2024-01-09 15:00:00  46792.27  49873.00  42765.00  46764.01
1  2024-01-09 16:00:00  46761.41  49386.00  23227.11  46902.88
2  2024-01-09 17:00:00  46903.83  47973.00  23419.63  46711.45
3  2024-01-09 18:00:00  46716.00  48295.00  10000.01  46651.90
4  2024-01-09 19:00:00  46640.50  48610.00  10000.01  46878.98
5  2024-01-09 20:00:00  46877.27  48742.96  10000.01  46616.88
6  2024-01-09 21:00:00  46616.50  49084.00  10000.01  45465.18
7  2024-01-09 22:00:00  45464.24  48435.00  23010.01  46128.00
8  2024-01-09 23:00:00  46128.00  48435.00  19000.00  46146.32
9  2024-01-10 00:00:00  46146.32  48579.00  10000.01  45850.47
10 2024-01-10 01:00:00  45850.47  47644.00  22821.01  45927.79
11 2024-01-10 02:00:00  45927.74  47151.00  12950.01  45949.93
12 2024-01-10 03:00:00  45939.45  47984.00  16567.21  46117.10
13 2024-01-10 04:00:00  46117.04  48729.00  10000.01  45971.96
14 2024-01-10 05:00:00  45965.99  46504.00  44337.00  45975.73
15 2024-01-10 06:00:00  45976.00  46063.59  10000.01  45982.48
16 2024-01-10 07:00:00  45982.48  46216.51  10000.01  45768.47
17 2024-01-10 08:00:00  45768.47  46067.35  45016.00  45644.22
18 2024-01-10 09:00:00  45645.89  46893.14  44288.00  45614.43
19 2024-01-10 10:00:00  45614.43  45744.30  45152.33  45534.09

Dataframe boyutlarını gösteren shape özelliğidir.

print(df.shape)
(20,5)

Dataframe kolonların tiplerini gösteren dtypes özelliğidir.

print(df.dtypes)
timestamp     datetime64[ns]
open         object
high         object
low          object
close        object
dtype: object

Bir kolonun tipini dönüştürmek için:

# Convert the 'close', 'high' columns from string to float
df["open"] = df["open"].astype(float)
df["high"] = df["high"].astype(float)
df["low"] = df["low"].astype(float)
df["close"] = df["close"].astype(float)
print(df.dtypes)

timestamp    datetime64[ns]
open                float64
high                float64
low                 float64
close               float64
dtype: object

Sayısal tipteki kolonlar üzerinde matematiksel işlemler yapmak mümkündür. String tipteki kolonlarda matematiksel işlemler yapılmak istenirse hata dönecektir.

# divs adında yeni bir kolon açılarak değerler buraya aktarılır.
df["divs"] = df["close"]/df["high"]

# 3'er satırlık hareketli ortalamalar 
df["moving_avg"] = df["close"].rolling(3).mean()

Dataframe de tek bir kolonu, örneğin “close” almak için df[“close”] veya df.close kullanılır.

print(df["close"])
0     46764.01
1     46902.88
2     46711.45
...

Sadece belli kolonlardan yeni bir frame oluşturmak için:

subdf = df[["close", "high"]]
print(subdf)

       close      high
0   46764.01  49873.00
1   46902.88  49386.00
2   46711.45  47973.00
3   46651.90  48295.00
...

Belli özellikteki verilerin temizlenmesi için:

# 'close' içerisinde değeri sıfır olan satırları temizle.
# örneğin tatil günlerinde borsada hacim kolonu sıfır gelebilir.
df[df['close']!=0]

# Bu işlemden sonra index değerinin sıralı olması için index reset gerekir.
df.reset_index(drop=False, inplace=True)

pandas.Dataframe.copy

dataframe copyalam işlemleri için kullanılır.

copydf = df.copy(deep=False) 
# sadece df referansı kopyalanarak yeni bir obje oluşur. 
# df içersinde değişiklik olursa, copydf de değişir.
copydf = df.copy(deep=False)
# yeni bir obje oluşturulur. 
# dolayısıyla df içersinde değişiklik olursa, copydf değişmez.

pandas.Dataframe.to_datetime

Dataframe’in birinci kolonu integer tipinde timestamp olarak geliyor ve okunabilir değildir. Timestamp verilerini okunabilir hale getirmek için aşağıdaki komut kullanılır.

# Convert Integer timestamp
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')

pandas.Dataframe.set_index

Herhangi bir kolon index olarak kullanılmak istenirse, örneğin timestamp kolonu aşağıdaki gibi set_index() fonksiyonu ile düzenlenir.

# set timestamp as index
df.set_index('timestamp', inplace=True)

print(df)
                         open      high       low     close
timestamp                                                  
2024-01-09 15:00:00  46792.27  49873.00  42765.00  46764.01
2024-01-09 16:00:00  46761.41  49386.00  23227.11  46902.88
...

pandas.Dataframe.reset_index

Tekrar sıfırdan başlayan bir index oluşturmak için reset_index() fonksiyonu kullanılır. Şu anda timestamp kolonu index olduğu için bu fonksiyonda drop=True olursa timestamp kolonu reset sırasında silinir.

# new index column: 0,1,2,...
df.reset_index(drop=False, inplace=True)

print(df)
             timestamp      open      high       low     close
0  2024-01-09 15:00:00  46792.27  49873.00  42765.00  46764.01
1  2024-01-09 16:00:00  46761.41  49386.00  23227.11  46902.88
...

pandas.Dataframe.drop

Dataframe’den bir kolonu silmek için drop fonksiyonu kullanılır. örneğin high kolonu silinsin. Fonksiyonda axis=1 parametresi kolon silmek için, axis=0 ise satır silmek için kullanılır.

# drop high column
# df = df.drop(["high"], axis=1)

print(df)
             timestamp      open  low       close
0  2024-01-09 15:00:00  46792.27  42765.00  46764.01
1  2024-01-09 16:00:00  46761.41  23227.11  46902.88
...

Satır silmek için drop fonksiyonuna silinecek satırlar verilir.

# drop row 0
# df = df.drop([0], axis=0)

print(df)
             timestamp      open  low       close
1  2024-01-09 16:00:00  46761.41  23227.11  46902.88
...

pandas.Dataframe.dropna

Eğer veri içerisinde her hangi bir hücrede NaN, None gibi kayıp veriler varsa bunları içeren satırları silmek için dropna() fonksiyonu kullanılır.

# drop row if any cell value is None, NaN, or missing
df = df.dropna()

pandas.Dataframe.head

Dataframe içerisinden ilk N elemanı almak için head() fonksiyonu kullanılır. Bu fonksiyona parametre verilmediğinde default değeri 5’tir.

# get first N items default 5
df = df.head()

print(df)
            timestamp      open      high       low     close
0 2024-01-09 15:00:00  46792.27  49873.00  42765.00  46764.01
1 2024-01-09 16:00:00  46761.41  49386.00  23227.11  46902.88
2 2024-01-09 17:00:00  46903.83  47973.00  23419.63  46711.45

pandas.Dataframe.tail

Dataframe içerisinden son N elemanı almak için tail() fonksiyonu kullanılır. Bu fonksiyona parametre verilmediğinde default değeri 5’tir.

# get last N items default 5
df = df.tail()

print(df)
             timestamp      open      high       low     close
15 2024-01-10 06:00:00  45976.00  46063.59  10000.01  45982.48
16 2024-01-10 07:00:00  45982.48  46216.51  10000.01  45768.47
17 2024-01-10 08:00:00  45768.47  46067.35  45016.00  45644.22
18 2024-01-10 09:00:00  45645.89  46893.14  44288.00  45614.43
19 2024-01-10 10:00:00  45614.43  45744.30  45152.33  45534.09

pandas.Dataframe.take

Belli index verilerini almak için take() fonksiyonu kullanılır

# take items
df = df.take([1,5,7])

print(df)
            timestamp      open      high       low     close
1 2024-01-09 16:00:00  46761.41  49386.00  23227.11  46902.88
5 2024-01-09 20:00:00  46877.27  48742.96  10000.01  46616.88
7 2024-01-09 22:00:00  45464.24  48435.00  23010.01  46128.00

Yeni dizi, vektör oluşturmak

Dataframe boyutunda sıfırlar ile dolu bir vektör oluşturmak:

signals = [0]*len(df)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Python ile Proxy Http Request

27 Eyl

Python programlama dilinde http isteği en temel hali ile aşağıdaki gibi yapılabilmektedir. Bu işlem için requests modülünün import edilmesi gerekmektedir.

import requests

url = 'https://my-web-api.com'

response = requests.get(url)

print(response.text)

Bu isteği bir proxy aracılığı ile yapmak için aşağıdaki gibi düzenlemek gerekmektedir.

import requests

url = 'https://my-web-api.com'

proxies = {
   'http': 'http://proxy.example.com:8080',
   'https': 'http://secureproxy.example.com:8090',
}

response = requests.get(url, proxies=proxies)

print(response.text)

Python pip install SSL Sertifika sorunu

11 Şub

Python geliştirme sırasında ihtiyaç duyulan paketlerin bulunduğu repository adresine bazı durumlarda erişim sorunları yaşanabilir. Bu durumlardan biri de firewall arkasında bulunan sistemlerden, https protokolü ile repository erişimi talep edildiğinde, SSL sertifikalarının ilgili firewall tarafından değiştirilmesi nedeni ile meydana gelebilecek sertifika sorunudur. Kendi çalışmalarım sırasında Sophos filrewall arkasında çalışırken böyle bir sorunla karşılaştım.

Python geliştirme IDE’si PyCharm ile geliştirme yaparken Python paketlerini yüklemeye çalıştığınızda aşağıdaki ekran ile karşılaşabilirsiniz. Aşağıdaki örnekte Redis paketinin yüklenmesi sırasında karşılaşılan SSL sorunu vurgulanmıştır.

Bu durumdan kurtulabilmek için PyCharm arayüzünde yapılması gereken, paket yükleme arayüzündeki options kısmına –trusted-host pypi.python.org –trusted-host files.pythonhosted.org –trusted-host pypi.org ayarlarını girmektir.

Bu şekilde yükleme yapıldığında SSL sorunu ortadan kalkacaktır.

PyCharm kullanmadan, pip komutlarını konsol arayüzü aracılığı ile kullanarak yükleme yapmak için gerekli komut:  pip install redis –trusted-host pypi.python.org –trusted-host files.pythonhosted.org –trusted-host pypi.org şeklindedir.

Ancak geliştirme sürecinde onlarca paket yükleme işlemi olacağını göz önüne aldığımızda her defasında bu komutu kullanmak çok ta pratik bir çözüm değildir. Bunun yerinde pip ayarlarını global olarak pip.ini dosyasına eklemek, bizi her defasında aynı komutları girmekten kurtaracaktır. Python 3.7 versiyonu için Windows 10 ortamında pip.ini dosyasına C:\ProgramData\pip\pip.ini şeklide erişebilmek mümkündür.

Artık her pip install <package name> komutu, SSL sorununa takılmadan çalışacaktır.

Stackoverflow üzerinde tartışılan pip always fails ssl verification başlıklı soruya verilen çözüm cevabında belirtildiği üzere, trusted-host  seçeneği aslında SSL’yi atlamaz, ancak geçerli (ya da herhangi bir) HTTPS bulunmadığında (ve yalnızca) ilgili ana bilgisayarı güvenilir olarak işaretler.