course
Jeśli regularnie używasz Pythona do analizy danych, tak jak ja, szybko zauważysz, że wczytywanie plików CSV to jedno z najczęstszych zadań. Jednak wraz ze wzrostem zbiorów danych ta metoda może stać się wolna lub pamięciożerna.
Polars to szybka, nowoczesna biblioteka DataFrame dla Pythona, zaprojektowana jako wysokowydajna alternatywa dla Pandas. Radzi sobie z dużymi zbiorami danych znacznie płynniej niż tradycyjne narzędzia, ponieważ jest zbudowana z naciskiem na szybkość i niskie zużycie pamięci.
Kluczowa funkcja Polars pl.read_csv() zapewnia prosty sposób wczytywania plików CSV do DataFrame, z wbudowanymi opcjami kontroli parsowania, typów danych i zużycia pamięci.
W tym przewodniku pokażę ci, jak czytać pliki CSV, kontrolować parsowanie i obsługiwać duże zbiory danych za pomocą funkcji Polars pl.read_csv(). Jeśli dopiero zaczynasz, sprawdź nasz kurs Introduction to Polars, aby nauczyć się manipulować danymi i wyciągać wnioski z użyciem Polars.
Podstawowe użycie pl.read_csv()
Zanim przejdziemy dalej, zerknij na nasz poradnik Python Polars, aby dowiedzieć się, jak przygotować środowisko.
Sprawdźmy teraz, jak działa funkcja pl.read_csv():
# 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())
W powyższym przykładzie Polars czyta plik i ładuje go do DataFrame. Funkcja zwraca Polars DataFrame, czyli tabelaryczną strukturę danych, podobną do tego, co otrzymasz w pandas.
Domyślnie pl.read_csv():
-
Zakłada, że pierwszy wiersz zawiera nazwy kolumn (
has_header=True) -
Automatycznie wnioskuje typy danych kolumn
-
Używa przecinka (
,) jako separatora -
Wczytuje cały plik do pamięci
Najczęstsze parametry w pl.read_csv()
Gdy już wiesz, jak pl.read_csv() ładuje dane, zobaczmy, jak dzięki poniższym parametrom możesz dostosować sposób parsowania danych przez Polars.
Ścieżka pliku i źródło
Polars pozwala wczytywać dane z różnych źródeł. Możesz przekazać lokalną ścieżkę jako string, obiekt Pathlib lub nawet URL. Na przykład poniższy kod czyta duży plik csv z sieci zawierający PKB różnych krajów w różnych latach.
# Reading from a URL
url = "https://raw.githubusercontent.com/datasets/gdp/master/data/gdp.csv"
gdp_data = pl.read_csv(url)
Separatory
Nie wszystkie pliki CSV używają przecinków. Możesz użyć argumentu separator, aby obsłużyć tabulatory, średniki, pionowe kreski lub inne znaki. Poniższy przykład pokazuje, jak określić separatory podczas czytania plików
# 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")
Obsługa nagłówków
Jak widzieliśmy wcześniej, Polars zakłada, że pierwszy wiersz danych zawiera nazwy kolumn. Jeśli twój plik nie ma wiersza nagłówka, użyj parametru has_header=False, jak poniżej. Polars automatycznie przypisze nazwy kolumn takie jak column_1, column_2, column_3 itd.
# Load file without a header
orders_data = pl.read_csv("all_orders.csv", has_header=False)
Możesz też zmienić nazwy kolumn, podając konkretne nazwy. Na przykład:
# Providing specific column names
sales_data = pl.read_csv("sales_April.csv", new_columns=[
"OrderDate", "OrderNumber", "ProductKey", "SalespersonKey", "Salesperson"])
Kodowanie
Różne pliki CSV mogą używać różnych kodowań tekstu. Jeśli trafiasz na dziwne znaki lub błędy, określ kodowanie:
# Load CSV into a Polars DataFrame
fuel_data = pl.read_csv("Fuel_Consumption_2000-2022.csv", encoding="utf8")
Inne popularne opcje kodowania to ”latin1” i ”utf8-lossy”, które odpowiednio obsługują nieprawidłowe znaki.
Jak wybierać kolumny podczas czytania CSV w Polars
Pracując z dużymi plikami CSV, często nie potrzebujesz każdej kolumny. Polars pozwala wczytać tylko te kolumny, których potrzebujesz, używając parametru columns.
# Load only specific columns
fuel_data = pl.read_csv("Fuel_Consumption_2000-2022.csv",
columns=["YEAR", "MAKE", "MODEL"]
)
Wybranie potrzebnych kolumn już na etapie wczytywania pliku zmniejsza zużycie pamięci, bo nie ładujesz zbędnych danych. Ta metoda przyspiesza też odczyt pliku i poprawia wydajność całego pipeline’u.
Jak obsługiwać typy danych (schemat) w CSV Polars
Polars to biblioteka o silnym typowaniu, co oznacza, że każda kolumna musi mieć spójny typ danych, np. same liczby całkowite lub same stringi.
Automatyczne wnioskowanie typów
Domyślnie Polars analizuje twoje dane i automatycznie określa typy kolumn. Ta metoda działa dobrze w większości przypadków, ale czasem może błędnie zinterpretować kolumny, np. traktując identyfikatory jako liczby całkowite zamiast stringów.
Ręczne określanie schematu
Gdy zależy ci na spójności w DataFrame, powinieneś ręcznie określić schemat danych. Zapewnia to zgodność między wieloma plikami i pomaga uniknąć błędów typów na dalszych etapach przetwarzania.
W większości przypadków użyj schema_overrides, aby wskazać typ danych dla konkretnych kolumn, pozostawiając Polarsowi wnioskowanie pozostałych kolumn
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
}
)
Albo użyj schema, aby zdefiniować całą strukturę DataFrame.
# 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
}
)
Jak obsługiwać brakujące wartości w CSV Polars
Domyślnie Polars automatycznie wykrywa brakujące wartości i reprezentuje je jako null. Czasami brakujące wartości są reprezentowane przez konkretne stringi, takie jak ”NA”, ”N/A” lub ”missing”. Możesz je zdefiniować za pomocą null_values, aby traktować je jako null.
# Treating "N/A" and "EMPTY" as nulls
survey_data = pl.read_csv(
"survey_results.csv",
null_values=["N/A", "EMPTY", "null"]
)
Prawidłowa obsługa braków zapewnia spójne typy danych i zapobiega błędnym obliczeniom, ograniczając błędy podczas analizy i modelowania.
Czytanie dużych plików CSV w Polars
Pracując z dużymi zbiorami danych, które przekraczają dostępną pamięć RAM, Polars naprawdę błyszczy, przetwarzając dane bez jednoczesnego ładowania całego pliku.
Leniwe wczytywanie z scan_csv()
Zamiast natychmiast wczytywać dane do pamięci jak read_csv(), Polars oferuje leniwą alternatywę, scan_csv(), która buduje zoptymalizowany plan zapytania i wykonuje tylko potrzebne operacje.
W poniższym przykładzie pl.scan_csv skanuje plik CSV bez jego wczytywania, buduje zapytanie, aby pobrać tylko kolumny „YEAR”, „MAKE” i „MODEL” tam, gdzie marka auta to „ACURA”, a następnie wykonuje to zapytanie. Dzięki temu do pamięci trafi jedynie przefiltrowany wycinek danych, a nie cały plik.
# 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()
Polecam używać scan_csv() gdy:
- Pracujesz z dużymi plikami, które nie mieszczą się wygodnie w pamięci
- Stosujesz wiele transformacji, takich jak filtrowanie, wybór i agregacje
- Chcesz optymalizacji zapytania przed wykonaniem
Streaming i efektywność pamięciowa
Polars pozwala też na strumieniowe przetwarzanie danych w kawałkach, utrzymując stały szczytowy użytek pamięci niezależnie od rozmiaru pliku.
Dla dużych plików CSV zacznij od scan_csv(), aby utworzyć leniwe zapytanie. Plik nie jest w pełni ładowany w momencie wywołania scan_csv().
# Read data in chunks
fuel_consumption = pl.scan_csv("Fuel_Consumption_2000-2022.csv",
low_memory=True)
Ponieważ powyższa metoda wciąż używa read_csv, najlepszym podejściem jest połączenie leniwego wykonania ze streamingiem.
W poniższym przykładzie Polars przetwarza plik potokowo, wiersz po wierszu w partiach, przechowując w danej chwili w pamięci tylko przefiltrowane wiersze (gdzie “CYLINDERS” > 3).
# 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")
Przewaga wydajności nad Pandas
W porównaniu z pandas, Polars często wypada lepiej przy odczycie i przetwarzaniu CSV, co zobaczymy w następnej sekcji.
Polars read_csv vs Pandas read_csv
Poniższa tabela podsumowuje różnice między Polars i Pandas podczas czytania CSV w Pythonie.
|
Aspekt |
Polars |
Pandas |
|
Szybkość |
Szybszy dzięki wielowątkowości i zoptymalizowanemu parsowaniu |
Wolniejszy przy dużych plikach (głównie jednowątkowy) |
|
Zużycie pamięci |
Niższy narzut; wspiera tryb leniwy + streaming |
Ładuje cały zbiór danych zachłannie do pamięci |
|
Składnia |
|
|
|
Model wykonania |
Obsługuje wykonanie leniwe ( |
Tylko wykonanie zachłanne (natychmiastowe) |
|
Optymalizacja |
Wbudowana optymalizacja zapytań (projekcja, filtrowanie) |
Ograniczona automatyczna optymalizacja |
|
Najlepszy przypadek użycia |
Duże zbiory danych, krytyczne pod kątem wydajności workflowy |
Mniejsze zbiory danych, szybka analiza |
Polecam przeczytanie naszego artykułu o różnicach między Pandas a Polars, aby określić, które narzędzie najlepiej pasuje do twoich potrzeb analitycznych.
Czytanie CSV z różnych źródeł
Jak widzieliśmy wcześniej, możesz używać Polars do czytania plików csv z różnych źródeł. W powyższych przykładach pokazałem, jak czytać csv z plików lokalnych i z URL-i.
Dodatkowo Polars może automatycznie obsługiwać skompresowane pliki CSV. Na przykład poniższy kod czyta dane z pliku .gzip.
# Read gzip-compressed CSV
census_data = pl.read_csv("2018_census.csv.gz")
Typowe błędy i rozwiązywanie problemów
Nawet przy tak wydajnym silniku jak Polars wciąż możesz napotkać problemy, zwłaszcza podczas czytania pliku csv. Oto niektóre z częstych problemów, na które trafiałem, i jak je rozwiązać.
-
Błędy kodowania: Możesz zobaczyć błąd
UnicodeDecodeError, co oznacza, że plik nie używa kodowania UTF-8 — to częsty problem w starszych plikach lub CSV eksportowanych z niektórych wersji Excela. Aby to naprawić, ustaw odpowiednie kodowanie albo użyj“utf8-lossy”, jeśli plik zawiera niespójne lub zepsute znaki. -
Problemy z separatorem: Jeśli DataFrame się ładuje, ale wszystkie dane lądują w jednej kolumnie, Polars nie rozpoznał separatora. Aby to rozwiązać, jawnie ustaw właściwy separator za pomocą argumentu
separator, np. średnik (;), tabulator (\t) lub pionowa kreska (|). -
Nieprawidłowe typy danych: Czasami Polars może błędnie wywnioskować typy kolumn, np. odczytać numeryczne ID jako stringi lub napotkać błędy parsowania. W takiej sytuacji użyj
schema_overrides, aby wskazać typ danych dla konkretnych kolumn. Jeśli chcesz zdefiniować typy dla każdej kolumny, użyjschema. Możesz też zwiększyćinfer_schema_length, aby Polars przeanalizował więcej wierszy przed wnioskowaniem schematu. -
Problemy z pamięcią przy dużych plikach: Jeśli proces Pythona się wyłącza podczas ładowania dużego pliku, oznacza to, że wyczerpałeś RAM. Aby to naprawić, przełącz się z
read_csv()nascan_csv()dla leniwego ładowania, by zmniejszyć zużycie pamięci i poprawić wydajność. Możesz też wczytać mniej kolumn zbioru danych albo użyć wykonania strumieniowego, aby ładować dane partiami.
Podsumowanie
Funkcja read_csv() w Polars jest prosta w użyciu, ale wystarczająco potężna do zadań produkcyjnych. Moim zdaniem Polars ma wyraźną przewagę przy pracy z rosnącymi zbiorami danych.
Jako kolejny krok zajrzyj na nasz blog o silniku GPU w Polars, aby dowiedzieć się więcej o jego zastosowaniach. Jeśli masz ochotę na praktykę, wypróbuj nasz Super Bowl Analytics with Polars code-along, aby rozwiązywać realne problemy analityczne, stosować obliczenia i wykorzystać podstawowe techniki ML w analityce sportowej.
FAQs
Jaka jest różnica między read_csv() a scan_csv() w Polars?
read_csv() ładuje dane zachłannie do pamięci, a scan_csv() używa wykonania leniwego i przetwarza dane dopiero po wywołaniu .collect().
Kiedy używać scan_csv() zamiast read_csv()?
Używaj scan_csv() dla dużych zbiorów danych lub przy łączeniu wielu transformacji, ponieważ optymalizuje wykonanie i zmniejsza zużycie pamięci.
Czy Polars może czytać tylko wybrane kolumny z pliku CSV?
Tak, użyj parametru columns=[...] w read_csv() lub wybierz kolumny w leniwym zapytaniu z scan_csv().
Jak obsługiwać brakujące wartości w plikach CSV w Polars?
Polars domyślnie traktuje puste wartości jako null, a własne znaczniki braków możesz zdefiniować parametrem null_values=.
Czy Polars obsługuje skompresowane pliki CSV?
Tak, obsługuje skompresowane formaty, takie jak .gz i .zip, bez ręcznego rozpakowywania.