23 KiB
Praca z danymi: Python i biblioteka Pandas
![]() |
|---|
| Praca z Pythonem - Sketchnote autorstwa @nitya |
Bazy danych oferują bardzo efektywne sposoby przechowywania danych i ich przeszukiwania za pomocą języków zapytań, ale najbardziej elastycznym sposobem przetwarzania danych jest napisanie własnego programu do ich manipulacji. W wielu przypadkach zapytanie do bazy danych byłoby bardziej efektywne. Jednak w sytuacjach, gdy potrzebne jest bardziej złożone przetwarzanie danych, SQL może nie być wystarczający. Przetwarzanie danych można zaprogramować w dowolnym języku programowania, ale istnieją języki, które są bardziej zaawansowane w pracy z danymi. Specjaliści od danych zazwyczaj preferują jeden z następujących języków:
- Python, uniwersalny język programowania, który często jest uważany za jeden z najlepszych wyborów dla początkujących ze względu na swoją prostotę. Python posiada wiele dodatkowych bibliotek, które mogą pomóc w rozwiązywaniu praktycznych problemów, takich jak wyodrębnianie danych z archiwum ZIP czy konwersja obrazu na odcienie szarości. Oprócz analizy danych, Python jest również często używany w tworzeniu aplikacji webowych.
- R to tradycyjne narzędzie stworzone z myślą o statystycznym przetwarzaniu danych. Zawiera również dużą bazę bibliotek (CRAN), co czyni go dobrym wyborem do analizy danych. Jednak R nie jest językiem uniwersalnym i rzadko jest używany poza obszarem analizy danych.
- Julia to kolejny język stworzony specjalnie do analizy danych. Został zaprojektowany z myślą o lepszej wydajności niż Python, co czyni go świetnym narzędziem do eksperymentów naukowych.
W tej lekcji skupimy się na używaniu Pythona do prostego przetwarzania danych. Zakładamy podstawową znajomość tego języka. Jeśli chcesz zgłębić Pythona, możesz skorzystać z jednego z poniższych zasobów:
- Nauka Pythona w zabawny sposób z grafiką Turtle i fraktalami - szybki kurs wprowadzający do programowania w Pythonie na GitHubie
- Pierwsze kroki z Pythonem Ścieżka nauki na Microsoft Learn
Dane mogą występować w różnych formach. W tej lekcji rozważymy trzy formy danych - dane tabelaryczne, tekst i obrazy.
Skupimy się na kilku przykładach przetwarzania danych, zamiast przedstawiać pełny przegląd wszystkich powiązanych bibliotek. Dzięki temu zrozumiesz główne możliwości i będziesz wiedzieć, gdzie szukać rozwiązań swoich problemów, gdy zajdzie taka potrzeba.
Najbardziej przydatna rada. Gdy musisz wykonać określoną operację na danych, a nie wiesz, jak to zrobić, spróbuj poszukać jej w internecie. Stackoverflow często zawiera wiele przydatnych przykładów kodu w Pythonie dla typowych zadań.
Quiz przed lekcją
Dane tabelaryczne i DataFrame'y
Spotkałeś się już z danymi tabelarycznymi, gdy omawialiśmy relacyjne bazy danych. Gdy masz dużo danych, które są przechowywane w wielu powiązanych tabelach, zdecydowanie warto używać SQL do pracy z nimi. Jednak istnieje wiele przypadków, gdy mamy jedną tabelę danych i chcemy uzyskać pewne zrozumienie lub wnioski na temat tych danych, takie jak rozkład wartości, korelacje między nimi itd. W analizie danych często musimy przeprowadzić pewne transformacje danych, a następnie ich wizualizację. Oba te kroki można łatwo wykonać za pomocą Pythona.
Istnieją dwie najbardziej przydatne biblioteki w Pythonie, które mogą pomóc w pracy z danymi tabelarycznymi:
- Pandas pozwala manipulować tak zwanymi DataFrame'ami, które są analogiczne do tabel relacyjnych. Możesz mieć nazwane kolumny i wykonywać różne operacje na wierszach, kolumnach i całych DataFrame'ach.
- Numpy to biblioteka do pracy z tensorami, czyli wielowymiarowymi tablicami. Tablica zawiera wartości tego samego typu, jest prostsza niż DataFrame, ale oferuje więcej operacji matematycznych i generuje mniejsze obciążenie.
Istnieje również kilka innych bibliotek, które warto znać:
- Matplotlib to biblioteka używana do wizualizacji danych i tworzenia wykresów
- SciPy to biblioteka z dodatkowymi funkcjami naukowymi. Już wcześniej spotkaliśmy się z tą biblioteką, omawiając prawdopodobieństwo i statystykę
Oto fragment kodu, który zazwyczaj używa się do importowania tych bibliotek na początku programu w Pythonie:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import ... # you need to specify exact sub-packages that you need
Pandas opiera się na kilku podstawowych koncepcjach.
Series
Series to sekwencja wartości, podobna do listy lub tablicy numpy. Główna różnica polega na tym, że Series ma również indeks, który jest uwzględniany podczas operacji na Series (np. dodawania). Indeks może być tak prosty jak liczba całkowita reprezentująca numer wiersza (jest to domyślny indeks podczas tworzenia Series z listy lub tablicy), lub może mieć bardziej złożoną strukturę, taką jak przedział dat.
Uwaga: W towarzyszącym notebooku
notebook.ipynbznajduje się wprowadzenie do kodu Pandas. Tutaj przedstawiamy tylko niektóre przykłady, ale zachęcamy do zapoznania się z pełnym notebookiem.
Rozważmy przykład: chcemy przeanalizować sprzedaż w naszym punkcie z lodami. Wygenerujmy serię liczb sprzedaży (liczba sprzedanych produktów każdego dnia) dla pewnego okresu czasu:
start_date = "Jan 1, 2020"
end_date = "Mar 31, 2020"
idx = pd.date_range(start_date,end_date)
print(f"Length of index is {len(idx)}")
items_sold = pd.Series(np.random.randint(25,50,size=len(idx)),index=idx)
items_sold.plot()
Załóżmy teraz, że co tydzień organizujemy imprezę dla znajomych i zabieramy dodatkowe 10 opakowań lodów na imprezę. Możemy stworzyć kolejną serię, indeksowaną tygodniami, aby to pokazać:
additional_items = pd.Series(10,index=pd.date_range(start_date,end_date,freq="W"))
Gdy dodamy dwie serie, otrzymamy całkowitą liczbę:
total_items = items_sold.add(additional_items,fill_value=0)
total_items.plot()
Uwaga: Nie używamy prostego zapisu
total_items+additional_items. Gdybyśmy to zrobili, otrzymalibyśmy wiele wartościNaN(Not a Number) w wynikowej serii. Dzieje się tak, ponieważ brakuje wartości dla niektórych punktów indeksu w seriiadditional_items, a dodanieNaNdo czegokolwiek skutkujeNaN. Dlatego musimy określić parametrfill_valuepodczas dodawania.
W przypadku szeregów czasowych możemy również próbkować serię z różnymi przedziałami czasowymi. Na przykład, jeśli chcemy obliczyć średnią wielkość sprzedaży miesięcznie, możemy użyć następującego kodu:
monthly = total_items.resample("1M").mean()
ax = monthly.plot(kind='bar')
DataFrame
DataFrame to w zasadzie zbiór serii z tym samym indeksem. Możemy połączyć kilka serii w jeden DataFrame:
a = pd.Series(range(1,10))
b = pd.Series(["I","like","to","play","games","and","will","not","change"],index=range(0,9))
df = pd.DataFrame([a,b])
To stworzy poziomą tabelę, taką jak ta:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 1 | I | like | to | use | Python | and | Pandas | very | much |
Możemy również użyć serii jako kolumn i określić nazwy kolumn za pomocą słownika:
df = pd.DataFrame({ 'A' : a, 'B' : b })
To da nam tabelę taką jak ta:
| A | B | |
|---|---|---|
| 0 | 1 | I |
| 1 | 2 | like |
| 2 | 3 | to |
| 3 | 4 | use |
| 4 | 5 | Python |
| 5 | 6 | and |
| 6 | 7 | Pandas |
| 7 | 8 | very |
| 8 | 9 | much |
Uwaga: Możemy również uzyskać ten układ tabeli, transponując poprzednią tabelę, np. pisząc
df = pd.DataFrame([a,b]).T..rename(columns={ 0 : 'A', 1 : 'B' })
Tutaj .T oznacza operację transponowania DataFrame, czyli zamianę wierszy i kolumn, a operacja rename pozwala nam zmienić nazwy kolumn, aby pasowały do poprzedniego przykładu.
Oto kilka najważniejszych operacji, które możemy wykonać na DataFrame'ach:
Wybór kolumn. Możemy wybrać pojedyncze kolumny, pisząc df['A'] - ta operacja zwraca serię. Możemy również wybrać podzbiór kolumn do innego DataFrame, pisząc df[['B','A']] - to zwraca nowy DataFrame.
Filtrowanie tylko określonych wierszy według kryteriów. Na przykład, aby pozostawić tylko wiersze, w których kolumna A jest większa niż 5, możemy napisać df[df['A']>5].
Uwaga: Sposób działania filtrowania jest następujący. Wyrażenie
df['A']<5zwraca serię logiczną, która wskazuje, czy wyrażenie jestTrueczyFalsedla każdego elementu oryginalnej seriidf['A']. Gdy seria logiczna jest używana jako indeks, zwraca podzbiór wierszy w DataFrame. Dlatego nie można używać dowolnych wyrażeń logicznych w Pythonie, na przykład pisaniedf[df['A']>5 and df['A']<7]byłoby błędne. Zamiast tego należy użyć specjalnej operacji&na seriach logicznych, piszącdf[(df['A']>5) & (df['A']<7)](nawiasy są tutaj ważne).
Tworzenie nowych obliczalnych kolumn. Możemy łatwo tworzyć nowe obliczalne kolumny dla naszego DataFrame, używając intuicyjnych wyrażeń, takich jak:
df['DivA'] = df['A']-df['A'].mean()
Ten przykład oblicza odchylenie A od jego wartości średniej. Co właściwie się tutaj dzieje, to obliczamy serię, a następnie przypisujemy tę serię do lewej strony, tworząc nową kolumnę. Dlatego nie możemy używać operacji, które nie są kompatybilne z seriami, na przykład poniższy kod jest błędny:
# Wrong code -> df['ADescr'] = "Low" if df['A'] < 5 else "Hi"
df['LenB'] = len(df['B']) # <- Wrong result
Ostatni przykład, choć składniowo poprawny, daje błędny wynik, ponieważ przypisuje długość serii B do wszystkich wartości w kolumnie, a nie długość poszczególnych elementów, jak zamierzaliśmy.
Jeśli musimy obliczyć złożone wyrażenia, możemy użyć funkcji apply. Ostatni przykład można napisać w następujący sposób:
df['LenB'] = df['B'].apply(lambda x : len(x))
# or
df['LenB'] = df['B'].apply(len)
Po powyższych operacjach otrzymamy następujący DataFrame:
| A | B | DivA | LenB | |
|---|---|---|---|---|
| 0 | 1 | I | -4.0 | 1 |
| 1 | 2 | like | -3.0 | 4 |
| 2 | 3 | to | -2.0 | 2 |
| 3 | 4 | use | -1.0 | 3 |
| 4 | 5 | Python | 0.0 | 6 |
| 5 | 6 | and | 1.0 | 3 |
| 6 | 7 | Pandas | 2.0 | 6 |
| 7 | 8 | very | 3.0 | 4 |
| 8 | 9 | much | 4.0 | 4 |
Wybór wierszy na podstawie numerów można wykonać za pomocą konstrukcji iloc. Na przykład, aby wybrać pierwsze 5 wierszy z DataFrame:
df.iloc[:5]
Grupowanie jest często używane do uzyskania wyników podobnych do tabel przestawnych w Excelu. Załóżmy, że chcemy obliczyć średnią wartość kolumny A dla każdej liczby LenB. Możemy wtedy pogrupować nasz DataFrame według LenB i wywołać mean:
df.groupby(by='LenB').mean()
Jeśli potrzebujemy obliczyć średnią i liczbę elementów w grupie, możemy użyć bardziej złożonej funkcji aggregate:
df.groupby(by='LenB') \
.aggregate({ 'DivA' : len, 'A' : lambda x: x.mean() }) \
.rename(columns={ 'DivA' : 'Count', 'A' : 'Mean'})
To daje nam następującą tabelę:
| LenB | Count | Mean |
|---|---|---|
| 1 | 1 | 1.000000 |
| 2 | 1 | 3.000000 |
| 3 | 2 | 5.000000 |
| 4 | 3 | 6.333333 |
| 6 | 2 | 6.000000 |
Pobieranie danych
Widzieliśmy, jak łatwo można tworzyć Series i DataFrames z obiektów Pythona. Jednak dane zazwyczaj występują w formie pliku tekstowego lub tabeli Excel. Na szczęście Pandas oferuje prosty sposób na załadowanie danych z dysku. Na przykład, odczytanie pliku CSV jest tak proste jak to:
df = pd.read_csv('file.csv')
Zobaczymy więcej przykładów ładowania danych, w tym pobieranie ich z zewnętrznych stron internetowych, w sekcji "Wyzwanie".
Drukowanie i Wizualizacja
Data Scientist często musi eksplorować dane, dlatego ważne jest, aby móc je wizualizować. Gdy DataFrame jest duży, często chcemy tylko upewnić się, że wszystko robimy poprawnie, drukując pierwsze kilka wierszy. Można to zrobić, wywołując df.head(). Jeśli uruchamiasz to z Jupyter Notebook, DataFrame zostanie wydrukowany w ładnej formie tabelarycznej.
Widzieliśmy również użycie funkcji plot do wizualizacji niektórych kolumn. Chociaż plot jest bardzo przydatny do wielu zadań i obsługuje różne typy wykresów za pomocą parametru kind=, zawsze można użyć surowej biblioteki matplotlib, aby stworzyć coś bardziej złożonego. Szczegółowo omówimy wizualizację danych w osobnych lekcjach kursu.
Ten przegląd obejmuje najważniejsze koncepcje Pandas, jednak biblioteka jest bardzo bogata i nie ma ograniczeń co do tego, co można z nią zrobić! Teraz zastosujmy tę wiedzę do rozwiązania konkretnego problemu.
🚀 Wyzwanie 1: Analiza Rozprzestrzeniania się COVID
Pierwszym problemem, na którym się skupimy, jest modelowanie rozprzestrzeniania się epidemii COVID-19. Aby to zrobić, skorzystamy z danych dotyczących liczby zakażonych osób w różnych krajach, dostarczonych przez Center for Systems Science and Engineering (CSSE) na Johns Hopkins University. Zestaw danych jest dostępny w tym repozytorium GitHub.
Ponieważ chcemy pokazać, jak radzić sobie z danymi, zachęcamy do otwarcia notebook-covidspread.ipynb i przeczytania go od początku do końca. Możesz również uruchomić komórki i wykonać wyzwania, które zostawiliśmy dla Ciebie na końcu.
Jeśli nie wiesz, jak uruchomić kod w Jupyter Notebook, zapoznaj się z tym artykułem.
Praca z Niestrukturalnymi Danymi
Chociaż dane bardzo często występują w formie tabelarycznej, w niektórych przypadkach musimy radzić sobie z mniej ustrukturalnymi danymi, na przykład tekstem lub obrazami. W takim przypadku, aby zastosować techniki przetwarzania danych, które widzieliśmy wcześniej, musimy w jakiś sposób wyodrębnić dane ustrukturalne. Oto kilka przykładów:
- Wyodrębnianie słów kluczowych z tekstu i sprawdzanie, jak często te słowa kluczowe się pojawiają
- Używanie sieci neuronowych do wyodrębniania informacji o obiektach na zdjęciu
- Uzyskiwanie informacji o emocjach ludzi z obrazu z kamery wideo
🚀 Wyzwanie 2: Analiza Publikacji o COVID
W tym wyzwaniu kontynuujemy temat pandemii COVID i skupiamy się na przetwarzaniu publikacji naukowych na ten temat. Istnieje zestaw danych CORD-19 zawierający ponad 7000 (w momencie pisania) publikacji na temat COVID, dostępny wraz z metadanymi i abstraktami (a dla około połowy z nich dostępny jest również pełny tekst).
Pełny przykład analizy tego zestawu danych za pomocą usługi Text Analytics for Health opisano w tym wpisie na blogu. Omówimy uproszczoną wersję tej analizy.
NOTE: Nie dostarczamy kopii zestawu danych jako części tego repozytorium. Możesz najpierw pobrać plik
metadata.csvz tego zestawu danych na Kaggle. Może być wymagana rejestracja w Kaggle. Możesz również pobrać zestaw danych bez rejestracji stąd, ale będzie on zawierał wszystkie pełne teksty oprócz pliku metadanych.
Otwórz notebook-papers.ipynb i przeczytaj go od początku do końca. Możesz również uruchomić komórki i wykonać wyzwania, które zostawiliśmy dla Ciebie na końcu.
Przetwarzanie Danych Obrazowych
Ostatnio opracowano bardzo potężne modele AI, które pozwalają na rozumienie obrazów. Istnieje wiele zadań, które można rozwiązać za pomocą wstępnie wytrenowanych sieci neuronowych lub usług w chmurze. Niektóre przykłady obejmują:
- Klasyfikacja Obrazów, która może pomóc w kategoryzacji obrazu do jednej z predefiniowanych klas. Możesz łatwo wytrenować własne klasyfikatory obrazów, korzystając z usług takich jak Custom Vision
- Detekcja Obiektów, aby wykrywać różne obiekty na obrazie. Usługi takie jak computer vision mogą wykrywać wiele typowych obiektów, a Ty możesz wytrenować model Custom Vision, aby wykrywać konkretne obiekty, które Cię interesują.
- Detekcja Twarzy, w tym wykrywanie wieku, płci i emocji. Można to zrobić za pomocą Face API.
Wszystkie te usługi w chmurze można wywoływać za pomocą Python SDKs, dzięki czemu można je łatwo włączyć do swojego workflow eksploracji danych.
Oto kilka przykładów eksploracji danych z obrazów:
- W wpisie na blogu Jak uczyć się Data Science bez kodowania eksplorujemy zdjęcia z Instagrama, próbując zrozumieć, co sprawia, że ludzie dają więcej polubień zdjęciu. Najpierw wyodrębniamy jak najwięcej informacji ze zdjęć, korzystając z computer vision, a następnie używamy Azure Machine Learning AutoML, aby zbudować interpretowalny model.
- W Warsztacie Badań Twarzy używamy Face API, aby wyodrębnić emocje ludzi na zdjęciach z wydarzeń, próbując zrozumieć, co sprawia, że ludzie są szczęśliwi.
Podsumowanie
Niezależnie od tego, czy masz już dane ustrukturalne, czy niestrukturalne, za pomocą Pythona możesz wykonać wszystkie kroki związane z przetwarzaniem i rozumieniem danych. Jest to prawdopodobnie najbardziej elastyczny sposób przetwarzania danych, i dlatego większość data scientistów używa Pythona jako swojego głównego narzędzia. Nauka Pythona w głębi jest prawdopodobnie dobrym pomysłem, jeśli poważnie myślisz o swojej drodze w data science!
Quiz po wykładzie
Przegląd i Samodzielna Nauka
Książki
Zasoby Online
Nauka Pythona
- Naucz się Pythona w zabawny sposób z grafiką Turtle i fraktalami
- Zrób swoje pierwsze kroki z Pythonem Ścieżka nauki na Microsoft Learn
Zadanie
Wykonaj bardziej szczegółowe badanie danych dla powyższych wyzwań
Podziękowania
Ta lekcja została napisana z ♥️ przez Dmitry Soshnikov
Zastrzeżenie:
Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI Co-op Translator. Chociaż dokładamy wszelkich starań, aby zapewnić poprawność tłumaczenia, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.






