⚠ Trading önemli ölçüde zarar riski içerir. Bu sitedeki her şey yalnızca eğitim amaçlıdır ve finansal tavsiye değildir.
Ders 3 / 13 · Ücretsiz

pandas'ın Temelleri: Series, DataFrame, DatetimeIndex, Seçme ve Filtreleme ve Günlük Çubukları Haftalığa Yeniden Örnekleme

Series ve DataFrame yapılarını anlayın, fiyat verisini tarihe göre indeksleyin, loc ve iloc ile satır seçin, boolean maskelerle filtreleyin ve günlük çubukları haftalık çubuklara toplayın.

Yazar: Moustafa Hijaziİçerik gözden geçirildi: 2026-10-305 dk okumaKendi kendine öğrenme kursu

Neler öğreneceksiniz

  • Series ve DataFrame yapılarının ne olduğu ve DatetimeIndex'in neden fiyat analizinin omurgası olduğu.
  • Etiket tabanlı loc ile konum tabanlı iloc arasındaki fark ve boolean maskelerin satırları nasıl filtrelediği.
  • resample ve her sütun için doğru toplama kuralıyla günlük çubuklardan haftalık veya aylık çubukların nasıl oluşturulacağı.
  • pandas 3.0 sürümünde hangi varsayılanların değiştiği ve 2.2 ile 3.x'te aynı şekilde davranan kodun nasıl yazılacağı.

Açıklama

Series, tek boyutlu etiketli bir dizidir: her değere bir tarihin iliştirildiği bir kapanış fiyatları sütunu. DataFrame ise tek bir indeksi paylaşan Series'lerden oluşan bir tablodur: açılış, en yüksek, en düşük, kapanış ve hacim yan yana. İndeks satır etiketlerini tutar; fiyat verisi için bu bir DatetimeIndex olmalıdır. DatetimeIndex, tarih dilimlemeyi, yeniden örneklemeyi ve saat dilimi işlemlerini mümkün kılan, zaman damgalarından oluşan özel bir indekstir. Genel kullanım: import pandas as pd.

Sütunlardan oluşan bir sözlük ve bir tarih indeksiyle bir tablo oluşturun:

idx = pd.bdate_range("2025-03-03", periods=10)

df = pd.DataFrame({"open": [...], "high": [...], "low": [...], "close": [...], "volume": [...]}, index=idx)

bdate_range yalnızca hafta içi günleri üretir ve borsa tatillerinden haberi yoktur; gerçek veri dosyalardan gelir (4. ders). df.head(), df.info() (türler ve eksik değerler) ve df.describe() ile inceleyin. df.index.dtype mutlaka datetime64 göstermelidir; object gösteriyorsa tarihler hâlâ metin hâlindedir.

Seçme. df["close"] bir Series döndürür; df[["open", "close"]] (bir liste) ise bir DataFrame döndürür. df.loc[row_labels, columns] etikete göre seçer: df.loc["2025-03-05":"2025-03-07", "close"] bu üç tarihin kapanışlarını verir ve loc ile, Python listelerinden farklı olarak, bir dilimin her iki ucu da dahil edilir. df.iloc[0:3] tamsayı konumuna göre seçer (ilk üç satır, bitiş hariç) ve df.iloc[-1] en son çubuktur.

Filtreleme. Bir Series üzerindeki karşılaştırma, boolean değerlerden oluşan bir Series, yani bir maske üretir: up = df["close"] > df["open"]. Maskeyi vermek, eşleşen satırları seçer: df[up]. Maskeleri & (ve), | (veya) ve ~ (değil) ile birleştirin; her koşul kendi parantezi içinde olmalıdır: df[(df["close"] > df["open"]) & (df["volume"] > 1200)]. up.sum() True değerlerini sayar, up.mean() ise yükselen günlerin oranıdır.

Sütun eklemek bir atamadır: df["range"] = df["high"] - df["low"]. İşlemler vektörleştirilmiştir, yani tüm sütunlara aynı anda uygulanır; pandas'ın hızlı olmasının nedeni budur. shift(1) değerleri bir satır aşağı kaydırır (dünün kapanışı bugünün satırında) ve pct_change() yüzde değişimleri verir; her ikisi de ilk satırda NaN (not a number, sayı değil) bırakır.

Yeniden örnekleme. resample, satırları sabit zaman aralıklarında gruplar. Her sütunun kendi kuralı olmalıdır: haftalık açılış ilk günlük açılıştır, en yüksek maksimum, en düşük minimum, kapanış son değerdir ve hacim toplamdır:

rules = {"open": "first", "high": "max", "low": "min", "close": "last", "volume": "sum"}

weekly = df.resample("W-FRI").agg(rules)

"W-FRI" kodu her haftayı o haftanın cuma günüyle etiketler. Aylık çubuklar "ME" (ay sonu) kullanır. Eski eğitimler "M" yazar; pandas 2.2 bu takma adı "ME" lehine kullanımdan kaldırdı (aynı şekilde "QE" ve "YE") ve yeni takma adlarla yazılan kod hem 2.2'de hem 3.x'te çalışır.

Bilinmesi gereken pandas 3.0 değişiklikleri. Copy-on-Write (yazınca kopyala) artık tek moddur: filtrelenmiş bir tablo bağımsız bir kopyadır, dolayısıyla df[mask]["close"] = 0 df'yi asla değiştirmez; bunun yerine df.loc[mask, "close"] = 0 yazın. Metin sütunlarının dtype'ı artık object yerine str'dir.

Çözümlü örnek

Varsayımsal örnek: 3 Mart Pazartesi'den 14 Mart 2025 Cuma'ya kadar on günlük çubuk; fiyatlar euro cinsinden, tatil yok.

