Documente Academic
Documente Profesional
Documente Cultură
INCREZĂTOR și COMPETENT !
Materiale
platforma Moodle
http://fim.curs.pub.ro/2021
InformaticăAplicată2
Structura cursului
Prezenta obligatorie la laborator
NU se fac recuperari la laborator.
Încrezător și competent!
Cum să scriem cod
ȘTIINȚA
Teotetică (Calcul Științific)
Experimentală (Calcul Științific)
Calcul Științific
The case for open computer programs, D.C. Ince, Nature 482, 485-488 (2012).
https://www.nature.com/nature/volumes/482/issues/7386
Calcul Științific
Rezultatele științifice trebuie să fie:
Trebuie:
Exemplu:
Bash
for in in {1..10}; do
echo Hello, World!
done
PowerShell
for ( $i=1; $i –le 10; $i++) {
Write-Host "Hello, World!"
}
De ce PYTHON pentru Calculul Științific ?
• Comunitate mare de utilizatori, multă documentație
• Vast ecosistem de biblioteci științifice/pachete/medii:
NumPy: http://numpy.scipy.org –Numerical Python
SciPy: http://www.scipy.org - Scientific Python
Matplotlib: http://www.matplotlib.org - Grafică
Pandas – http://pandas.pydata.org/ - Analiza Datelor
•Nu există costuri de licență -perfect atât pentru aplicații industriale cât și
pentru cercetarea academică.
ISTORIA PYTHON
•Python a fost creat de Guido van Rossum la sfârșitul anilor 1980, la Institutul
Național de Cercetare pentru Matematică și Informatică în Țările de Jos. La
fel ca Perl, codul sursă Python este disponibil sub licența GNU General
Public License (GPL).
• Inca din 1991 s-au dezvoltat mai multe versiuni disponibile pentru
WINDOWS, UNIX, și Mac OS .
Python 2.4, 2.6, 2.7 …(2000)… Python …. 3.7.11 (2020)
Ultima versiunea Python 3.8.12 – 3 Mai 2021
https://www.python.org/downloads/
https://stackoverflow.blog/2017/09/06/incredible-growth-python/
https://www.netguru.com/blog/future-of-python
https://insights.stackoverflow.com/survey/2018#technology
Ce este PYTHON ?
• Python este un limbaj de programare de
nivel înalt, interpretat, interactiv,
scripting orientat pe obiecte, și de scop
general.
• Python este interpretat: codul este
procesat în timpul rulării de către un
interpretor, nu este nevoie să compilați
programul înainte de a-l executa - similar
cu PERL și PHP.
• Python este interactiv: puteți sta la un
Python prompt și să interacționați în mod
direct pentru a scrie programe, ușor de
testat si depanat.
• Python este orientat-obiect: Python acceptă
stilul orientat pe obiect sau tehnica de
programare care incapsuleaza codul în
interiorul obiectelor.
Caracteristicile PYTHON
• Python este portabil: rulează pe o varietate de platforme hardware și are
aceeași interfață pe Windows,UNIX și Macintosh OS.
• Python este extensibil: se pot adăuga module de nivel jos pentru interpretor,
module ce permit adăugarea, personalizarea sau eficientizarea diverselor
instrumentele.
• Python are Programare GUI: suportă aplicații GUI, care pot fi create și
portate, are multe apeluri de sistem, biblioteci și sisteme de ferestre pentru
Windows MFC, Macintosh și sistemul X Window of Unix.
• Python este scalabil: oferă o structură mai bună și suport pentru programe
mai mari decât shell scripting.
Caracteristicile limbajului PYTHON ?
• Python este ușor de învățat: puține cuvinte cheie, structură simplă/clară și cu
sintaxa minimalistă, perioadă scurtă de învățare:
Tipuri de date nivel înalt: siruri de caractere, liste, dic ționare, etc.
Structurile obișnuite de control: if-else, if-elif-else, while, plus un for
iterator
• Python este intuitiv și ușor de citit: dacă este bine scris e simplu de citit și de
înțeles.
• Python este expresiv, ușor de întreținut: mai puține linii de cod, mai puține
bug-uri, mai ușor de întreținut- mentenabilităte foarte bună cu dimensiunea
proiectelor.
gabi@koko:~$ ipython
Python 3.8.8 (default, Apr 13 2021, 19:58:26)
Type 'copyright', 'credits' or 'license' for more
information
IPython 7.26.0 -- An enhanced Interactive Python.
Type '?' for help.
In [1]:
Exista convertoare 2to3 (code 3.x să fie generat din code 2.x) și
3to2 convertește code3.x la code2.x
https://wiki.python.org/moin/Python2orPython3
https://docs.python.org/3/whatsnew/3.0.html
Python3
Îmbunătățiri pentru a face limbajul mai clar și mai consistent:
Funcția print a fost înlocuită cu print()
print(x, y, z, sep=”\n”)
Python3:
type str (comportamentul și punerea în aplicare a tipului unicode
vechi).
type bytes (o secvență de numere întregi între 0 și 255 inclusiv,
conține întotdeauna date binare arbitrare)
Tipurile str și bytes nu pot fi amestecate! Trebuie convertite între ele!
str.encode() - de la str la bytes str(b, encoding=...)
bytes.decode() de la bytes la str. bytes(s, encoding=...)
Python3
Comparații clare și curate:
Python2: <> # operator pentru „nu sunt egale” sau „sunt diferite”
Python3: != # operator pentru „nu sunt egale” sau „sunt diferite”
Python3
Operatorul de împărțire:
Python3: 1 // 2
0
# operator // pentru împarțirea cu rezultatul funcției 'floor'
NumPy
NumPy- Numerical Python și SciPy - Scientific Python sunt
pachetele fundamentale folosite în calculul științific.
https://www.python.org/shell/
https://www.onlinegdb.com/online_python_interpreter
https://repl.it/languages/python3
https://www.tutorialspoint.com/execute_python3_online.php
https://rextester.com/l/python3_online_compiler
https://trinket.io/python3
Test
•Anacona www.anaconda.org
Python: http://www.python.org/
Python Documentations: https://docs.python.org/3/
Python Tutorial https://docs.python.org/3/tutorial/
IPython: http://ipython.org/
Jupyter Notebook: https://jupyter.org/
NumPy: http://www.numpy.org/
SciPy: https://www.scipy.org/
Pandas: http://pandas.pydata.org/
Matplotlib -2D: http://matplotlib.org/
Mayavi - 3D:http://code.enthought.com/projects/mayavi/
Bibliografie
https://github.com/jrjohansson/scientific-python-
lectures/blob/master/Lecture-1-Introduction-to-Python-
Programming.ipynb
Limbajul PYTHON
Tipuri de date/Variabile
Expresii/Operatii
Programe Iterative
Important!
• Python are tipuri de date standard, care sunt folosite pentru a defini
operațiile posibile pe ele și metodele pentru fiecare dintre ele.
https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-
long-complex
https://docs.python.org/3/library/math.html
Exemplu:
In[]:import math
In[]:x=[1,2,3,4,5]
In[]:math.fsum(x)
In[]:15.0
String- uri
Interpretor = evalueaza și printeaza
String-urile pot fi introduse între ghilimele: simple (') sau duble ("), sau
triple (asa ''' sau asa """)
In[]: type(‘3.2’)
In[]: print('''"Oh no", she exclaimed, "Ben's bike is broken!"''')
https://docs.python.org/3/library/stdtypes.html#string-methods
Exemplu:
In[]: "George Vasilescu".upper()
In[]: ‘GEORGE VASILESCU’
Expresii
Trebuie să manipulăm date cât mai complexe, deci trebuie să
combinăm aceste tipuri de date și să creeam expresii:
- Aritmetici
- Comparație
- Logici (sau relaționali)
- Atribuire
- Condiționare
Operatori Aritmetici
+ Adunare - adună valorile de pe fiecare parte a operatorului: a + b
- numeric și string
In[]: 3*’abc’ # rezultatul va fi ‘abcabcabc’
! = dacă valorile celor doi operanzi nu sunt egale, atunci condiția devine
adevărată
> în cazul în care valoarea operandului stâng este mai mare decât
valoarea operandului din dreapta, atunci condiția devine adevărată
> = în cazul în care valoarea operandului stâng este mai mare sau egală
cu valoarea operandului din dreapta, atunci condiția devine adevărată.
< în cazul în care valoarea operandului din stânga este mai mică decât
valoarea din dreapta, atunci condiția devine adevărată.
<= în cazul în care valoarea operandului stâng este mai mică sau egală
cu cea a operandului din dreapta, atunci condiția devine adevărată
Reprezentarea Float point
1/10
baza 10=1*10-1
baza2 = ? nu există un nr binar care să reprezinte aceasta fracție.
OR - În cazul în care oricare dintre cei doi operanzi sunt non zero,
atunci condiția devine adevărată.
In[]: True or True # True
In[]: True or False # True
In[]: False or True # True
In[]: False or False #False
()
**
NOT , AND , OR
* ,/ , // , %
+, -
len(‘Rezultat?’)*2**3/4
9*8 /4
Rezultatul final 18
Variabile
Variabilele sunt nume ptr obiecte, “care se referă la valori”
In[]: x=5
In[]: x=’abc’
Operatori de Asignare
= asignare simplă; asignează valoarea din partea dreaptă, valorii din
stanga operandului: c = a + b se va asigna valoarea a + b în c
X= 5 asignare simplă
X =Y =5 asignare multiplă
Exemplu:
In[]:X=10
In[]: X,Y= 20,X
In[]: print(X,Y)
20 10
Statements (declarații)
Statements comenzi pe care Python le interpretează și execută
x=15 x=int(input(‘x=’))
if ( x/2 )*2 == x : if x%2 == 0:
print(“par”) print(“par”)
else : else :
print(“impar”) print(“impar”)
if x%3 !=0:
print(“nu e divizibil cu 3”)
Condiționare – If, Else
Ce text va fi scris ?
Exemplu1: Exemplu2:
z=’b’ z=’b’
if ‘x’ < z: if ‘x’ < z:
print(“Buna”) print(“Buna”)
print(“Mama”) print(“Mama”)
Condiționare – If, Else
Ce text va fi scris ?
x=15
y=13
z=11
print(‘x=’,x,’y=’, y, ‘z=’,z)
if x< y:
if x<z:
print(“x e cel mai mic număr”)
else:
print(“z e cel mai mic număr”)
else:
print(“y e cel mai mic număr”)
x=15
y=13
z=11
print(‘x=’,x,’y=’, y, ‘z=’,z)
if x< y and x<z:
print(“x e mai mic”)
elif:
print(“y e mai mic”)
else:
print(“z e mai mic”)
Bucla While
O expresie logică trebuie să întoarcă una din valorile True sau False
Exemplu:
nr = 0
while nr < 9 :
print (' Numărul este:', nr)
nr = nr + 1
print (‘Gata, am terminat!’)
Bucla WHILE infinită / break
Următorul cod va contina pâna când veți tasta CNTL+c :
var=1
while var == 1 : # bucla infinită
nr = input("Introduceti un număr =")
print ("Ati introdus: ", nr)
x= int(input(‘Introduceti un nr =’))
ans =0 # initializez variabilele în afara buclei
while ans*ans < = x: # setez condiția de ieșire din buclă
ans=ans+1 # scriu setul de instrucțiuni
print (ans) # ce se va întampla dupa ce ies din buclă
for i in range(1,n) :
declarații
declarații
x=10 x=10
i=1 for i in range(1, x+1)
while i < x: if x%i==0:
if x%i==0: print(‘divizor’,i)
print(‘divizor’,i)
i=i+1
Scrieți codul Python pentru a afla dacă un număr este pătrat perfect
apoi modificați acest cod Python pentru a afla dacă un număr
(poate să fie și un nr negativ) este cub perfect.
Python: http://www.python.org/
Python Documentations: https://docs.python.org/3/
Python Tutorial https://docs.python.org/3/tutorial/
IPython: http://ipython.org/
Jupyter noNebook: https://jupyter.org/
NumPy: http://www.numpy.org/
SciPy: https://www.scipy.org/
Pandas: http://pandas.pydata.org/
Matplotlib -2D: http://matplotlib.org/
Mayavi - 3D:http://code.enthought.com/projects/mayavi/
Bibliografie
Limbajul PYTHON
String-uri/
Funcții /
Recursivitate
String-uri
Exemplu: str()
In[] : x=str(3)
In[]: print(x)
‘3’
In[]: print(type(x))
<class ‘str’>
In[]:sir="""acum
...plec
...de
...acasa"""
In[]: s=’hello’
In[]: s[0]=’c’
s = "abc,def gh"
for nume_var in s:
if nume_var == 'e' or nume_var == 'u':
print("am gasit litera e sau u”)
https://docs.python.org/3/library/stdtypes.html#string-methods
Exemplu:
In[]: s=’Vreau sa merg la Madrid’
In[]: ss=s.split()
In[]: ss = [‘Vreau’,‘sa’, ‘merg’, ‘la’, ‘Madrid’]
In[]: ss[4]=’Madrid’
In[]: s.find(‘la’) # întoarce locația substringului sau -1 daca nu-l gasește
Funcții
O funcție este:
un bloc de cod organizat,
ce întoarce o singură valoare/obiect
și este reutilizabilă
Funcțiile oferă:
decompoziție - separare în module
abstractizare - eliminăm detaliile
Atenție! Parametrii de intrare pot fi orice tip de date, insclusiv alte funcții
Return – întoarcem valori din funcții
a =30
print(div(a,10)) --> x este 30 și y este 10 printează 3
x=10
y=30
print(div(y,x)) --> x este 30 și y este 10 printează 3
def salut(nume=’tuturor’):
print(‘Buna’ + nume + ‘!’)
In[]: salut(‘Vasile’)
In[]: salut()
In[]: print(mediaAritmetica(45,32,89,78))
Număr arbitrar de argumente **kwargs
return print ()
In[]: i=44
In[]: estepar(45) # am făcut apelul funcție: estepar(45)
Atenție! Țineți cont de variabile locale (din corpul funcției) și cele globale
(din afara funcției)
Ce va întoarce funcția?
Variabile locale / globale
def fg(x):
def fh():
x=’abc’
x=x+1
print(‘in functia fg(x): x= ’, x)
fh()
return x
In[]: x=3
In[]: z=fg(x)
Funcții lambda
Pentru a crea o funcție anonimă (Matlab) de forma unei expresii
folosim sintaxa lambda:
lambda arg: expresie
In[]: nr=[2,4,6,8,10]
In[]: print(ll)
Folosim funcția lambda cu funcția map()
Funcția map() se poate aplica pe liste multiple:
In[]: m=[2,4]
In[]: n=[10, 20, 30]
In[]: p=map(lambda a,b: a*b, m, n)
In[]: print(list(p)) # [20,80]
Exemplu: modulatitate și abstractizare
porci+gaini=20
4*porci+2*gaini=56
def ferma():
capete=int(input(‘Introduceți nr de capete= ’))
picioare = int(input(‘Introduiceți nr de picioare=’ ))
porci, gaini =solve(capete, picioare)
if porci ==None:
print(‘nu am găsit o soluție’)
else:
print(‘nr de porci:’, porci)
print(‘nr de gaini:’, gaini)
Exemplu: modularitate
def fermaN():
capete=int(input(‘Introduceți nr de capete= ’))
picioare = int(input(‘Introduiceți nr de picioare=’ ))
porci, gaini, viermi =solveN(capete, picioare)
if porci ==None:
print(‘nu am găsit o soluție’)
else:
print(‘nr de porci:’, porci)
print(‘nr de gaini:’, gaini)
print(‘nr de viermi:’, viermi)
Exemplu: generalizare
Mai multe soluții posibile (2 variabile și 3 necunoscute)
def solveG(nCap, nPic):
solutieGasită = False
for viermi în range(0, nCap+1):
for gaini in range(0, nCap +1-viermi):
porci = nCap – gaini - viermi
totPic = 4*porci+2*gaini+8*viermi
if totPic==nPic:
print(‘nr de porci:’, porci)
print(‘nr de gaini:’, gaini)
print(‘nr de viermi:’, viermi)
solutieGasita=True
if not solutieGasita:
print(‘nu am găsit o soluție’)
Un caz de bază este un caz în care problema poate fi rezolvată fără a mai
apela la recursivitate în continuare.
Recursivitate poate ajunge într-o buclă infinită când cazul de bază nu este
îndeplinit în apelurile funcției.
Exemplu : iterativ
def multiplic(a,b):
rez=0
while b> 0:
rez+=a
b-=1
return rez
Exemplu : recursiv
a*b = echivalent cu a aduna a cu el însuși de b ori = a+a+a+a+...a
print(factR(4))
F(0) = 0
F(1) = 1
F(n) = F(n-1) + F(n-2)
print(fibR(4))
Se calculează: 4*fibR(3)=4*3*fibR(2)=4*3*2*fibR(1)=4*3*2*1
Reguli:
1.trebuie să mut un singur disc odată
2.niciodată nu trebuie să am un disc mai mare peste unul mai mic
Se cere:
Să scrieți program care rezolvă problema, printând ordinea mutărilor.
Turnurile din Hanoi : recursiv
Metodă iterativă este foarte complex de scris!
Metoda recursivă ușor de scris:
Rezolvăm problemă mai simplă
Rezolvăm cazul de baza
Rezolvăm problemă mai simplă
Napoleon :
“Able was I, ere I saw Elba” – a zis-o
Anne Michaels:
“Are we not drawn onward, we few, drawn onward to new era?”
Recursivitate pe string - palindrom
Cum rezolv ?
În primul rând, mă asigur că șirul este format doar din caractere mici
(elimin semnele de punctuație, convertesc șirul la caractere mici, etc)
Cazul de bază:
un șir de lungime 0 ( inițial am un nr par de caractere în șir) sau
un șir de lungime 1 ( inițial am un nr impar de careactere în șir)
este un palindrom
Cazul recursiv:
dacă primul caracter se potrivește cu ultimul caracter, atunci este un
palindrom dacă și secțiunea de mijloc este un palindrom....și tot repet
procesul
Recursivitate pe string - palindrom
def estePalindrom(s):
def curatSir(s):
s = s.lower()
ans = ' '
for c in s:
if c in 'abcdefghijklmnopqrstuvwxyz':
ans = ans + c
return ans
def ePal(s):
if len(s) <= 1:
return True
else:
return s[0] == s[-1] and ePal(s[1:-1])
return ePal(curatSir(s))
Testez: print(estePalindrom(‘Cojoc’))
Recursivitate pe string - ADN
AGGACAT
ATTACGAT
In[]:secvcom(“AGGACAT”, “ATTACGAT”)
5
def secvcom(s1,s2):
if s1==”” or s2=””:
return 0 # cazul de bază
else:
if: s1[0]==s2[0]:
return 1 + secvcom(s1[1:], s2[1:])
else:
return max(secvcom(s1, s2[1:]), secvcom(s1[1:], s2))
Redenumirea unui modul
După această declarație de import există doar namespace-ul mm și nu
există namespace-ul math.
pi = 3.14159
def area(r):
return pi*(r**2)
def circumference(r):
return 2*pi*r
Putem importa modulul circle în shell sau în alt fișier pentru a-l folosi:
In[]:import circle
In[]:pi = 3
In[]:print(pi)
In[]:print(circle.pi)
In[]:print(circle.area(3))
In[]:print(circle.circumference(3))
Module
Dacă vrem să apelăm funcțiile și alte declareții din modul, dar nu vrem
să folosim sintaxa nume_modul.funcții/declarații trebuie să scriem
declarația de import așa:
Aceast import are efectul de a crea o legatură între starea curentă și toate
obiectele definite în modul – atenție numele de variabile sau funcții
din modul să fie diferite de cele folosite în shell sau în alte fișiere
Declarațiile din modul sunt executate doar o singură dată când modulul
este importat ! Dacă schimb declarațiile sau funcțiile din modul trebuie sa
invoc din nou declarația: from nume_modul import *
Locația unui modul
Aflăm locația modului după ce a fost importat:
In[]: import numpy
In[]: numpy.__file__
In[]: '/home/gabi/anaconda3/lib/python3.5/site-packages/ numpy /
__init__.py'
Strings
https://docs.python.org/3/tutorial/introduction.html#strings
Functions:
https://docs.python.org/3/tutorial/controlflow.html#defining-
functions
Module
https://docs.python.org/3/tutorial/modules.html
Curs 4
Limbajul PYTHON
Data Collections - Arrays
Python Collections - Arrays
Dacă argumentul funcției built-in tuple () este o secvență (string, lista sau
altă tuplă), rezultatul va fi o tuplă cu elementele din secvență
Soluția: strâng toate valorile int într-o tuplă și toate valorile string în altă tupla
def coldata(aTuple):
nrs = () # cream tupla nrs
cuvs = () # cream tupla cuvs
for t in aTuple:
nrs = nrs + (t[0] ,) # colectez valorile int și concatenez cu +
if t[1] not in cuvs:
cuvs = cuvs + (t[1] ,) # colectez valorile string
mic = min(nrs)
mare = max(nrs)
nr_unice = len(cuvs)
return (mic, mare, nr_unice)
(mic, mare, nr_unice) = coldata(((13, ‘masa’), (7, ‘s’), (4, ‘we’), (99,’s’)))
Set-uri
Secvență neordonată de valori, ce pot reprezenta diferite tipuri de date
eliminând duplicatele.
In[]: 33 in s
True
In[]: ‘p’ in s
False
Set-uri
Seturile sunt colectii neordonate, deci nu putem accesa elementele setului
folosindu-ne de un index
‘a’
33
‘b’
‘c’
‘d’
5.0
33
‘c’
‘f’
Metode pe Set-uri
In[]: help(set) # metodele asociate cu tipul de date set
In[]: a={1, 2 , 3, 4, 6, 8}
In[]: b ={2, 3, 4, 5, 9}
a – b – diferență - (doar în a și nu în b)
{1, 6, 8}
Dacă argumentul funcției built-in list() este o secvență (string, lista sau
altă tuplă), rezultatul va fi o listă cu elementele din secvență
[start : stop : step ] - selecție din listă start se include, stop se exclude,
ca si cum am avea [start : stop: step)
Clasic Liste
total = 0 total = 0
for i in range(len(L)): for i in L:
total += L[i] total += i
print(total) print(total)
Căteva exemple:
In[]: s=[’a’, ‘b’, ‘c’, 1, 22, 33]
In[]: s.append(555) # adaugă la sfârșitul listei o nouă valoare
['a', 'b', 'c', 1, 22, 33, 555]
Căteva exemple:
https://docs.python.org/3/tutorial/datastructures.html#more-on-lists
L=[9,6,0,3]
sorted(L) # întoarce lista sortată, dar nu modifică lista originală L
In[]: madona
[‘muzica’, ‘bogată’, ‘blondă’]
In[]:diva
[‘muzica’, ‘bogată’, ‘blondă’]
In[]: diva.append(‘copii’)
In[]: diva
[‘muzica’, ‘bogată’, ‘blondă’, ‘copii’]
In[]:madona
[‘muzica’, ‘bogat’, ‘blondă’]
Sort() și Sorted()
sort() modifică lista și nu întoarce nimic return:None
De ce?
• Python folosește un counter intern pentru index-ul din buclă
• L1.remove(e)- modifică lungimea listei, dar Python nu updatează
counter-ul intern
• bucla niciodată nu ajunge la elementul 2
Funcții ca obiecte
Putem folosi funcțiile în același mod în care folosim alte tipuri de date:
numere, liste, etc
De ce?
• funcțiile au / întorc un anumit tip de date
• funcțiile pot fi elelemente într-o alta structură de date : listă
• funcțiile pot apărea în expresii
- atribuire
- argument la o altă funcție
for i in range(len(L)):
L[i] = f(L[i])
4
4
24
5
Generalizare -Higher order programming
Python: map – o funcție aplicată pe o colecție de date
Exemplu: map(abs, [1, -2, 3, -4])
Operații comune:
◦ seq[i] # elementul al i-lea din secvența
◦ len(seq) # lungimea secvenței
◦ seq1 + seq2 # concatenare a două secvențe (nu se poate cu range)
◦ n*seq # secvența care se repetă de n ori (nu se poate cu range)
◦ seq[start:end] # slice-ing în secvență
◦ e in seq #True dacă e conținut în secvență
◦ e not in seq # True dacă e conținut în secvență
◦ for e in seq # iterează peste elementele din secvență
Generalizarea listelor:
In[]: note[‘Radu’]
7
In[]:note[‘Maria’] # KetError: ‘Maria’ - nu există cheia în dicționar
In[]: ‘Ion’ in note # testez dacă există cheia Ion , întoarce True
In[]: del(note[‘Dan’])
note={‘Ana’: 10 , ‘Ion’: 9, ‘Radu’: 7, ‘Elena’:6}
Metode pe Dicționar
cheile:
• trebuie să fie unice
• să fie de un tip de date immutabil ( int, float, string, tuple,bool )
• ATENȚIE la tipul de date float
valorile:
• pot fi duplicate
• orice tip de date (immutabile sau mutabile)
• pot fi liste, chiar alte dicționare!
List vs Dicționar
2) găsim cuvântul care apare de cele mai multe și de câte ori apare
• utilizăm o listă, în cazul în care există mai mult de un cuvânt
• returnează o tuplă (listă, int) pentru (lista_cuv, frecvența_mare)
# versuri –string, șir de caractere separate prin spațiu sau alte caractere
def frecvența_cuvintelor(versuri):
myDict = {}
for cuv in versuri: # iterez pe o listă de string-uri
if cuv in myDict: # iterez pe o cheile din dicționar
myDict[cuv] += 1 # modific valorile asociate cu cheile
else:
myDict[cuv] = 1 # prima dată când găsesc cuv, dau valoarea1
return myDict
In[]: beatles=frecventa_cuvintelor(she_loves_you)
In[]: beatles={‘because’: 1,
‘yes’:1,
‘a’:4,
‘ almost’: 1,
‘bad’: 3,
‘ can: 1,
‘can’t’:3,
‘her’:4,
‘hurt’:2
}
def cel_mai_comun_cuvânt(dct):
val = dct.values() # iterabil , știu că sunt de tip int
best = max(val) # pot aplica funcții built-in pe iterabil
cuvs = [] # aflu cuvintele care au valoarea best
for k in dct:
if dct[k] == best: # iterez pe cheile din dicționar
cuvs.append(k) # adaug la listă
return (cuvs, best)
In[]:(cuv,best) =cel_mai_comun_cuvânt(beatles)
In[]: cuv
[‘a’, ‘like’, ‘her’, ‘with’]
In[]: best
4
Folosesc Dicționarul
fib(0)=fib(1)=1
fib(n) = fib(n-1) + fib(n-2)
fib(6) = fib(5)+fib(4)
fib(5) = fib(4)+fib(3)
fib(4) = fib(3)+fib(2)
fib(3) = fib(2)+fib(1)
fib(2) = fib(1)+fib(0)
In[]: numFibCalls =0
In[]: print(fib_recursiv(12)) # am setat global numFibCalls și în recursiv
In[]: print(‘am apelat de atârea ori’, numFibCalls)
In[]: numFibCalls =0
In[]: d = {0:1, 1:1} # setez cazurile de bază
In[]: print(fib_eficient(12, d))
In[]: print(‘am apelat de atârea ori’, numFibCalls)
Fibonacci– Eficient cu dicționar
In[]: fib_recursiv(12))
In[]: am apelat de atârea ori 287
In[]: fib_recursiv(30))
In[]: am apelat de atârea ori 1664079
In[]: fib_recursiv(34))
In[]: am apelat de atârea ori 11405773
print(muchii(graf))
[('a', 'c'), ('a', 'd'), ('b', 'd'), ('b', 'e'), ('c', 'a'), ('c', 'e'), ('e', 'b'), ('e', 'c'),
('d', 'a'), ('d', 'b')]
Graf -uri
Liste - Capitolul 10
Dicționare -Capitolul 11
Tuple - Capitolul 12
DE CITIT!
Tuple/Liste/Dictionare
https://docs.python.org/3/tutorial/datastructures.html
Curs 5
Limbajul PYTHON
Exemple/Exerciții
While Loop
In programare, traducerea cuvântului while (cât timp) vă spune că e vorba
de un interval de timp, iar loop însemna că ceva se repetă
Exemplu de implementare:
#Setez o variabilă:
nr=2
nr = 2
while nr < 5 :
# gasesc restul împărțirii la 2
if nr % 2 == 0:
print(Numărul "+str(nr)+" este par")
else:
print("Numărul "+str(nr)+" este impar")
# Incrementez variabile nr cu 1
nr+ = 1
For Loop
In programare, traducerea pentru for loop este că repetiția execu ției unui
code se va face pentru un anumit număr de ori.
for nr in range(3):
print("Multumesc")
For Loop
for nr in range(5,10,2) :
print("Eu sunt : "+str(nr))
Eu sunt: 5
Eu sunt: 7
Eu sunt: 9
for i in range(n,0,-1):
for j in range(i):
print("* ", end="")
print(" ")
desenez(4) # apelul functiei
* 0 # am inlocuit cu print(j, end=””)
** 01
*** 012
**** 0123
*** 012
** 01
* 0
Apel de funcție în altă funcție - decompoziție
Printați rezultatul.
Apel de funcție în altă funcție - decompoziție
def patrat(x):
y=x*x
return y
rez1 = sum_patrate(-3, 5)
rez2 = sum_patrate(-3, 5, 20)
print(rez1,rez2)
def faraVocale(s):
voc = "aeiouAEIOU"
vs = ""
for c in s:
if c not in voc : # în loc de not in cum puteam să mai scriu ?
vs = vs + c
return vs
Scrieți funcția care calculează de câte ori o anumită literă apare intr-un
string.
Strings
print(nr_char("abra ca dabra","a"))
Liste
Ce se va printa?
listanr = [1, 2, 3]
ss = ''.join(str(n) for n in listanr)
print(ss)
Liste
Care e diferența între funcțiile extend () și append() ?
def dublu(lin):
""" întoarce în lista lout - elementele double din lista lin """
lout = []
for v in lin:
elnou = 2 * v
lout.append(elnou)
return lout
Liste
def div3_7(n):
""" intoarce lista numerelor mai mici ca n, divizibile cu 3 și 7 """
rez = []
for i in range(2, n):
if i%3 ==0 and i%7 ==0:
rez.append(i)
return rez
rrr=div3_7(118)
[21, 42, 63, 84, 105]
List comprehension
List comprehensions este modalitatea concisă pentru a crea liste.
Sintaxa generală este:
m = [1,2,3,4,5]
rez = [item * 2 for item in m] # dublu elementelor din lista m
def div3_7(n):
re = [i for i in range(2,n) if i %3 ==0 and i%7 ==0]
return re
r=div3_7(118)
Functii Lambda
List comprehensions este modalitatea concisă pentru a crea liste.
Sintaxa generală este:
[<expression> for <item> in <sequence> if <condition>]
Ca și cum am scrie:
f = lambda x: x*x
[f(x) for x in range(10)]
Functii Lambda
def mmm(n):
return lambda a : a * n
ddd = mmm(2)
print(ddd(11))
List comprehension
li= [‘a’,’b’,’b’]
li.count(‘b’) # va fi 2
Exemplu:
X = [1,2,3,4,5,6,7,8,9]
[(1,2,3), (4,5,6), (7,8,9)]
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18,
19], [20, 21, 22, 23, 24], [25, 26, 27, 28, 29], [30, 31, 32, 33, 34],
[35, 36, 37, 38, 39],[40, 41, 42, 43, 44], [45, 46, 47, 48, 49]]
List
Folosind functiile zip() și iter() separ o listă în părți egale:
x = [1,2,3,4,5,6,7,8,9]
y = zip(*[iter(x)]*3) # impart lista x în 3
list(y) # folosesc metoda list() să printez rezultatul metodei zip()
[(1,2,3), (4,5,6), (7,8,9)]
4. Ultimul apel:
[1, 4, 7], [2, 5, 8], [3, 6, 9]
readline(n) – returnează linia din fișier - citește toate caracterele până (și
inclusiv ) întâlnește caracterul de linie nouă \n. Dacă n este specificat ca
parametru, numai n caractere vor fi returnate dacă linia este mai lungă
decât n.
fid.close()
Dicționare
Ce se va printa?
for ak in cutii.keys():
print("Ptr cheia", ak, "am valoarea", cutii[ak])
ks = list(cutii.keys())
print(ks)
print(list(cutii.values()))
print(list(cutii.items()))
Ce se va printa?
Exemple Dicționare
def iauv(d)
for k in d:
print(d[k])
Ce se va printa?
iauv(cutii) # ordinea cheilor nu e definita
430
525
312
217
Ce se va printa?
Exemple Dicționare
total = 0
zoo = {"cai":12, "dromaderi":6, "elefanti":23, "bizoni":20}
for ak in zoo:
if len(ak) > 3:
total = total + zoo[ak]
print(total)
Ce se va printa?
Exemple Dicționare
Scrieți un program care permite utilizatorului să introducă un șir de
caractere, apoi printează un tabel cu literele alfabetului care apar în
șir împreună cu numărul de apariție a fiecărei litere ( se afișează în
ordine alfabetică).
else:
nrL[c] = 1
return nrL
print(nr_a("banana"))
Dicționare
Limbajul PYTHON
Exemple/Exerciții
Recursivitate
Exemple while
S= 1*2 +2*3+3*4+….n*(n+1)
Exemple while
def calcul1(n):
s=0
i=1
while i<=n:
s=s+i*(i+1)
i=i+1
return s
Exemple while
S= 1+1*2 +1*2*3+1*2*3*4+….1*2*3...*n
Exemple while
def calcul2(n):
s=0
p=1
i=1
while i<=n:
p=p*i
s=s+p
i=i+1
return s
Exemple while
def calcul3(n):
11,13,17,19,23,29,31,37,41,43,47
List Comprehension
nuprime=[4,6,8...48,6,9,12,15…48,8,12,16,20...48,10,15,20..45,
12,18...14,21,49]
Facem inversa listei nuprime =lista numerelor mai mici ca 50 care SUNT
prime:
prime
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
Liste
def varsta(a,n):
for i in range(0, len(n)):
nume = n[i]
ani = a[i]
zile = ani*365
print('Buna ' + nume + '! ai trait pe aceasta planeta ' + str(zile) + '
zile!')
varsta(a,n)
Liste
['INVATAT', 'invatat', 7]
['E', 'e', 1]
['OMUL', 'omul', 4]
['CARE', 'care', 4]
['NU', 'nu', 2]
['TERMINA', 'termina', 7]
['NICIODATA', 'niciodata', 9]
['DE', 'de', 2]
['INVATAT', 'invatat', 7]
Liste
cuv =text.split()
for i in rez:
print(i)
Liste
def findMedian(L):
cc = L[:]
cc.sort()
if len(cc) % 2 == 1:
return cc[len(cc) / 2]
else:
return (cc[len(cc) / 2] + cc[len(cc) / 2 - 1]) / 2
Strings
Indicatii: Creați un string gol. Cand gasiti un caracter comun celor doua
cuvinte, verificati daca nu se afla in acest string.
Strings
w1 = input( "Introduceti cuvantul1: " )
w2 = input( "Introduceti cuvantul2: " )
comun = ""
for litera in w1:
if (litera in w2) and (litera not in comun):
comun += litera
if comun == "":
print( "Nu sunt litere comune" )
else:
print( "Cuvintele au aceste litere in comun", comun )
mere 10 15 20 30 40
pere 23 16 19 22
caise 8 22 17 14 32 17 24 21 2 9 11 17
gutui 12 28 21 45 26 10
prune 14 32 25 16 89
Scrieti scriptul care va afisa valoarea min si max pentru fiecare fruct
Strings
f = open("fructe.txt", "r")
for line in f:
items = line.split()
print(items[0], "min", min(items[1:]), "max", max(items[1:]))
f.close()
Recursivitate
Varianta iterativă:
def sumI(numL):
s=0
for i in numL:
s=s+i
return s
s= (2+(11+(40+(5+ (65+(44+33))))))
s= (2+(11+(40+(5 +(65+77)))))
s= (2+(11+(40+(5+142))))
s= (2+(11+(40+147)))
s= (2+(11+187))
s= (2+198)
s= 200
Varianta recursivă:
def sumR(numL):
if len(numL) == 1:
return numL[0]
else:
return numL[0] + sumR(numL[1:])
print(nr2tr(1453,16))
5AD
print(nr2tr(1453,2))
10110101101
print(nr2tr(1453,9))
1884
Fractali - Recursivitate Grafică
Exemplu: un copac este format dintr-un trunchi care are un alt copac care
ii crește pe dreapta și un alt copac care ii crește pe stanga -aplicăm
recursivitate în ambele direcții – recursivitate dublă
Fractali - Recursivitate Grafică
import turtle
def main():
t = turtle.Turtle()
myscr = turtle.Screen() # creez o fereastra grafică
t.lt(90)
t.pu()
t.bk(100)
t.pd()
t.color("green")
tree(t,75)
myscr.exitonclick() # inchid fereastra grafică
main()
Fractali - Recursivitate Grafică
import turtle
def getMid(p1,p2):
return ( (p1[0]+p2[0]) / 2, (p1[1] + p2[1]) / 2)
Fractali - Recursivitate Grafică
def sierpinski(t, pct, grad):
colormap = ['blue','red','green','white','yellow', 'violet','orange']
triunghi(t, pct, colormap[grad])
if grad > 0:
sierpinski(t, [pct[0],
getMid(pct[0], pct[1]),
getMid(pct[0], pct[2])],
grad-1)
sierpinski(t, [pct[1],
getMid(pct[0], pct[1]),
getMid(pct[1], pct[2])],
grad-1)
sierpinski(t,[pct[2],
getMid(pct[2], pct[1]),
getMid(pct[0], pct[2])],
grad-1)
Fractali - Recursivitate Grafică
def main():
t = turtle.Turtle()
myscr = turtle.Screen()
myPct = [[-100,-50],[0,100],[100,-50]]
sierpinski(t, myPct, 3)
myscr.exitonclick()
main()
Curs - Turtle
Limbajul PYTHON
CaseStudy - Turtle
Modulul Turtle
Verificăm dacă modulul Turtle este instalat (in ipython sau python).
Modulul turtle (cu literă mică 't') oferă o metodă numită Turtle (cu 'T'),
care creează un obiect Turtle, pe care îl atribuim unei variabile numită bob
Modulul Turtle
import turtle
bob = turtle.Turtle()
print(bob)
turtle.mainloop()
De exemplu, pentru a-l muta pe bob înainte (forward), apelăm metoda fd()
bob.fd (100)
Apelarea unei metode este ca și cum ați face o cerere: cereți lui bob să
meargă înainte.
Metodele:
Pentru a desena un unghi drept, adaugăm aceste linii la code (după crearea
obiectului bob și înainte de a apela metoda mainloop):
bob.fd (100)
bob.lt (90)
bob.fd (100)
bob.fd (100)
bob.lt (90)
bob.fd (100)
bob.lt (90)
bob.fd (100)
bob.lt (90)
bob.fd (100)
Rescriem așa:
for i in range(4):
bob.fd(100)
bob.lt(90)
Rândul suplimentar durează mai mult timp, dar simplifică codul dacă
facem același lucru de fiecare dată în buclă.
Acestă versiunea are de asemenea efectul de a păstra “broscu ța” în pozi ția
inițială, în direcția de plecare.
Modulul Turtle
Modulul Turtle
import turtle
t=turtle.Turtle()
t.speed(10)
t.pencolor(“red”)
d= 200
u=90
for i in range(1,50):
t.fd(d)
t.lt(u)
d=d-3
t.pu() # t.up() pen up
t.fd(300) # t.goto(x,y)
t.pd() # t.down() pen down
Avantaj: re-utilizam acest cod, fără a copia codul de mai multe ori !
Scrieți apelul de funcție în care broasca țestoasă este bob și apoi executați
programul din nou.
Încapsulare
def square(t):
for i in range(4):
t.fd(100)
t.lt(90)
import turtle
bob=turtle.Turtle()
square(bob)
Dacă creăm un nou obiect, o nouă broască țestoasă numită alice, putem
apela funcția square din nou :
alice = turtle.Turtle()
square(alice)
Generalizare
import turtle
bob=turtle.Turtle()
square(bob, 100)
Folositi metodele pu(), fd(), bk() si pd() pentru a desena pe ecran la altă
pozitie.
Generalizare
import turtle
bob=turtle.Turtle()
polygon(bob, 8, 70)
Folositi metodele pu(), fd(), bk() si pd() pentru a desena pe ecran la altă
pozitie.
Generalizare
import math
import turtle
bob=turtle.Turtle()
circle(bob, 100)
import math
def circle(t, r):
circumference = 2 * math.pi * r
n = int(circumference / 3) + 1
length = circumference / n
polygon(t, n, length)
import turtle
bob=turtle.Turtle()
circle(bob, 100)
Refactorizare
Dar arcul nu este la fel de cooperant- nu putem folosi poligonul sau cercul
să trasăm un arc de cerc.
for i in range(n):
t.fd(step_length)
t.lt(step_angle)
Partea de cod cu for seamana cu funcția polygon(), dar are imi trebuie alti
parametrii de intrare. Am putea să generalizăm funcția polygon() și să
adaugam un nou parametru de intrare angle, dar funcția o sa devină mai
apropiată de o polylinie, nu de un polygon.
Refactorizare
https://docs.python.org/3/library/turtle.html
python -m turtledemo
https://www.geeksforgeeks.org/turtle-programming-python/
https://stackoverflow.com/questions/14713037/python-turtle-set-
start-position
Curs 7
Limbajul PYTHON
Programare Orientată pe Obiect
(OOP)
Programare Orientată pe Obiecte(OOP)
Python: crearea de obiecte și clase de obiecte definite de utilizator
Avantajele OOP:
• reprezentare internă
prin atributele datelor
• interfața pentru interacțiunea cu alte obiecte
prin funcții/metode ce ascund implementarea
Indentarea codului pentru a indica care desclarații fac parte din defini ția
clasei
• date
- ne gândim la date ca la alte obiecte care compun clasa
( pentru un set de coordonate am nevoie de 2 numere)
• metode
- ne gândim la metode/funcțiile care se potrivesc numai cu acestă clasă
(pot să definesc distanța dintre 2 obiecte Coordonate, dar această distan ța
nu are niciun sens între 2 obiecte listă, sau string)
Definirea unei instanțe a unui obiect
Definesc o instanță a unui obiect cu o metoda specială numită
_ _init_ _ care va inițializa unele atribute ale obiectului:
class Coordonate(object):
def __init__(self, x, y):
self.x = x
self.y = y
parametrul self nu trebuie sa fie obligatoriu numit self, puteti sa-i dati
orice nume, dar trebuie sa fie primul parametru in orice metoda a
clasei
c=Coordonare(3,4)
print(c.x)
origine=Coordonate(0,0)
print(origine.x)
class Coordinate(object):
def __init__(self, x, y):
self.x = x
self.y = y
def distanta(self, pct): # calculez distanța între două puncte
dif_x = (self.x-pct.x)**2
dif_y = (self.y-pct.y)**2
return (dif_x + dif_y)**0.5
c = Coordonate(3,4) c = Coordonate(3,4)
origine = Coordonate(0,0) origine = Coordonate(0,0)
print(c.distanta(origine)) print(Coordonate.distanta(c, origine))
class Coordonate(object):
def __init__(self, x, y):
self.x = x
self.y = y
def distanta(self, pct):
dif_x = (self.x-pct.x)**2
dif_y = (self.y-pct.y)**2
return (dif_x + dif_y)**0.5
def __str__(self):
return "<" + str(self.x) + "," + str(self.y) + ">"
In []: c = Coordonate(3,4)
In []: print(c)
<3,4>
Reprezentarea unui obiect
Vreau să verific tipul unui obiect :
In []: print(type(c))
<class __main__.Coordinate>
c este o instanță a unei clase, iar tipul clasei este Coordonate. (__main__
precizează mediul Python unde a fost definită, mediul cu care eu
interacționez)
Pot sa fac o instanța a unui obiect, pot s-o printez, să aflu informa ții
despre ea.
Metoda magica __add__ este apelata cand adun doua numere folosind
operatorul +
>>> num=10
>>> num + 5
15
De fapt ceea ce se apeleaza e:
>>> num.__add__(5)
15
class Coordonate(object):
def __sub__(self, other):
return Coordonate(self.x-other.x, self.y-other.y)
In[]: c=Coordonate(5,10)
In[]: origine=Coordonate(0,0)
In[]: c-origine
<__main__.Coordonate at 0x11935f9e8 > # “-”este o metoda a clasei
In[]: x= c-origine
<5,10> # așa se printrează ptr că eu am definit metoda __str__
class fractie(object):
def __init__(self, num, numi):
self.num = num
self.numi = numi
def __str__(self):
return str(self.num) + ' / ' + str(self.numi)
class fractie(object):
def __init__(self, num, numi): # nu am mai rescris să am loc pe slide
def __str__(self): # nu am mai rescris să am loc pe slide
def getNumarator(self):
return self.num
def getNumitor(self):
return self.numi
In[]: jumatate.getNumarator()
1
jumatate este o instanță a obiectului fractie, cu operatorul “.” accesez
metoda getNumarator() - nu am self ca parametru, deoarece jumatate este
o instanța, se pasează automat self.
In[]: fractie.getNumitor(douatrimi)
3
nume_clasa.nume_metoda(instanța) – am ca argument instanța obiectului
Definirea clasei fractie - Pas3
Adaug noi metode, rescriu metodele: __add__ și __sub__
class fractie(object):
def __init__(self, num, numi): # nu am mai rescris să am loc pe slide
def __str__(self): # nu am mai rescris să am loc pe slide
def getNumarator(self): # nu am mai rescris să am loc pe slide
def getNumitor(self): # nu am mai rescris să am loc pe slide
def __add__(self, other):
numNew = other.getNumitor() * self.getNumarator() \
+ other.getNumarator() * self.getNumitor()
numiNew = other.getNumitor() * self.getNumitor()
return fractie(numNew, numiNew)
def __sub__(self, other):
numNew = other.getNumitor() * self.getNumarator() \
- other.getNumarator() * self.getNumitor()
numiNew = other.getNumitor() * self.getNumitor()
return fractie(numNew, numiNew)
def __str__(self):
""" intoarce reprezentarea a lui self ca strig """
self.vals.sort()
return '{' + ','.join([str(e) for e in self.vals]) + '}'
Testez obiectul intSet
In []: s = intSet()
In []: print(s)
{}
In []: s.insert(3)
In []: s.insert(4)
In []:s.insert(3)
In []:print(s)
{3, 4}
In []: s.member(3)
True
In []: s.member(6)
False
In []: s.remove(3)
In []: s.insert(6)
In []: print(s)
{4,6}
In []: s.remove(3)
ValueError: 3 nu e in lista
De ce OOP ?
definirea metodelor
(cum folosesc obiectul)
Definirea Clasei vs Instanța Clasei
Grupuri de obiecte
atribute data
- cum putem reprezenta un obiect cu ajutorul datelor?
- ce este obiectul?
ptr o coordonată: valorile x și y
pentru un animal: vârsta, nume
Pot defini legături pentru atributele date care sunt transmise – age
dar pot defini, de asemenea, și alte legături cu atribute date pe care am de
gând să le folosesc pe plan intern, le voi seta separat –name
In[]: a = Animal(3)
In[]: print(a)
In[]: animal: None:3
In[]: a.set_name(“Trump”)
In[]: print(a)
In[]: animal: Trump:3
In[]: a.get_age()
In[]: 3
class Animal(object):
def __init__(self, age):
self.years = age
def get_age(self):
return self.years
Dacă accesati atributele dată în afara clasei și în definiția clasei ele sunt
schimbate - > erori
In[]: print(55/0)
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
In[]: a = []
In[]: print(a[5])
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
IndexError: list index out of range
def vârsta():
v = int(input("Introduceți vârsta dvs: "))
if v < 0:
# Creăm o instanță a unei excepții
my_error = ValueError(str(v) +’ nu e vârsta potrivită’)
raise my_error
return v
Limbajul PYTHON
Programare Orientată pe Obiect
(OOP) - Ierarhii
OOP
Clasele -template-uri pentru a crea
propriile obiecte
Animal
Students
Ierarhii de Obiecte
clase copii
(subclase)
Cats, Rabbits, People, Students
Students
• moștenesc toate datele și comportamentul
clasei parinte
• adaugă mai multă informație (date)
• adaugă mai multă interacțiune (metode)
•comportament diferit, suprascriu interacțiunile clasei părinte(alte metode)
Ierarhii – Clasa Părinte
class Animal(object):
def __init__(self, age):
self.age = age # variabila unei instanțe
self.name = None # variabila unei instanțe
def get_age(self):
return self.age
def get_name(self):
return self.name
def set_age(self, newage):
self.age = newage
def set_name(self, newname=""):
self.name = newname
def __str__(self):
return "animal:"+str(self.name)+":"+str(self.age)
Ierarhii
In []: bob.set_name()
In []: print(bob) # apelez metodele clasei ptr a seta atribute
animal::1
Ierarhii
class Cat(Animal):
def speak(self):
print("meow”)
def __str__(self):
return "cat:"+str(self.name)+":"+str(self.age)
class Rabbit(Animal):
def speak(self):
print(”meep”)
def __str__(self):
return ”rabbit:"+str(self.name)+":"+str(self.age)
Utilizarea Ierarhiilor
In []: bob.speak()
AttributeError: 'Animal' object has no attribute 'speak'
Utilizarea Ierarhiilor
In []: elena.speak()
Hello
In []: print(fred)
student:Fred:18:Course VI
In []: fred.speak()
i have homework
In []: fred.speak()
i should eat
Variabilele Instanțelor vs Variabilele Claselor
tag folosit pentru a avea un id unic ptr fiecare noua instan ță a clasei
Rabbit
Variabilele Claselor și subclasa Rabbit
class Rabbit(Animal):
tag = 1 # variabila clasei Rabbit
def __init__(self, age, parent1=None, parent2=None):
Animal.__init__(self, age)
self.parent1 = parent1
self.parent2 = parent2
self.rid = Rabbit.tag
Rabbit.tag += 1
def get_rid(self):
return str(self.rid).zfill(3)
def get_parent1(self):
return self.parent1
def get_parent2(self):
return self.parent2
In[]: peter.set_name(‘Peter’)
In[]: hopsy.set_name(‘Hopsy’)
In []: print(cotton)
animal:Cottontail:1
In []: print(cotton.get_parent1())
animal:Peter:2
Definirea propriei metode: __add__
• vreau: r4 = r1 + r2
r1 și r2 sunt instanțe ale clasei Rabbit
r4 este o nouă instanța a clasei Rabbit cu age 0
Exemplu de utilizare
In []: peter.set_name(‘Peter’)
In []: hopsy.set_name(‘Hopsy’)
In []: mopsy.set_name('Mopsy')
In []: print(mopsy.get_parent1())
animal:Peter:2
In []: print(mopsy.get_parent2())
animal:Hopsy:3
Definirea propriei metode: __eq__
In []: peter.set_name(‘Peter’)
In []: hopsy.set_name(‘Hopsy’)
clasa Person:
# date
nume, data nașterii
import datetime
class Person(object):
def __init__(self, name): # crează o persoană cu numele name
self.name = name
self.birthday = None
self.lastName = name.split(' ')[-1]
def getLastName(self): # intoarce self's last name
return self.lastName
def __str__(self): # întoarce self's name
return self.name
def setBirthday(self,month,day,year): # setez data nașterii
self.birthday = datetime.date(year,month,day)
import datetime
class Person(object):
def __init__(self, name): # crează o persoană cu numele name
def getLastName(self): # intoarce last name
def __str__(self): # întoarce name
def setBirthday(self,month,day,year): # setez data nașterii
In[]:print(p1)
Out: 'Mark Zuckerberg'
Exemplu : sortare de date Person
personList.sort()
for e in personList: for e in personList:
print(e) print(e)
Mark Zuckerberg Andrew Gates
Drew Houston Bill Gates
Bill Gates Drew Houston
Andrew Gates Steve Wozniak
Steve Wozniak Mark Zuckerberg
Exemplu : utilizarea ierarhilor de clase
Person:
__init__
getLastName
__lt__
UPBPerson:
nextIDNum: 0(1) name, birthday, lastName, nextIDNum=0
__init__
__lt__
UPBPersonList.sort()
for e in UPBPersonList: for e in UPBPersonList:
print(e) print(e)
Bill Gates Mark Zuckerberg
Drew Houston Drew Houston
Mark Zuckerberg Bill Gates
# sortat după name # sortat după idNum
Exemplu utilizare ierarhii
In[]:p1 = UPBPerson(‘Eric’) # name=Eric, birthday, lastName, idNum=0
In[]:p2=UPBPerson(‘John’) # name=John, birthday, lastName, idNum=1
In[]:p3=UPBPerson(‘John’) # name=John, birthday, lastName, idNum=2
In[]: p4 = Person(‘John’) # name=John, birthday, lastName
In[]: p4 < p1
False
# p4 < p1 echivalent cu p4.__lt__(p1), care aplică metoda asociată cu
type lui p4, clasa Person (compară după name)
class UG(UPBPerson):
def __init__(self, name, classYear):
UPBPerson.__init__(self, name)
self.year = classYear # year=data atribut
def getClass(self):
return self.year
def speak(self, blablabla):
return UPBPerson.speak(self, " Dude, " + blablabla)
class Grad(UPBPerson):
pass # cuvânt cheie nu avem nimic de declarat
def isStudent(obj):
return isinstance(obj,UG) or isinstance(obj,Grad)
Exemplu : utilizarea ierarhilor de clase
In[]:print(s1)
Out: 'Matt Damon'
In[]: print(s1.getClass())
Out: 2017
In[]: print(s1.speak('unde este berea?'))
Out: Damon says: Dude, unde este berea?
In[]:print(s2.speak(‘Habar nu am!’))
Out: Affleck says: Habar nu am!
Principiul Substituției
Person
Ierarhia de clase:
UPBPerson
UG Grad
Ierarhia de clase:
UPBPerson
Student
UG Transfer
Grad
Principiul Substituției:
class Professor(UPBPerson):
def __init__(self, name, department):
UPBPerson.__init__(self, name)
self.department = department # setez un atribut nou
def speak(self, bla):
new = 'In course' + self.department + ' we say ’
return UPBPerson.speak(self, new + bla) # moștenită
def lecture(self, topic):
return self.speak('it is obvious that ' + topic) # propria metodă
In[]: print(faculty.lecture('hello'))
Who says: In course six we say it is obvious that hello
In[]:print(m1.speak('hi there'))
Mark Zuckerberg says: hi there
In[]:print(s1.speak('hi there'))
Matt Damon says:Dude, hi there
In[]:print(m1.speak('hi there'))
Mark Zuckerberg says: hi there
In[]:print(s1.speak('hi there'))
Matt Damon says:Yo Bro, hi there
class Grades(object):
def __init__(self): # creez un catalog gol
self.students = [] # lista studentilor
self.grades = {} # dicționar :mapez idNum -> lista notelor
self.isSorted = True # true daca self.students este sortată
class Grades(object):
def allStudents(self): # intorc lista studentilor din catalog
if not self.isSorted:
self.students.sort()
self.isSorted = True
return self.students[:]
six00 = Grades()
six00.addStudent(g1)
six00.addStudent(ug2)
six00.addStudent(ug1)
six00.addStudent(g2)
six00.addStudent(ug4)
six00.addStudent(ug3)
Rulez exemplul Catalog !
print(gradeReport(six00)) print(gradeReport(six00))
Matt Damon's mean grade is 95.0 Matt Damon's mean grade is 87.5
Ben Affleck's mean grade is 85.0 Ben Affleck's mean grade is 80.0
Drew Houston's mean grade is 75.0 Drew Houston's mean grade is 75.0
Mark Zuckerberg has no grades Mark Zuckerberg has no grades
Bill Gates’s mean grade is 100.0 Bill Gates’s mean grade is 95.0
Steve Wozniak’s mean grade is 25.0 Steve Wozniak’s mean grade is 35.0
Folosesc Catalogul !
for s in six00.allStudents():
print(s)
Librarii/Pachete Python
NumPy
Pachete & Python
1. NumPy - Matematica
2. Pandas – Data Exploration si Vizualizare
3. Matplotlib - Vizualizare
4. SciPy – Matematica, Inginerie
5. Plotly - Vizualizare
6. Seaborn - Vizualizare
7. BeautifulSoup - Data Mining
8. Scrappy - Data Mining
9. Scikit Learn - Machine Learning (ML) - invatare automata
10. PyCaret – Machine Learning ( ML)
11. TensorFlow – Deep Learning (DL) - invatare profunda
12. Keras – Deep Learning (DL)
13. PyTorch – Deep Learning (DL)
Pachete & Python
Panda oferă structuri de date pentru date sub formă de tabele care provin
din seturi de date reale.
Distributii Discrete
Distributii Continue
Funcții din Numpy.linalg
In[]: from numpy import array #import doar o funcție dintr-un pachet
# folosesc doar asa:
x=array([1,2,3])
Elementele arrays sunt toate de acelasi tip de date ( scriem cod mai
simplu și mai eficient) stocate într-un boc continnuu de memorie
Întreg în Python ?
x=10000 # tipul de date este inferat dinamic
struct _longobject {
long ob_refcnt;
PyTypeObject *ob_type;
size_t ob_size;
long ob_digit[1]; }
ob_refcnt - a reference count - aloca si dealoca memoria
• ob_type - encodează tipul variabilei
• ob_size - specifică dimensiunea următoarelor date membre
• ob_digit - conține valoarea întreagă actuală ce reprezintă variabila
Lista permite diverse tipuri de date- fiecare element este un obiect Python
La nivel de implementare:
In[]: type(poz)
numpy.ndarray
In[]: poz.dtype
dtype('float64')
In[]: poz.ndim
2
In[]: poz.shape
(10000000, 2)
In[]: poz.itemsize
8 # calculez bite size - float64
2 dimension ndarray
Indexarea liniilor si coloanelor de la 0
Cum creăm un array
Listele sunt foarte generale, pot conține orice fel de obiecte, sunt scrise
în mod dinamic. Listele nu oferă suport pentru funcții matematice.
Putem defini explicit tipul unui array când îl creăm folosind atributul
dtype ca argument:
Tipurile de date ce pot fi folosite : int, float, complex, bool, string, object
In[]: f=d.flatten()
In[]: f
array([ 6.+0.j, 6.+0.j, 6.+0.j, 6.+0.j, 6.+0.j, 6.+0.j, 6.+0.j,
6.+0.j, 6.+0.j])
Cum creăm un array cu funcții
Pentru date de dimensiuni mari, nu este practic să le inițializăm manual,
folosind liste.
In[]: a = arange(10)**3
In[]: a
array([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729])
In[]: a[0], a[2], a[-1] # primul, al treilea si ultimul element
(0, 8, 729)
In[]: a[2:5] # a[start: stop: step] echivalent cu a[start, stop) default step 1
array([ 8, 27, 64])
In[]: a[2:5] =55 # atribuim valoarea 55 pentru toate elementele din interval
array([ 0, 1, 55, 55, 55, 125, 216, 343, 512,729])
In[]: a[:6:2] = -1000 # echivalent cu a[0:6:2] = -1000
In[]: a
array([-1000, 1, -1000, 27, -1000, 125, 216, 343, 512, 729])
In[]: a[ : :-1] # în ordine inversă a
array([ 729, 512, 343, 216, 125, -1000, 27, -1000, 1, -1000])
Manipularea arrays
In[]: a = linspace(10, 100, num=10)
Out[]: print(a)
[ 10. 20. 30. 40. 50. 60. 70. 80. 90. 100.]
Dacă indecsii sunt mai putini ca nr axelor se întoarce array de dimensiune N-1
In[]: x=diag(arange(3))
x
array([[0, 0, 0],
[0, 1, 0],
[0, 0, 2]])
In[]: x[1,1] # linia 1, coloana 1 (primul indice linia, al doilea coloana)
In[]: b = array([[11, 12, 13, 14], [21, 22, 23, 24], [31, 32, 33, 34]])
Out[]:print(b)
[[11 12 13 14]
[21 22 23 24]
[31 32 33 34]]
În Python, toate numerele întregi diferite de zero se vor evalua drept True:
In []: v.take(ind)
Array([-2, 0, 2])
In []: take([-3, -2, -1, 0, 1, 2], ind) # fct take() aplicată pe liste și alte obiecte
Array([-2, 0, 2])
[[12 13 14 15],
[16 17 18 19],
[20 21 22 23]]])
Exercițiu
In[]: print(c)
[[12 13 14 15],
[16 17 18 19],
[20 21 22 23]]])
c[1,1,2]
c[1,1:,2:]
c[1, :, [1,2]]
Exerciții
In[]: %pylab
In[]: x=np.arange(3*4*5*6).reshape(3,4,5,6) ?
Calculele repetate asupra elementelor matricilor pot fi foarte rapide cand sunt
utilizate operațiuni vectorizate
In[]: x = arange(5)
In[]: y = zeros(10)
In[]: power(2, x, out=y[::2])
print(y)
[1. 0. 2. 0. 4. 0. 8. 0. 16. 0.]
In[]: data=genfromtxt('stkdate.dat')
In[]: data.shape
(643, 7) # 643 de linii si 7 coloane
In[]: mean(data[:,3]) # calculez temp medie in ultimii ani
In[]: std(data[:,3]), var(data[:,3]) # deviatia standard si varianta
In[]: data[:,3].min() , data[:,3].max() # valoarea min si max
Atenție!
In Python avem funcțiile buit-in sum(), min(), max() etc
În NumPy avem alte funcții sum(), min(), max() etc care operează mult
mai rapid si tin cont de dimensiunile arrays
Ufuncs - scipy.special
In[]: a = arange(3)
In[]:b = arange(3)[: , newaxis]
In[]:print(a)
Out[]:[0 1 2]
In[]:print(b)
Out[]:[[0]
[1]
[2]]
In[]: a + b
Out[]: array([[0, 1, 2],
[1, 2, 3],
[2, 3, 4]])
Broadcasting
Reguli Broadcasting
In[]: M+a
Out[]: array([[ 1., 2., 3.],
[ 1., 2., 3.]])
Sortarea
import numpy as np
def my_sort(x):
for i in range(len(x)):
swap = i + np.argmin(x[i:]) # găsesc valoarea minimă
(x[i], x[swap]) = (x[swap], x[i])
return x
NU așa ! Foarte lent algoritmul mai ales ptr foarte multe valori
NU folosim nici funcțiile sort() și sorted() de la liste!
http://www.numpy.org/
http://jrjohansson.github.io/computing.html
Curs 10
Matplotlib
Librarie grafică & Python
Matplotlib – librărie ce permite desenarea figurilor grafice 2D și 3D în
Python, astfel încât să se vizualizeze interactiv orice formă de date și
posibilitatea de a face figuri de calitate pentru articolele științifice.
Avantaje:
Ușor de învățat
Suport pentru texte și etichete formatate LATEX
Control sporit al fiecărui element dintr-o figură, inclusiv dimensiunea
figurii și DPI (dots per inch)- toate aspectele figurii pot fi controlate
prin programare
Salvarea figurilor de calitate în diverse formate PNG, PDF, SVG, EPS,
și PGF.
GUI pentru a explora în mod interactiv cifre și pentru generarea
figurilor
Import Matplotlib
Libraria Matplotlib trebuie importată în scripturi/fișiere sau folosită
interactiv în IPython
sau așa:
In[]: import numpy as np
In[]: import matplotlib.pyplot as plt
# folosesc asa:
x= plt. subplots() #subplot este o funcție din pachetul pyplot
Exemple
Majoritatea funcțiilor din MATLABsunt implementate în modulul pyplot
In[]: % pylab
In[]: x=linspace(0, 5, 10)
In[]: y= x**2
In[]: plot(x,y, ‘r’)
In[]: xlabel('x')
In[]: ylabel('y',fontsize=’large’)
In[]:title('orice text')
Accesăm help-ul:
In[]: ylabel?
Accesăm help-ul:
In[]: plot?
Exemplu - subplot()
Multiple plots – împărțim fereastra de desenare:
subplot(nr de linii, nr de coloane, poziția activă)
x=array([1,2,3,2,1])
y=array([1,3,2,3,1])
subplot(1,2,1)
plot(x, ‘c--’)
subplot(1,2,2)
plot(y, ‘g*-’)
Accesăm help-ul:
In[]: subplot?
Matplotlib
Ideea principală este de a avea obiecte pe care se pot aplica funcții și acțiuni
și niciun obiect sau program nu ar trebui să fie global (cum este API
MATLAB).
Pentru a utiliza API-ul orientat pe obiect folosim clasa Figure - dar în loc să
creăm o nouă figură globală, păstrăm o referință la instanța figurii create
(într-o variabilă) și în ea vom folosi metode (exemplu: creăm noi axe cu
metoda add_axes)
Exemplu API Orientată -obiect
import matplotlib.pylab as plt
x=linspace(0,5,10)
y=x**2
fig = plt.figure()
# stânga, jos, lațime, înălțime (range 0 to 1)
axes1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # axe principale
axes2 = fig.add_axes([0.2, 0.5, 0.4, 0.3]) # axe insert
# figura principală
axes1.plot(x, y, 'r')
axes1.set_xlabel('x')
axes1.set_ylabel('y')
axes1.set_title('title')
# insert
axes2.plot(y, x, 'g')
axes2.set_xlabel('y')
axes2.set_ylabel('x')
axes2.set_title('insert title')
fig.show()
Exemplu figsize, DPI, savefig
Matplotlib permite ca DPI raportul de aspect și dimensiunea figurii să fie
specificate când obiectul figure este creat, folosind argumentele figsize și
dpi.
figsize este o tuplă (lățimea , înălțimea) figurii în inch,
dpi este dots-per-inch (pixel per inch).
O metodă mai bună este utilizarea argumentului label funcției plot, iar
apoi folosim metoda legend fără argumente pentru a adăuga legenda
figurii:
fig, ax = subplots()
ax.plot(x, x**2, label="y = x**2")
ax.plot(x, x**3, label="y = x**3")
ax.legend(loc=2)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('title')
Formatarea textului:LaTeX, font size, font family
Sau putem seta ca matplotlib să folosească LaTeX ptr orice element text
din figură:
matplotlib.rcParams.update({'font.size': 18, 'text.usetex': True})
# restaurăm condițiile
matplotlib.rcParams.update({'font.size': 12, 'font.family': 'sans',
'text.usetex': False})
Formatarea textului:LaTeX, font size, font family
Serif STIR
LaTeX
Setare culorilor
x=linspace(0,5,20)
# MATLAB style
ax.plot(x, x**2, 'b.-') # dots line albastra
ax.plot(x, x**3, 'g--') # dashed line verde
x=linspace(0,5,20)
fig, ax = subplots(figsize=(12,6))
ax.plot(x, x+1, color="blue", linewidth=0.25)
ax.plot(x, x+2, color="blue", lw=0.50)
# custom dash
line, = ax.plot(x, x+8, color="black", lw=1.50)
line.set_dashes([5, 10, 15, 10]) # formatul: line length, space length, ...
Setare stilurilor de markers
# simboluri de markers posibili: '+', 'o', '*', 's', ',', '.', '1', '2', '3', '4', ...
ax.plot(x, x+ 9, color="green", lw=2, ls='--', marker='+')
ax.plot(x, x+10, color="green", lw=2, ls='--', marker='o')
ax.plot(x, x+11, color="green", lw=2, ls='--', marker='s')
ax.plot(x, x+12, color="green", lw=2, ls='--', marker='1')
x=linspace(0,5,20)
fig, axes = subplots(3, 1, figsize=(12, 4))
axes[0].plot(x, x**2, x, x**3)
axes[0].set_title("default axes ranges")
x=linspace(0,5,20)
fig, axes = plt.subplots(2, 1, figsize=(10,4))
axes[0].plot(x, x**2, x, exp(x))
axes[0].set_title("Normal scale")
x=linspace(0,5,20)
fig, ax = subplots(figsize=(10, 4))
ax.plot(x, x**2, x, x**3, lw=2)
ax.set_xticks([1, 2, 3, 4, 5])
ax.set_xticklabels([r'$\alpha$',r'$\beta$',
r'$\gamma$', r'$\delta$', r'$\epsilon$'],
fontsize=18)
x=linspace(0, 5, 10)
fig, ax = subplots(1, 1)
ax.set_xlabel("x")
ax.set_ylabel("y")
Grid
x=linspace(0,5,10)
fig, axes = subplots(1, 2, figsize=(10,3))
# default grid
axes[0].plot(x, x**2, x, x**3, lw=2)
axes[0].grid(True) # afișează gridul
# custom grid
axes[1].plot(x, x**2, x, x**3, lw=2)
axes[1].grid(color='b', alpha=0.5, linestyle='dashed', linewidth=0.5)
Axe duale – funcțiile twinx și twiny
ax2 = ax1.twinx()
ax2.plot(x, x**3, lw=2, color="red")
ax2.set_ylabel(r"volume $(m^3)$", fontsize=18, color="red")
for label in ax2.get_yticklabels():
label.set_color("red")
Axa x și y sunt 0
fig, ax = subplots()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
# setez poziția lui x la x=0
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
# setez poziția lui y la y=0
ax.spines['left'].set_position(('data',0))
subplot2grid
fig = figure()
ax1 = subplot2grid((3,3), (0,0), colspan=3)
ax2 = subplot2grid((3,3), (1,0), colspan=2)
ax3 = subplot2grid((3,3), (1,2), rowspan=2)
ax4 = subplot2grid((3,3), (2,0))
ax5 = subplot2grid((3,3), (2,1))
fig.tight_layout()
Figuri cu multiple subplots
gridspec
import matplotlib.gridspec as gridspec
fig = figure()
gs = gridspec.GridSpec(2, 3, height_ratios=[2,1], width_ratios=[1,2,1])
for g in gs:
ax = fig.add_subplot(g)
fig.tight_layout()
Obiectele Figure si Axes
Rețineți cu plt.<func>() avem acces doar la ultimul obiect Figure
In[]: plt.close('all')
rcParams
Este important să vă simțiți confortabili să lucrați cu obiectele Figure și
Axes, acestea permite un control mai fin al vizualizărilor.
In[]: rcParams['figure.figsize']
[6.4 , 4.8 ]
In[]: rcdefaults()
Diverse 2D plots
Scatter - identificăm corelații și posibile
relații neliniare între variabile
x=rand(200)
y=rand(200)
size=rand(200)*30
color=rand(200)
scatter(x,y,size,color)
colorbar()
fill_between
fig, axes = subplots(1,1, figsize=(12,3))
axes.fill_between(x, x**2, x**3,
color="green", alpha=0.5)
axes.set_title("fill_between")
Polar plots
%pylab
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.cm.hot)
ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap=plt.cm.hot)
ax.set_zlim(-2,2)
plt.show()
3D plots- suprafețe
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
# `ax` e o instanță 3D deoarece cuvântul cheie projection='3d' e
argument al metodei add_subplot
ax = fig.add_subplot(1,1, 1, projection='3d')
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
%pylab
from mpl_toolkits.mplot3d import Axes3D
t=linspace(0,30, 1000)
x,y,z=[ t*cos(t), t*sin(t), t]
fig = figure()
ax = fig.gca(projection='3d')
ax.plot(x, y, z)
Mayavi - mlab
Mayavi2 oferă vizualizarea interactivă a datelor 3D:
Instalare:
pip install ipyvolume # folosind comanda pip
https://ipyvolume.readthedocs.io/en/latest/?badge=latest
SEABORN
https://seaborn.pydata.org/
https://python-graph-gallery.com/
DASH
Dash este un frameworkPython pentru construirea aplicațiilor web.
https://dash.plot.ly/
Aplicația exportă în mod dinamic date din Google Finance într-un
DataFrame Pandas.
Codul sursa:
https://gist.github.com/chriddyp/3d2454905d8f01886d651f207e2419f0
BASHPLOTLIB
Bashplotlib este instrument in linie de comandă pentru realizarea
ploturilor de bază în terminal.
Se instaleaza așa:
pip install bashplotlib
Se instaleaza așa:
pip install bashplotlib
http://matplotlib.org
http://docs.enthought.com/mayavi/mayavi/
https://seaborn.pydata.org
https://ipyvolume.readthedocs.io/en/latest/?badge=latest
https://dash.plot.ly/
Bibliografie
PANDAS
Pandas & Python
Librăria Pandas este cea care trebuie utilizată când doriți să faceți
manipularea și analiza datelor heterogene în Python.
In[]: pd.__version__
In[]: pd?
In[]: pd.<TAB>
Pandas
In []: obj.values
Out[]: array([-3, 4, -6, -8]) # NumPy array
In []: obj.index
Out[]: RangeIndex(start=0, stop=4, step=1) # array-like
Series
In[]:from pandas import Series
In []: obj2 = Series( [4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
In []: obj2
Out[]:
d 4
b 7
a -5
c 3
dtype:int64
In []: obj2.index
Out[]: Index(['d', 'b', 'a', 'c'], dtype='object')
In[]: obj2.index[1:]
Out[]: Index([b, a, c], dtype=object)
In[]: list(data.items())
Out[]:[('d', 4), ('b', 7), ('a', -5), ('c', 3)]
Series
Indexul unei structuri Series deja create poate fi alterat prin atribuire
(assignment):
In []: obj2 = Series( [4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
In []: data = pd.Series([0.25, 0.5, 0.75, 1.0], index=['a', 'b', 'c', 'd'])
Out[]:
a 0.25
b 0.50
c 0.75
d 1.00
dtype: float64
sau asa
Ce observați?
Series
In []: obj4.isnull()
Out[]:
California True
Ohio False
Oregon False
Texas False
Series
O caracteristică critică a structurilor Series pentru multe aplicații este
aceea că se aliniază automat, datele indexate în operațiile aritmetice:
In []: frame
Out[]:
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
In []: frame2
Out[]:
year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 NaN
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 NaN
five 2002 Nevada 2.9 NaN
In [23]: frame2.columns
Out[23]: Index(['year', 'state', 'pop', 'debt'], dtype='object')
Cum creăm DataFrame
df.loc[] df.iloc[]
df.loc[‘A’]
df.iloc[1]
df.iloc[:, 2]
df.loc[:, 49]
df.iloc[-2:]
df.loc[‘A’:, 49] # conteaza ordinea pentru :
df.iloc[:1, :2]
Cum selectăm anumite valori din DataFrame
In[]: df = DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), index=
[2, 'A', 4], columns=[48, 49, 50])
df=
48 49 50
2 1 2 3
A 4 5 6
4 7 8 9
df.at[] df.iat[]
-at va funcționa la fel ca loc, dar mai rapid (indicele nu este intreg)
df.at[‘A’, 49]
-iat va funcționa la fel ca iloc (indicele doar valori intregi)
df.iat[2,1]
In []: frame
Ohio Texas California
a 0 1 2
c 3 4 5
d 6 7 8
Metode pentru ștergerea, îndepărtarea sau înlocuirea valorilor NaN sau null in
structurile de date Pandas.
dropna() - întoarce o versiune filtrată a datelor lipsă (se poate seta câte)
In[]:df = DataFrame([[1., 6.5, 3.], [1., NAN, NAN], [NAN, NAN, NAN],
[NAN, 6.5, 3.]])
în DrataFrame:
In[]: df.dropna() # șterge orice linie ce conține cel puțin o valoare NAN
In[]: df.dropna(how=’all’) # șterge doar liniile ale caror valori sunt toate NAN
In[]: data.dropna(axis=1, how='all') # sau axis=”columns”
0 1 2
0 -0.252457 NaN NaN
1 -0.337905 NaN NaN
2 1.690233 NaN 0.515731
3 0.371090 NaN 1.397751
4 -2.188474 -0.391753 -0.042306
5 0.144136 -0.866658 -0.507123
6 -0.138193 0.540594 0.856762
import numpy as np
In[]: x = [1, 2, 3]
In[]: y = [4, 5, 6]
In[]: z = [7, 8, 9]
In[]: np.concatenate([x, y, z])
Out[]: array([1, 2, 3, 4, 5, 6, 7, 8, 9])
In[]: df1
A B
1 A1 B1
2 A2 B2
In[]: df2
A B A B
3 A3 B3 1 A1 B1
4 A4 B4 2 A2 B2
3 A3 B3
In[]: print(pd.concat([df1, df2])) 4 A4 B4
In[]: df1
A B
1 A1 B1
2 A2 B2
In[]: df2
A B A B
1 A3 B3 1 A1 B1
2 A4 B4 2 A2 B2
1 A3 B3
In[]: print(pd.concat([df1, df2])) 2 A4 B4
In[]: df1
A B
0 A1 B1
1 A2 B2
In[]: df2
A B A B
0 A3 B3 x 0 A1 B1
1 A4 B4 1 A2 B2
y 0 A3 B3
In[]: print(pd.concat([df1, df2], keys=['x', 'y'])) 1 A4 B4
De multe ori este util să stochezi date cu dimensiuni superioare - adică date
indexate cu mai mult de una sau două dimensiuni.
Pandas oferă obiecte Panel și Panel4D care gestionează în mod nativ date
tridimensionale și patru dimensiuni.
Un mod mult mai comun în practică este acela de a folosi indexarea ierarhizată
(sau multi-indexare) pentru a încorpora mai multe niveluri de index în cadrul
unui index unic.
De multe ori este util să stochezi date cu dimensiuni superioare - adică date
indexate cu mai mult de una sau două dimensiuni.
Pandas oferă obiecte Panel și Panel4D care gestionează în mod nativ date
tridimensionale și patru dimensiuni.
Un mod mult mai comun în practică este acela de a folosi indexarea ierarhizată
(sau multi-indexare) pentru a încorpora mai multe niveluri de index în cadrul
unui index unic.
Dacă vrem să selectăm toate valorile din 2010 – e complicat si foarte lent:
In[] : p[[i for i in p.index if i[1] == 2010]]
In[]:pd.MultiIndex.from_tuples([('a', 1), ('a', 2), ('b', 1), ('b', 2)]) sau așa
In []: df
a b c d message
0 1 2 3 4 hello
1 5 6 7 8 world
2 9 10 11 12 foo
A B C\n',
'aaa -0.264438 -1.026059 -0.619500\n',
'bbb 0.927272 0.302904 -0.032399\n',
'ccc -0.264273 -0.386314 -0.217601\n',
'ddd -0.871858 -0.348382 1.100491\n'
http://pandas.pydata.org/pandas-docs/stable/generated/
pandas.DataFrame.to_csv.html
Scrierea datelor in format Excel
http://pandas.pydata.org/pandas-docs/stable/generated/
pandas.DataFrame.to_excel.html
http://pandas.pydata.org/pandas-docs/stable/io.html
Bibliografie
https://pandas.pydata.org/
https://www.youtube.com/watch?v=9d5-Ti6onew
https://tutswiki.com/pandas-cookbook/chapter1/