Curs Python
Curs Python
CURS 1
INTRODUCERE
INTRODUCERE
De la începutul acestui mileniu, creșterea accelerată a soluțiilor software de tip open source a produs
proiecte remarcabile.
Specialiștilor în data science li s-au deschis astfel oportunități enorme pentru prelucrarea volumelor mari de
date.
Cel mai important rezultat al proiectelor open source în domeniu este Python.
Pyhon își are rădăcinile în domeniile științific și al tehnicii de calcul și are o sintaxă foarte compactă.
Ultimii ani au fost marcați de o intensificare a implementărilor în care sunt folosite combinat tehnologii
proprietare și open source.
Este important să găsim modalități de combinare a capacitățile acestor limbajelor comerciale și open source
pentru a se completa reciproc.
CARACTERISTICI
Variabilele nu necesita declarare explicita si sunt case- Limbajului SAS nu este necesar să se declare variabile și tipurile
sensitive. de date asociate, deoarece sunt deduse din utilizarea lor.
Categorii generale de tipuri de date Python: a) Încorporate Limbajul SAS de bază nu face distincție între numere întregi și
în limbaj; b) Adăugate de terți; c) Create prin codul Python. float. Implementări mai noi, cum ar fi SAS Cloud Analytic
Services (CAS) definesc o gamă de tipuri de date numerice.
Permit manipularea unei mari varietăți de date și îi permit
să fie un limbaj de programare de nivel înalt (de uz general), Tipurile de date pentru SAS sunt fie numerice, fie de caractere.
pe lângă utilizarea sa ca limbaj de prelucrare a datelor. Intern, SAS reprezintă valorile numerice în virgulă mobilă.
Python permite operații aritmetice „mixte” – sunt permise Limbajul SAS efectuează multe procesări necesare pentru
în expresii tipuri de date diferite. conversia sau citirea datelor fără intervenția utilizatorului.
TIPURI DE DATE- PYTHON/SAS
COLECTII DE DATE – LISTE (ARRAY)
• Colecții de date care pot fi neomogene, ordonate și modificabile, permit elemente identice si sunt
reprezentate utilizând [ ];
• Modificare element: lista[index] = valoare → index incepe de la 0;
• Numar elemente: len(lista);
• Adaugare element la sfarsitul listei: lista.append(element);
• Adaugare element la un anumit index: lista.insert(index,element);
• Eliminare element:
- lista.remove(element)→elimina primul element daca in lista exista mai multe elemente identice;
- lista.pop(index) → elimina ultimul element daca nu se specifica indexul;
- del lista[index];
• Golire lista: lista.clear();
• Sterge lista: del lista.
ACCESARE LISTE
seq = [7, 2, 3, 7, 5, 6, 0, 1]
Index 0 1 2 3 4 5 6 7
-7 -6 -5 -4 -3 -2 -1 0
print(seq[1:5])
# Afiseaza elemente lista de la indexul 1 pana la 5 exclusiv [2, 3, 7, 5]
seq[3:4] = [6, 3]
print(seq)
# Modificare elemente de la pozitiile 3 si 4 [7, 2, 3, 6, 3, 5, 6, 0, 1]
seq[3:] = [6, 3]
print(seq)
# Inlocuirea tuturor elementelor incepand de la pozitia 3 a listei [7, 2, 3, 6, 3]
print(seq[:3])
# Afisare elemente lista pana la pozitia 3 exclusiv [7, 2, 3]
print(seq[3:])
# Afisare elemente lista incepand de la pozitia 3 [6, 3]
print(seq[-4:])
# Afisare elemente lista de la coada la cap pana la pozitia -4 exclusiv [2, 3, 6, 3]
print(seq[-4:-2])
# Afisare elemente lista de la coada la cap de la pozitia -2 la -4 exclusiv [2, 3]
print(seq[::2])
# Afisare elemente din 2 in 2 [7, 3, 3]
print(seq[::-1])
# Inversare elemente [3, 6, 3, 2, 7]
Metoda Descriere #Exemplu 1
b = ['saw', 'small', 'He', 'foxes', 'six']
append() Adaugă un element la sfârșitul listei b.sort(reverse = True)
clear() Elimină toate elementele listei print(b)
b.sort(key=len)
copy() Crează o copie a listei print(b)
count() Returnează numărul de apariții al elementului în listă #['small', 'six', 'saw', 'foxes', 'He’]
extend() Adăugă elemente la sfârșitul unei liste #['He', 'six', 'saw', 'small', 'foxes']
Ex: seq = [7, 2, 3, 6, 3]; seq.extend([1,2,3]); print(seq)
#Exemplu 2
→ [7, 2, 3, 6, 3, 1, 2, 3] import bisect as bi
index() Returnează indexul unui element b = ['saw', 'small', 'He', 'foxes',
'six']
insert() Adaugă un element la poziția specificată b.sort()
pop() Elimină elementul de la poziția specificată print(bi.bisect(b,'sell'))
bi.insort(b,'sell')
remove() Elimină primul element specificat print(b)
reverse() Inversează ordinea elementelor în listă
#3
sort() Sortează lista #['He', 'foxes', 'saw', 'sell', 'six',
'small']
COLECTII DE DATE
LISTE METODE
FUNCTII BUILD-IN ENUMERATE
b = ['saw', 'small', 'He', 'foxes', 'six']
for i, value in enumerate(b,3):
enumerate(iterable, start=0)
print(i, value)
permite parcurgerea unei colecții de
lista = list(enumerate(b,1)) elemente în timp ce păstrează indexul
print(lista) elementului curent într-o variabilă
contor. Parametri:
dictionar = dict(enumerate(b,1)) • iterable - o secvență, un iterator sau
print(dictionar) obiect care suportă iterație
• start (optional) - enumerate()
pornește numărarea de la acest număr.
'''3 saw
4 small
Implicit este 0.
5 He
6 foxes
7 six
[(1, 'saw'), (2, 'small'), (3, 'He'), (4, 'foxes'), (5, 'six’)]
Metoda Descriere
clear() Elimină toate elementele din dicționar
copy() Returnează o copie a dicționarului
fromkeys() Creează un dicționar cu chei și valori specificate
get() Returnează valoarea pentru o anumită cheie
items() Returnează o listă conținând un tuplu pentru fiecare pereche cheie-valoare
keys() Returnează o listă conținând cheile dicționarului
pop() Elimină elementul având o anumită cheie specificată
popitem() Elimină ultima pereche adăugată cheie-valoare
update() Actualizează dicționarul cu perechile cheie-valoare specificate
values() Returnează o listă cu toate valorile dicționarului
Exemple dictionare
d1 = {'a' : 'some value', 'b' : [1, 2, 3, 4]}; print(d1)
# Afiseaza d1 {'a': 'some value', 'b': [1, 2, 3, 4]}
d1[7] = 'an integer'
print(d1)
# Adauga un element la d1 {'a': 'some value', 'b': [1, 2, 3, 4], 7: 'an integer’}
print(d1['b'])
# Afiseaza valoarea pentru cheia respectiva [1, 2, 3, 4]
print('b' in d1)
# Verifica daca cheia respectiva face parte din dictionar True
d1[5] = 'some value’; d1['dummy'] = 'another value’ # Adauga noi elemente {'a': 'some
value','b': [1, 2, 3, 4],7: 'an integer',5: 'some value','dummy': 'another value’}
del d1[5] # Sterge elementul corespunzator {'a': 'some value','b': [1, 2, 3, 4],7: 'an
integer','dummy': 'another value’}
ret = d1.pop('dummy’); # Sterge {'a': 'some value', 'b': [1, 2, 3, 4], 7: 'an integer’}
list(d1.keys()) # Pune cheile intr-o lista ['a', 'b', 7]
list(d1.values()) # Pune valorile in lista ['some value', [1, 2, 3, 4], 'an integer’]
d1.update({'b' : 'four', 'c' : 12})
# Actualizeaza d1 {'a': 'some value', 'b': 'four', 7: 'an integer', 'c': 12}
Exemple dictionare
# Dictionare = colectii formate din doua tupluri
col2tup=dict(zip((0,1,2,3,4),(4,3,2,1,0)))
print(col2tup)
#{0: 4, 1: 3, 2: 2, 3: 1, 4: 0}
col2tup = dict(zip(range(5), reversed(range(5))))
print(col2tup)
#{0: 4, 1: 3, 2: 2, 3: 1, 4: 0}
# Clasificare lista de cuvinte pornind de la prima litera formand un dictionar de de
liste
words = ['dig','apple', 'bat', 'corn', 'dog', 'bar', 'atom', 'book', 'cat', 'cattle']
by_letter = {}
for word in words:
letter = word[0]
if letter not in by_letter:
by_letter[letter] = [word]
else:
by_letter[letter].append(word)
print(by_letter)
#{'d': ['dig', 'dog'], 'a': ['apple', 'atom'], 'b': ['bat', 'bar', 'book'], 'c':
['corn', 'cat', 'cattle']}
print(dict(sorted(by_letter.items())))
#{'a': ['apple', 'atom'], 'b': ['bat', 'bar', 'book'], 'c': ['corn', 'cat',
'cattle'], 'd': ['dig', 'dog']}
COLECTII DE DATE - SETURI
• Colecții de date neordonate, nemodificabile și neindexate. Nu sunt acceptate elemente identice. Seturile sunt
reprezentate prin { }. Se aseamana cu dictionarele, numai ca elementele nu sunt cheie-valoare.
Metoda Descriere
add() Adaugă un element
clear() Elimină toate elementele setului
copy() Returnează o copie a setului
difference() Returnează un set reprezentând diferența dintre două sau mai multe seturi
difference_update() Elimină elementele dintr-un set care sunt conținute de un alt set specificat
discard() Elimină un element specificat
intersection() Returnează un set reprezentând intersecția a două seturi
intersection_update() Elimină elementele dintr-un set care nu sunt în alt set
isdisjoint() Arată dacă două seturi se intersectează sau nu
issubset() Arată dacă un set este inclus într-un alt set sau nu
issuperset() Arată dacă un set conține un alt set sau nu
pop() Elimină un element
remove() Elimină elementul specificat
symmetric_difference() Returnează un set cu elemente necomune celor doua seturi
symmetric_difference_update() Inserează intr-un set diferențele dintre două seturi
union() Returnează un set reprezentând reuniunea a două seturi
update() Actualizează setul cu reuniunea dintre un set și altele
Exemple seturi
print(set([2, 2, 2, 1, 3, 3]))
#{1, 2, 3}
print({2, 2, 2, 1, 3, 3})
#{1, 2, 3}
a = {1, 2, 3, 4, 5}
b = {3, 4, 5, 6, 7, 8}
print(a.union(b)); print(a | b)
#{1, 2, 3, 4, 5, 6, 7, 8}
print(a.symmetric_difference(b)); print(a^b)
#{1, 2, 6, 7, 8}
print(a.symmetric_difference_update(b))
print(a)
#{1, 2, 6, 7, 8}
my_data1 = [1, 2, 3, 4]
my_data2 = [4, 5]
my_set = {tuple(my_data1), tuple(my_data2)}
print(my_set)
#{(4, 5), (1, 2, 3, 4)}
Prelucrari colectii
1) strings = ['a', 'as', 'bat', 'car', 'dove', 'python']
3) Afisare lungime elemente. SINTAXA set = {expr for value in collection if condition}
unique_lengths = {len(x) for x in strings}
print(unique_lengths)
#{1, 2, 3, 4, 6}
4) Afisare nume in care litera a apare de cel putin 2 ori #nested lists
nume = [['John', 'Emily', 'Michael', 'Mary', 'Steven'],['Maria', 'Juan', 'Javier', 'Natalia', 'Pilar']]
result = [name for names in nume for name in names if name.count('a') >= 2]
print(result)
#['Maria', 'Natalia’]
OPERATORI ARITMETICI, ATRIBUIRE,
COMPARATIE
Operator Denumire Exemplu
+ Adunare x+y Operator Exemplu Echivalent
- Scădere x-y
= x=5 x=5
* Înmulțire x*y
/ Împărțire x/y
+= x += 3 x=x+3
% Restul împărțirii x%y -= x -= 3 x=x-3
** Exponențial x ** y *= x *= 3 x=x*3
// Partea întreagă a x // y /= x /= 3 x=x/3
împărțirii %= x %= 3 x=x%3
//= x //= 3 x = x // 3
Operator Denumire Exemplu **= x **= 3 x = x ** 3
== Egal x == y
!= Diferit x != y
> Mai mare x>y
< Mai mic x<y
>= Mai mare sau egal x >= y
<= Mai mic sau egal x <= y
OPERATORI LOGICI, IDENTITATE,
APARTENENTA
Operator Descriere Exemplu
and Returnează True dacă ambele expresii sunt adevărate x < 5 and x < 10
or Returnează True dacă cel puțin o expresie este adevărată x < 5 or x < 4
not Negația, inversează rezultatul returnând False dacă rezultatul este not(x < 5 and x < 10)
adevărat
if x < 0:
print('It is negative')
elif x == 0:
print('Equal to zero')
elif 0 < x < 5:
print('Positive but smaller than 5')
else:
print('Positive and larger than or equal to 5')
STRUCTURI REPETITIVE (FOR)
sequence = [1, 2, None, 4, None, 5]
total = 0 #12
for value in sequence:
if value is None:
continue
total += value
print(total) #13
sequence = [1, 2, 0, 4, 6, 5, 2, 1]
total_until_5 = 0
for value in sequence: (0, 0)
if value == 5: (1, 0)
break (1, 1)
total_until_5 += value (2, 0)
print(total_until_5) (2, 1)
(2, 2)
for i in range(4): (3, 0)
for j in range(4): (3, 1)
if j > i: (3, 2)
break (3, 3)
print((i, j))
STRUCTURI REPETITIVE (WHILE)
i = 1
while i < 6:
print(i)
if i == 3:
break
i += 1
i = 0
while i < 6:
i += 1
if i == 3:
continue
print(i)
GENERATOARE (SUPLIMENTAR)
#Functie care calculeaza x**2 import itertools
def squares(n=10):
print('Generating squares from 1 to
{0}'.format(n ** 2)) first_letter = lambda x: x[0]
for i in range(1, n + 1):
yield i ** 2 names = ['Alan', 'Adam', 'Wes', 'Will',
gen = squares() 'Albert', 'Steven', 'Simona', 'Ana’]
for x in gen:
print(x) names = sorted(names, key = first_letter)
#echivalent cu
gen = (x ** 2 for x in range(1,11)) for letter, names in
print(list(gen)) itertools.groupby(names, first_letter):
#Generatorul poate fi argumentul unei print(letter, list(names))
functii
print(sum(x ** 2 for x in range(1,11))) '''A ['Alan', 'Adam', 'Albert', 'Ana']
#385 S ['Steven', 'Simona']
W ['Wes', 'Will']'''
#dictionar format din valoare – patratul
valorii
print(dict((i, i **2) for i in range(5)))
#{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
BIBLIOGRAFIE
• Python for Data Analysis, DATA WRANGLING WITH PANDAS, NUMPY, AND IPYTHON,
Wes McKinney, 2nd edition, 2012, Ed. O’REILLY
• Data Science from Scratch, FIRST PRINCIPLES WITH PYTHON, Joel Grus, 2015, Ed. O’REILLY
• Python Data Science Handbook, ESSENTIAL TOOLS FOR WORKING WITH DATA, Jake
VanderPlas, 2016, Ed. O’REILLY
• Fundamentals of Python®: Data Structures, Kenneth A. Lambert, Cengage Learning PTR, 2014
PYTHON
CURS 2
1
ACCESARE DATE DIN FISIERE (I)
Fișiere: .txt, .csv, xlsx, .json
Fișiere text
Funcția open()care doi parametri: numele fișierului sau calea și modul în care poate fi accesat:
"r" - Read - implicit. Deschide fișierul pentru citire, apare eroare dacă fișierul nu există.
"a" - Append - Deschide fișierul pentru adăugare, creează fișierul dacă nu există.
"w" - Write - Deschide fișierul pentru scriere, creează fișierul dacă nu există.
"x" - Create - creează fișierul, apare eroare dacă fișierul există.
Suplimentar, se pot specifica:
"t" - Text - Implicit. Modul text
"b" - Binary - Modul binar (de ex. imagine)
import csv
with open('clienti_leasing.csv', 'r') as f:
reader = csv.reader(f)
for row in reader:
print (row)
import pandas as pd
df = pd.read_csv('clienti_leasing.csv')
print(df)
3
ACCESARE DATE DIN FISIERE (III)
Fișiere .xlsx
import json
from pprint import pprint
json_data=open('clienti_daune.json').read()
data = json.loads(json_data)
pprint(data)
import json
import pandas as pd
with open("clienti_daune.json") as f:
data = json.load(f)
dataframe = pd.DataFrame(data)
print(dataframe)
5
NUMPY
• NumPy prescurtarea pentru Numerical Python sau calcule numerice
Python.
• NumPy contine:
- Tipul de obiect multidimensional ndarray
- Functii pentru calcule cu vectori sau operatii matematice cu vectori
- Instrumente pentru citirea si scrierea seturilor de date bazate pe
vectori
- operatii din algebra liniara, transformata Fourier si generare de
numere aleatoare
- API pentru C sau C++
6
MATPLOTLIB & SCIPY
• Matplotlib este cea mai populara biblioteca Python pentru realizarea reprezentarilor grafice
• SciPy reprezinta o colectie de pachete pentru rezolvarea unor probleme standard din diferite
domenii
- scipy.integrate: Ofera rutine pentru integrare numerica si calculul ecuatiilor diferentiale;
- scipy.linalg: Rutine din algebra relationala, prelucrarea avansata matricelor, fiind superior
pachetului numpy.linalg;
- scipy.optimize. Functii de optimizare (minimizare) si algoritmi de identificare a drumului
critic;
- scipy.signal. Instrumente de procesare a semnalului;
- scipy.sparse. Calcule cu matrice si sisteme de ecuatii liniare (sparse);
- scipy.special. O biblioteca Fortran pentru implementarea celor mai populare functii
matematice, cum ar fi functia gamma;
- scipy.stats. Distributii de probabilitati, teste statistice, statistici descriptive.
7
SCIKIT-LEARN
• Instrumente pentru machine learning in Python, ce include submodule pentru diverse modele:
• Clasificare: SVM, nearest neighbors, random forest, logistic regression etc.
• Regresia: Lasso, ridge regression etc.
• Clustering: k-means, spectral clustering etc.
• Reducerea dimensionalitatii (Dimensionality reduction): PCA, feature selection, matrix
factorization etc.
• Selectie model: Grid search, cross-validation, metrics
• Preprocesare: Feature extraction, normalizare
8
STATSMODELS
• In comparatie cu scikit-learn, statsmodels continue algoritmi clasici din statistica si
econometrie. Include submodule, cum ar fi:
• Regresie: liniara, modele liniare generalizate , modele liniare robuste, linear mixed effects
models etc.
• ANOVA
• Analize pe serii de timp: AR, ARMA, ARIMA,VAR etc.
• Nonparametric methods: Kernel density estimation, kernel regression
• rezultatele analizelor realizate cu statsmodels sunt axate pe indicatori statistici, p-values, in
timp ce rezultatele analizelor efectuate cu scikit-learn, se axeaza mai mult pe predictii.
9
PACHETUL PANDAS (I)
Reprezintă elementul
central pentru Oferă două structuri Detectarea și Operații ușoare de
înțelegerea Python în de date de tip masiv: manipularea ușoară a feliere și creare de
contextul prelucrării Series și Dataframe valorilor lipsă subseturi
datelor
Obiecte index
Încărcătoare pentru
Combinarea și automat pentru
intrare / ieșire
îmbinarea mai multor rânduri și coloane cu
acceptând o gamă
Dataframe mai multe niveluri /
largă de date tabelare
indexare ierarhică
10
PACHETUL PANDAS (II)
Contine structuri de date (Dataframe), orientate pe coloane,si instrumente pentru
manipularea datelor, proiectate pentru a realiza mai rapid si mai usor curatarea si
analiza datelor in Python;
11
Pandas adaopta stilul de calcul bazat pe vectori,
in special functii pe vectori, specific NumPy,
precum si procesarea datelor in stil pythonian,
fara a utiliza structuri repetitive;
12
DATAFRAME
▪ În multe situații, ca și structură și comportament, un Dataframe se comportă similar unui
set de date SAS.
▪ Există mai multe metode pentru a încărca valori într-un DataFrame dintr-o gamă largă de
surse de intrare, precum fișiere .csv, tabele DBMS, API-uri REST, seturi de date SAS
(.sas7bdat ) etc. Acestea sunt similare liniei de produse SAS/Access.
▪ Pentru vizualizarea stucturii unui DataFrame se folosesc: atributul shape și metoda info()
care oferă informații similare cu PROC CONTENTS din SAS
#%%DataFrame
#import din sursa locala Pandas SAS
import pandas as pd DataFrame Set de date
file_loc = "E:\\Date\\uk_accidents.csv" Rând Observație
#file_loc=r"E:\Date\uk_accidents.csv" Coloană Variabilă
df = pd.read_csv(file_loc)
#df = pd.read_csv("uk_accidents.csv")
Groupby By-Group
print(df.shape) NaN . (punct)
Felie Subset
(266776, 27)
13
DATAFRAME – VIZUALIZARE ȘI PARSARE
#import din sursa web
import pandas as pd
df = pd.read_csv("https://raw.githubusercontent.com/AncaAndreescu/Date/main/uk_accidents.csv")
print(df.shape)
print(df.info())
#parsare data
import pandas as pd
file_loc = "E:\\Date\\uk_accidents.csv"
df = pd.read_csv(file_loc, parse_dates=['Date'])
print(df['Date'].dtype)
14
VALORI LIPSĂ
Pandas folosește două tipuri de obiecte pentru tratarea valorilor lipsă: obiectul None și obiectul NaN (not a
number).
La afișarea datelor vor apărea None sau NaN în funcție de tipul de date.
Temp object
Viteza object
Masura1 float64
Masura2 float64
Masura3 float64
Masura4 float64
16
FUNCȚII PENTRU LUCRUL CU
VALORI LIPSĂ
Funcție Acțiune
isnull( ) Generează o mască booleană care indică valorile lipsă
print(df2.isnull()) notnull( ) Are efect opus funcției isnull()
dropna( ) Returnează o copie filtrată a Dataframe-ului inițial
#elemente lipsa pe coloane fillna( ) Returnează o copie a Dataframe-ului inițial având valorile
for col_name in df2.columns: nule completate în funcție de opțiunile funcției.
print (col_name, end="---->")
print (sum(df2[col_name].isnull()))
17
OPERAȚII CU VALORI LIPSĂ
#operatia de adunare cu valori lipsa
• Într-un Datafame, comportamentul valorilor lipsă utilizate în operații și
df2['Sum_M3_M4'] = df2['Masura3'] + funcții matematice este similar cu comportamentul SAS.
df2['Masura4']
print(df2[['Masura3', 'Masura4', • În cazul Dataframe:
'Sum_M3_M4']])
– Într-o operație aritmetică la nivel de rând, valorile lipsă sunt propagate.
– Pentru metode și funcții, valorile lipsă sunt tratate ca fiind zero.
#functia sum() cu valori lipsa
print(df2['Sum_M3_M4'].sum()) – Dacă lipsesc toate valorile datelor, rezultatul unei metode sau funcții va fi zero.
#functia sum() cu valori lipsa cu skipna
print(df2['Sum_M3_M4'].sum(skipna=False)) • Parametrul skipna = False forțează sum () să returneze un NaN dacă o
valoare NaN este întâlnită în operație.
#functia sum() numai cu valori lipsa • Funcția sum() care primește ca intrare doar valori lipsă, returnează valoarea
df2['Masura5'] = None zero.
print(df2['Masura5'])
print(df2['Masura5'].sum())
18
PANDAS READERS (CITITORI)
• Cititorii pandas sunt o colecție de metode de intrare / ieșire pentru scrierea și încărcarea
valorilor în DataFrames.
• Facilitatea principală pandas pentru scrierea și citirea în/din DataFrames sunt cititorii, precum
read_csv (), read_json () și read_sql_table (), printre altele.
• Acești cititori folosesc o sintaxă similară. Primul argument este calea sau locația către țintă,
care poate fi nume de fișiere complet calificate, nume de fișiere relative (relativ la directorul de
lucru curent care execută Python), tabele din baze de date, adrese URL (inclusiv metode de
acces HTTPS, SFTP și S3) etc. În multe cazuri, valorile implicite pentru argumentele cititorilor
sunt suficiente pentru operațiile de citire / scriere.
19
METODELE CITITORULUI AU
ARGUMENTE DE SPECIFICAT:
• Locații de intrare și ieșire
• Locația și numele coloanei și indexului
• Reguli de parsare pentru gestionarea datelor primare
• Reguli pentru datele lipsă
• Manipularea datelor calendaristice
• Tratarea erorilor
• Reguli de citire
• Formate pentru fișiere
lipsa = {'JOB' : ['NaN','-']} creează obiectul lipsa ca o pereche cheie-valoare de tip dicționar
(dictionary): în care valoarea cheie JOB este numele coloanei DataFrame urmată de valorile 'NaN'și'-',
utilizate pentru a desemna ambele ca valori lipsă. Parametrul na_values = folosește acest dicționar lipsa pentru a
mapa valorile care sunt considerate lipsă atunci când sunt întâlnite în coloana JOB.
21
READ_SAS
Organizațiile au adesea un număr mare de seturi de date SAS
permanente, stocate pe sistemul de fișiere. pandas oferă cititorul
read_sas () pentru crearea de DataFrame, citind seturi de date SAS
permanente. Seturile de date SAS permanente sunt adesea denumite
fișiere .sas7bdat (după extensia utilizată de SAS pentru denumirea
fișierelor de seturi de date din sistemele de fișiere Windows și Unix).
import pandas as pd
df = pd.read_sas('produse.sas7bdat', encoding = 'latin-1')
print(df.head())
print(df.info())
df.Cod = df.Cod.astype(int)
print(df.head())
print(df.info()) 22
INDEXARE (I)
Pandas creează automat o structură de tip index la momentul creării unui DataFrame, atât pentru
rânduri, cât și pentru coloane.
Obiectul RangeIndex este folosit ca index implicit de rând. Aceste obiecte index sunt responsabile
pentru păstrarea etichetelor asociate axelor, precum și a altor metadate.
Una sau mai multe coloane din DataFrame pot fi utilizate pentru a defini un index.
24
INDEXARE (III)
#indesci cu definire de coloane
import pandas as pd
df = pd.DataFrame([['0071', 'Patton' , 17, 27],
['1001', 'Joyner' , 13, 22],
['0091', 'Williams', 111, 121],
['0110', 'Jurat' , 51, 55],
['1106', 'Haskins', 51, 55],
['1189', 'Aden', 71, 70],
['1203', 'Tanner', 113, 122],
['1240', 'Jenkins', 99, 99]]
,columns = ['ID', 'Nume', 'Inainte', 'Dupa'])
print(' Index Rand: ', df.index, '\n', 'Index Coloana:', df.columns)
df.set_index('ID', inplace=True)
print(df)
print(' Index Rand: ', df.index, '\n', 'Index Coloana:', df.columns)
2. loc - folosește etichete de rânduri și coloane pentru generarea de subseturi. Eticheta unei coloane
reprezintă numele acesteia, iar etichetele rândurilor sunt atribuite de un index (fie indexul implicit de la
momentul creării DataFrame, fie cel creat cu metoda set_index (). Dacă nu există nume atribuite coloanelor,
atunci, conform indexului implicit, se etichetează coloanele începând de la 0.
3. iloc - folosește poziții reprezentate prin numere întregi (de la 0 la lungime axă - 1) pentru selectarea
rândurilor și coloanelor. Această metodă rămâne disponibilă chiar dacă este definit un index definit de
utilizator.
26
OPERATORUL []
• Operatorul [] permite selectarea de linii sau coloane
• Selectarea coloanelor
▪ Folosește numele unei coloane sau o listă de nume de coloane( df[‘A’] sau df[[‘A’,’B’]])
▪ Poate folosi indexul implicit dacă nu au fost denumite coloanele (df[0] sau df[[0,1]])
• Selectarea înregistrărilor
• Sintaxa generală pentru felierea înregistrărilor folosind operatorul [] este: df [start: stop: step]
• Poziția de pornire este inclusă în ieșire, iar poziția de oprire nu este inclusă în ieșire (df[:3] sau
df[::2]).
• Pentru selectarea înregistrărilor pornind de la poziție sau valori se folosesc cu preponderență loc
și iloc deoarece oferă o gamă mult mai largă de opțiuni de selectare.
# Coloane:
df["Nume"] # coloana Nume
df[["Nume", "Inainte", "Dupa"]] # listă de coloane
# Inregistrari:
df[:4] # primele patru înregistrări
27
df[1::2] # înregistrările de pe poziții pare
ILOC (I)
Selectare cu iloc – selectare bazată pe poziție
• iloc folosește poziții întregi (de la 0 la lungime axă –1) pentru selectarea
rândurilor și coloanelor.
• Intrările permise pentru iloc sunt :
▪ un număr întreg, de exemplu, 12
▪ o listă Python de numere întregi [4, 2, 22]
▪ un domeniu de numere întregi 2:22 (în acest caz 2, este inclusiv, iar
poziția de oprire 22 este exclusivă)
• Absența selectării rândurilor se substituie prin caracterul “:”
28
ILOC (II)
• iloc integer-location based indexing: selecteaza linii si coloane dupa index/pozitie
În SAS, acest lucru se realizează cu funcții precum PROC PRINT și PROC SQL.
Funcțiile head () și tail () afișează în mod implicit primele cinci rânduri, respectiv ultimele cinci rânduri
ale unui DataFrame.
import pandas as pd
data.to_csv("output.csv")
print (type(data.head(3)))
print (type(data.iloc[:,1]))
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.series.Series'> 30
LOC (I)
Selectare cu loc – selectare bazată pe etichete
import pandas as pd
data = pd.read_csv('https://s3-eu-west-1.amazonaws.com/shanebucket/downloads/uk-500.csv')
#fixarea indexului pe coloana first_name
data.set_index("first_name", inplace=True)
#selectarea coloanelor, first_name este afisata implicit
print(data.loc[["Antonio", "Peter"],['last_name', 'address', 'city']])
import pandas as pd
data = pd.read_csv('https://s3-eu-west-1.amazonaws.com/shanebucket/downloads/uk-500.csv')
#fixarea indexului pe coloana first_name
data.set_index("last_name", inplace=True)
print(data.loc[['Andrade', 'Veness'], 'city':'email'])
print(data.loc['Andrade':'Veness', ['first_name', 'address', 'city']]) 32
LOC (III)
• loc poate include expresii pentru selectarea conditionala a inregistrarilor.
• In expresiile conditionale se foloseste sintaxa: df[‘nume_coloana’]
• Nu este necesară indexarea
import pandas as pd
data = pd.read_csv('https://s3-eu-west-1.amazonaws.com/shanebucket/downloads/uk-500.csv')
print(data.loc[data['first_name'] == 'Antonio'])
import pandas as pd
data = pd.read_csv('https://s3-eu-west-1.amazonaws.com/shanebucket/downloads/uk-500.csv')
print(data.loc[data['email'].str.endswith("hotmail.com"), 'phone1':'email'])
34
SELECTAREA INREGISTRARILOR
35
ACTUALIZAREA VALORILOR DIN SETUL DE DATE
import pandas
df = pandas.read_csv('clienti_leasing20.csv', nrows=6, usecols =
['NAME_CLIENT','VENIT_PER_YEAR'])
print(df)
df.loc[1,'VENIT_PER_YEAR'] = 1500
print(df.loc[1,'VENIT_PER_YEAR'])
print(df)
import pandas as pd
data = pd.read_csv('clienti_leasing.csv')
print(data.loc[data['PRESCORING'] == 7,'NAME_CLIENT'])
print(data.loc[data['PRESCORING'] == 8,'NAME_CLIENT'])
36
STERGEREA COLOANELOR (DROP)
• Stergerea inregistrarilor sau a coloanelor dintr-un set de date se realizeaza prin functia drop.
• Pentru stergerea unei coloane sau a mai multor coloane, se utilizeaza numele coloanelor
specificand axis=I sau se utilizeaza parametrul ‘columns’ (nemaifiind necesar ‘axis’).
– Stergerea coloanei "Area" din set:
df = df.drop("Area", axis=1)
– Stergerea coloanei cu parametrul ‘columns’:
df = df.drop(columns=“Area")
• Stergerea unei coloane duce la crearea unui alt set de date. Pentru a modifica setul original
(curent), se utilizeaza parametrul inplace = True, nefiind returnata nicio valoare.
df.drop("Area", axis=1, inplace=True).
• Stergerea multipla a coloanelor
data = data.drop(["Y2001", "Y2002", "Y2003"], axis=1)
37
STERGEREA INREGISTRARILOR (DROP)
• Inregistrarile pot fi sterse utilizand functia drop si specificand axis=0.
import pandas as pd
df = pd.read_csv('clienti_leasing20.csv')
df.drop([1,2], axis = 0, inplace=True)
print(df)
• Drop() poate sterge inregistrarile pe baza unor expresii. Stergerea inregistrarilor care contin “ROL“.
In cazul stergerii bazate pe expresii, se va seta mai intai coloana indexata (CURRENCY) :
import pandas as pd
df = pd.read_csv('clienti_leasing.csv')
df = df.set_index("CURRENCY")
df = df.drop("ROL", axis=0)
print(df)
• Pentru a sterge inregistrarile in functie de pozitia sau indexul acestora, se utilizeaza iloc. Stergerea
primelor cinci inregistrari utilizand iloc
import pandas as pd
df = pd.read_csv('clienti_leasing20.csv')
df = df.iloc[5:,].drop
print(df) 38
REDENUMIREA COLOANELOR (RENAME)
• Redenumirea coloanelor in pandas se realizeaza in doua moduri prin intermediul functiei rename.
• Redenumirea prin maparea denumilor vechi cu denumirile noi, astfel {“denumire_veche”:
“denumire_noua”, …}
import pandas as pd
df = pd.read_csv('clienti_leasing.csv')
df.rename(columns={"ID_CLIENT": "COD"}, inplace=True)
print(df)
import pandas as pd
df = pd.read_csv('clienti_leasing.csv')
df.rename(columns={"ID_CLIENT": "COD","AGE": "VARSTA"}, inplace=True)
print(df)
• Redenumirea printr-o functie care sa schimbe denumirile coloanelor si care se aplica pentru fiecare
coloana.
import pandas as pd
df = pd.read_csv('clienti_leasing.csv')
df = df.rename(columns=str.lower)
#df = df.rename(columns=lambda x: x.lower().replace(' ', '_'))
print(df) 39
FUNCTII DE AGREGARE
import pandas as pd
df =
pd.read_csv('clienti_leasing.csv',usecols=['NAME_CLIENT','JOB','SEX','DEPOSIT
_AMOUNT','AGE’])
40
IMPUNERE (FILLNA)
Decât să renunțe la un întreg rând sau coloană, valorile lipsă pot fi înlocuite (impuse) folosind funcții
matematice și statistice.
Metoda fillna () returnează un DataFrame (sau None dacă inplace=True) prin înlocuirea valorilor lipsă cu
anumite valori sau cu valori derivate.
import pandas as pd
df =
pd.read_csv('clienti_leasing20.csv',usecols=['NAME_CLIENT','JOB','SEX','VENIT_PER_YEAR'])
print(df['VENIT_PER_YEAR'])
print(df['VENIT_PER_YEAR'].fillna(0))
import pandas as pd
df =
pd.read_csv('clienti_leasing20.csv',usecols=['NAME_CLIENT','JOB','SEX','VENIT_PER_YEAR'])
print(df['VENIT_PER_YEAR'])
v_m = df['VENIT_PER_YEAR'].mean()
print(df['VENIT_PER_YEAR'].fillna(value=v_m))
41
PRELUCRARE DATE TRADITIONAL VS. PANDAS
from pprint import pprint
import pandas as pd
df = pd.read_csv('clienti_daune.csv')
set_clienti=[]
for index, row in df.iterrows():
if row['VALOARE_DAUNA'] > 2000:
set_clienti.append(row['ID_CLIENT'])
pprint (set_clienti)
43
TO_CSV
from pprint import pprint
import pandas as pd
df = pd.read_csv('clienti_daune.csv')
set_clienti=[]
for index, row in df.iterrows():
if row['VALOARE_DAUNA'] > 2000:
set_clienti.append(row['ID_CLIENT'])
pprint (set_clienti)
df = pd.DataFrame(set_clienti)
df.to_csv("output_clienti.csv")
#Varianta pandas
df=df.loc[df['VALOARE_DAUNA']>2000,'ID_CLIENT']
print(df)
df.to_csv("output_clienti.csv")
44
PRELUCRARE DATE PANDAS
from pprint import pprint
import pandas as pd
df = pd.read_csv('clienti_daune.csv')
df.to_csv('clienti_daune_mod.csv')
df.to_csv('clienti_daune_mod.csv')
45
PYTHON
CURS 3
GRUPAREA SI AGREGAREA DATELOR (I)
• Pandas are un sistem de opțiuni care permite personalizarea unor aspecte ale comportamentului său. Cele mai
frecvente sunt opțiunile legate de afișare.
pandas.set_option (parametru, valoare)
• Exemplu: Setează numărul maxim de rânduri afișate. Variante: pd.set_option ("display.max_rows", 100)
sau pd.options.display.max_rows = 100
• Când este importat un fișier CSV și se realizează un DataFrame, • Funcția groupby() împarte datele din DataFrame
obiectele Datetime din fișier sunt citite ca un obiect șir. Pe în diferite grupuri, în funcție de anumite criterii.
acestea este foarte greu să efectăm operații precum diferența de
timp. Metoda pandas to_datetime() ajută la convertirea șirului • Returnează un obiect de tip GroupBy.
în obiecte Python Datetime. • Funcții precum max(), min(), mean(), first(), last()
• pd.DatetimeIndex – permite efectuarea de operații complexe pot fi aplicate obiectului GroupBy pentru a obține
pe obiecte Datetime și conține metadate specifice acestora. statistici rezumative pentru fiecare grup.
GRUPAREA Grupări complexe
SI import pandas as pd
AGREGAREA df = pd.read_csv('clienti_daune.csv')
pd.options.display.max_rows = 999
D AT E LO R
(IV) print('Numarul de marci pentru fiecare
tara producatoare’)
print(df.groupby(['TARAPRODUCATOR',
'MARCA'])['MARCA'].count())
GRUPAREA
SI
AGREGAREA
D AT E LO R Sursa: https://www.shanelynn.ie/summarising-aggregation-and-grouping-data-in-
(V) python-pandas/
Instrucțiunile pentru agregare sunt furnizate sub forma unui dicționar sau listă python.
Pentru a aplica mai multe funcții unei singure coloane din datele grupate, se va specifica o
listă de funcții ca și valori ale dicționarului.
Având indexul ierarhic în poziție, putem identifica cu ușurință subseturi folosind indexatorul loc (). În acest
exemplu, loc () împarte acele rânduri care aparțin initial DataFrame-ului df4.
MERGE (I)
Antetul metodei merge () este:
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False,
right_index=False, sort=False. suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
În cod se folosește argumentul on = „ID_CLIENT” pentru a indica folosirea coloanei ID_CLIENT ca o coloană cheie
găsită în ambele DataFrames. Argumentul on = ” ID_CLIENT” nu este necesar în acest exemplu, deoarece metoda
merge () detectează prezența unei coloane etichetate ID_CLIENT în ambele DataFrames și le atribuie automat ca și
coloană cheie. Argumentul how = efectuează implicit o joncțiune internă. Argumentul sort = este setat la False din
oficiu. Nu este surprinzător faptul că operațiile merge () pe DataFrames mari obțin îmbunătățiri substanțiale ale
performanței prin faptul că nu trebuie să returneze rândurile în ordine sortată.
MERGE (III)
#rez2 = pd.merge(df, df1, on='ID_CLIENT', how='outer', sort=False, validate="one_to_one" )
#rez2 = pd.merge(df, df1, on='ID_CLIENT', how='outer', sort=False, validate="one_to_many" )
#rez2 = pd.merge(df, df1, on='ID_CLIENT', how='inner', sort=False, validate="many_to_one" )
rez2 = pd.merge(df, df1, on='ID_CLIENT', how='outer', sort=False, validate="many_to_many" )
print(rez2)
În acest exemplu, argumentul validate = determină dacă îmbinarea are un tip specific de relație. Valorile
valide pentru validate = sunt:
• one_to_one sau 1: 1: Verifică dacă cheile sunt unice atât în DataFrame-ul din stânga, cât și în dreapta.
• one_to_many sau 1: m: Verifică dacă cheile sunt unice în Dataframe-ul din stânga.
• many_to_one sau m: 1: Verifică dacă cheile sunt unice în Dataframe-ul din dreapta.
• many_to_many sau m: m: Este permis, dar nu are ca rezultat o verificare.
Valoarea implicită este None. În acest exemplu, validate = ”one_to_one” generează o eroare
pandas.errors.MergeError și raportează că cheile, ID_CLIENT, nu sunt unice în setul de date din stânga sau
din dreapta.
MERGE (IV)
Data analytics pe clienti si daune
import pandas as pd
df = pd.read_csv('clienti_leasing.csv')
df1 = pd.read_csv('clienti_daune.csv')
result = pd.merge(df[['ID_CLIENT','NUME_CLIENT', 'PROFESIA', 'SEX','VENIT_ANUAL',
'VARSTA']],
df1[['ID_CLIENT', 'VIN','MARCA', 'PRET_MANOPERA', 'VALOARE_DAUNA']],
on='ID_CLIENT')
print('Grupare dupa Id_client si Marca, calcul min, max, suma pentru Valoare_dauna si
numar daune (VIN)')
print(result.groupby(['ID_CLIENT', 'MARCA']).agg({'VALOARE_DAUNA': [min, max, sum],
'VIN': "count"}))
print('Afisam primele 5 marci cu cele mai multe daune')
print(result.groupby(['MARCA'])['VALOARE_DAUNA'].count().nlargest(5))
print(result.groupby(['MARCA'])['VALOARE_DAUNA'].size().nlargest(5))
print('Afisam primii 15 clienti cu cele mai multe daune')
print(result.groupby(['ID_CLIENT'])['VIN'].count().nlargest(15))
print('Afisam primii 15 clienti cu cea mai mare valoare totala a daunelor')
print(result.groupby(['ID_CLIENT'])['VALOARE_DAUNA'].sum().nlargest(15))
DataFrame-ul df1 este creat apelând metoda join () care face joncțiunea fie pe un index (ca în acest caz), fie pe
o coloană cheie desemnată.
În acest exemplu, apelul metodei join () efectuează implicit o joncțiune de stânga, cu argumentul how = ‘left’.
Indecșii din ambele coloane sunt păstrați pe noul DataFrame df1, în funcție de tipul de joncțiune numită.
Observați cum funcția print () afișează coloana index ca etichete de rând în df1.
import pandas as pd
left = pd.DataFrame(
{ 'Style' : ['S1', 'S2', 'S3', 'S4'],
'Size' : ['S', 'M', 'L', 'XL']},
index = ['01', '02', '03', '05'])
right = pd.DataFrame(
{ 'Color' : ['Red', 'Blue', 'White', 'Black'],
'Brand' : ['Polo', 'Motor', 'Zara', 'Bershka']},
index = ['01', '02', '03', '04'])
print(left)
print(right)
df1 = left.join(right, how='left')
print(df1)
#df1 = left.merge(right, how='left', left_index=True, right_index=True)
#print(df1)
JOIN (II)
Metoda join () prevede patru metode de joncțiune:
• Left: folosește indexul DataFrame apelant sau o coloană cheie, dacă este specificată. Aceasta este metoda
implicită pentru join ().
• Outer: returnează uniunea de apelare a indexului DataFrame cu celălalt index DataFrame și sortează indexul.
• Inner: returnează intersecția indexului DataFrame apelant cu celălalt index DataFrame și păstrează ordinea
indexului DataFrame apelant.
JOIN (III)
• https://matplotlib.org/index.html
• https://www.shanelynn.ie/summarising-aggregation-and-grouping-data-in-python-pandas/
• https://www.shanelynn.ie/merge-join-dataframes-python-pandas-index-1/
• Python for Data Analysis, DATA WRANGLING WITH PANDAS, NUMPY, AND IPYTHON,
Wes McKinney, 2nd edition, 2012, Ed. O’REILLY
• Data Science from Scratch, FIRST PRINCIPLES WITH PYTHON, Joel Grus, 2015, Ed. O’REILLY
• Python Data Science Handbook, ESSENTIAL TOOLS FOR WORKING WITH DATA, Jake
VanderPlas, 2016, Ed. O’REILLY
• Betancourt, R. and Chen, S., Python for SAS Users, Apress, 2019.
PYTHON
CURS 4
CONECTAREA LA BAZE DE DATE ORACLE –
PACHETUL CX_ORACLE
• Pachetul cx_Oracle conține metode pentru realizarea unei conexiuni cu o bază de date
Oracle, pentru gestiunea interogărilor și a tranzacțiilor (comenzile
SELECT/INSERT/UPDATE/DELETE/MERGE și COMMIT/ROLLBACK).
• Pentru realizarea conexiunii cu o bază de date Oracle se precizează userul, parola,
serverul (host/ip) și denumirea bazei de date (service name/SID). De exemplu, pentru
realizarea conexiunii cu serverul oracle care rulează pe IP-ul 37.120.250.20 cu service_name
oracle, nume utilizator student_ps și parola oracle se inițializează conexiunea următoare:
• connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle")
• Pentru gestiunea interogărilor sau a tranzacțiilor este
necesară utilizarea unui cursor:
cursor = connection.cursor()
• Variabila de tip cursor dispune de toate metodele
CURSORUL necesare gestiunii tranzacțiilor și procesării interogărilor.
• Lista completă a metodelor acestuia este disponibilă aici:
https://cx-oracle.readthedocs.io/en/latest/cursor.html
METODE ALE CURSORULUI
Metoda Explicații
cursor.execute(comanda SQL, Execută comanda SQL specificată împreună cu lista de parametrii. Ca rezultat,
parametri) în cazul SELECT, cursorul este încărcat cu înregistrările returnate;
• Pentru prelucrarea unui cursor se pot utiliza listele de tupluri, înregistrările putând fi încărcate
cu ajutorul metodelor cursorului:
fetchone() – încarcă o singură înregistrare;
fetchmany(n) – încarcă n înregistrări;
fetchall() – încarcă toate înregistrările din cursor.
• Interogări cu parametri:
• Parametrii se pot specifica direct în cadrul metodei execute() (a se vedea exemplul 2);
• O altă variantă presupune utilizarea metodei prepare () pentru realizarea interogării cu
parametru (a se vedea exemplul 3).
EXEMPLUL 1 INTEROGARI
Să se returneze numele, profesia, venitul anual și suma solicitată în cazul clienților care au solicitat mai mult de
5000 lei credit.
import cx_Oracle
from pprint import pprint
• Operațiile de INSERT, UPDATE și DELETE sunt realizate tot prin intermediul unui cursor cu
ajutorul metodei execute().
• În cazul INSERT, se pot transmite mai multe înregistrări prin metoda executemany(). În acest caz
se recomandă să se precizeze numărul de înregistrări prin proprietatea bindarraysize și
tipul parametrilor prin metoda setinputsizes.
• Tranzacțiile se pot finaliza sau anula prin precizarea opțiunilor COMMIT sau ROLLBACK ale
conexiunii: connection.commit() sau connection.rollback()
EXEMPLUL 4 INSERT
Să se adauge o listă de tupluri în tabela CLIENTI_NOI care are următoarea structură: id_client number, nume_client varchar2(150),
profesia varchar2(150), sex varchar2(3), varsta number, stare_civila varchar2(1), suma_solicitata number. Să se finalizeze tranzacția și
apoi să se returneze înregistrările noi adăugate. Modificați secvența de cod și anulați tranzacția.
import cx_Oracle
from pprint import pprint
connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle")
lista_clienti_noi = [(100, "Popa Marcel", "Inginer", "m", 34, "C", 230),
(101, "Popa Vasilica", "Coafeza", "f", 32, "C", 200),
(102, "Popa Ion", "Instalator", "m", 64, "C", 120)]
cursor = connection.cursor()
#adaugarea listei de clienti noi in tabela
cursor.bindarraysize = 3
cursor.setinputsizes(int, 150, 150, 3, int, 1, float)
cursor.executemany("insert into clienti_noi(id_client, nume_client, profesia, sex, varsta,
stare_civila,suma_solicitata) values (:1, :2, :3, :4, :5, :6, :7)", lista_clienti_noi)
cursor.close()
#finalizarea tranzactiei
connection.commit()
#interogarea bazei de date pentru vizualizarea inregistrarilor noi adaugate
cursor2 = connection.cursor()
cursor2.execute("""SELECT * from clienti_noi where nume_client like 'Popa%'""")
lista_clienti=cursor2.fetchall()
pprint(lista_clienti)
cursor2.close()
connection.close()
E X E M P L U L 5 U P D AT E
Să se majoreze cu 10% suma solicitată de clienții al căror nume este introdus de utilizator de la tastatură.
Actualizările se vor realiza pe tabela CLIENTI_NOI. Să se finalizeze/anuleze tranzacția și să se re-deschidă un
cursor pentru verificarea rezultatelor tranzacției.
import cx_Oracle
from pprint import pprint
connection = cx_Oracle.connect("student_ps", "oracle", "37.120.250.20/oracle"
cursor = connection.cursor()
#adaugarea listei de clienti noi in tabela
statement="update clienti_noi set suma_solicitata=suma_solicitata*1.10 where
lower(nume_client) like :p_nume"
v_nume=input("Introduceti numele clientului:")
cursor.execute(statement,p_nume='%'+v_nume.lower()+'%')
cursor.close()
#finalizarea tranzactiei
connection.commit()
#interogarea bazei de date pentru vizualizarea inregistrarilor noi adaugate
cursor2 = connection.cursor()
cursor2.execute("""SELECT * from clienti_noi where lower(nume_client) like :p_nume""",
p_nume='%'+v_nume.lower()+'%')
lista_clienti=cursor2.fetchall()
pprint(lista_clienti)
cursor2.close()
connection.close()
EXEMPLUL 6 DELETE
Să se șteargă din tabela CLIENTI_NOI clienții cu numele de familie Popa. Să se finalizeze tranzacția.
import cx_Oracle
cursor = connection.cursor()
#finalizarea tranzactiei
connection.commit()
connection.close()
EXEMPLUL 7 INCARCARE IN PANDAS
• Înregistrările returnate de o interogare SQL se pot încărca direct într-un DataFrame Pandas prin metoda
pandas.read_sql(comanda SQL, conexiunea, lista de parametri).
• În acest caz nu mai este necesară încărcarea înregistrărilor în cursor, acestea fiind gestionate automat de
către DataFrame.
Să se selecteze din tabela T_CLIENTI_DAUNE marca, modelul, anul de fabricație, componenta, prețul
manoperei și valoarea daunei pentru autoturismele mai noi de 2010.
import pandas as pd
import cx_Oracle
from pprint import pprint
# Connect to oracle.
connection = cx_Oracle.connect("student_ps", "oracle",
"37.120.250.20/oracle")
#incarcam in DataFrame inregistrarile returnate de SELECT
an=2010
query ="""Select marca, model, an_fabricatie, componenta, pret_manopera,
valoare_dauna
from t_clienti_daune
where an_fabricatie>:an"""
df = pd.read_sql(query, con=connection, params={'an': an})
pprint(df)
connection.close()
EXEMPLUL 8 PRELUCRARE IN PANDAS
Pornind de la exemplul anterior, în exemplul de mai sus să se adauge o nouă coloană în df pentru a calcula
ponderea manoperei din valoarea totală a daunei. Să se afișeze marca și componentele înlocuite în cazul în
care ponderea depășește 30% din valoarea daunei.
import pandas as pd
import cx_Oracle
from pprint import pprint
# Connect to oracle.
connection = cx_Oracle.connect("student_ps", "oracle",
"37.120.250.20/oracle")
#incarcam in DataFrame inregistrarile returnate de SELECT
an=2010
query ="""Select marca, model, an_fabricatie, componenta, pret_manopera,
valoare_dauna
from t_clienti_daune
where an_fabricatie>:an"""
df = pd.read_sql(query, con=connection, params={'an': an})
connection.close()
df["PROCENT"]=df["VALOARE_DAUNA"]/df["PRET_MANOPERA"]
pprint(df.loc[(df["PROCENT"]>30), ["MARCA","COMPONENTA"]])
EXERCIȚII PROPUSE (I)
1. Să se returneze într-un df componenta, anul de fabricatie și pretul manoperei
pentru autoturismele Ford și Jeep. Pe setul din df, majorați cu 10% pretul
manoperei pentru autoturismele fabricate inainte de 2010 și care au
componenta BATTERY defectă. Salvați modificările într-un fișier .csv.
EXERCIȚII PROPUSE (II)
2. Încărcați într-un df marca, modelul, valoarea medie și numărul de daune pe
fiecare model și marcă. Afișați numărul de autoturisme pentru care valoarea
medie depășește 400 lei. Reprezentați grafic modelele care au înregistrat mai
mult de 200 de daune.
EXERCIȚII PROPUSE (III)
3. Încărcați într-un df numele, suma solicitată, suma din depozite și fidelitatea
clienților cu vârsta > 30 de ani care au solicitat un credit mai mare de 10.000 lei.
Verificați în df dacă suma din depozit este mai mare decât suma solicitată și
pentru acești clienți modificați fidelitatea în 5 (doar în df).
EXERCIȚII PROPUSE (IV)
4. Încărcați într-un df profesia, venitul anual, suma din depozite și suma solicitată
pe fiecare profesie. În df adăugați o nouă coloană pentru a calcula gradul de
îndatorare pe fiecare profesie (suma_solicitata/(venit_anual+suma_depozit)*100).
EXERCIȚII PROPUSE (V)
5. Încărcați într-un df starea civilă, profesia și suma totală solicitată grupată în
funcție de aceste atribute. Introduceți de la tastatură profesia și pentru aceasta
reprezentați grafic suma solicitată în funcție de starea civilă.
• Using Python with Oracle Database 11g,
https://www.oracle.com/technetwork/articles/dsl/python-
091105.html
• Developing a Python Web Application with Oracle Database 11g,
SURSE https://www.oracle.com/webfolder/technetwork/tutorials/obe/db/
BIBLIOGRAFICE OOW11/python_django/python_django.htm
• https://learncodeshare.net/2015/06/26/insert-crud-using-
cx_oracle/