Tarih Açılış En yüksek En düşük Kapanış Hacim
03 Mar 100 102 99 101 1,000
04 Mar 101 104 100 103 1,200
05 Mar 103 104 101 102 900
06 Mar 102 105 101 104 1,100
07 Mar 104 106 103 105 1,500
10 Mar 105 106 103 104 1,300
11 Mar 104 107 103 106 1,000
12 Mar 106 108 105 107 1,400
13 Mar 107 109 106 108 1,200
14 Mar 108 110 106 107 1,600

Yeniden örnekleme iki satır verir. 7 Mart'ta biten hafta: açılış = ilk açılış = 100; en yüksek = max(102, 104, 104, 105, 106) = 106; en düşük = min(99, 100, 101, 101, 103) = 99; kapanış = son kapanış = 105; hacim = 1,000 + 1,200 + 900 + 1,100 + 1,500 = 5,700. 14 Mart'ta biten hafta: açılış 105, en yüksek 110, en düşük 103, kapanış 107, hacim = 1,300 + 1,000 + 1,400 + 1,200 + 1,600 = 6,500.

Filtreleme: (df["close"] > df["open"]).sum() 7 döndürür, çünkü yalnızca 5, 10 ve 14 Mart günleri açılışlarının altında kapanmıştır. df.loc["2025-03-05":"2025-03-07", "close"] 102, 104, 105 döndürür.

Sık yapılan hata

loc ile iloc'u karıştırmak ve loc'un bitişi dahil ettiğini unutmakdf.iloc[0:5] beş satır döndürür (0'dan 4'e kadar konumlar), ancak df.loc["2025-03-03":"2025-03-07"] 7 Mart dahil o tarihe kadarki her satırı döndürür. "İlk N satır" veya "son çubuk" için iloc, dönemler için ise açık tarihlerle loc kullanın.

Uygulama etkinliği

Yukarıdaki on çubukluk tabloyu kullanarak kâğıt üzerinde çalışın: (a) 10 ile 12 Mart arasındaki (her ikisi dahil) çubukları seçen pandas ifadesini yazın; (b) df.iloc[-3:]["close"].tolist() ifadesinin ne döndürdüğünü belirtin; (c) tek aylık çubuğu, yani df.resample("ME").agg(rules) ifadesinin üreteceği çubuğu hesaplayın; (d) biri tüm sütunlar için df.resample("ME").last() yazarsa neyin yanlış gittiğini açıklayın.

Çözümü göster

(a) df.loc["2025-03-10":"2025-03-12"]; üç satır, her iki uç dahil.

(b) Son üç kapanış: [107, 108, 107].

(c) 31 Mart 2025 (ay sonu) etiketli tek satır: açılış 100 (ilk), en yüksek 110 (maks.), en düşük 99 (min.), kapanış 107 (son), hacim 12,200 (5,700 + 6,500).

(d) .last() her sütunun son değerini alır: aylık en düşük 99 yerine 106, açılış 100 yerine 108 ve hacim 12,200 yerine 1,600 olur. Her zaman sütun bazında kuralları verin.

Sınırlamalar: örnekte tatil veya eksik gün yoktur; gerçek veride tatil içeren bir hafta yalnızca dört çubuğu toplar ve son işlem günü 28 Mart olsa bile "31 Mart" ay etiketi görünür.

Önemli çıkarımlar

  • Fiyat verisi, DatetimeIndex'e sahip bir DataFrame içinde yaşar; her şeyden önce df.index.dtype'ı kontrol edin.
  • loc etikete göre seçer ve dilim bitişini dahil eder; iloc konuma göre seçer ve bitişi hariç tutar.
  • &, | ve ~ ile birleştirilen boolean maskeler, filtreleme için döngülerin yerini alır; bir maske üzerinde .sum() eşleşmeleri sayar.
  • OHLCV verisini first/max/min/last/sum ile yeniden örnekleyin, "W-FRI" ve "ME" takma adlarını kullanın ve atama yaparken pandas 3.0'ın Copy-on-Write davranışını unutmayın.

Sonraki adım

4. ders gerçek veriyi devreye sokuyor: CSV dosyalarını ve ücretsiz API'leri okumak, düzeltilmiş ve düzeltilmemiş fiyatları anlamak ve eksik değerler ile saat dilimlerini ele almak.

Öz değerlendirme

Soruları yanıtlayın, ardından yanıtlarınızı kontrol edin. İstediğiniz kadar tekrar deneyebilirsiniz.

1. Hangi toplama sözlüğü günlük OHLCV çubuklarını doğru şekilde haftalık çubuklara dönüştürür?

2. Bir DataFrame 250 günlük satıra sahip. İkinci aralık her iki uç tarih dahil tam olarak 10 işlem günü içeriyorsa, df.iloc[0:10] ve df.loc['2025-01-02':'2025-01-15'] kaçar satır döndürür?

3. pandas 3.0'da df[df['volume'] > 1000]['close'] = 0 çalıştırıyorsunuz ve df'nin değişmediğini görüyorsunuz. Neden?

Kendi tekrarınız için otomatik öz değerlendirme. Cevaplarınız tarayıcınızda kontrol edilir; bunları görmez ve değerlendirmeyiz. Bu bir sınav veya yeterlilik değildir.

İlerlemeniz

“Tamamlandı” yalnızca dersi bitirdiğinizi işaretlediğiniz anlamına gelir. Anlayışınızın bir sınavı değildir. İlerleme ve notlar yalnızca bu cihazdaki bu tarayıcıda saklanır — bir hesapta değil.