0Pricing
Pandas & NumPy Academy · Ders

Kategorik Veri Türü

Düşük kardinaliteli string sütunlarını pandas Categorical türüne dönüştürerek bellek kullanımını azaltın ve groupby işlemlerini hızlandırın.

Kategorik Veri Türü, CoddyKit'te ücretsiz bir Pandas & NumPy Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Pandas & NumPy Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Pandas & NumPy Academy kursu toplamda 4 dersten oluşur.

Categorical Veri Türü Nedir?

Pandas'teki Categorical veri türü, cinsiyet, durum, bölge veya ürün kategorisi gibi sınırlı sayıda ayrık değer (düşük kardinalite) içeren sütunlar için tasarlanmıştır. Pandas, her satır için dizenin tamamını saklamak yerine benzersiz değerleri ( kategoriler olarak adlandırılır) bir kez saklar ve bunlara başvurmak için her satırda bir tamsayı kodu kullanır. Bu, veritabanlarının arama tablolarını veya enum türlerini kullanma biçimine benzer.

import pandas as pd

df = pd.DataFrame({
    'region': ['North', 'South', 'East', 'North', 'East', 'South'] * 1000
})

# Without Categorical: object dtype stores every string
print('object dtype memory:', df['region'].memory_usage(deep=True))

# With Categorical: only stores 3 unique values + integer codes
df['region_cat'] = df['region'].astype('category')
print('category dtype memory:', df['region_cat'].memory_usage(deep=True))

Categorical Series Oluşturma

Herhangi bir Series üzerinde .astype('category') çağırarak bir sütunu Categorical türüne dönüştürün. Sonuçta oluşan Categorical Series, benzersiz değerleri .cat.categories olarak, tamsayı konum kodlarını da .cat.codes olarak saklar. Kategorileri ve sıralarını baştan belirtmek için pd.Categorical() ile doğrudan bir Categorical da oluşturabilirsiniz.

import pandas as pd

s = pd.Series(['low', 'high', 'med', 'high', 'low'])
s_cat = s.astype('category')

print(s_cat.cat.categories)  # Index(['high', 'low', 'med'], dtype='object')
print(s_cat.cat.codes)       # integer codes per row
# 0    1
# 1    0
# 2    2
# 3    0
# 4    1

Categorical ile Bellek Tasarrufu

Categorical veri türüyle elde edilen bellek tasarrufu kardinalite oranına (benzersiz değerler ÷ toplam satır sayısı) bağlıdır. 1.000.000 satırlık bir sütunda 5 benzersiz dize bulunduğunda object veri türü 1 milyon dize işaretçisi (her biri yaklaşık 50+ bayt) saklarken Categorical yalnızca 5 dize ile 1 milyon adet 8 bitlik tamsayı saklar. Tasarruf 5-20 kat olabilir; 50 MB'lık bir sütun 2-5 MB boyutuna inebilir.

import pandas as pd
import numpy as np

n = 1_000_000
statuses = np.random.choice(['active', 'inactive', 'pending'], size=n)
df = pd.DataFrame({'status': statuses})

object_mem = df['status'].memory_usage(deep=True) / 1e6
df['status'] = df['status'].astype('category')
cat_mem = df['status'].memory_usage(deep=True) / 1e6

print(f'Object dtype:    {object_mem:.1f} MB')
print(f'Category dtype:  {cat_mem:.1f} MB')
print(f'Reduction:       {object_mem/cat_mem:.1f}x')

Sıralama için Düzenli Categorical

Bazen kategorilerin doğal bir sırası vardır — örneğin 'low' < 'medium' < 'high' veya tişört bedenlerinde XS < S < M < L < XL. Sıralı bir Categorical bu sıralamayı temsil eder; anlamlı karşılaştırma işleçlerini (<, >= vb.) etkinleştirir ve groupby sonuçlarının alfabetik olarak değil, doğru anlamsal sırada sıralanmasını sağlar.

import pandas as pd

df = pd.DataFrame({
    'priority': ['high', 'low', 'medium', 'high', 'low']
})

priority_type = pd.CategoricalDtype(
    categories=['low', 'medium', 'high'],
    ordered=True
)
df['priority'] = df['priority'].astype(priority_type)

