[vc_row] [vc_column] [vc_column_text]
Najpierw pierwsze rzeczy
W nauce o danych i świecie Pythona istnieje bardzo dobrze znany pakiet pandy.
Ale... czym są pandy?
Pandy zapewniają niezbędne struktury danych, takie jak serie, ramy danych i panele, które pomagają w manipulowaniu zestawami danych i szeregami czasowymi. Wprowadzony ogromny zestaw operacji sprawia, że ta biblioteka jest bardzo potężnym narzędziem. Jest darmowa w użyciu i biblioteka open source, co czyni ją jedną z najczęściej używanych bibliotek nauk o danych na świecie. Dowiedz się, jak nasze usługi inżynierii danych może pomóc Twojej firmie
Architektura Pandas
- pandy/rdzeń - struktury danych
- pandy/src - podstawowa funkcjonalność zapisana w C/Cyton.
- pandy/io - narzędzia do wprowadzania i wyjścia, plików, danych itp
- pandy/narzędzia - kody i algorytmy dla różnych funkcji i operacji (np.: scalanie, łączenie, konkatenacja itp.)
- pandy/rzadkie - przenosi rzadkie wersje, np. wersje stworzone do obsługi brakujących wartości różnych struktur danych
- pandy/statystyki - funkcje związane ze statystyką, takie jak regresja liniowa
- pandy/użyteczny - narzędzia testowe i różne inne narzędzia do debugowania biblioteki.
- pandy/rpy - interfejs, który pomaga połączyć R. Nazywa się R2Py
Kluczowe cechy
- manipulacja danymi
- obsługa brakujących wartości
- obsługa formatu pliku
- czyszczenie danych
- wyobrażać sobie
- obsługa Pythona
Proste przykłady kodu
Pisanie plików Excel - generowanie próbki testowej
import numpy
import losowy
importuj pandy jako pd
writer = pd.ExcelWriter ('pandas_simple.xlsx', engine = 'openpyxl')
sample_nb = int (1e1)
df = plik PD.DataFrame (
{'wiek': np.random.random_całkowite (0, 100, sample_nb),
'sex': np.random.choice (['mężczyzna', 'kobieta'], sample_nb)})
df.to_excel (pisarz, arkusza_nazwa='arkusza1')
writer.save ()
Odczytywanie plików Excel
importuj pandy jako pd
df = pd.read_excel ('pandas_simple.xlsx', arkusza_nazwa='arkusza1')
df
Wynik:
Bez nazwy: 0 wiek płci
0 0 43 Kobieta
1 1 57 mężczyźni
2 2 9 kobieta
3 3 56 Kobieta
4 4 75 mężczyźni
5 5 6 kobieta
6 6 49 mężczyźni
7 7 15 mężczyźni
8 8 19 Kobieta
9 9 63 mężczyźni
df.sex.unikalny ()
Wynik:
array (['kobieta', 'męski'], dtype=obiekt)
df.mean ()
Wynik:
Bez nazwy: 0 4.5
wiek 39,2
typ d: float64
Koala
Główny zamiar tego projektować ma na celu zapewnienie naukowcom danych używającym pand sposobu skalowania istniejących obciążeń dużych zbiorów danych poprzez uruchamianie ich na Apache SparkTM bez znaczącej modyfikacji ich kodu.
The Koala projekt pozwala na wykorzystanie interfejs API pandy interfejs z big data, poprzez implementację pandy Interfejs API DataFrame na szczycie Apache Spark.
Pandas jest de facto standardową (jednowęzłową) implementacją DataFrame w Pythonie, podczas gdy Spark jest standardem przetwarzania dużych zbiorów danych.
Oznacza to, że teoretycznie praca POC napisana w pandach powinna być bardzo łatwa do migracji do środowiska iskrowego.
Możesz być natychmiast produktywny dzięki Spark, bez krzywej uczenia się, jeśli znasz już pandy.
- pandy - testy, mniejsze zbiory danych
- koale - duże rozproszone zbiory danych
Ostrzeżenie
: koalas implementuje ~ 80% wszystkich interfejsów API pandy [czerwiec 2020]
koale zaleca się stosowanie z najnowszym Apache Spark 3.0+:
- Python 3.8
- Akcesoria iskrowe
- nowe wskazówki typu
- lepsze operacje na miejscu
Wewnętrznie, Koalas DataFrames są zbudowane na PySpark DataFrame API. Koalas tłumaczy interfejsy API pandas na logiczny plan Spark SQL, który jest następnie zoptymalizowany i wykonywany przez wyrafinowany i solidny silnik SQL Spark. Koalas wykorzystuje również leniwą semantykę oceny w celu maksymalizacji wydajności. Aby mieć zgodną strukturę pandy DataFrame i jej bogate interfejsy API, które wymagają niejawnego porządkowania, Koalas DataFrame mają wewnętrzne metadane reprezentujące indeksy równoważne pandy i etykiety kolumn mapowane do kolumn w PySpark DataFrame.
Bawmy się databrickami
Aby to utrudnić, użyjemy plików Excel:) Ktoś mądry powiedział pewnego dnia, że prawdziwe big data zawsze wiąże się z Excelem w pewnym momencie. Najlepiej byłoby mieć go na samym końcu przepływu pracy, ale życie łatwo to weryfikuje.
Koalas to biblioteka wysokiego poziomu, którą możemy zainstalować tylko po stronie sterownika. Niemniej jednak nadal potrzebujemy zainstalowanych zależności w naszych węzłach:
- PySpark >= 2.4 - sterownik+węzły
- pyarrow >= 0.10 - sterownik+węzły
- pandy >= 0.23 - kierowca
- matplotlib >= 3.0.0 - kierowca
Instalacja i import:
dButils.Library.InstallPypi („koala”)
dButils.Library.InstallPypi („openpyxl”)
dbutils.library.RestartPython ()
importuj numpy jako np
importuj pandy jako pd
importuj databricks.koalas jako ks
Teraz generujemy niektóre przykładowe dane uważane za dość ciężkie do przetworzenia na jednej maszynie. Jest to bardzo nietypowe źródło, dlatego kod nie wykorzystuje Spark moc ramy:
import numpy
import losowy
importuj pandy jako pd
def sample_dfs (plików_nb):
dla i w zakresie (files_nb):
sample_nb = int (1e5)
wydajność ks.DataFrame (
{'wiek': np.random.randint (0, 100, sample_nb),
'sex': np.random.choice (['mężczyzna', 'kobieta'], sample_nb)})
dla idx, df w wyliczeniu (sample_dfs (100)):
writer = pd.excelWriter ('/dbfs/pandas_simple_%03d.xlsx'% idx, engine = 'openpyxl')
df.to_excel (pisarz, arkusza_nazwa='arkusza1')
writer.save ()
Takie nieprzyjemne źródło można załadować od razu!
kdf = ks.read_excel ('plik: /dbfs/pandas_simple_*', engine = 'openpyxl')
kdf.to_spark () .count ()
Wynik:
100000000
kdf.count ()
Wynik:
Bez nazwy: 0 10000
wiek 10000
seks 10000
typ d: int64
Aby udowodnić, że koale wykorzystują Iskra możemy użyć:
kdf.explain (rozszerzony=prawda)
Wynik:
== Przeanalizowany plan logiczny ==
Projekt [__index_level_0__ #32185L, Bez nazwy: 0 #32186L, wiek #32187L, płeć #32188]
+- Projekt [__index_level_0__ #32185L, bez nazwy: 0 #32186L, wiek #32187L, płeć #32188, monotonically_augmenting_id () AS __natural_order__ #32197L]
+- MapInPandas <lambda>(treść #32178), [__index_level_0__ #32185L, Bez nazwy: 0 #32186L, wiek #32187L, płeć #32188]
+- Projekt [treść #32178]
+- Relacja [ścieżka #32175, czas modyfikacji #32176, długość #32177L, zawartość #32178] BinaryFile
== Analizowany plan logiczny ==
__index_level_0__: bigint, Bez nazwy: 0: bigint, wiek: bigint, płeć: string
Projekt [__index_level_0__ #32185L, Bez nazwy: 0 #32186L, wiek #32187L, płeć #32188]
+- Projekt [__index_level_0__ #32185L, bez nazwy: 0 #32186L, wiek #32187L, płeć #32188, monotonically_augmenting_id () AS __natural_order__ #32197L]
+- MapInPandas <lambda>(treść #32178), [__index_level_0__ #32185L, Bez nazwy: 0 #32186L, wiek #32187L, płeć #32188]
+- Projekt [treść #32178]
+- Relacja [ścieżka #32175, czas modyfikacji #32176, długość #32177L, zawartość #32178] BinaryFile
== Zoptymalizowany plan logiczny ==
MapInPandas <lambda>(treść #32178), [__index_level_0__ #32185L, Bez nazwy: 0 #32186L, wiek #32187L, płeć #32188]
+- Projekt [treść #32178]
+- Relacja [ścieżka #32175, czas modyfikacji #32176, długość #32177L, zawartość #32178] BinaryFile
== Plan fizyczny ==
MapInPandas <lambda>(treść #32178), [__index_level_0__ #32185L, Bez nazwy: 0 #32186L, wiek #32187L, płeć #32188]
+- FileScan BinaryFile [content #32178] Batched: false, Filters danych: [], Format: org.apache.spark.sql.execution.Datasources.binaryFile.BinaryFileFormat @128c5b73, Lokalizacja: InMemoryFileIndex [plik: /dbfs/pandas_simple_003.xlsx, plik: /dbfs/pandas_simple_009.xlsx, plik: /dbf..., PartitionFilters: [],: konstrukcja <content:binary>
Podczas oglądania DAY dla tej ramy danych możemy zaobserwować nowe rodzaje operacji w pierwszym etapie:
PlikiScan BinaryFile -> MapinPandas
Konfiguracja
Koala są dostarczane z zestawem opcji konfiguracyjnych, które mogą nawet przełączać typ przetwarzania między pandami a PySpark w zależności od progów. Proszę zapoznać się z dokumenty tutaj. Poszczególne opcje mogą mieć ogromny wpływ na ostateczny czas przetwarzania.
Opcje można ustawić globalnie lub dla części kodu za pomocą menedżerów kontekstu:
importuj databricks.koalas jako ks
z databricks.koalas.config importuj get_option, set_option, reset_option
# przykład
opt_value = get_option ('compute.max_rows')
print ('check', opt_value)
set_option ('compute.max_rows', 2000)
opt_value = get_option ('compute.max_rows')
print („po zmianie”, wartość opt_)
reset_option ('compute.max_rows')
print ('po zresetowanie', opt_value)
# lub
ks.options.compute.max_rows = 2000
drukuj (ks.options.compute.max_rows)
# opcje koalas używane tylko w następującym kontekście
z ks.option_context ('display.max_rows', 10, 'compute.max_rows', 5):
drukuj (ks.get_option ('display.max_rows'))
drukuj (ks.get_option ('compute.max_rows'))
Interoperacyjność między pandami i Sparkiem
Istnieje kilka sposobów korzystania z funkcji iskry w koalach danych:
importuj databricks.koalas jako ks
sdf = Spark.CreateDataFrame (
[(1, 23, „Marysia”),
(2, 15, „Kasia”),
(3, 17, „Wojtek”)],
schema= ['indeks', 'wiek', 'nazwa'])
sdf.show ()
# +-----+---+-------+
# |index|wiek| nazwa|
# +-----+---+-------+
# | 1| 23|Marysia |
# | 2| 15| Kasia|
# | 3| 17| Wojtek|
# +-----+---+-------+
# konwertuj spark-df na koalas-df
kdf = sdf.to_koalas ()
# konwertuj koalas-df na spark-df
sdf = kdf.to_spark ()
# akcesoria iskrowe
z pyspark.sql importuj funkcje jako F
kdf ['age_sqrt'] = kdf.age.spark.Transform (lambda col: f.sqrt (col))
kdf
# nazwa wieku indeksu age_sqrt
# 0 1 23 Marysia 4.795832
# 1 2 15 Kasia 3.872983
# 2 3 17 Wojtek 4.123106
# zastosuj
kdf.spark.apply (
lambda sdf: sdf.selectExpr ('wiek + 10 jako wiek_następny_10_lat'))
# wiek_następny_10_lat
# 0 33
# 1 25
# 2 27
Zauważ, że zastosuj z akcesorium iskrowego służy do obsługi całej ramy danych w ramach funkcji lambda. przekształcać jest używany tylko dla określonej kolumny.
Komentarz
Koala jest czymś jeszcze nowym. Niemniej jednak może to być bardzo przydatna biblioteka, zwłaszcza gdy praca z projektem POC opartym na pandach wymaga szybkiej migracji do pełnego środowiska dużych zbiorów danych, ponieważ Spark wykorzystuje znacznie większą skalę.
Odwiedź nasz blog, aby uzyskać bardziej szczegółowe artykuły dotyczące inżynierii danych:
- Testowanie Databricks z działaniami GitHub
- Co to jest denormalizacja bazy danych?
- Czym jest reklama programowa?
[/vc_column_text] [/vc_column] [/vc_row] [vc_row] [vc_column] [vc_single_image image="6559" img_size="pełny” onclick="custom_link” link=” https://dsstream.com/services/data-engineering/"][/vc_column][/vc_row]