Wprowadzenie do obiektów Dask DataFrame
Zastąp pd.read_csv i pd.DataFrame odpowiednikami z Dask, wywołuj compute(), aby uruchomić wykonanie, i profiluj grafy zadań.
Wprowadzenie do obiektów Dask DataFrame to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.
Czym jest Dask?
Dask to biblioteka do obliczeń równoległych w Pythonie, która rozszerza możliwości NumPy i Pandas na zbiory danych większe niż pamięć RAM. Jej moduł dask.dataframe udostępnia interfejs DataFrame niemal identyczny jak w Pandas, ale zamiast natychmiast wykonywać operacje, Dask tworzy graf zadań i wykonuje go leniwie po wywołaniu .compute(). Dzięki temu Dask może rozdzielać pracę między wiele rdzeni, a nawet wiele maszyn, przy minimalnych zmianach w kodzie.
Instalowanie i importowanie Dask
Dask instaluje się za pomocą polecenia pip install dask[dataframe]. Przyjęta konwencja importu to import dask.dataframe as dd. Wewnętrznie obiekt Dask DataFrame jest podzielony na wiele mniejszych obiektów Pandas DataFrame, z których każdy jest przetwarzany niezależnie. Operacje na obiekcie Dask DataFrame tworzą leniwy graf zadań — nic nie jest wykonywane, dopóki nie zostanie wywołane .compute(). To rozdzielenie opisywania obliczeń od ich wykonywania stanowi kluczową ideę Dask.
import dask.dataframe as dd
# Read a large CSV — returns a Dask DataFrame immediately (no data loaded yet)
ddf = dd.read_csv('large_sales.csv')
print(type(ddf)) # dask.dataframe.core.DataFrame
print(ddf.columns.tolist())
print(ddf.dtypes)Dask a Pandas: najważniejsza różnica
W Pandas każda operacja jest wykonywana natychmiast i zachłannie. W Dask operacje zwracają kolejny obiekt Dask reprezentujący odroczone obliczenie. Dopiero po wywołaniu .compute() Dask faktycznie odczytuje dane i wykonuje graf zadań. Leniwe wykonywanie pozwala Daskowi zoptymalizować plan przed rozpoczęciem obliczeń — na przykład może połączyć następujące po sobie filtry, aby uniknąć wielokrotnego wczytywania danych. Można porównać to do przepisu: Dask zapisuje przepis, a .compute() przyrządza danie.
import dask.dataframe as dd
ddf = dd.read_csv('sales.csv')
# This does NOT run yet — just builds the task graph
filtered = ddf[ddf['amount'] > 1000]
agg = filtered.groupby('region')['amount'].sum()
print(type(agg)) # dask.dataframe.core.Series
# NOW execute everything
result = agg.compute()
print(result)Partycje: podstawowa koncepcja
Obiekt Dask DataFrame jest podzielony na partycje, z których każda jest zwykłym obiektem Pandas DataFrame. Domyślnie dd.read_csv tworzy jedną partycję na plik (lub jedną na każde 128 MB w przypadku dużych plików). Można to kontrolować za pomocą blocksize. Sprawdzenie ddf.npartitions pokazuje liczbę istniejących partycji. Większa liczba partycji zwiększa możliwości przetwarzania równoległego, ale wiąże się z większym narzutem; mniejsza liczba zmniejsza narzut, lecz ogranicza równoległość. Optymalnym rozwiązaniem jest zazwyczaj kilkaset partycji.
import dask.dataframe as dd
ddf = dd.read_csv('data/*.csv') # Read multiple CSV files at once
print('Number of partitions:', ddf.npartitions)
# Access a single partition as a Pandas DataFrame
first_partition = ddf.get_partition(0).compute()
print('Partition 0 shape:', first_partition.shape)Znane operacje Pandas w Dask
Większość typowych operacji Pandas działa w Dask w identyczny sposób: .head(), .tail(), .describe(), indeksowanie boolowskie, .groupby(), .merge() i .assign() mają swoje odpowiedniki w Dask. Największa różnica polega na tym, że aby zmaterializować wynik, należy wywołać .compute(). Operacje, które Pandas wykonuje w milisekundach, mogą w Dask trwać sekundy z powodu narzutu grafu zadań — dlatego Pandas należy stosować dla małych danych, a Dask wtedy, gdy dane nie mieszczą się w pamięci RAM.
import dask.dataframe as dd
ddf = dd.read_csv('transactions.csv')
# Filtering — same syntax as Pandas
high_value = ddf[ddf['amount'] > 500]
# GroupBy aggregation
by_region = high_value.groupby('region')['amount'].mean()
# Execute
result = by_region.compute()
print(result.sort_values(ascending=False))Odczytywanie wielu plików za pomocą wzorców glob
Jedną z najbardziej przydatnych funkcji Dask jest odczytywanie wielu plików jednocześnie za pomocą wzorców glob. dd.read_csv('data/2024-*.csv') odczytuje wszystkie pasujące pliki i tworzy jedną partycję na plik. To idealne rozwiązanie dla danych przechowywanych w plikach podzielonych według miesięcy lub dni — jest to częsty wzorzec w jeziorach danych. Dask automatycznie ujednolica schematy, zapewniając efekt równoważny ręcznemu iterowaniu po plikach i ich konkatenacji w Pandas, ale w znacznie prostszy sposób.
import dask.dataframe as dd
# Read all monthly files at once
ddf = dd.read_csv('sales/2024-*.csv',
dtype={'order_id': 'int32',
'amount': 'float32'})
print(f'Partitions: {ddf.npartitions}') # One per file
print(f'Total rows (lazy): {len(ddf)}') # This triggers a compute!Metoda visualize() dla grafów zadań
Przed wykonaniem złożonego potoku Dask można sprawdzić graf zadań, wywołując result.visualize(), która generuje diagram PNG przedstawiający wszystkie kroki obliczeń. Jest to przydatne do zrozumienia, co Dask wykona, oraz do diagnozowania nieoczekiwanej powolności. Graf pokazuje przepływ partycji przez kroki filtrowania, grupowania i agregacji, dzięki czemu łatwo zauważyć zbędne obliczenia. Wymaga pakietu graphviz.
import dask.dataframe as dd
ddf = dd.read_csv('orders.csv')
pipeline = (
ddf[ddf['status'] == 'completed']
.groupby('product_id')['revenue']
.sum()
)
# Visualise the task graph (saves to PNG)
# pipeline.visualize('task_graph.png')
# Check number of tasks in the graph
print('Number of tasks:', len(pipeline.__dask_graph__()))Stosowanie własnych funkcji za pomocą map_partitions
Gdy trzeba zastosować własną funkcję Pandas do obiektu Dask DataFrame, należy użyć ddf.map_partitions(func). Funkcja func jest stosowana niezależnie do każdej partycji i zwraca nowy obiekt Dask DataFrame. Funkcja otrzymuje zwykły obiekt Pandas DataFrame i musi taki obiekt zwrócić. Jest to odpowiednik df.apply() w Dask oraz sposób na integrację Dask z kodem, który obsługuje wyłącznie Pandas.
import dask.dataframe as dd
import pandas as pd
def normalise_chunk(df):
df = df.copy()
df['amount_norm'] = (df['amount'] - df['amount'].mean()) / df['amount'].std()
return df
ddf = dd.read_csv('data.csv')
normalised = ddf.map_partitions(normalise_chunk)
result = normalised[['order_id', 'amount_norm']].compute()
print(result.head())Opcje harmonogramu Dask
Dask udostępnia wiele harmonogramów, które sterują sposobem wykonywania zadań. Harmonogram 'synchronous' wykonuje zadania sekwencyjnie w bieżącym wątku (co jest przydatne podczas debugowania). Harmonogram 'threads' korzysta z puli wątków (sprawdza się w przypadku pracy ograniczonej przez operacje wejścia-wyjścia). Harmonogram 'processes' uruchamia wiele procesów do pracy ograniczonej przez moc obliczeniową procesora (omija GIL Pythona). Rozproszony klaster Dask umożliwia wykonywanie obliczeń na wielu maszynach. Harmonogram należy określić za pomocą compute(scheduler='threads').
import dask.dataframe as dd
ddf = dd.read_csv('data.csv')
agg = ddf.groupby('category')['sales'].sum()
# Choose scheduler based on workload
result_sync = agg.compute(scheduler='synchronous') # sequential, easy to debug
result_threads = agg.compute(scheduler='threads') # parallel I/O
result_processes = agg.compute(scheduler='processes') # parallel CPUKonwersja między Dask a Pandas
Często duży zbiór danych jest przetwarzany za pomocą Dask, a następnie zagregowany wynik jest przenoszony do Pandas na potrzeby końcowej analizy lub wizualizacji. Aby przekonwertować obiekt Dask DataFrame na Pandas, należy użyć .compute(). W drugą stronę dd.from_pandas(df, npartitions=4) konwertuje obiekt Pandas DataFrame na Dask DataFrame, co jest przydatne podczas testowania kodu Dask na małych danych przed przeskalowaniem go do pełnego zbioru danych.
import pandas as pd
import dask.dataframe as dd
# Start with a small Pandas DF for testing
df_small = pd.DataFrame({'a': range(100), 'b': range(100, 200)})
# Convert to Dask for development/testing
ddf = dd.from_pandas(df_small, npartitions=4)
result = ddf.groupby('a')['b'].sum().compute()
print(type(result)) # pandas.Series
print(result.head())Kiedy używać Dask, Pandas, a kiedy SQL
Dask nie zawsze jest właściwym narzędziem. Pandas należy stosować, gdy dane mieszczą się w pamięci RAM (mniej niż kilka GB) — jest prostszy i szybszy dzięki mniejszemu narzutowi. Dask należy stosować, gdy dane przekraczają rozmiar pamięci RAM, ale potrzebna jest składnia podobna do Pandas i równoległość na jednej maszynie. SQL lub bazę danych należy stosować, gdy dane znajdują się w relacyjnej bazie danych i agregacje można przenieść do silnika bazy. Spark lub BigQuery należy stosować, gdy potrzebne jest rozproszone przetwarzanie na wielu maszynach w skali petabajtów.
Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat analizy danych z tego rozdziału.
Podsumowanie rozdziału
W tym rozdziale poznano: Dask DataFrame to leniwie ewaluowane kolekcje partycji Pandas ze znanym interfejsem, .compute() uruchamia faktyczne wykonanie grafu zadań, a map_partitions umożliwia zastosowanie dowolnej własnej funkcji Pandas do wszystkich partycji. W dalszej części przyjrzymy się formatowi Parquet jako szybkiej, kolumnowej alternatywie dla CSV do przechowywania dużych zbiorów danych.
Często zadawane pytania
Czy lekcja „Wprowadzenie do obiektów Dask DataFrame” jest bezpłatna?
Tak — pełny tekst „Wprowadzenie do obiektów Dask DataFrame” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wprowadzenie do obiektów Dask DataFrame”?
Zastąp pd.read_csv i pd.DataFrame odpowiednikami z Dask, wywołuj compute(), aby uruchomić wykonanie, i profiluj grafy zadań. Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?
Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Wprowadzenie do obiektów Dask DataFrame”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?
Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Strumieniowy odczyt CSV z chunksize
- Przyrostowa agregacja między porcjami
- Wprowadzenie do obiektów Dask DataFrame
- Parquet: szybki magazyn kolumnowy