Kurs
Benim gibi siz de düzenli olarak Python ile veri analizi yapıyorsanız, CSV dosyalarını okumanın en yaygın görevlerden biri olduğunu kısa sürede fark edersiniz. Ancak veri kümeleriniz büyüdükçe, bu yöntem yavaşlayabilir veya belleği zorlayabilir.
Polars, Pandas’a yüksek performanslı bir alternatif olarak tasarlanmış, hızlı ve modern bir Python DataFrame kütüphanesidir. Hız ve düşük bellek kullanımı odaklı inşa edildiği için, geleneksel araçlara göre büyük veri kümelerini çok daha akıcı şekilde işleyebilir.
Polars’ın temel pl.read_csv() işlevi, ayrıştırma, veri türleri ve bellek kullanımını kontrol etmek için yerleşik seçeneklerle CSV dosyalarını bir DataFrame’e yüklemek için basit bir çözüm sunar.
Bu kılavuzda, Polars pl.read_csv() işlevini kullanarak CSV dosyalarını nasıl okuyacağınızı, ayrıştırmayı nasıl kontrol edeceğinizi ve büyük veri kümelerini nasıl yöneteceğinizi göstereceğim. Yeni başlıyorsanız, Polars ile verileri nasıl dönüştürüp içgörü elde edeceğinizi öğrenmek için Polars’a Giriş kursumuza göz atın.
pl.read_csv()’in Temel Kullanımı
İleri gitmeden önce, ortamınızı nasıl kuracağınızı öğrenmek için Python Polars eğitimimize göz atın.
Şimdi pl.read_csv() işlevi nasıl çalışıyor bakalım:
# import the module
import polars as pl
# Load CSV into a Polars DataFrame
fuel_data = pl.read_csv("Fuel_Consumption_2000-2022.csv")
# Preview first few rows
print(fuel_data.head())
Yukarıdaki örnekte, Polars dosyayı okuyup bir DataFrame’e yüklüyor. İşlev, pandas’ta elde edeceğinize benzer, tablosal bir veri yapısı olan bir Polars DataFrame döndürür.
Varsayılan olarak, pl.read_csv():
-
İlk satırın sütun adlarını içerdiğini varsayar (
has_header=True) -
Sütun veri türlerini otomatik olarak çıkarır
-
Ayraç olarak virgül (
,) kullanır -
Tüm dosyayı belleğe okur
pl.read_csv()’de Yaygın Parametreler
Artık pl.read_csv()’in verileri nasıl yüklediğini öğrendiğinize göre, Polars’ın verilerinizi nasıl ayrıştıracağını özelleştirmek için aşağıdaki parametreleri nasıl kullanabileceğinize bakalım.
Dosya yolu ve kaynak
Polars, verileri farklı kaynaklardan yüklemenize olanak tanır. Yerel bir dize yolu, bir Pathlib nesnesi veya bir URL geçebilirsiniz. Örneğin, aşağıdaki kod, çeşitli yıllarda farklı ülkelerin GSYİH’sini içeren büyük bir csv dosyasını web’den okur.
# Reading from a URL
url = "https://raw.githubusercontent.com/datasets/gdp/master/data/gdp.csv"
gdp_data = pl.read_csv(url)
Ayraçlar ve ayırıcılar
Tüm CSV dosyaları virgül kullanmaz. Sekmeler, noktalı virgüller, boru işareti veya diğer karakterleri işlemek için separator bağımsız değişkenini kullanabilirsiniz. Aşağıdaki örnek, dosyaları okurken ayırıcıların nasıl belirtileceğini gösterir
# Reading a Semicolon-separated file
sales_data = pl.read_csv("2024_sales.csv", separator=";")
# Reading a Tab-separated file (TSV)
orders_data = pl.read_csv("all_orders.tsv", separator="\t")
Üstbilgi (header) işlemesi
Daha önce gördüğümüz gibi, Polars verilerin ilk satırının sütun adlarını içerdiğini varsayar. Dosyanızda bir üstbilgi satırı yoksa, aşağıda gösterildiği gibi has_header=False parametresini kullanın. Polars otomatik olarak column_1, column_2, column_3 vb. gibi sütun adları atayacaktır.
# Load file without a header
orders_data = pl.read_csv("all_orders.csv", has_header=False)
Ayrıca belirli sütun adlarını sağlayarak sütunları yeniden adlandırabilirsiniz. Örneğin:
# Providing specific column names
sales_data = pl.read_csv("sales_April.csv", new_columns=[
"OrderDate", "OrderNumber", "ProductKey", "SalespersonKey", "Salesperson"])
Kodlama
Farklı CSV dosyaları farklı metin kodlamaları kullanabilir. Garip karakterler veya hatalarla karşılaşırsanız kodlamayı belirtin:
# Load CSV into a Polars DataFrame
fuel_data = pl.read_csv("Fuel_Consumption_2000-2022.csv", encoding="utf8")
Diğer yaygın kodlama seçenekleri arasında, geçersiz karakterleri uygun şekilde ele alan ”latin1” ve ”utf8-lossy” bulunur.
Polars’ta CSV Okurken Sütunlar Nasıl Seçilir
Büyük CSV dosyalarıyla çalışırken, çoğu zaman tüm sütunlara ihtiyacınız olmaz. Polars, columns parametresiyle yalnızca ihtiyaç duyduğunuz sütunları yüklemenize olanak tanır.
# Load only specific columns
fuel_data = pl.read_csv("Fuel_Consumption_2000-2022.csv",
columns=["YEAR", "MAKE", "MODEL"]
)
Gerekli sütunları dosyayı yüklerken seçmeniz, gereksiz verileri yüklemediği için bellek kullanımını azaltır. Bu yöntem, dosya okuma hızını artırır ve genel veri hattı performansını iyileştirir.
Polars CSV’de Veri Türleri (Şema) Nasıl Yönetilir
Polars güçlü tür denetimine sahip bir kütüphanedir; yani her sütunun tümüyle aynı veri türünde olması gerekir, örneğin tümü tamsayı veya tümü metin gibi.
Otomatik tür çıkarımı
Varsayılan olarak Polars verilerinizi inceler ve sütun türlerini otomatik olarak belirler. Varsayılan yöntem çoğu durumda iyi çalışır, ancak bazen kimlikleri metin yerine tamsayı olarak ele almak gibi yanlış yorumlamalar yapabilir.
Şemayı elle belirtme
DataFrame’inizde tutarlılık istediğinizde veri şemasını elle belirtmelisiniz. Bu, birden fazla dosya arasında tutarlılık sağlar ve aşağı akış işlemede türle ilgili hatalardan kaçınmanıza yardımcı olur.
Çoğu durumda, geri kalan sütunları Polars’ın çıkarmasına izin verirken belirli sütunların veri türünü belirtmek için schema_overrides kullanın
import polars as pl
# Manually overriding specific data types
empl_data = pl.read_csv(
"all_employees.csv",
schema_overrides={
"id": pl.Int64,
"name": pl.String,
"age": pl.Int64,
"salary": pl.Float64
}
)
Ya da DataFrame’in tüm yapısını tanımlamak için schema kullanın.
# Manually define the full schema
empl_data = pl.read_csv(
"all_employees.csv",
schema={
"id": pl.Int64,
"name": pl.String,
"age": pl.Int64,
"salary": pl.Float64
}
)
Polars CSV’de Eksik Değerler Nasıl Yönetilir
Varsayılan olarak Polars bu eksik değerleri otomatik olarak algılar ve null olarak temsil eder. Bazen bu eksik değerler ”NA”, ”N/A” veya ”missing” gibi belirli dizelerle gösterilir. Bunları null olarak ele almak için null_values ile tanımlayabilirsiniz.
# Treating "N/A" and "EMPTY" as nulls
survey_data = pl.read_csv(
"survey_results.csv",
null_values=["N/A", "EMPTY", "null"]
)
Eksik değerleri doğru şekilde yönettiğinizde, veri türlerinde tutarlılığı sağlarsınız ve yanlış hesaplamaları önlersiniz; bu da analiz ve modelleme sırasında hataları azaltır.
Polars ile Büyük CSV Dosyalarını Okuma
Mevcut RAM’inizi aşan büyük veri kümeleriyle çalışırken, Polars tüm dosyayı bir kerede yüklemeden veriyi işleyerek gerçekten öne çıkar.
scan_csv() ile Tembel Yükleme
read_csv() gibi verileri hemen belleğe yüklemek yerine, Polars yalnızca gereken işlemleri yürüten ve optimize edilmiş bir sorgu planı oluşturan tembel bir alternatif scan_csv() sağlar.
Aşağıdaki örnekte, pl.scan_csv CSV dosyasını yüklemeden tarar, otomobil markası “ACURA” olan satırlarda yalnızca “YEAR”, “MAKE” ve “MODEL” sütunlarını almak için bir sorgu kurar, ardından bu sorguyu yürütür. Bu işlem, tüm dosya yerine yalnızca süzülmüş veri dilimini belleğe yükler.
# Lazily reference the file (no data loaded yet)
fuel_consumption = pl.scan_csv("Fuel_Consumption_2000-2022.csv")
fuel_consumption_filtered = fuel_consumption.select(
["YEAR", "MAKE", "MODEL"]).filter(pl.col("MAKE") == "ACURA")
# Execute the query and load only the required data
fuel_consumption_acura = fuel_consumption_filtered.collect()
scan_csv() kullanmanızı öneririm:
- Belleğe rahatça sığmayan büyük dosyalarla çalışırken
- Filtreleme, seçim ve toplulaştırma gibi birden çok dönüşüm uygularken
- Yürütmeden önce sorgu optimizasyonu istediğinizde
Akış ve bellek verimliliği
Polars ayrıca verileri parçalara bölerek akış halinde işlemeye olanak tanır; böylece dosya boyutundan bağımsız olarak tepe bellek kullanımı sabit kalır.
Büyük CSV dosyaları için, tembel bir sorgu oluşturmak üzere scan_csv() ile başlayın. scan_csv() çağrıldığında dosya tamamen yüklenmez.
# Read data in chunks
fuel_consumption = pl.scan_csv("Fuel_Consumption_2000-2022.csv",
low_memory=True)
Yukarıdaki yöntem hâlâ read_csv kullanmaya devam ettiğinden, en iyi yaklaşım tembel yürütmeyi akışla birleştirmektir.
Aşağıdaki örnekte, Polars dosyayı bir ardışık düzende, satır satır partiler halinde işler ve herhangi bir anda yalnızca filtrelenmiş satırları (“CYLINDERS” > 3 olduğu yerler) bellekte tutar.
# Lazily reference the file (no data loaded yet)
fuel_consumption = pl.scan_csv("Fuel_Consumption_2000-2022.csv")
result = fuel_consumption.filter(pl.col("CYLINDERS") > 3)
# Stream execution instead of loading everything at once
fuel_consumption_high = result.collect(engine="streaming")
Pandas’a karşı performans avantajı
Pandas ile karşılaştırıldığında, Polars genellikle CSV okuma ve işleme için daha iyi performans sunar; bunu bir sonraki bölümde göreceğiz.
Polars read_csv ve Pandas read_csv
Aşağıdaki tablo, Python’da csv okurken Polars ve Pandas arasındaki farkı özetler.
|
Boyut |
Polars |
Pandas |
|
Hız |
Çok iş parçacığı ve optimize ayrıştırma sayesinde daha hızlı |
Büyük dosyalarda daha yavaş (çoğunlukla tek iş parçacıklı) |
|
Bellek Kullanımı |
Daha düşük ayak izi; tembel + akış desteği |
Tüm veri kümesini istekli biçimde belleğe yükler |
|
Sözdizimi |
|
|
|
Yürütme Modeli |
Tembel yürütmeyi destekler ( |
Yalnızca istekli (anlık) yürütme |
|
Optimizasyon |
Yerleşik sorgu optimizasyonu (projeksiyon, filtreleme) |
Sınırlı otomatik optimizasyon |
|
En İyi Kullanım Durumu |
Büyük veri kümeleri, performans kritik iş akışları |
Daha küçük veri kümeleri, hızlı analiz |
Analitik ihtiyaçlarınıza en uygun aracı belirlemek için Pandas ve Polars arasındaki farkları ele aldığımız makalemizi okumanızı öneririm.
Farklı Kaynaklardan CSV Okuma
Daha önce gördüğümüz gibi, Polars ile farklı kaynaklardan csv dosyası okuyabilirsiniz. Yukarıdaki örneklerde, yerel dosyalardan ve URL’lerden csv okumanın nasıl yapıldığını gösterdim.
Buna ek olarak, Polars sıkıştırılmış CSV dosyalarını otomatik olarak işleyebilir. Örneğin, aşağıdaki kod bir .gzip dosyasından veri okur.
# Read gzip-compressed CSV
census_data = pl.read_csv("2018_census.csv.gz")
Yaygın Hatalar ve Sorun Giderme
Polars gibi yüksek performanslı bir motorla bile, özellikle bir csv dosyası okurken bazı sorunlarla karşılaşabilirsiniz. Aşağıda, karşılaştığım yaygın problemler ve bunların nasıl düzeltileceği yer alıyor.
-
Kodlama hataları:
UnicodeDecodeErrorgibi bir hata görebilirsiniz; bu, dosyanın UTF-8 kodlaması kullanmadığı anlamına gelir ve bu sorun daha eski dosyalarda veya Excel’in belirli sürümlerinden dışa aktarılan CSV’lerde yaygındır. Bunu düzeltmek için uygun kodlamayı ayarlayın veya dosyada tutarsız ya da bozuk karakterler varsa“utf8-lossy”kullanın. -
Ayraç sorunları: DataFrame’iniz yükleniyor ama tüm veriler tek bir sütunda toplanıyorsa, Polars ayırıcıyı tanımamış demektir. Bunu çözmek için, noktalı virgül (
;), sekme (\t) veya boru (|) gibi doğru ayırıcıyıseparatorbağımsız değişkeniyle açıkça ayarlayın. -
Yanlış veri türleri: Bazen Polars sütun türlerini yanlış çıkarabilir; örneğin sayısal kimlikleri metin olarak okumak veya ayrıştırma hatalarıyla karşılaşmak gibi. Böyle bir durumda, belirli sütunların veri türünü belirtmek için
schema_overrideskullanabilirsiniz. Tüm sütunların türlerini tanımlamak istiyorsanızschemakullanın. Ayrıcainfer_schema_lengthdeğerini artırarak Polars’ın şemayı çıkarmadan önce daha fazla satırı incelemesini sağlayabilirsiniz. -
Büyük dosyalarda bellek sorunları: Python süreciniz büyük bir dosyayı yüklerken çöküyorsa, RAM’inizi tüketmişsiniz demektir. Bunu düzeltmek için, bellek kullanımını azaltıp performansı artırmak üzere
read_csv()yerine tembel yükleme sağlayanscan_csv()’e geçin. Ayrıca veri kümesinin daha az sütununu yükleyebilir veya veriyi parçalara ayırarak yüklemek için akış (stream) yürütmesini kullanabilirsiniz.
Sonuç
Polars’taki read_csv() işlevi kullanımı basit ama gerçek dünya görevleri için yeterince güçlüdür. Bana göre, büyüyen veri kümeleriyle çalışırken Polars belirgin bir avantaja sahiptir.
Bir sonraki adım olarak, çeşitli kullanım alanları hakkında daha fazla bilgi edinmek için Polars GPU motoru hakkında yazdığımız bloğumuza göz atın. Uygulamaya hazırsanız, gerçek dünyadaki analitik soruları çözmek, hesaplamalar uygulamak ve spor analitiği problemlerine temel ML tekniklerini uygulamak için Polars ile Super Bowl Analizi eşli kodlama içeriğimize katılın.
SSS
Polars’ta read_csv() ve scan_csv() arasındaki fark nedir?
read_csv() verileri belleğe istekli (eager) biçimde yüklerken, scan_csv() tembel (lazy) yürütme kullanır ve yalnızca .collect() çağırdığınızda veriyi işler.
read_csv() yerine scan_csv()’i ne zaman kullanmalıyım?
Büyük veri kümeleri için veya dönüşümleri birbirine zincirlerken scan_csv() kullanın; yürütmeyi optimize eder ve bellek kullanımını azaltır.
Polars bir CSV dosyasından yalnızca belirli sütunları okuyabilir mi?
Evet, read_csv() içinde columns=[...] parametresini kullanın veya tembel bir sorguda scan_csv() ile sütun seçin.
Polars CSV dosyalarındaki eksik değerleri nasıl işlerim?
Polars, boş değerleri varsayılan olarak null kabul eder ve null_values= ile özel null işaretleyicileri tanımlayabilirsiniz.
Polars sıkıştırılmış CSV dosyalarını destekliyor mu?
Evet, .gz ve .zip gibi sıkıştırılmış formatları elle çıkarmaya gerek kalmadan okuyabilir.
