Kullanımdan kaldırılmış low_memory seçeneği
low_memory
Seçenek düzgün kaldırılan değil, ama aslında farklı bir şey yapmaz çünkü, olması gerektiği [ kaynak ]
Bu low_memory
uyarıyı almanızın nedeni , her sütun için dtype tahmininin çok bellek gerektirmesidir. Pandalar, her sütundaki verileri analiz ederek hangi dtype'un ayarlanacağını belirlemeye çalışır.
Tipi Tahmin (çok kötü)
Pandalar, yalnızca tüm dosya okunduğunda bir sütunun hangi dtype'a sahip olması gerektiğini belirleyebilir. Bu, son değeri okurken söz konusu sütunun dtype'sini değiştirmek zorunda kalmadığınız sürece, tüm dosya okunmadan önce hiçbir şeyin gerçekten ayrıştırılamayacağı anlamına gelir.
User_id adlı bir sütunu olan bir dosya örneğini düşünün. User_id öğesinin her zaman sayı olduğu 10 milyon satır içerir. Pandalar sadece sayılar olduğunu bilemediğinden, tüm dosyayı okuyana kadar orijinal dizeler olarak tutacaktır.
Türleri belirtme (her zaman yapılmalıdır)
ekleme
dtype={'user_id': int}
için pd.read_csv()
dosyayı okumaya başladığında çağrı bu sadece tamsayı olduğunu, pandalar biliyoruz yapacaktır.
Ayrıca kayda değer dosyasındaki son satırı olurdu eğer ki "foobar"
yazılı user_id
sütunda yukarıdaki d_type belirtildi yükleme çökmesine neden oluyordu.
Dtypes tanımlandığında kırılan bozuk veri örneği
import pandas as pd
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
csvdata = """user_id,username
1,Alice
3,Bob
foobar,Caesar"""
sio = StringIO(csvdata)
pd.read_csv(sio, dtype={"user_id": int, "username": "string"})
ValueError: invalid literal for long() with base 10: 'foobar'
dtypes genellikle tipik bir şeydir, onlar hakkında daha fazla bilgiyi buradan edinebilirsiniz:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html
Hangi türler var?
Numpy türlerine erişebiliyoruz: float, int, bool, timedelta64 [ns] ve datetime64 [ns]. Nümerik tarih / saat türlerinin saat diliminden haberdar olmadığını unutmayın .
Pandalar bu dtypes setini kendi ile genişletir:
'datetime64 [ns,]' Saat diliminden haberdar olan bir zaman damgasıdır.
esasen bir enum olan 'kategori' (kaydetmek için tamsayı tuşlarıyla gösterilen dizeler)
'period []' Bir zaman dilimiyle karıştırılmaması için bu nesneler aslında belirli zaman periyotlarına bağlanır
'Seyrek', 'Seyrek [int]', 'Seyrek [şamandıra]' seyrek veriler veya 'İçinde çok fazla delik bulunan veriler' içindir. Veri çerçevesine NaN veya Hiçbiri kaydetmek yerine, nesneleri atlar .
'Aralık' başlı başına bir konudur ancak asıl kullanım endeksleme içindir. Daha fazlasını burada görün
'Int8', 'Int16', 'Int32', 'Int64', 'UInt8', 'UInt16', 'UInt32', 'UInt64', numpy değişkeninin aksine null olabilecek pandaya özgü tamsayılardır.
'dize', dize verileriyle çalışmak için belirli bir dptir ve .str
ve dizideki özniteliğe .
'boolean' numpy 'bool' gibidir ancak eksik verileri de destekler.
Referansın tamamını buradan okuyun:
Pandalar dtype başvurusu
Yakaladım, uyarılar, notlar
Ayarlama dtype=object
yukarıdaki uyarıyı susturur, ancak belleği daha verimli hale getirmez, sadece bir şey varsa verimli çalışır.
Ayar dtype=unicode
hiçbir şey yapmaz, çünkü numpy için a unicode
olarak temsil edilir object
.
Dönüştürücülerin kullanımı
@sparrow, 'foobar'
olarak belirtilen bir sütunda karşılaşıldığında pandaların patlamasını önlemek için dönüştürücü kullanımını doğru bir şekilde işaret eder int
. Dönüştürücülerin pandalarda kullanım için gerçekten ağır ve verimsiz olduğunu ve son çare olarak kullanılması gerektiğini eklemek istiyorum. Bunun nedeni read_csv işleminin tek bir işlem olmasıdır.
CSV dosyaları satır satır işlenebilir ve böylece pandaların desteklemediği bir dosyayı basitçe parçalara ayırarak ve birden çok işlemi çalıştırarak paralel olarak birden çok dönüştürücü tarafından daha verimli bir şekilde işlenebilir. Ama bu farklı bir hikaye.