Python & IPython Notebook

Cursul de Algebra liniara prezinta metode liniare cu aplicatii in diverse domenii ale Computer Science (CS):

  • compresia datelor

  • cautare pe WEB

  • determinarea nodului central intr-o retea

  • designul sistemelor de recomandare de servicii si produse

  • analiza retelelor sociale

  • grafica 2D si 3D

  • procesarea imaginii

  • machine learning, data science

Metodele si tehnicile de baza pe care le studiem le experimentam prin calcul direct. Pentru aplicatiile in CS, care implica folosirea matricilor 2D de dimensiuni mari, folosim pachetul numpy si scipy din Python. In plus pentru vizualizarea datelor vom apela matplotlib, iar pentru generarea si analiza retelelor, networkx.


In [3]:
from IPython.display import Image
Image(url='https://www.python.org/static/community_logos/python-logo.png')


Out[3]:

Descarcati distributia Python 2.7, Anaconda, de la Continuum Analytics: ContinuumIO pentru sistemul de operare pe care il folositi.

Dupa instalare, sub Windows, identificati icon-ul Spyder si dati click pentru a-l lansa. Sub Linux se lanseaza din terminal: spyder


In [4]:
Image(url='https://code.google.com/p/spyderlib/logo?cct=1379130103')


Out[4]:

Spyder este un mediu interactiv de dezvoltare (IDE) pentru Python, care permite editarea codului si executarea lui.


In [5]:
Image(filename='Imag/MeniuSpyderNB.jpg')


Out[5]:

De ce Python?

  • Pentru ca este usor de invatat

  • Codul in Python este usor citibil si nu necesita managementul memoriei (alocare memorie si testare daca s-a facut alocarea, etc).

  • Python este open source si gratuit.

  • Exista o multime de tutoriale pe WEB si o comunitate activa de dezvoltatori, care acorda asistenta pe stackoverflow, grupuri si liste de discutii.

In Timisoara exista grupul pasionatilor de Python, PyTim.

PyTim is a Python user group which focuses on bringing together all the Python enthusiasts in Timisoara. Whether you are an experienced Python developer or just a beginner, join our community and meet, talk and learn from the best Python hackers in town.

Python este considerat limbajul oficial la Google:

Python has been an important part of Google since the beginning, and remains so as the system grows and evolves. Today dozens of Google engineers use Python, and we're looking for more people with skills in this language." said Peter Norvig, director of search quality at Google, Inc

Fisierul pe care-l cititi acum este un IPython Notebook, convertit in fisier html.


In [6]:
Image(url='http://ipython.org/ipython-doc/stable/_static/logo.png')


Out[6]:

Ce este IPython Notebook? Raspunsul este dat aici:

The IPython Notebook is a web-based interactive computational environment where you can combine code execution, text, mathematics, plots and rich media into a single document

Versiunea curenta de IPython Notebook, inclusa in distributia Anaconda, este 2.3.1

IPython Notebook este o aplicatie WEB bazata pe structura server-client.

Dupa ce ati instalat Anaconda creati un folder numit, de exemplu, Nbooks.
Apoi din cmd sub Windows sau terminal sub Linux, schimbati directorul:

cd Documents\Nbooks

respectiv

cd Nbooks

In cmd sau terminal invocati IPython Notebook:

ipython notebook

Aceasta comanda starteaza un server notebook. Acest server ruleaza pe adresa http://127.0.0.1:8888/ si este accesibil doar din localhost.

Dupa ce serverul a fost startat de comanda ipython notebook in bara browserului vedeti afisat http://localhost:8888/tree.

In browser apare dashboard-ul care vizualizeaza toate notebook-urile din director (fisiere cu extensia ipynb).

Daca in prealabil ati descarcat in directorul Nbooks acest notebook atunci dashboard-ul afiseaza numele acestui fisier.

Puteti crea unul nou, dand click pe butonul New Notebook din dashboard.


In [7]:
Image(filename='Imag/dashboard.jpg')


Out[7]:

Dupa ce un fisier ipynb a fost deschis este afisat urmatorul toolbar:


In [8]:
Image(filename='Imag/toolbar.jpg')


Out[8]:

