NumPy’da cumsum() Fonksiyonu: Kümülatif Toplamların Gücü
NumPy, Python’da bilimsel hesaplamalar için temel bir kütüphanedir. Özellikle çok boyutlu diziler (arrayler) ve bu diziler üzerinde yüksek performanslı matematiksel işlemler için optimize edilmiştir. Veri bilimi, makine öğrenimi, finans, mühendislik ve fizik gibi birçok alanda vazgeçilmez bir araç haline gelmiştir. NumPy’ın sunduğu zengin fonksiyon setinden biri de cumsum() fonksiyonudur. Bu fonksiyon, dizilerdeki elemanların kümülatif (birikimli) toplamlarını hesaplamak için kullanılır ve veri analizinden sinyal işlemeye kadar geniş bir yelpazede kritik öneme sahiptir.
Bu makalede, numpy.cumsum() fonksiyonunun ne olduğunu, nasıl çalıştığını, farklı boyutlardaki dizilerle nasıl kullanıldığını, performans özelliklerini ve çeşitli pratik uygulama alanlarını detaylı bir şekilde inceleyeceğiz. Ayrıca, bu fonksiyonu kullanırken dikkat edilmesi gereken noktaları ve ilgili diğer NumPy fonksiyonlarını da ele alarak, okuyuculara cumsum() hakkında kapsamlı bir rehber sunmayı amaçlıyoruz.
Kümülatif Toplam Nedir? Temel Kavramlar
Kümülatif toplam, bir sayı dizisindeki her elemanın, kendinden önceki tüm elemanların toplamıyla birleştirilmesiyle elde edilen yeni bir dizidir. Başka bir deyişle, dizinin her noktasındaki değer, o noktaya kadar olan tüm değerlerin toplamını temsil eder.
Matematiksel olarak ifade etmek gerekirse, eğer $A = [a_1, a_2, \ldots, a_n]$ bir sayı dizisiyse, bu dizinin kümülatif toplamı $C = [c_1, c_2, \ldots, c_n]$ şeklinde bir dizi olacaktır. Burada:
$c_1 = a_1$
$c_2 = a_1 + a_2$
$c_3 = a_1 + a_2 + a_3$
…
$c_k = \sum_{i=1}^{k} a_i$
Basit bir örnekle açıklayalım:
Eğer bir dizimiz [1, 2, 3, 4, 5] ise, kümülatif toplamı şu şekilde hesaplanır:
* İlk eleman: 1
* İkinci eleman: 1 + 2 = 3
* Üçüncü eleman: 1 + 2 + 3 = 6
* Dördüncü eleman: 1 + 2 + 3 + 4 = 10
* Beşinci eleman: 1 + 2 + 3 + 4 + 5 = 15
Sonuç olarak, kümülatif toplam dizisi [1, 3, 6, 10, 15] olacaktır.
Kümülatif toplamlar, finansal analizde (örneğin, birikimli kar/zarar veya hisse senedi getirileri), veri analizinde (çalışan toplamlar, trend analizi), istatistikte (kümülatif dağılım fonksiyonları) ve sinyal işlemede (akümülasyon) gibi birçok alanda temel bir araçtır. Bir sürecin zaman içindeki toplam değişimini veya birikimini anlamak için son derece faydalıdırlar.
NumPy’da cumsum() Fonksiyonuna Giriş
NumPy kütüphanesi, kümülatif toplamları hesaplamak için numpy.cumsum() fonksiyonunu sağlar. Bu fonksiyon, Python’ın yerleşik listeleri veya döngülerle manuel olarak hesaplamaktan çok daha hızlı ve verimlidir, özellikle büyük veri setleriyle çalışırken bu performans farkı kritik hale gelir.
numpy.cumsum() fonksiyonunun temel sözdizimi şöyledir:
numpy.cumsum(a, axis=None, dtype=None, out=None)
Parametreleri açıklayalım:
* a: Kümülatif toplamı hesaplanacak olan giriş dizisi (array-like). Bu bir NumPy dizisi, bir Python listesi veya başka bir dizi benzeri nesne olabilir.
* axis: (İsteğe bağlı) Kümülatif toplamın hangi eksen boyunca hesaplanacağını belirler. Varsayılan olarak None‘dır.
* axis=None (varsayılan): Giriş dizisi düzleştirilir (tek boyutlu hale getirilir) ve tüm elemanlar üzerinde kümülatif toplam hesaplanır. Sonuç tek boyutlu bir dizi olur.
* axis=0: Kümülatif toplam, sütunlar boyunca (yani, satırları birleştirerek) hesaplanır.
* axis=1: Kümülatif toplam, satırlar boyunca (yani, sütunları birleştirerek) hesaplanır.
* Daha yüksek boyutlu dizilerde, axis parametresi ilgili boyutun indeksi olarak kullanılır.
* dtype: (İsteğe bağlı) Döndürülecek çıktı dizisinin veri tipini belirler. Varsayılan olarak, giriş dizisinin veri tipi veya daha geniş bir veri tipi (taşmayı önlemek için) kullanılır.
* out: (İsteğe bağlı) Sonucun yazılacağı alternatif bir çıktı dizisi sağlar. Bu, yeni bir dizi oluşturma maliyetinden kaçınarak performansı artırabilir. Döndürülen dizi out ile aynı olmalıdır.
Fonksiyon, kümülatif toplamları içeren yeni bir NumPy dizisi döndürür.
Tek Boyutlu Dizilerde cumsum() Kullanımı
Tek boyutlu dizilerde cumsum() kullanımı en basit şeklidir. axis parametresi belirtilmediğinde veya axis=0 olarak ayarlandığında (tek boyutlu diziler için), fonksiyon tüm elemanlar üzerinde kümülatif toplamı hesaplar.
import numpy as np
Pozitif sayılarla örnek
arr1 = np.array([1, 2, 3, 4, 5])
cumulative_sum1 = np.cumsum(arr1)
print("Dizi 1:", arr1)
print("Kümülatif Toplam 1:", cumulative_sum1)
Çıktı: [ 1 3 6 10 15]
Negatif sayılarla örnek
arr2 = np.array([-1, 2, -3, 4, -5])
cumulative_sum2 = np.cumsum(arr2)
print("Dizi 2:", arr2)
print("Kümülatif Toplam 2:", cumulative_sum2)
Çıktı: [-1 1 -2 2 -3]
Float sayılarla örnek
arr3 = np.array([0.1, 0.2, 0.3, 0.4])
cumulative_sum3 = np.cumsum(arr3)
print("Dizi 3:", arr3)
print("Kümülatif Toplam 3:", cumulative_sum3)
Çıktı: [0.1 0.3 0.6 1. ]
NaN (Not a Number) değerlerinin olduğu durumlarda cumsum() bu değerleri olduğu gibi yayar. Yani, NaN bir kez toplama dahil olduğunda, ondan sonraki tüm kümülatif toplamlar da NaN olacaktır. Bu davranış, NaN değerlerinin varlığını izlemek için faydalı olabilir, ancak bazen özel ön işleme gerektirebilir (örneğin, NaN değerlerini sıfırla doldurmak veya yok saymak).
arr_nan = np.array([1, 2, np.nan, 4, 5])
cumulative_sum_nan = np.cumsum(arr_nan)
print("NaN içeren dizi:", arr_nan)
print("NaN içeren kümülatif toplam:", cumulative_sum_nan)
Çıktı: [ 1. 3. nan nan nan]
Çok Boyutlu Dizilerde cumsum() ve axis Parametresi
cumsum() fonksiyonunun gücü, çok boyutlu dizilerle çalışırken axis parametresiyle ortaya çıkar. axis parametresi, kümülatif toplamın hangi boyut boyunca hesaplanacağını belirler. Bu, özellikle matrisler veya daha yüksek boyutlu tensörlerle çalışırken çok önemlidir.
axis=None (Varsayılan)
axis parametresi belirtilmediğinde veya None olarak ayarlandığında, NumPy diziyi düzleştirir (yani, tüm elemanları tek bir sıraya koyar) ve bu düzleştirilmiş dizi üzerinde kümülatif toplamı hesaplar. Sonuç her zaman tek boyutlu bir dizidir.
matrix = np.array([[1, 2, 3],
[4, 5, 6]])
cumulative_sum_flat = np.cumsum(matrix, axis=None)
print("Orijinal Matris:\n", matrix)
print("Düzleştirilmiş Kümülatif Toplam (axis=None):\n", cumulative_sum_flat)
Çıktı: [ 1 3 6 10 15 21]
Yukarıdaki örnekte, matris [1, 2, 3, 4, 5, 6] şeklinde düzleştirilir ve kümülatif toplam bu düzleştirilmiş dizi üzerinde hesaplanır.
axis=0: Sütunlar Boyunca Kümülatif Toplam
axis=0 olarak ayarlandığında, kümülatif toplam her sütun boyunca (yani, satırlar arasında aşağı doğru) hesaplanır. Her sütun kendi içinde ayrı ayrı toplanır. Sonuç dizisinin şekli orijinal diziyle aynı olur.
matrix = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
cumulative_sum_axis0 = np.cumsum(matrix, axis=0)
print("Orijinal Matris:\n", matrix)
print("Sütunlar Boyunca Kümülatif Toplam (axis=0):\n", cumulative_sum_axis0)
Çıktı:
[[ 1 2 3]
[ 5 7 9]
[12 15 18]]
Bu örnekte:
* İlk sütun için: [1, 4, 7] -> [1, 1+4, 1+4+7] = [1, 5, 12]
* İkinci sütun için: [2, 5, 8] -> [2, 2+5, 2+5+8] = [2, 7, 15]
* Üçüncü sütun için: [3, 6, 9] -> [3, 3+6, 3+6+9] = [3, 9, 18]
axis=1: Satırlar Boyunca Kümülatif Toplam
axis=1 olarak ayarlandığında, kümülatif toplam her satır boyunca (yani, sütunlar arasında sağa doğru) hesaplanır. Her satır kendi içinde ayrı ayrı toplanır. Sonuç dizisinin şekli orijinal diziyle aynı olur.
matrix = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
cumulative_sum_axis1 = np.cumsum(matrix, axis=1)
print("Orijinal Matris:\n", matrix)
print("Satırlar Boyunca Kümülatif Toplam (axis=1):\n", cumulative_sum_axis1)
Çıktı:
[[ 1 3 6]
[ 4 9 15]
[ 7 15 24]]
Bu örnekte:
* İlk satır için: [1, 2, 3] -> [1, 1+2, 1+2+3] = [1, 3, 6]
* İkinci satır için: [4, 5, 6] -> [4, 4+5, 4+5+6] = [4, 9, 15]
* Üçüncü satır için: [7, 8, 9] -> [7, 7+8, 7+8+9] = [7, 15, 24]
Daha Yüksek Boyutlu Dizilerde axis
Üç boyutlu veya daha yüksek boyutlu dizilerde de axis parametresi benzer şekilde çalışır. Örneğin, bir 3D dizi için:
* axis=0: İlk boyut (katmanlar/derinlik) boyunca toplama yapar.
* axis=1: İkinci boyut (satırlar) boyunca toplama yapar.
* axis=2: Üçüncü boyut (sütunlar) boyunca toplama yapar.
tensor_3d = np.arange(1, 28).reshape(3, 3, 3)
print("Orijinal 3D Dizi (3x3x3):\n", tensor_3d)
axis=0 (derinlik/katmanlar boyunca)
cumsum_axis0_3d = np.cumsum(tensor_3d, axis=0)
print("\naxis=0 boyunca kümülatif toplam:\n", cumsum_axis0_3d)
İlk katman olduğu gibi kalır
İkinci katman: İlk katman + İkinci katman
Üçüncü katman: İlk katman + İkinci katman + Üçüncü katman
axis=1 (satırlar boyunca)
cumsum_axis1_3d = np.cumsum(tensor_3d, axis=1)
print("\naxis=1 boyunca kümülatif toplam:\n", cumsum_axis1_3d)
Her bir derinlikteki matrisin satırları boyunca kümülatif toplam
axis=2 (sütunlar boyunca)
cumsum_axis2_3d = np.cumsum(tensor_3d, axis=2)
print("\naxis=2 boyunca kümülatif toplam:\n", cumsum_axis2_3d)
Her bir derinlikteki matrisin sütunları boyunca kümülatif toplam
axis parametresinin doğru anlaşılması ve kullanılması, çok boyutlu veri manipülasyonunda temel bir beceridir ve cumsum()'ın esnekliğini maksimize eder.
dtype Parametresi: Veri Tipini Belirleme
dtype parametresi, cumsum() fonksiyonunun döndüreceği çıktı dizisinin veri tipini (data type) kontrol etmenizi sağlar. NumPy, genellikle giriş dizisinin veri tipine göre veya taşmayı önlemek için daha geniş bir veri tipine otomatik olarak yükseltme yapar. Ancak, bazen belirli bir veri tipiyle çalışmak isteyebilirsiniz.
Örneğin, küçük tam sayılarla çalışırken sonuçların büyüyebileceği ve bir tam sayı taşmasına (integer overflow) neden olabileceği durumlar olabilir. Tam sayı taşması, bir sayının depolanabileceği maksimum değeri aşması durumunda beklenmedik sonuçlara yol açar. Bunu önlemek için, dtype'ı daha geniş bir tam sayı tipi (int64) veya kayan nokta tipi (float64) olarak belirleyebilirsiniz.
arr_int = np.array([100000, 200000, 300000], dtype=np.int32)
print("Orijinal dizi (int32):", arr_int)
print("Orijinal dizi veri tipi:", arr_int.dtype)
Otomatik dtype yükseltme
cumulative_sum_auto = np.cumsum(arr_int)
print("Otomatik kümülatif toplam:", cumulative_sum_auto)
print("Otomatik kümülatif toplam veri tipi:", cumulative_sum_auto.dtype)
Çıktı: int64 (NumPy, taşmayı önlemek için int64'e yükseltir)
Manuel dtype belirleme (float64)
cumulative_sum_float = np.cumsum(arr_int, dtype=np.float64)
print("float64 olarak kümülatif toplam:", cumulative_sum_float)
print("float64 kümülatif toplam veri tipi:", cumulative_sum_float.dtype)
Çıktı: float64
Taşma örneği (eğer NumPy otomatik yükseltme yapmasaydı)
Not: NumPy bu durumda otomatik olarak yükselteceği için bu örneği çalıştırmak taşma göstermez.
Ancak konsepti anlamak için önemlidir.
Küçük bir int tipiyle büyük toplamlar:
arr_small_int = np.array([30000, 30000, 30000], dtype=np.int16) # max ~32767
cumsum_small_int = np.cumsum(arr_small_int) # Bu hala int32 veya int64 olacaktır
Eğer zorla int16'ya düşürülseydi: [30000, 60000 (taşma), 90000 (taşma)]
dtype parametresi, özellikle bellek kullanımı veya belirli hassasiyet gereksinimleri olduğunda faydalıdır. Örneğin, çok büyük dizilerle çalışırken float32 kullanmak, float64'e göre daha az bellek tüketir ancak daha düşük hassasiyet sunar.
out Parametresi: Sonuç Dizisini Belirleme
out parametresi, cumsum() fonksiyonunun sonucunu, önceden tahsis edilmiş belirli bir NumPy dizisine yazmasını sağlar. Bu, özellikle performans açısından kritik durumlarda veya bellek tahsisini kontrol etmek istediğinizde kullanışlıdır. Yeni bir dizi oluşturmaktan kaçınarak bellek tahsisi ve kopyalama maliyetini azaltabilir.
out parametresi olarak verilen dizinin, çıktı dizisiyle aynı şekle ve uyumlu bir veri tipine sahip olması gerekir.
arr = np.array([1, 2, 3, 4, 5])
result_array = np.empty_like(arr) # arr ile aynı şekle ve dtype'a sahip boş bir dizi oluştur
np.cumsum(arr, out=result_array)
print("Orijinal dizi:", arr)
print("Sonuç dizisi (out parametresi kullanılarak):", result_array)
Çıktı: [ 1 3 6 10 15]
Farklı bir örnek:
arr_large = np.arange(1, 1000001) # 1 milyon elemanlı dizi
output_large = np.zeros_like(arr_large, dtype=np.int64) # Çıktı için bellek ayır
out parametresi olmadan
%timeit np.cumsum(arr_large) # Yaklaşık 3-5 ms
out parametresi ile
%timeit np.cumsum(arr_large, out=output_large) # Yaklaşık 2-4 ms (genellikle biraz daha hızlı veya aynı)
Büyük dizilerle yapılan işlemlerde, out parametresinin kullanımı küçük ama ölçülebilir bir performans iyileşmesi sağlayabilir, özellikle döngüler içinde tekrar tekrar çağrılan fonksiyonlar için.
cumsum()'ın Performansı ve Verimliliği
NumPy'ın cumsum() fonksiyonu, Python'ın yerleşik listeleri veya manuel döngülerle kümülatif toplam hesaplamaya kıyasla çok daha hızlıdır. Bu performans farkının temel nedenleri şunlardır:
1. C ile Uygulama: NumPy'ın çekirdek fonksiyonları, C veya Fortran gibi düşük seviyeli dillerde optimize edilmiş kodlarla yazılmıştır. Bu, Python'ın yorumlama maliyetinden kaçınarak doğrudan makine kodunda çalışmayı sağlar.
2. Vektörel İşlemler: NumPy, tüm dizi üzerinde tek bir işlem olarak çalışır (vektörizasyon). Bu, Python'daki for döngülerinin her eleman için ayrı ayrı Python yorumlayıcısını çağırmasından kaynaklanan ek yükü ortadan kaldırır.
3. Bellek Yönetimi: NumPy dizileri bellekte bitişik bloklar halinde depolanır. Bu, verilere daha hızlı erişim sağlar ve işlemci önbelleğini daha verimli kullanır. Python listeleri ise bellekte dağınık nesneleri tutan referanslardan oluşur.
Basit bir karşılaştırma ile bu farkı görebiliriz:
import time
Python listesi ve manuel döngü
def python_cumsum(arr):
cumulative_list = []
current_sum = 0
for x in arr:
current_sum += x
cumulative_list.append(current_sum)
return cumulative_list
data_size = 1000000 # 1 milyon eleman
python_list = list(range(data_size))
numpy_array = np.arange(data_size)
Python ile süre ölçümü
start_time = time.perf_counter()
py_result = python_cumsum(python_list)
end_time = time.perf_counter()
print(f"Python cumsum süresi: {(end_time - start_time):.6f} saniye")
NumPy ile süre ölçümü
start_time = time.perf_counter()
np_result = np.cumsum(numpy_array)
end_time = time.perf_counter()
print(f"NumPy cumsum süresi: {(end_time - start_time):.6f} saniye")
Genellikle NumPy, Python'dan yüzlerce kat daha hızlı olacaktır.
Örneğin: Python ~0.1-0.2 saniye, NumPy ~0.001-0.002 saniye
Bu performans üstünlüğü, büyük veri setleriyle çalışan veri bilimcileri ve mühendisler için NumPy'ı vazgeçilmez kılar. cumsum() gibi temel işlemlerin bile optimize edilmiş olması, karmaşık algoritmaların genel performansını önemli ölçüde artırır.
cumsum() İçin Pratik Uygulama Alanları
cumsum() fonksiyonu, basit bir matematiksel işlem olmasına rağmen, birçok farklı alanda güçlü ve pratik uygulamalara sahiptir:
1. Finansal Analiz
* Hisse Senedi Getirileri: Bir hisse senedinin veya portföyün günlük getirilerinin kümülatif toplamı, zaman içindeki toplam getiriyi veya kayıpları gösterir.
daily_returns = np.array([0.01, -0.005, 0.02, -0.01, 0.03]) # Günlük getiriler
cumulative_returns = (1 + daily_returns).cumprod() - 1 # Kümülatif çarpan getiri
print("Kümülatif Getiriler:", cumulative_returns)
# Eğer basit toplam getiri isteniyorsa:
# cumulative_sum_returns = np.cumsum(daily_returns)
# print("Basit Kümülatif Getiri Toplamı:", cumulative_sum_returns)
* Bütçe Takibi/Nakit Akışı: Bir şirketin veya bireyin günlük/aylık gelir ve giderlerinin kümülatif toplamı, belirli bir dönemdeki toplam nakit akışını veya bütçe durumunu gösterir.
* Kümülatif Kar/Zarar: Bir dizi işlemden elde edilen kar ve zararların kümülatif toplamı, toplam finansal performansı izlemek için kullanılır.
2. Veri Analizi ve İstatistik
* Çalışan Toplamlar (Running Sums): Bir veri akışındaki veya zaman serisindeki çalışan toplamları hesaplamak, trendleri ve birikimleri görselleştirmek için kullanılır.
* Kümülatif Dağılım Fonksiyonları (CDF): Olasılık dağılımlarında, kümülatif toplamlar bir değişkenin belirli bir değerden küçük veya ona eşit olma olasılığını veren CDF'leri hesaplamak için kullanılır.
data = np.array([1, 1, 2, 3, 3, 3, 4, 5])
unique_values, counts = np.unique(data, return_counts=True)
probabilities = counts / len(data)
cumulative_probabilities = np.cumsum(probabilities)
print("Değerler:", unique_values)
print("Olasılıklar:", probabilities)
print("Kümülatif Olasılıklar (CDF):", cumulative_probabilities)
* Sıralı İstatistikler: Sıralı veriler üzerinde çeşitli istatistiksel metriklerin hesaplanmasında temel oluşturur.
3. Görüntü İşleme
* Integral Görüntü (Summed-Area Table): Görüntü işlemede, bir integral görüntü (veya summed-area table), her pikselin değerini, kendisinin ve solundaki ve üstündeki tüm piksellerin toplamı olarak depolar. Bu, dikdörtgen bölgelerdeki piksel toplamlarını çok hızlı bir şekilde hesaplamak için kullanılır ve özellikle Haar özellikleri gibi özellik çıkarımında veya filtrelemede önemlidir. cumsum() bu tabloların oluşturulmasında temel bir adımdır.
image_data = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
integral_image_row = np.cumsum(image_data, axis=1) # Önce satırlar boyunca
integral_image = np.cumsum(integral_image_row, axis=0) # Sonra sütunlar boyunca
print("Orijinal Görüntü Verisi:\n", image_data)
print("İntegral Görüntü (Basitleştirilmiş):\n", integral_image)
4. Sinyal İşleme
* Akümülasyon: Bir sinyalin zaman içindeki toplam enerjisini veya birikimini hesaplamak için kullanılır. Örneğin, bir ses sinyalinin enerji birikimi veya bir sensörden gelen verilerin toplam değişimi.
* Hareket Tespiti: Sensör verilerindeki kümülatif değişiklikleri izleyerek hareket veya durum değişikliklerini tespit etmek.
5. Diğer Uygulamalar
* Veri Düzeltme: Bir sensörün zamanla biriken hatasını düzeltmek için kümülatif toplamlar kullanılabilir.
* Ön Ek Toplamlar (Prefix Sums): Algoritmalarda belirli aralıklardaki toplamları hızlıca bulmak için kullanılan bir teknik olan ön ek toplamları oluşturmak.
İlgili NumPy Fonksiyonları ve Alternatifler
numpy.cumsum() ile yakından ilişkili veya benzer işlevlere sahip başka NumPy fonksiyonları ve Python kütüphaneleri de bulunmaktadır:
* numpy.cumprod(): Kümülatif toplam yerine kümülatif çarpımı hesaplar. Yani, dizideki her eleman, kendinden önceki tüm elemanların çarpımıyla birleştirilir.
arr_prod = np.array([1, 2, 3, 4, 5])
cumulative_product = np.cumprod(arr_prod)
print("Kümülatif Çarpım:", cumulative_product)
# Çıktı: [ 1 2 6 24 120]
* numpy.diff(): Bir dizinin ardışık elemanları arasındaki farkları hesaplar. Bu, cumsum()'ın tersi bir işlem olarak düşünülebilir. Eğer bir dizi üzerinde cumsum() uygulandıysa, diff() uygulamak orijinal diziye geri dönmenizi sağlar (ilk eleman hariç).
arr_original = np.array([1, 2, 3, 4, 5])
cumulative = np.cumsum(arr_original)
print("Kümülatif:", cumulative) # [ 1 3 6 10 15]
diff_result = np.diff(cumulative)
print("Fark:", diff_result) # [ 2 3 4 5] (İlk eleman olan 1 eksik)
* numpy.add.accumulate(): cumsum() ile aynı işlevi gören daha genel bir NumPy ufunc (üniversal fonksiyon) metodudur. np.cumsum(a) aslında np.add.accumulate(a)'nın özel bir durumudur.
* Pandas Kütüphanesi: Pandas DataFrame ve Series nesneleri de cumsum() metoduna sahiptir. Pandas, yapılandırılmış verilerle çalışmak için özel olarak tasarlanmıştır ve cumsum()'ı gruplama (groupby) işlemleriyle birleştirmek gibi daha karmaşık senaryolarda çok güçlüdür.
import pandas as pd
s = pd.Series([1, 2, 3, 4, 5])
print("Pandas Series cumsum:\n", s.cumsum())
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
print("Pandas DataFrame cumsum (sütunlar boyunca varsayılan):\n", df.cumsum())
print("Pandas DataFrame cumsum (satırlar boyunca):\n", df.cumsum(axis=1))
Pandas'ın cumsum()'ı, NaN değerlerini varsayılan olarak atlar (skipna=True), bu da NumPy'dan farklı bir davranıştır ve veri analizinde genellikle daha kullanışlıdır.
cumsum() Kullanırken Dikkat Edilmesi Gerekenler
numpy.cumsum() güçlü bir araç olsa da, onu kullanırken bazı önemli noktaları göz önünde bulundurmak faydalıdır:
* Veri Tipi Taşması (Overflow): Özellikle int32 gibi sınırlı aralığa sahip tam sayı tipleriyle çalışırken, kümülatif toplamların büyüyerek veri tipi aralığını aşması mümkündür. Bu durumda, dtype parametresini np.int64 veya np.float64 gibi daha geniş bir tipe ayarlayarak taşmayı önlemelisiniz. NumPy çoğu durumda otomatik olarak daha geniş bir tipe yükseltme yapsa da, bu davranışı bilmek ve kontrol etmek önemlidir.
* NaN Değerlerinin Yönetimi: cumsum(), NaN değerlerini yoksaymaz; bir NaN değeri toplama dahil edildiğinde, sonraki tüm kümülatif toplamlar da NaN olur. Eğer bu istenmeyen bir durumsa, np.nan_to_num() kullanarak NaN değerlerini sıfırla değiştirebilir veya np.isnan() ile bu değerleri filtreleyip özel olarak işleyebilirsiniz. Pandas'ın cumsum()'ı skipna=True varsayılanıyla NaN'ları atlar, bu da bazen daha sezgisel olabilir.
* Bellek Kullanımı: Büyük dizilerle çalışırken, cumsum() orijinal diziyle aynı boyutta yeni bir dizi döndürür. Bu, bellek tüketimini iki katına çıkarabilir. Çok büyük diziler için bellek kısıtlamaları varsa out parametresini kullanmayı veya veriyi daha küçük parçalara bölerek işlemeyi düşünebilirsiniz.
* axis Parametresi: Çok boyutlu dizilerde axis parametresinin doğru anlaşılması kritik öneme sahiptir. Yanlış axis seçimi, beklenen sonuçları vermeyen hatalı hesaplamalara yol açabilir. Her zaman axis değerinin ne anlama geldiğini ve çıktıyı nasıl etkilediğini görselleştirmeye çalışın.
Gelişmiş Konular ve İpuçları
* Kümülatif Ortalama (Cumulative Mean): Kümülatif toplamı, her adımda toplanan eleman sayısına bölerek kümülatif ortalamayı hesaplayabilirsiniz.
data = np.array([1, 2, 3, 4, 5])
cumulative_sum = np.cumsum(data)
cumulative_count = np.arange(1, len(data) + 1)
cumulative_mean = cumulative_sum / cumulative_count
print("Kümülatif Ortalama:", cumulative_mean)
# Çıktı: [1. 1.5 2. 2.5 3. ]
* Koşullu Kümülatif Toplamlar: Belirli bir koşula uyan elemanların kümülatif toplamını hesaplamak için, önce koşulu uygulayarak bir maske oluşturabilir ve ardından sadece bu elemanlar üzerinde cumsum() uygulayabilirsiniz.
data = np.array([1, -2, 3, -4, 5])
positive_data = np.where(data > 0, data, 0) # Sadece pozitifleri al, diğerleri 0
cumulative_positive_sum = np.cumsum(positive_data)
print("Koşullu Kümülatif Toplam (Sadece Pozitifler):", cumulative_positive_sum)
# Çıktı: [1 1 4 4 9]
* Resetlenen Kümülatif Toplamlar: Bazen, belirli bir koşul karşılandığında kümülatif toplamın sıfırlanması gerekebilir. Bu, genellikle daha karmaşık bir mantık gerektirir ve doğrudan cumsum() ile yapılamaz ancak bir döngü veya daha gelişmiş Pandas/NumPy teknikleriyle uygulanabilir.
Sonuç
numpy.cumsum() fonksiyonu, NumPy kütüphanesinin sunduğu temel ancak son derece güçlü araçlardan biridir. Kümülatif toplamları hızlı ve verimli bir şekilde hesaplama yeteneği, onu veri analizinden finansal modellemeye, görüntü işlemeden sinyal işlemeye kadar birçok bilimsel ve mühendislik uygulamasında vazgeçilmez kılar.
Bu makalede, cumsum()'ın temel kullanımından axis, dtype ve out gibi parametrelerin derinlemesine incelenmesine, performans özelliklerinden pratik uygulama alanlarına ve ilgili diğer fonksiyonlara kadar geniş bir yelpazede bilgi sunduk. cumsum()'ı doğru bir şekilde anlamak ve kullanmak, NumPy ile verimli ve etkili bir şekilde çalışmak için kritik bir adımdır. Büyük veri setleriyle uğraşırken veya karmaşık matematiksel işlemleri hızlandırmak istediğinizde, numpy.cumsum() her zaman başvurabileceğiniz güvenilir bir araç olacaktır. Bu fonksiyonun sunduğu esneklik ve performans, Python'da bilimsel hesaplamaların neden bu kadar popüler olduğunu bir kez daha göstermektedir.
