Jupyter Notebook duomenų analizei

Kas tas Jupyter Notebook ir kodėl jis tapo duomenų analitikų geriausiuoju draugu

Jei kada nors bandėte dirbti su Python duomenų analize, tikrai susidūrėte su Jupyter Notebook. Šis įrankis per pastaruosius kelerius metus tapo beveik standartu duomenų mokslo srityje, ir tam yra rimtų priežasčių. Jupyter leidžia rašyti kodą, vykdyti jį dalimis, vizualizuoti rezultatus ir pridėti paaiškinimus – visa tai vienoje vietoje.

Tradiciniai Python skriptai veikia paprastai: parašai kodą, paleidi jį, gauni rezultatą. Jei kažkas negerai – keiti ir paleidžianti iš naujo. Jupyter Notebook visiškai kitoks – jis veikia kaip interaktyvus užrašų knygelė, kur galite vykdyti kodo blokus (vadinamus „cells”) atskirai, matyti tarpines išvestis ir eksperimentuoti realiu laiku.

Pavadinimas „Jupyter” kilęs iš trijų programavimo kalbų – Julia, Python ir R. Nors pradžioje buvo sukurtas kaip IPython Notebook tik Python kalbai, dabar jis palaiko daugybę programavimo kalbų. Bet praktikoje dauguma žmonių jį naudoja būtent Python projektams, ypač kai reikia analizuoti duomenis, kurti mašininio mokymosi modelius ar tiesiog tyrinėti naujus duomenų rinkinius.

Kaip pradėti dirbti su Jupyter

Įdiegti Jupyter Notebook yra gana paprasta, bet yra keletas būdų tai padaryti. Paprasčiausias variantas – įsidiegti Anaconda distribuciją, kuri jau ateina su Jupyter ir daugybe populiarių duomenų analizės bibliotekų. Tiesiog atsisiuntate Anaconda, įdiegiate, ir viskas veikia iš karto.

Jei nenorite pilnos Anaconda instaliacijos (ji užima nemažai vietos), galite įdiegti tik Jupyter per pip:

pip install jupyter

Po instaliacijos paleisti Jupyter labai paprasta – terminale įvedate komandą jupyter notebook, ir jūsų naršyklėje atsidaro Jupyter sąsaja. Taip, teisingai – Jupyter veikia per naršyklę, nors pats serveris sukasi jūsų kompiuteryje. Tai vienas iš dalykų, kuris pradžioje gali atrodyti keistas, bet greitai įprantate.

Kai pirmą kartą atidarote Jupyter, matote failų naršyklę. Galite naršyti po savo kompiuterio katalogus ir sukurti naują notebook. Naujas notebook atrodo kaip tuščias dokumentas su viena tuščia langeliu. Čia ir prasideda magija.

Ląstelės, kodas ir Markdown – pagrindai

Jupyter Notebook sudarytas iš ląstelių (cells). Kiekviena ląstelė gali būti arba kodo ląstelė, arba Markdown ląstelė tekstui. Kodo ląstelėje rašote Python kodą ir vykdote jį paspaudę Shift+Enter. Rezultatas atsiranda iš karto po ląstele.

Štai paprastas pavyzdys – sukuriate ląstelę ir įrašote:

import pandas as pd
import numpy as np

data = {'vardas': ['Jonas', 'Petras', 'Ona'],
'amžius': [25, 30, 28],
'miestas': ['Vilnius', 'Kaunas', 'Klaipėda']}

df = pd.DataFrame(data)
print(df)

Paleidus šią ląstelę, iš karto matote DataFrame lentelę. Nereikia jokių papildomų veiksmų – rezultatas čia pat. Tai neįtikėtinai patogu, kai tyrinėjate duomenis ir norite greitai pamatyti, kas vyksta.

Markdown ląstelės skirtos dokumentacijai. Galite rašyti paaiškinimus, antraštes, sąrašus, net įterpti nuotraukas ar formules. Tai labai svarbu, nes geras Jupyter notebook turėtų pasakoti istoriją – ne tik rodyti kodą, bet ir paaiškinti, ką darote ir kodėl.

Duomenų analizės workflow su Jupyter

Realus darbas su duomenimis Jupyter aplinkoje paprastai atrodo maždaug taip: pradedame nuo duomenų įkėlimo, paskui darome pradinę apžvalgą, valoome duomenis, analizuojame ir vizualizuojame rezultatus. Visas šis procesas vyksta palaipsniui, ląstelė po ląstelės.

Pirmas žingsnis – importuoti reikiamas bibliotekas. Dažniausiai tai bus pandas duomenų manipuliacijai, numpy matematiniams skaičiavimams, matplotlib ir seaborn vizualizacijoms. Gera praktika – visus importus laikyti pačioje pradžioje:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