Un fisier ipynb este constituit dintr-o succesiune de celule Markdown si Code. In imaginea precedenta celula este setata pe Code.

Inainte de a edita o celula Markdown se selecteaza din toolbar Markdown.

Intr-o celula Markdown se scrie text uzual sau folosind sintaxa Markdown. De exemplu linkurile din acest fisier le-am inserat folosind regula de editare a link-urilor din Markdown

Intr-o celula Markdown se pot insera si relatii matematice editate in LaTeX:

$A\in\mathbb{R}^{m\times n}, \quad Null(A)=\{v\in\mathbb{R}^n\:|\: Av=\theta\}$

Dupa ce s-a editat celula se ruleaza selectand din meniu butonul $\blacktriangleright$

Pentru a edita cod Python ce se ruleaza in browser se selecteaza din toolbar Code si dupa ce s-a editat se da din nou click pe run, adica pe $\blacktriangleright$

Intr-un notebook celulele de tip Code sunt cele care incep cu In[n], unde n este un numar intreg ce indica a cata celula Code este celula respectiva. Rezultatul rularii celulei n este afisat in celula urmatoare, care incepe cu Out[n].

Daca s-au facut erori de editare, se selecteaza din toolbar Raw Text (aceeasi locatie unde apare Code si Markdown). Dupa ce s-au facut corecturile in modul Raw Text se selecteaza tipul de celula adecvat si se ruleaza din nou. Prin experimentare veti realiza care este procedura.

Sa dam acum un exemplu de cod Python (mai multe detalii in urmatorul notebook ce se va posta). Acest notebook are scopul doar de a evidentia capabilitatile acestui instrument de predare/invatare.


In [9]:
# O linie care incepe cu diez # este o linie de comentariu
import numpy as np # importam modulul `numpy` ce contine functii ce opereaza asupra array-urilor

A=np.array([[2,-1],[3,4]], float)
print A # acum dam run si:


[[ 2. -1.]
 [ 3.  4.]]

In [10]:
#calculam determinantul lui A
d=np.linalg.det(A)
print 'determinatul este: ', d


determinatul este:  11.0

In [11]:
%matplotlib inline
# figurile generate sunt afisate instant in notebook
import matplotlib.pyplot as plt# importa biblioteca grafica

In [12]:
x=np.arange(0, 2*np.pi, 0.01)
y=np.sin(2*x)+0.5*np.cos(x)
plt.plot(x,y,'r')# deseneaza graficul functiei  y(x)=sin(2x)+0.5 cos(x)


Out[12]:
[<matplotlib.lines.Line2D at 0xab2e908>]

Intr-o celula se poate rula si cod extern, de pe WEB, folosind comanda magica %load. Codul este incarcat in celula imediat urmatoare si poate fi editat inainte de rulare.


In [13]:
%load  http://matplotlib.org/mpl_examples/images_contours_and_fields/pcolormesh_levels.py

In [15]:
"""
Shows how to combine Normalization and Colormap instances to draw
"levels" in pcolor, pcolormesh and imshow type plots in a similar
way to the levels keyword argument to contour/contourf.

"""

import matplotlib.pyplot as plt
from matplotlib.colors import BoundaryNorm
from matplotlib.ticker import MaxNLocator
import numpy as np


# make these smaller to increase the resolution
dx, dy = 0.05, 0.05

# generate 2 2d grids for the x & y bounds
y, x = np.mgrid[slice(1, 5 + dy, dy),
                slice(1, 5 + dx, dx)]

z = np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)

# x and y are bounds, so z should be the value *inside* those bounds.
# Therefore, remove the last value from the z array.
z = z[:-1, :-1]
levels = MaxNLocator(nbins=15).tick_values(z.min(), z.max())


# pick the desired colormap, sensible levels, and define a normalization
# instance which takes data values and translates those into levels.
cmap = plt.get_cmap('PiYG')
norm = BoundaryNorm(levels, ncolors=cmap.N, clip=True)

plt.subplot(111)
# contours are *point* based plots, so convert our bound into point
# centers
plt.contourf(x[:-1, :-1] + dx / 2.,
             y[:-1, :-1] + dy / 2., z, levels=levels,
             cmap=cmap)