# Comparison now works correctly
print(df['priority'] >= 'medium')
# 0     True
# 1    False
# 2     True
# 3     True
# 4    False

Sıralı Categorical Değerleri Sıralama

Sıralı bir Categorical sütununu sıraladığınızda Pandas, alfabetik sıra yerine tanımlanan kategori sırasını kullanır. Bu nedenle 'low', dizeler olarak nasıl sıralanacaklarından bağımsız biçimde 'medium' değerinden, o da 'high' değerinden önce gelir. Bu, doğru sıralanmış özet tabloları ve grafikler oluşturmak için kritik öneme sahiptir.

import pandas as pd

df = pd.DataFrame({
    'severity': pd.Categorical(
        ['high', 'low', 'medium', 'low', 'high'],
        categories=['low', 'medium', 'high'],
        ordered=True
    ),
    'count': [5, 20, 8, 15, 3]
})

# sort_values respects the categorical order
print(df.sort_values('severity')[['severity', 'count']])
#   severity  count
# 1      low     20
# 3      low     15
# 2   medium      8
# 0     high      5
# 4     high      3

Categorical ile GroupBy Hızı

Pandas, mümkün olan tüm grupları önceden bildiği için Categorical sütunlarındaki groupby() işlemlerini optimize edebilir. Bu, büyük DataFrame'lerde groupby işlemini 2-5 kat hızlandırabilir. Ayrıca Categorical üzerinde groupby, boş olanlar da dahil olmak üzere tüm kategorileri döndürür — böylece bazılarında hiç gözlem olmasa bile özet tablolarınızda beklenen her grup için her zaman bir satır bulunur.

import pandas as pd
import numpy as np

np.random.seed(0)
df = pd.DataFrame({
    'region': pd.Categorical(
        np.random.choice(['North', 'South', 'East', 'West'], 10),
        categories=['North', 'South', 'East', 'West']
    ),
    'sales': np.random.randint(100, 1000, 10)
})

# observed=False shows ALL categories even empty ones
print(df.groupby('region', observed=False)['sales'].sum())

Kategorileri Ekleme ve Kaldırma

Kategori listesini yönetmek için .cat erişicisini kullanın. .cat.add_categories() yeni izin verilen değerler ekler (yeni veri eklemeden önce kullanışlıdır), .cat.remove_unused_categories() ise karşılık gelen satırı olmayan kategori etiketlerini kaldırır — filtrelemeden sonra kullanışlıdır. Önce eklemeden, kategoriler arasında bulunmayan bir değeri atayamazsınız.

import pandas as pd

s = pd.Categorical(['a', 'b', 'a'], categories=['a', 'b', 'c'])
s = pd.Series(s)

print(s.cat.categories)  # Index(['a', 'b', 'c'], dtype='object')
print(s.value_counts())  # a:2, b:1, c:0

# Remove unused category 'c'
s = s.cat.remove_unused_categories()
print(s.cat.categories)  # Index(['a', 'b'], dtype='object')

Kategori Etiketlerini Yeniden Adlandırma

.cat.rename_categories(), temel kodları değiştirmeden kategorileri yeniden adlandırmanızı sağlar. Bu, daha anlaşılır adlar görüntülemek (örneğin 'M' → 'Male') veya object türüne geri dönüp yeniden eşleme yapmadan tutarsız etiket büyük/küçük harf kullanımını düzeltmek istediğinizde kullanışlıdır. Yöntem bir listeyi (konumsal) veya bir sözlüğü (hedefli) kabul eder.

import pandas as pd

s = pd.Series(pd.Categorical(['M', 'F', 'M', 'F'], categories=['M', 'F']))

# Rename using a dict
s = s.cat.rename_categories({'M': 'Male', 'F': 'Female'})
print(s)
# 0      Male
# 1    Female
# 2      Male
# 3    Female
print(s.cat.categories)  # Index(['Male', 'Female'], dtype='object')

Categorical Ne Zaman Kullanılmamalı?

