Przestarzała opcja low_memory
low_memory
Opcja nie jest prawidłowo przestarzałe, ale powinno być, ponieważ w rzeczywistości nie robić nic inaczej [ źródło ]
Powodem, dla którego low_memory
pojawia się to ostrzeżenie, jest to, że zgadywanie typów dla każdej kolumny jest bardzo wymagające pod względem pamięci. Pandas próbuje ustalić, który typ należy ustawić, analizując dane w każdej kolumnie.
Dtype Guessing (bardzo źle)
Pandy mogą określić, jaki typ powinien mieć kolumna po odczytaniu całego pliku. Oznacza to, że tak naprawdę nic nie można przeanalizować przed odczytaniem całego pliku, chyba że ryzykujesz koniecznością zmiany typu tej kolumny podczas czytania ostatniej wartości.
Rozważ przykład jednego pliku, który ma kolumnę o nazwie user_id. Zawiera 10 milionów wierszy, w których identyfikator_użytkownika to zawsze liczby. Ponieważ pandy nie mogą wiedzieć, że to tylko liczby, prawdopodobnie zachowa je jako oryginalne ciągi znaków, dopóki nie przeczyta całego pliku.
Określanie typów (zawsze należy to zrobić)
dodawanie
dtype={'user_id': int}
do pd.read_csv()
połączenia uczyni pandy wiedzieć kiedy zaczyna odczytu pliku, że jest to tylko liczby całkowite.
Warto również zauważyć, że jeśli ostatni wiersz w pliku zostałby "foobar"
zapisany w user_id
kolumnie, ładowanie zawiesiłoby się, gdyby podano powyższy typ kodu.
Przykład uszkodzonych danych, które psują się, gdy zdefiniowane są dtypy
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'
dtypy są zwykle dziwaczne, przeczytaj o nich więcej tutaj:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html
Jakie istnieją typy?
Mamy dostęp do typów numpy: float, int, bool, timedelta64 [ns] i datetime64 [ns]. Zauważ, że typy liczbowe data / czas nie są zależne od strefy czasowej.
Pandy rozszerzają ten zestaw typów o własne:
„datetime64 [ns,]” Który jest znacznikiem czasu uwzględniającym strefę czasową.
„kategoria”, która jest zasadniczo wyliczeniem (ciągi znaków reprezentowane przez klucze całkowite do zapisania
„okres []” Nie należy mylić ich z timedelta, obiekty te są faktycznie zakotwiczone w określonych przedziałach czasowych
„Sparse”, „Sparse [int]”, „Sparse [float]” jest przeznaczony do rzadkich danych lub „danych z dużą ilością dziur” Zamiast zapisywać NaN lub None w ramce danych pomija obiekty, oszczędzając miejsce .
„Interwał” jest odrębnym tematem, ale jego głównym zastosowaniem jest indeksowanie. Zobacz więcej tutaj
„Int8”, „Int16”, „Int32”, „Int64”, „UInt8”, „UInt16”, „UInt32”, „UInt64” to liczby całkowite specyficzne dla pand, które można zerować, w przeciwieństwie do wariantu numpy.
„ciąg” jest specyficznym typem do pracy z danymi ciąg i zapewnia dostęp do .str
atrybutu w serii.
„boolean” jest jak numpy „bool”, ale obsługuje także brakujące dane.
Przeczytaj pełne odniesienie tutaj:
Odwołanie do typu pandy
Gotchas, zastrzeżenia, notatki
Ustawienie dtype=object
wyciszy powyższe ostrzeżenie, ale nie sprawi, że będzie bardziej wydajna pamięć, tylko wydajne przetwarzanie.
Ustawienie dtype=unicode
nic nie zrobi, ponieważ dla numpy, a unicode
jest reprezentowane jako object
.
Wykorzystanie konwerterów
@sparrow poprawnie wskazuje użycie konwerterów, aby uniknąć wysadzenia pand podczas spotkania 'foobar'
w kolumnie określonej jako int
. Chciałbym dodać, że konwertery są naprawdę ciężkie i nieefektywne w użyciu w pandach i powinny być używane w ostateczności. Wynika to z faktu, że proces read_csv jest procesem pojedynczym.
Pliki CSV mogą być przetwarzane wiersz po wierszu, a tym samym mogą być przetwarzane przez wiele konwerterów równolegle bardziej wydajnie, po prostu dzieląc plik na segmenty i uruchamiając wiele procesów, czego nie obsługuje panda. Ale to inna historia.