Ta paskutinė eilutė su %matplotlib inline – tai Jupyter „magic command”, kuris liepia grafikus rodyti tiesiai notebook’e, o ne atskiruose languose. Tokių magic komandų yra daugybė, ir jos labai palengvina gyvenimą.

Toliau įkeliame duomenis. Tarkime, turite CSV failą su pardavimų duomenimis:

df = pd.read_csv('pardavimai.csv')
df.head()

Metodas head() parodo pirmas penkias eilutes – puikus būdas greitai pamatyti, kaip atrodo duomenys. Paskui galite sukurti naują ląstelę ir patikrinti duomenų tipus:

df.info()

Dar vieną ląstelę – pagrindinei statistikai:

df.describe()

Matote mintį? Kiekvienas žingsnis – atskira ląstelė. Jei kažkas negerai, galite grįžti atgal, pakeisti tą konkretų žingsnį ir paleisti iš naujo, nereikia vykdyti viso skripto.

Vizualizacijos ir interaktyvumas

Vienas didžiausių Jupyter privalumų – galimybė matyti vizualizacijas tiesiai dokumente. Sukuriate grafiką, ir jis atsiranda iš karto po kodo ląstelės. Tai neįtikėtinai patogu, kai bandote suprasti duomenų struktūrą ar ieškote anomalijų.

Paprastas pavyzdys su matplotlib:

plt.figure(figsize=(10, 6))
plt.plot(df['data'], df['pardavimai'])
plt.title('Pardavimų dinamika')
plt.xlabel('Data')
plt.ylabel('Pardavimai')
plt.grid(True)
plt.show()

Seaborn biblioteka leidžia kurti dar gražesnius grafikus su mažiau kodo:

sns.set_style('whitegrid')
sns.boxplot(x='kategorija', y='kaina', data=df)
plt.xticks(rotation=45)
plt.tight_layout()

Bet Jupyter gali dar daugiau. Su tokiomis bibliotekomis kaip Plotly galite kurti interaktyvius grafikus, kuriuose galite priartinti, pasirinkti duomenis, matyti detales užvedus pelę. Tai ypač naudinga, kai pristatote rezultatus kitiems žmonėms.

Yra ir ipywidgets biblioteka, kuri leidžia pridėti slankiklius, mygtukus ir kitus interaktyvius elementus. Pavyzdžiui, galite sukurti slankiklį, kuris keičia grafiko parametrus realiu laiku. Tai atrodo įspūdingai, bet praktikoje naudoju retai – paprastai pakanka paprastų statinių vizualizacijų.

Tipinės klaidos ir kaip jų išvengti

Dirbant su Jupyter, yra keletas dalykų, kurie gali sukurti problemų, ypač pradedantiesiems. Pirma ir svarbiausia – ląstelių vykdymo tvarka. Jupyter leidžia vykdyti ląsteles bet kokia tvarka, bet tai nereiškia, kad taip turėtumėte daryti.

Įsivaizduokite – sukuriate kintamąjį vienoje ląstelėje, paskui jį naudojate kitoje. Vėliau grįžtate ir pakeičiate pirmąją ląstelę, bet pamirštate paleisti antrąją. Dabar jūsų notebook’e kodas rodo vieną dalyką, bet realybėje vykdomas kitas. Tai gali sukelti didelę painiavą.

Geriausia praktika – periodiškai pereiti „Kernel > Restart & Run All”, kas išvalo atmintį ir paleidžia visas ląsteles iš eilės. Jei viskas veikia – puiku, jūsų kodas tikrai teisingas. Jei ne – žinote, kad kažkur yra priklausomybių problema.

Kita dažna problema – per didelės ląstelės. Kai kurie žmonės rašo po 50-100 eilučių kodo vienoje ląstelėje. Tai prieštarauja visos Jupyter idėjai. Geriau suskaidyti į mažesnius, logiškus blokus. Kiekviena ląstelė turėtų atlikti vieną aiškią užduotį.

Dar vienas dalykas – nepamirškite išsaugoti. Jupyter turi auto-save funkciją, bet ji ne visada patikima. Ctrl+S (arba Cmd+S Mac’e) turėtų tapti jūsų refleksu. Praradus kelių valandų darbą dėl neišsaugoto notebook’o – ne pati maloniausia patirtis.

Versijų kontrolė ir bendradarbiavimas

Jupyter Notebook failai (.ipynb) iš tikrųjų yra JSON formato failai su visu kodu, išvestimis ir metaduomenimis. Tai kelia tam tikrų iššūkių dirbant su Git ar kitomis versijų kontrolės sistemomis.

Problema ta, kad kiekvieną kartą paleidus ląstelę, keičiasi ne tik kodas, bet ir išvestys, metaduomenys apie vykdymo laiką ir kita informacija. Tai reiškia, kad Git diff’ai tampa beveik neskaitomi – matote krūvą JSON pakeitimų, o ne tai, kas iš tikrųjų pasikeitė kode.

