Wyszukiwanie w witrynie

IPython i Jupyter nie są IDE — i właśnie dlatego używam ich do nauki o danych


Wiele osób używa IDE, takiego jak VS Code, lub zwykłego edytora, takiego jak Vim, ale do mojej pracy w dziedzinie nauki o danych i statystyki potrzebuję czegoś innego. Oto dlaczego używam IPythona i notatników Jupyter do eksploracji zbiorów danych.

Programowanie eksploracyjne

IPython i Jupyter pozwalają na eksplorację danych

IPython i Jupyter oferują coś innego niż standardowy przepływ pracy w skryptach lub IDE. Są to interaktywne narzędzia programistyczne. Możesz wpisać kod i od razu zobaczyć, co się stanie. Nie musisz pisać skryptu ani programu i go uruchamiać.

To otwiera drzwi do nowego stylu rozwoju. Zamiast mieć na uwadze określony cel, możesz wypróbować różne podejścia. Jednym z powodów, dla których statystyka i nauka o danych przyjęły notatniki, jest to, że te dziedziny są przystosowane do stylu eksploracyjnego, który promują IPython i Jupyter. Jeśli analizujesz zbiór danych, prawdopodobnie nie będziesz mieć pojęcia, co on zawiera. Gdy będziesz w stanie go podsumować i zwizualizować, stanie się jasne, co możesz z nim zrobić.

IPython

Lepszy interaktywny interpreter Pythona

Chociaż standardowy interpreter Pythona jest pomocny w testowaniu pomysłów i nauce języka, jeśli spróbujesz korzystać z niego intensywnie, napotkasz jego ograniczenia. Jedną z dużych brakujących funkcji w standardowym interpreterze Pythona jest uzupełnianie zakładek (tab completion). Trudno jest też ponownie uruchomić kod, który już został wykonany.

IPython jest dużą pomocą. Zawiera uzupełnianie po naciśnięciu klawisza Tab. Wystarczy nacisnąć klawisz Tab, a IPython uzupełni takie rzeczy jak funkcje czy nazwy zmiennych. Możesz też przemieszczać się w przód i w tył w swojej historii oraz wyszukiwać wcześniej wpisane polecenia. Działa to tak samo jak nowoczesne powłoki Linuksa, wykorzystując bibliotekę GNU Readline.

Kolejną przydatną funkcją są wbudowane polecenia „magiczne”. Poprzedzone są one znakiem procenta (%). Jednym z przydatnych poleceń magicznych jest polecenie „timeit”.

Pokażę to, najpierw generując tablicę 10 x 3 w NumPy, która będzie X, oraz losowo wygenerowaną tablicę 10 liczb, którą oznaczę jako y.

import numpy as np

rng = np.random.default_rng()

X = rng.random((10,3))

y = rng.random(10)

Następnie obliczę rozwiązanie metodą najmniejszych kwadratów i zmierzę czas:

%timeit np.linalg.lstsq(X,y)

Czas potrzebny na wykonanie zostanie zwrócony:

W tym przypadku zajęło to około 12 mikrosekund, co jest całkiem szybkie, choć jest to mała macierz. Większa może zająć więcej czasu:

X = rng.random((500,3))
y = rng.random(500)

%timeit np.linalg.lstsq(X,y)

Wynik wynosi około 22 mikrosekundy. To nadal jest szybko dla dużego układu liniowego.

Jupyter

Mieszaj tekst, kod i grafikę

Chociaż IPython jest świetnym interaktywnym programem terminalowym dla Pythona, Jupyter przenosi to na wyższy poziom. Jupyter to interaktywny program notatnikowy. Jupyter pozwala mieszać kod, tekst i wykresy w linii. Jest to forma „programowania literackiego”, termin ukuty przez legendarnego informatyka Donalda Knutha.

Notatniki Jupyter są podobne do interfejsów notatników w programach takich jak Mathematica. Notatnik składa się z komórek, które mogą zawierać kod lub tekst w formacie Markdown. Chociaż Jupyter pierwotnie był odgałęzieniem IPythona, pozwala także na używanie innych języków programowania, takich jak R, Julia czy Scala.

Oto screencast autorstwa Roba Mullę, pokazujący jak stworzyć notatnik Jupyter:

Najlepszą cechą notatnika Jupyter jest jego trwałość. Mogę badać zbiór danych za pomocą Pythona, a kiedy do niego wrócę, mogę pamiętać, co zrobiłem.

Kiedy powinienem użyć któregoś

Eksploracja kontra wytrwałość

Istnieją wyraźne przypadki użycia zarówno dla IPython, jak i Jupyter. Do szybkich eksperymentów sięgnę po IPython. Często zostawiam go działającego w tle w terminalu. Stworzyłem środowisko Pixi z NumPy, SymPy i innymi matematycznymi bibliotekami Pythona, aby zapewnić sobie najlepszą kalkulator biurkowy.

Podczas gdy IPython jest przydatny do szybkich obliczeń i tymczasowych obliczeń, do których prawdopodobnie nie będę musiał wracać, Jupyter jest użyteczny do eksploracji danych, do których będę chciał wrócić lub udostępnić je innym. Już przesłałem kilka moich własnych eksploracji statystycznych w notatnikach Jupyter na moje konto GitHub.

Vim wciąż jest moim ulubionym edytorem do regularnych skryptów i modyfikowania plików konfiguracyjnych.

Typowy proces pracy ze statystykami

Łącząc to wszystko

Pokażę to krótko, otwierając notebooka Jupyter. Już zainstalowałem Jupyter w katalogu o nazwie „stats”. Środowisko w Pixi to po prostu katalog. Chcę to pokazać w środowisku, które można odtworzyć. Przesłałem mojego notebooka do mojego repozytorium na GitHub.

Uruchomię serwer Jupyter:

jupyter notebook

Stworzę nowy notatnik. Zamierzam przeanalizować z góry określony zestaw danych zebranych przez kelnera w restauracji w Nowym Jorku, który zanotował całkowity rachunek, napiwek, liczbę osób przy stoliku oraz informację, czy ktoś z nich palił.

Utworzę komórkę, która będzie zawierać biblioteki, które chcę użyć:

import numpy as np
import pandas as pd
import seaborn as sns
sns.set_theme()
from scipy import stats
import statsmodels.api as sm
import statsmodels.formula.api as smf
%matplotlib inline

To importuje NumPy, pandas, Seaborn, podmoduł stats z SciPy, statsmodels oraz jego API formuł i informuje matplotlib, aby wstawiał wszelkie wykresy do notatnika Jupyter zamiast otwierać je w osobnym oknie.

Po zaimportowaniu bibliotek mogę załadować bazę danych wskazówek z Seaborn, która zawiera niektóre wbudowane zestawy danych głównie do tworzenia wykresów. Zostanie to zapisane jako DataFrame w pandas.

tips = sns.load_dataset('tips')

Sprawdzę górę zestawu danych.

tips.head()

Następnie wezmę statystyki opisowe kolumn numerycznych. Obejmuje to średnią, odchylenie standardowe, minimum, pierwszy kwartyl (25. percentyl), wartość środkową lub medianę oraz trzeci kwartyl (75. percentyl).

tips.describe()

Następnie chcę przyjrzeć się rozkładowi całkowitego rachunku:

sns.displot(x='total_bill',data=tips)

I wskazówki:

sns.displot(x='total_bill',data=tips)

Teraz spójrzę na wykres punktowy napiwku w zależności od rachunku:

sns.relplot(x='total_bill',y='tip',data=tips)

Mogę naszkicować linię regresji na wykresie punktowym:

sns.regplot(x='total_bill',y='tip',data=tips)

Wygląda na to, że istnieje dodatnia zależność liniowa, ponieważ linia wznosi się do góry. Będę musiał użyć biblioteki statsmodels, aby uzyskać wartości do podstawienia w klasyczne równanie y=mx + b, używając notacji formułowej spopularyzowanej przez R.

results = smf.ols('tip ~ total_bill',data=tips).fit()
results.summary()

Wartości punktu przecięcia z osią y oraz nachylenia (m), w tym przypadku całkowitego rachunku, są wymienione w najbardziej lewej kolumnie w tabeli.


Tworzenie programu od podstaw

Najlepszą rzeczą w programowaniu interaktywnym jest to, że możesz zacząć od niczego i skończyć z pełną analizą. To rodzaj programowania od dołu do góry, gdzie budujesz program przez eksplorację, a następnie możesz dzielić się swoimi wynikami z innymi.

Powiązane artykuły