Kardinalite yüksek olduğunda Categorical veri türü kötü bir seçimdir — neredeyse her satır benzersiz bir değer içeriyorsa (kullanıcı kimlikleri, serbest metin yorumları veya UUID'ler gibi), kategori dizini neredeyse özgün veri kadar büyük olur ve bellek tasarrufu sağlamaz. Genel bir kural olarak Categorical'ı yalnızca benzersiz değer sayısı toplam satırların yaklaşık %50'sinden az olduğunda ve özellikle benzersiz değerler onlar veya yüzler düzeyinde olduğunda kullanın.

import pandas as pd
import numpy as np

df = pd.DataFrame({'user_id': range(1_000_000)})

# High-cardinality: every value is unique — don't use Categorical
object_mem = df['user_id'].astype(str).memory_usage(deep=True) / 1e6
cat_mem = df['user_id'].astype(str).astype('category').memory_usage(deep=True) / 1e6

print(f'String: {object_mem:.1f} MB')
print(f'Category: {cat_mem:.1f} MB')
# Category is WORSE for high-cardinality data!

Özet Tablolarda ve Groupby'da Categorical

Categorical kullanmak, groupby ve özet tablo sonuçlarında tutarlı çıktı biçimi sağlar. Categorical olmadan, hiç gözlemi olmayan gruplar sonuçtan sessizce çıkarılır — bu da farklı veri dilimlerini karşılaştırırken hizalanmamış çıktılara neden olabilir. Categorical ve observed=False ile tüm gruplar çıktıda her zaman görünür.

import pandas as pd

df = pd.DataFrame({
    'quarter': pd.Categorical(
        ['Q1', 'Q1', 'Q3'],
        categories=['Q1', 'Q2', 'Q3', 'Q4']
    ),
    'revenue': [100, 200, 300]
})

# observed=False includes Q2 and Q4 even though they have no rows
result = df.groupby('quarter', observed=False)['revenue'].sum()
print(result)
# quarter
# Q1    300
# Q2      0
# Q3    300
# Q4      0

Categorical ve Makine Öğrenmesi

Birçok scikit-learn tahmincisi sayısal girdi bekler. Bir Categorical sütununu bir model için sayılara dönüştürmek üzere .cat.codes (etiket kodlama) veya pd.get_dummies() (tek-sıcak kodlama) kullanın. Tek-sıcak kodlama, kategoriler arasında sıralı bir ilişki varmış izlenimi oluşturmaktan kaçınır. Öncelik düzeyleri gibi sıralı categorical değerlerde etiket kodlama (doğrudan kodlar) uygundur ve sıralama bilgisini taşır.

import pandas as pd

df = pd.DataFrame({
    'colour': pd.Categorical(['red', 'blue', 'green', 'red'])
})

# One-hot encode for unordered categories
one_hot = pd.get_dummies(df['colour'], prefix='colour')
print(one_hot)
#    colour_blue  colour_green  colour_red
# 0            0             0           1
# 1            1             0           0
# 2            0             1           0
# 3            0             0           1

Hızlı Kontrol

Categorical veri türü konusundaki anlayışınızı test edin.

Ders Özeti

Bu derste şunları öğrendiniz: Kategorik veri türü, benzersiz değerleri bir kez depolar ve her satır için tamsayı kodları kullanır; böylece düşük kardinaliteli sütunlarda büyük miktarda bellek tasarrufu sağlar. Sıralı Kategorik, anlamlı karşılaştırmaları ve doğru sıralamayı destekler. observed=False ile groupby ise boş olanlar da dahil tüm kategorileri içerir. Yüksek kardinaliteli sütunlarda Kategorik kullanmaktan kaçının. Sırada tarih dizelerini pd.to_datetime() ile doğru şekilde ayrıştıracağız.

Sıkça Sorulan Sorular

“Kategorik Veri Türü” dersi ücretsiz mi?

Evet — “Kategorik Veri Türü” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Pandas & NumPy Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Pandas & NumPy Academy kursu toplamda 4 dersten oluşur.

“Kategorik Veri Türü” dersinde ne öğreneceğim?

Düşük kardinaliteli string sütunlarını pandas Categorical türüne dönüştürerek bellek kullanımını azaltın ve groupby işlemlerini hızlandırın. Pandas & NumPy Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Pandas & NumPy Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Pandas & NumPy Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Kategorik Veri Türü” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Pandas & NumPy Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Pandas & NumPy Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Sütun Veri Türlerini İnceleme
  2. astype() ile Tür Dönüştürme
  3. Kategorik Veri Türü
  4. Tarihleri Doğru Ayrıştırma
← Pandas & NumPy Academy Sayfasına Dön