Yra keletas sprendimų. Vienas – naudoti įrankius kaip nbdime, kuris supranta Jupyter notebook struktūrą ir rodo tik reikšmingus skirtumus. Kitas – išvalyti visas išvestis prieš commit’inant į Git. Tam galite naudoti nbconvert:

jupyter nbconvert --clear-output --inplace notebook.ipynb

Arba dar geriau – nustatyti Git hook’ą, kuris automatiškai išvalys išvestis prieš commit’ą. Yra paruoštų sprendimų, kaip nbstripout, kurie tai daro už jus.

Kalbant apie bendradarbiavimą, Jupyter Notebook nėra idealus įrankis keliems žmonėms dirbti vienu metu. Skirtingai nei Google Docs, čia nėra realaus laiko bendradarbiavimo. Bet yra alternatyvų – JupyterHub leidžia keliems vartotojams dirbti tame pačiame serveryje, o JupyterLab turi geresnes bendradarbiavimo galimybes.

Naujesnis sprendimas – Google Colab, kuris iš esmės yra Jupyter Notebook debesyje su Google Docs stiliaus bendradarbiavimu. Nemokamai gauname GPU prieigą, kas puiku mašininio mokymosi projektams. Vienintelis minusas – jūsų duomenys ir kodas yra Google serveriuose.

Jupyter alternatyvos ir ateitis

Nors Jupyter Notebook yra labai populiarus, jis nėra vienintelis žaidėjas rinkoje. JupyterLab – tai naujos kartos Jupyter sąsaja, kuri atrodo ir jaučiasi kaip pilnavertė IDE. Galite turėti kelis notebook’us šalia vienas kito, terminalą, failų naršyklę – visa tai vienoje vietoje.

Asmeniškai vis dažniau naudoju JupyterLab vietoj klasikinio Jupyter Notebook. Sąsaja šiuolaiškesnė, galimybių daugiau, bet pagrindinis funkcionalumas tas pats. Įdiegti labai paprasta:

pip install jupyterlab

Ir paleisti:

jupyter lab

Kitos alternatyvos – VS Code su Jupyter plėtiniu, kuris veikia stebėtinai gerai. Galite redaguoti notebook’us tiesiai VS Code, su visa code completion, debugging ir kitomis IDE funkcijomis. Kai kuriems žmonėms tai patogiau nei dirbti naršyklėje.

Yra ir Databricks Notebooks, kurie orientuoti į didelius duomenis ir Apache Spark. Observable – interaktyvūs notebook’ai JavaScript kalbai. Deepnote – modernesnė Jupyter alternatyva su geresnėmis bendradarbiavimo funkcijomis.

Bet realybė tokia – Jupyter Notebook vis dar dominuoja duomenų mokslo bendruomenėje. Dauguma tutorialų, kursų ir pavyzdžių naudoja būtent jį. Tai reiškia, kad net jei naudojate alternatyvą, vis tiek turėsite mokėti dirbti su Jupyter.

Kai Jupyter tampa jūsų kasdienybe

Po kurio laiko dirbant su Jupyter, jis tampa natūralia darbo aplinka. Pradedi naują analizės projektą – pirmas dalykas, ką darai, sukuri naują notebook. Nori išbandyti naują biblioteką – atidarai Jupyter. Reikia greitai patikrinti duomenis – vėl Jupyter.

Bet svarbu suprasti, kad Jupyter yra tyrinėjimo įrankis, ne gamybos sprendimas. Kai jūsų analizė pavirsta į produkcinį kodą, paprastai reikia perkelti jį į normalius Python modulius. Jupyter puikiai tinka eksperimentams, prototipavimui, duomenų tyrinėjimui. Bet galutinis kodas turėtų būti gerai struktūrizuotas, testuotas ir dokumentuotas.

Yra žmonių, kurie bando viską daryti Jupyter notebook’uose – net produkcinius pipeline’us. Tai paprastai baigiasi skausmingai. Notebook’ai tampa didžiuliai, nevaldomai, sunku juos testuoti ir palaikyti. Geriau naudoti Jupyter tam, kam jis skirtas – interaktyviai analizei ir tyrinėjimui.

Praktiškai tai reiškia tokį workflow: pradedi projektą Jupyter notebook’e, eksperimentuoji, bando įvairius metodus, vizualizuoji rezultatus. Kai randi veikiantį sprendimą, perkeli kodą į .py failus, pridedi testus, sutvarkai struktūrą. Notebook’as lieka kaip dokumentacija ir tyrinėjimo istorija, bet produktyvus kodas gyvena atskirai.

Taip dirbant gauname geriausią iš abiejų pasaulių – Jupyter lankstumą tyrinėjimo fazėje ir tvarkingą, palaikomą kodą produkcijai. Tai ne visada lengva, bet ilgalaikėje perspektyvoje apsimoka.

Daugiau

Payload CMS: TypeScript headless sistema