In questa lezione, iniziamo ad utilizzare due degli strumenti più utili in assoluto per la Data Science:
- IPython: si tratta, in primo luogo, di una console Python particolarmente potente e flessibile, ricca di funzioni, che compensa ampiamente
l'essenzialità della console standard a disposizione del programmatore. In secondo luogo, si tratta di un kernel, un motore per i notebook Jupyter anch'essi oggetto di questa lezione; - Jupyter notebook: un notebook è un ambiente operativo da usare in locale ma eseguito in una pagina web, costituito da una sequenza di celle
in cui digitare codice o scrivere documentazione. La duttilità di questi strumenti e la facilità di integrazione in servizi web hanno portato alla realizzazione di loro versioni in Cloud connotate da grande praticità come, per citarne uno, Google Colab.
Entrambe queste tipologie di strumenti sono comodamente messe a disposizione del programmatore utilizzando Anaconda come detto in una lezione precedente
tuttavia anche i consueti package manager del mondo Python permettono la loro singola installazione come vedremo a breve.
IPython
IPython può essere installato con pip
pip install ipython
o con conda
conda install -c conda-forge ipython
Quando lo si attiva - da terminale con il comando ipython
o passando da Anaconda - ci si trova di fronte ad una normale console dove ogni riga è introdotta da un numero progressivo tra
parentesi quadre anticipate dalle dicitura In per indicare l'immissione di un comando o Out per sottolineare l'emissione di output. La prima prova che possiamo fare è utilizzare
IPython come sostituto della console standard immettendo espressioni e direttive:
In [1]: 2*5
Out[1]: 10
In [2]: lista=[12, 21, 56, 65, 78, 87]
In [3]: lista[1:-2]
Out[3]: [21, 56, 65]
Notiamo che, nelle operazioni svolte nello stralcio di esecuzione riportato, la riga [2] non ha restituito alcun output.
Tra le varie comodità di IPython abbiamo l'autoindentazione ovvero la possibilità di scrivere codice su più righe senza inserire manualmente l'indentazione che in Python
riveste una così grande importanza:
In [1]: def moltiplica(op1, op2):
...: return op1*op2
...:
In [2]: moltiplica(3,4)
Out[2]: 12
Abbiamo così scritto una funzione, subito invocata, disposta su più righe dove gli spazi prima del return
sono stati aggiunti direttamente da IPython. Altro
aspetto molto utile di IPython sono le cosiddette magic function, funzioni in grado di attivare direttamente al suo interno un gran numero di funzionalità. Si dividono in due
categorie principali:
- line magic: si estendono per una sola riga e vengono introdotte da un simbolo di percentuale (%). Il loro risultato può essere applicato ad una variabile;
- cell magic: possono occupare più di una riga ed iniziano con un doppio simbolo di percentuale (%%).
Con la funzione %lsmagic
possiamo avere un elenco completo delle magic function del nostro ambiente:
Available line magics:
%alias %alias_magic %autoawait %autocall %autoindent %automagic %bookmark %cd %cls %colors %conda %config %copy %cpaste %ddir %debug %dhist %dirs %doctest_mode
%echo %ed %edit %env %gui %hist %history %killbgscripts %ldir %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %ls %lsmagic %macro %magic
%matplotlib %mkdir %notebook %page %paste %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %pip %popd %pprint %precision %prun %psearch %psource %pushd %pwd
%pycat %pylab %quickref %recall %rehashx %reload_ext %ren %rep %rerun %reset %reset_selective %rmdir %run %save %sc %set_env %store %sx %system %tb %time
%timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode
Available cell magics:
%%! %%HTML %%SVG %%bash %%capture %%cmd %%debug %%file %%html %%javascript %%js %%latex %%markdown %%perl %%prun %%pypy %%python %%python2 %%python3 %%ruby
%%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile
Automagic is ON, % prefix IS NOT needed for line magics.
Sperimentiamo subito qualcuna di esse con un esempio. Grazie ad alcune di queste funzioni possiamo misurare le prestazioni di operazioni Python:
In [1]: %time risultato=[i**500 for i in range(1,1000)]
Wall time: 6.98 ms
In [2]: %timeit risultato=[i**500 for i in range(1,1000)]
6.03 ms ± 53.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Possiamo altrimenti attivare uno script direttamente dall'interno di IPython con %run
o addirittura avviarne la redazione con %ed
che interpella l'editor di testo del nostro
sistema operativo. Proviamo queste ultime due insieme.
Per prima cosa, avviamo un editor di testo (per noi che siamo su Windows sarà notepad) per la creazione di uno script fornendone il percorso con %ed D:\labpython\script_prova.py
.
Il suo risultato sarà la stampa della tabellina del 5:
for i in range(1,11):
print(f'5 X {i} = {5*i}')
per poi eseguirlo con:
In [1]: %run D:\labpython\script_prova.py
5 X 1 = 5
5 X 2 = 10
5 X 3 = 15
5 X 4 = 20
5 X 5 = 25
5 X 6 = 30
5 X 7 = 35
5 X 8 = 40
5 X 9 = 45
5 X 10 = 50
Jupyter notebook
I notebook Jupyter possono essere utilizzati in diverse modalità tra cui quella classica installabile con pip
pip install notebook
o con conda
conda install -c conda-forge notebook
oppure racchiusi in un ambiente più completo, simile ad un IDE chiamato Jupyter Lab anche questo installabile con pip:
pip install jupyterlab
o con conda:
conda install -c conda-forge jupyterlab
L'utilizzo di notebook Jupyter è di approccio piuttosto immediato in quanto si esplicita in uno strumento visuale dall'uso interattivo. L'immagine seguente mostra alcune celle di codice
attivate in un notebook dove si vede come l'output venga restituito immediatamente:
Figura 1. Alcune celle di codice in un notebook
Ogni singola cella è distinta da un numero tra parentesi quadre che ricorda proprio la notazione appena vista per IPython che, come detto, costituisce il kernel di un notebook,
Al momento di creare una nuova cella, si può scegliere dal menu a tendina in alto se la si vuole dedicare al codice o alla scrittura di testo divulgativo in formato
Markdown:
Nel prosieguo della guida, conosceremo molti framework e librerie per la Data Science e la nostra produttività risulterà fortemente avvantaggiata dall'adozione di Jupyter notebook e IPython.