plt.colorbar()
plt.title('contourf with levels')


plt.show()


Parintele sistemului IPython (un shell interactiv pentru Python) este Fernando Perez de la University of California Berkeley.

In video-ul urmator Fernando prezinta evolutia proiectului IPython in cei 12 ani de la startare.


In [18]:
from IPython.display import YouTubeVideo
YouTubeVideo('F4rFuIb1Ie4')


Out[18]:

Pentru a afisa un video de pe youtube sau vimeo este necesar doar id-ul videoului.


In [19]:
from IPython.display import VimeoVideo
VimeoVideo(78015169)


Out[19]:

Intr-un IPython Notebook se poate crea si integra un audio control:


In [20]:
from IPython.display import Audio
Audio(filename="Data/ocean-flight.wav")
# ocean-flight downloaded from:
#http://www.freestockmusic.com/2013/classical-production-music/
#free-classical-production-music-ocean-flight/


Out[20]:

Intr-un frame se poate afisa linkul la un slideshow de pe slideshare.net. embed_code se identifica din sursa html a paginii respective:


In [21]:
from IPython.display import IFrame
IFrame("http://www.slideshare.net/slideshow/embed_code/27653235", 400, 300)


Out[21]:

Ipython Notebook poate vizualiza si imagini de pe WEB, de exemplu de pe Facebook:


In [22]:
Image(url='https://scontent-a-fra.xx.fbcdn.net/hphotos-frc3/v/t1.0-9/1000243_629550250402307_1381858575_n.jpg?oh=f3dfbac3600974eb5621c570e773c371&oe=54D2E020')


Out[22]:

Din notebook se pot urmari cursuri online: Least Square Examples - KhanAcademy


In [23]:
YouTubeVideo('8mAZYv5wIcE')


Out[23]:

Aici este o galerie de IPython Notebooks.

In concluzie, Ipython si Ipython Notebook ofera instrumente open source pentru calcul interactiv in Python.

IPython Notebook afiseaza orice tip de date ce pot fi afisate in browser: imagini, video-uri, fisiere locale, etc

Noi vom folosi IPython Notebook pentru a crea cursuri si seminarii executabile. In celule cod vom introduce cod ce ilustreaza diverse metode liniare folosite in CS.

Pentru prima experimentare, puteti modifica fisierul ipynb al acestui notebook. Pentru a-l descarca dati click pe sageata ce este afisata in coltul dreapta sus al paginii ce o cititi acum:


In [24]:
Image(filename='Imag/download.jpg')


Out[24]:

Rularea celulelor se face succesiv. Daca incercati sa rulati mai intai o celula interioara s-ar putea sa genereze erori, pentru ca nu au fost rulate celulele precedente care importau diverse module sau functii din module!!!!!

  • Un IPython Notebook se poate converti intr-un fisier html, static, dand comanda:

    ipython nbconvert NumeNbook.ipynb --to hml

  • Conversia este posibila daca in prealabil a fost instalat pandoc.

Fisierul NumeNbook.html, generat, se insereaza apoi intr-o pagina WEB.

  • O a doua posibilitate este sa se insereze intr-o pagina, http://www.adresa.ro/FolderNbooks, doar fisierul ipynb si apoi sa fie invocat serviciul WEB, gratuit, nbviewer, notebook viewer, inserand in pagina linkul:

http://nbviewer.ipython.org/url/adresa.ro/FolderNbooks/NumeNbook.ipynb

  • Pentru a putea afisa continutul oricarui IPython Notebook de pe web, instalati extensia Chrome Open in nbviewer sau add-on pentru Firefox.

  • Extensia/add-on actioneaza astfel: dati click pe fisierul cu extensia ipynb (notebook-ul) si apoi click in bara browserului pe extensie/add-on. Automat fisierul este transmis nbviewer-ului si afisat in format html

La data editarii acestui notebook exista deja mai multe IPython kernels nu doar pentru Python, dar si Scala , Haskell, Ruby, etc.


In [1]:
from IPython.core.display import HTML
def css_styling():
    styles = open("./custom.css", "r").read()
    return HTML(styles)
css_styling()


Out[1]: