Sunteți pe pagina 1din 128

Seminar 1 Python

Pachete software

Seminar 1 Python
1. Introducere in limbajul Python
- A fost inventat în 1991 de Guido van Rossum;
- Python este un limbaj de programare de ultimă generaţie, uşor de învăţat, ca urmare a
sintaxei simple similare cu limba engleză;
- Necesită mai puţine linii de cod în comparaţie cu alte limbaje;
- Python rulează pe diferite sisteme de operare: Windows, Mac, Linux, Raspberry Pi
etc.;
- Limbajul poate fi utilizat în mai multe medii (IDE): Eclipse, PyCharm, Thonny,
Netbeans etc.;
- Conţine o bibliotecă vastă de pachete;
- Python se poate conecta la baze de date.
- Citeşte şi modifică fişiere;
- Poate gestiona volume mari de date (big data) şi efectua operaţii matematice
complexe.
Instalare

Ultima versiune Python poate fi descărcată aici: https://www.python.org/downloads/.

Pentru IDE:

- accesaţi: www.eclipse.org. Efectuaţi apoi setarea IDE pentru Python ca în


https://www.ics.uci.edu/~pattis/common/handouts/pythoneclipsejava/eclipsepython%
20neon.html (de asemenea, această versiune de Eclipse poate fi utilizată);
- sau accesaţi: https://www.jetbrains.com/pycharm/download/#section=windows.

Linkuri utile:

Documentaţie: https://www.python.org/about/gettingstarted/

https://www.tutorialspoint.com/python/index.htm

https://www.w3schools.com/python/default.asp
Exemple: https://www.programiz.com/python-
programming/examples
Pachete: https://pip.pypa.io/en/stable/installing/
Rezolvări: https://stackoverflow.com

1
Seminar 1 Python
Pachete software

Pentru afişare utilizăm instrucţiunea print.


Exemplu 1 Exemplu 2
Pentru a combina un şir de caractere cu o variabilă, utilizăm +, care are rolul de a
concatena:
x = "pachete software" x = "Seminar "
print("Seminar " + x) y = "Pachete Software"
z= x +y
print(z)

Exemplu 3 Exemplu 4
Pentru numere, + acţionează ca operator Însumarea unui număr cu un şir de
matematic: caractere, duce la eroare: TypeError:
unsupported operand type(s) for +:
'int' and 'str'
x=5 x=5
y = 10 y = "Python"
print(x + y) print(x + y)

2. Elemente de programare: tipuri de date, variabile. tipuri de


variabile, operatori, vectori, structuri alternative si repetitive .

2.1 Tipuri de date


2.1.1 Numeric
 int
 float
 complex

Exemplu 5 Exemplu 6
Variabile de tipul numeric sunt create atunci Pentru a verifica tipul de data in Python
cand li se atribuie valoare. utilizam functia type():
Nu necesita declarare.
x = 1 # int print(type(x))
y = 2.8 # float print(type(y))
z = 1j # complex print(type(z))

Int sau integer reprezintă un număr întreg, pozitiv sau negativ, fără zecimale, de
lungime nelimitată.
Exemplu 7
x=1
y = 35656222554887711
z = -3255522

2
Seminar 1 Python
Pachete software

print(type(x))
print(type(y))
print(type(z))

Float reprezintă un număr pozitiv sau negativ, cu una sau mai multe zecimale.
Exemplu 8 Exemplu 9
x = 1.10 x = 35e3
y = 1.0 y = 12E4
z = -35.59 z = -87.7e100
print(type(x)) print(type(x))
print(type(y)) print(type(y))
print(type(z)) print(type(z))

Numerele complexe complex conţin "j" care desemnează partea imaginară.


Exemplu 10
x = 3+5j
y = 5j
z = -5j
print(type(x))
print(type(y))
print(type(z))

Specificarea tipului de dată pentru o variabilă


Atunci când se doreşte specificarea tipului de dată pentru o variabilă, utilizăm următorii
constructori:
 int() - construieşte un număr întreg dintr-un număr întreg, un număr cu zecimale
(prin eliminarea zecimalelor) sau un şir de caractere (când şirul reprezintă un număr
întreg);
 float() - construieşte un număr cu zecimale dintr-un număr întreg, un număr cu
zecimale sau un şir de caractere (când şirul reprezintă un număr întreg sau un număr
cu zecimale);
 str() - construieşte un şir de caractere dintr-o varietate de tipuri de date, incluzând
şiruri de caractere, numere întregi şi numele cu zecimale.

Exemplu 11 Exemplu 12 Exemplu 13


x = int(1) # 1 x = float(1) # 1.0 x = str("s1") # 's1'
y = int(2.8) # 2 y = float(2.8) # 2.8 y = str(2) # '2'
z = int("3") # 3 z = float("3") # 3.0 z = str(3.0) # '3.0'
w = float("4.2") # 4.2

2.1.2 Şiruri de caractere – marcate cu “ ” sau ‘ ’.


Ca în multe alte limbaje de programare, şirurile de caractere în Python sunt considerate ca
vectori. Parantezele [ ] sunt utilizate pentru a accesa elementele şirului.
Exemplu 14 Exemplu 15 Exemplu 16 Exemplu 17

3
Seminar 1 Python
Pachete software

Obţinerea Extragerea unui Metoda strip() Metoda len()


caracterului de la subşir. Obţinerea elimină spaţiile: returnează lungimea
poziţia 1 (primul caracterelor de la şirului:
caracter are poziţia poziţia 2 la 5
0): (exclusiv):
a = "Seminar pachete b = "Seminar pachete a=" Seminar a = "Seminar pachete
software" software" pachete software" software"
print(a[1]) print(b[2:5]) print(a.strip()) print(len(a))
# returns "Seminar
pachete software"
print(a)

Exemplu 18 Exemplu 19 Exemplu 20 Exemplu 21


Metoda lower() Metoda upper() Metoda replace() Metoda split()
transformă şirul în transformă şirul în înlocuieşte un şir cu împarte şirul în mai
litere mici: litere mari: un alt şir: multe şiruri după un
separator:
a = "Seminar pachete a = "Seminar pachete a = "Seminar pachete a = "Seminar, pachete
software" software" software" software"
print(a.lower()) print(a.upper()) print(a.replace(" ", "")) print(a.split(",")) # se
obtine o lista de valori
['Seminar', ' pachete
software']

2.2 Variabile
În Python, variabilele sunt case-sensitive.
Denumirea variabilelor trebuie să înceapă cu o literă sau underscore (nu cu un număr) şi
poate conţine numai caractere alfanumerice: de la A-z, 0-9 şi underscore.
Spre deosebire de alte limbaje, în Pythono variabilă nu se declară neapărat explicit, fiind
necesar să i se atribuie valoare.
Exemplu 23
Exemplu 22
Nu este necesar să se precizeze tipul de data Tipul de data al variabilei poate fi schimbat
al variabilei ulterior
x=5
x = 4# x este de tip int
y = "Python"
x = "Python"# acum x este de tip str
print(x)
print(x)
print(y)
2.3 Tipuri de variabile
Colecţii de date
2.3.1 Liste – colecţii de date care pot fi ordonate şi modificate. De asemenea, listele permit
elemente identice. Listele sunt reprezentate utilizând [ ].
Exemplu 22 Exemplu 23 Exemplu 24

4
Seminar 1 Python
Pachete software

Accesarea elementelor din Modificarea unui


Crearea şi afişarea unei liste
listă se realizează prin index: element:

lista = ["laptop", "creion", lista = ["laptop", "creion", lista = ["laptop", "creion",


"flipchart"] "flipchart"] "flipchart"]
print(lista) print(lista[1]) lista[1] = "carioca"
print(lista)

Pentru a determina numărul de elemente din listă, utilizăm metoda len()

Exemplu 25

lista = ["laptop", "creion", "flipchart"]


print(len(lista))

Pentru a adăuga un element în listă, utilizăm metoda append()

Exemplu 26

lista = ["laptop", "creion", "flipchart"]


lista.append("rucsac")
print(lista)

Pentru a adăuga un element în listă la o anumită poziţie, utilizăm metoda insert()

Exemplu 27

lista = ["laptop", "creion", "flipchart"]


lista.insert(1, "rucsac")
print(lista)

Eliminarea unui element se realizează cu metoda remove():

lista = ["laptop", "creion", "flipchart"]


lista.remove("laptop")
print(lista)

Metoda pop() elimină elementul de la indexul specificat sau ultimul element în cazul în care
indexul nu este specificat:

lista = ["laptop", "creion", "flipchart"]


lista.pop()
print(lista)

Şi metoda del elimina elementul de la indexul specificat:

5
Seminar 1 Python
Pachete software

lista = ["laptop", "creion", "flipchart"]


del lista [0]
print(lista)

Metoda del poate şterge întreaga lista:

lista = ["laptop", "creion", "flipchart"]


del lista
print(lista)#apare o eroare deoarece lista nu mai există

Metoda clear() goleşte lista:

lista = ["laptop", "creion", "flipchart"]


lista.clear()
print(lista)

Este posibilă crearea unei liste prin intermediul constructorului list().

lista = list(("laptop", "creion", "flipchart")) #observaţi parantezele rotunde duble


print(lista)

Metode pentru liste

Metoda Descriere
append() Adaugă un element la sfârşitul listei
clear() Elimină toate elementele listei
copy() Crează o copie a listei
count() Returnează numărul de apariţii al elementului în listă
extend() Adăugă elemente la sfârşitul unei liste
index() Returnează indexul unui element
insert() Adaugă un element la poziţia specificată
pop() Elimină elementul de la poziţia specificată
remove() Elimină elementul specificat
reverse() Inversează ordinea elementelor în listă
sort() Sortează lista

2.3.2 Tupluri – colecţii de date ordonate şi nemodificabile. De asemenea, tuplurile permit


elemente identice. Tuplurile sunt reprezentate utilizând ( ).

Exemplu 25 Exemplu 26 Exemplu 27


Accesarea elementelor din Modificarea unui element
Crearea şi afişarea unui tuplu:
tuplu se realizează prin index: nu este posibilă, tuplul
rămâne nemodificat.
tuplu = ("laptop", "creion", tuplu = ("laptop", "creion", tuplu = ("laptop", "creion",
"flipchart") "flipchart") "flipchart")
print(tuplu) print(tuplu[1]) tuplu[1] = "carioca"
TypeError: 'tuple'
objectdoesnotsupport

6
Seminar 1 Python
Pachete software

item assignment

Metode pentru tupluri

Metoda Descriere
count() Returnează numărul de apariţii al elementului în tuplu
index() Returnează poziţia unui element în tuplu

2.3.3 Seturi – colecţii de date neordonate şi neindexate. Nu sunt acceptate elemente identice.
Seturile sunt reprezentate prin { }.
Exemplu 26
Crearea şi afişarea unui set (fiind elemente neordonate, afişarea este aleatoare):
set = {"laptop", "creion", "flipchart"}
print(set)

Accesarea elementelor din set nu este posibilă, dar elementele pot fi parcurse cu for sau
poate fi verificată existenţa unui element cu in.

Nu pot fi modificate elementele unui set, însă pot fi adăugate elemente noi cu metoda add().

Metode pentru seturi

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 elementelenecomune celor doua
seturi
symmetric_difference_update() Inserează într-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

7
Seminar 1 Python
Pachete software

2.3.4 Dicţionare – colecţii de date neordonate, modificabile şi indexate. Nu sunt admise


elemente identice. Dicţionarele sunt reprezentate prin { }, având suplimentar chei şi valori.

Exemplu 27 Exemplu 28 Exemplu 29


Accesarea elementelor din Modificarea unui element
Crearea şi afişarea unui
dicţionar: dicţionar se realizează prin din dicţionar se
cheie (sau prin metoda realizează prin cheie:
get()):
dictionar = {"laptop":"IBM", dictionar = {"laptop":"IBM", dictionar = {"laptop":"IBM",
"creion":"FaberCastell", "creion":"FaberCastell", "creion":"FaberCastell",
"flipchart":"M3"} "flipchart":"M3"} "flipchart":"M3"}
print(dictionar) x = dictionar["laptop"] dictionar["laptop"] = "HP"
print(x) print(dictionar)

print(dictionar.get("laptop"))

Metode pentru dicţionare

Metoda Descriere
clear() Elimină toate elementele din dicţionar
copy() Returnează o copie a dicţionarului
fromkeys() Returnează un dicţionar cu chei 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
setdefault() Returnează valoarea pentru o cheie specificată. Dacă cheia nu există, o
adaugă
update() Actualizează dicţionarul cu perechile cheie-valoare specificate
values() Returnează o listă cu toate valorile dicţionarului

2.4 Operatori

 Aritmetici

Operator Denumire Exemplu


+ Adunare x+y
- Scădere x-y
* Înmulţire x*y
/ Împărţire x/y
% Restul împărţirii x%y
** Exponenţial x ** y
// Partea întreagă a împărţirii x // y

 Atribuire

8
Seminar 1 Python
Pachete software

Operator Exemplu Echivalent


= x=5 x=5
+= x += 3 x=x+3
-= x -= 3 x=x-3
*= x *= 3 x=x*3
/= x /= 3 x=x/3
%= x %= 3 x=x%3
//= x //= 3 x = x // 3
**= x **= 3 x = x ** 3

 Comparaţie

Operator Denumire Exemplu


== 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

 Logici

Operator Descriere Exemplu


and Returnează True dacă x < 5 and x < 10
ambele expresii sunt
adevărate
or Returnează True dacă cel x < 5 or x < 4
puţin o expresie este
adevărată
not Negaţia, inversează not(x < 5 and x < 10)
rezultatul returnând False
dacă rezultatul este adevărat

 Identitate

Operator Descriere Exemplu


is Returnează True dacă x is y
ambele variabile sunt acelaşi
obiect
isnot Returnează True dacă x isnot y
ambele variabile nu sunt
acelaşi obiect

 Apartenenţă

Operator Descriere Exemplu


in Returnează True dacă o x in y
secvenţă cu o valoare
specificată este prezentă în

9
Seminar 1 Python
Pachete software

obiect
not in Returnează True dacă o x not in y
secvenţă cu o valoare
specificată nu este prezentă
în obiect

2.5 Structuri de programare


Chiar dacă în alte limbaje indentarea nu e relevantă, în Pythonindentarea este esenţială, fiind
utilizată pentru a indica un bloc de cod.

2.5.1 Structuri alternative


if

Exemplu 30 Exemplu 31
x=-100 a = 1
#x = int(input ("Evalueaza un numar: ")) b = 3
if x<0: if a<b:
print('x negativ') print('a mai mic decat b')
elif x==0: IndentationError: expected an
print('zero') indented block
else:
print('x pozitiv')

2.5.2 Structuri repetitive


for

Exemplu 32 Exemplu 33
lista = ["laptop", "creion", lista = ["laptop", "creion",
"flipchart"] "flipchart"]
for w inlista: for w inlista:
print (w) print(w[0])
print(len(w))

Exemplu 34 Exemplu 35 Exemplu 36


lista = ["laptop", lista = ["laptop", lista = ["laptop",
"creion", "flipchart"] "creion", "flipchart"] "creion", "flipchart"]
for x inlista: for x inlista: for x inlista:
print(x) if x == "creion": if x == "creion":
if x == "creion": break continue
break print(x) print(x)

Exemplu 37. Funcţia range() returnează o


Exemplu 38. Clauza else se execută când se
secvenţă de numere termină for
for x inrange(6): for x inrange(6):
print(x) print(x)
else:
for x inrange(2, 6):
print("S-au afisatnumerele")

10
Seminar 1 Python
Pachete software

print(x)
for x inrange(2, 30, 3):
print(x)
# sau in liste
print(list(range(6)))
print(list(range(2, 6)))
print(list(range(2, 30, 3)))

Exemplu 39. Nestedloop Exemplu 40. Crearea unei funcţii recursive


lista = ["laptop", "creion", deff_recursiva(k):
"flipchart"] if(k>0):
culori = ["rosu", "galben", "verde"] result = k+f_recursiva(k-1)
for x inlista: print(result)
if x =='creion'or x =='flipchart': else:
for y inculori: result = 0
return result
print(x, y)
print("Apelfunctierecursiva")
f_recursiva(6)

while

Exemplu 41 Exemplu 42 Exemplu 43


i=1 i=1 i=0
whilei<6: whilei<6: whilei<6:
print(i) print(i) i += 1
i += 1 ifi == 3: ifi == 3:
break continue
i += 1 print(i)

O funcţie se defineşte prin intermediul lui def. Funcţia my_function, având parametru
implicit 100 (ex. 45)
Exemplu 44 Exemplu 45 Exemplu 46
defmy_function(x): defmy_function(x = 100): defmy_function(x,
result = x**2 result = x**2 n):
print (result) print (result) result = x**n
return result return result print (result)
my_function() my_function(5) return result
TypeError: my_function() my_function(4,2)
missing 1 required
positional argument: 'x'

Pentruintroducereaunorvalori de la tastatura, se utilizeazăfuncţiapredefinităinput


Exemplu 47 Exemplu 48
str = input("Enter your input: "); x=int(input('Introdunumarul:'))
print ("Received input is : ", str) if x>0:
print('nrpozitiv')
else: print('nreste zero saunegativ')

Funcţia lambda este o funcţie simplă, anonimă poate avea mai mulţi parametri şi o singură
expresie, returnând rezultatul expresiei.
Exemplu 49 Exemplu 50 Exemplu 51
x = lambdaa : a + 10 x = lambda a, b : a * b x = lambda a, b, c : a + b + c

11
Seminar 1 Python
Pachete software

print(x(5)) print(x(5, 6)) print(x(5, 6, 2))

Exerciţii
1. Să se citească un număr n < 10, să se creeze o listă de numereîntregi de dimensiune n şi să
se adauge elementele citite de la tastatură. Să se ordoneze crescător elementele listei şi să se
afişeze lista.

2. Să se creeze o lista de 5 elemente cu denumirile unor oraşe introduse de la tastatură.


Să se realizeze o funcţie care returnează lungimea fiecărui element (oraş) şi să se afişeze lista
ordonată descrescător, utilizând opţiunile metodei sort(), în funcţie de această lungime.

3. Să se creeze o listă de liste cu denumiri de echipamente IT, preţul şi cantitatea acestora.


Calculaţi valoarea fiecărui echipament, adăugaţi-o în listă şi sortaţi în funcţie de valoare.

4. Să se creeze două liste: lista_angajati cu numele şi prenumele angajaţilor


şilista_clienti cu numele şi prenumele clienţilor.

5. Să se creeze o listăde dicţionare cu următoarele chei: id, nume şi salariul pentru următorii
angajaţi: Popescu, Ionescu, Vasilescu.

12
Seminar 2 Python
Pachete software

Seminar 2 Python
 Prelucrare date din fișiere: .txt, .csv, .json
2.1 Citire fișier Data1.txt

Funcția open() returnează un obiect de tip fișier. Metoda read() citește conținutul
fișierului.

Funcția open()are doi parametri: numele fișierului și modul în care poate fi deschis:

"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ă.

 Metoda readline()citește o singură linie


 Poate fi specificat numărul de caractere afișate: read(100)

Exemplu 1 Exemplu 2
f = open("Data1.txt", "r") numara_inregistrari = sum(1 for
print(f.read()) line in open('Data1.txt'))
print(numara_inregistrari)
f = open("Data1.txt", "r")
print(f.read(100))

f = open("Data1.txt", "r") '''numara_inregistrari =


print(f.readline()) len(open('Data1.txt').read().spli
tlines())
f = open("Data1.txt", "r") print(numara_inregistrari) '''
for x in f:
print(x) 403374
Suplimentar, se pot specifica:

"t" - Text - Implicit. Modul text

"b" - Binary - Modul binar (de ex. imagine)

f = open("Data1.txt") și f = open("Data1.txt", "rt") sunt echivalente.

Exemplu 3
f1 = open("Data1.txt", "a")
f2 = open("Data2.txt", "r")
for r in f2:
f1.write(r)
num_inreg = sum(1 for line in open('Data1.txt'))
print(num_inreg)
Seminar 2 Python
Pachete software

2.2 Citire fișier .csv

Exemplu 4. Citirea unui fișier .csv, prin intermediul bibliotecii csv


import csv
with open('clienti_leasing.csv', 'r') as f:
reader = csv.reader(f)
for row in reader:
print (row)

Exemplu 5. Citirea primei coloane dintr-un fișier .csv


import csv
with open('clienti_leasing.csv', 'r') as f:
reader = csv.reader(f)
for row in reader:
print (row[0])

Exemplu 6. Citirea primelor două coloane dintr-un fișier .csv


import csv
with open('clienti_leasing.csv', 'r') as f:
reader = csv.reader(f)
for row in reader:
print (row[0],row[1]) # print (row[0:2])

Exemplu 7. Citirea primelor zece înregistrări dintr-un fișier .csv


import csv
with open('clienti_leasing.csv', 'r') as f:
reader = csv.reader(f)
for i, row in enumerate(reader):
print(row)
if(i >= 10):
break

Exemplu 8. Citirea primelor zece înregistrări dintr-un fișier .csv cu islice


import csv
from itertools import islice
with open('clienti_leasing.csv') as f:
reader = csv.reader(f)
for row in islice(reader, 10):
print(row)

Exemplu 9. Citirea unui fișier și încărcarea unor coloane în liste (vectori)


import csv
id_client = []
nume_client = []
sex = []
with open('clienti_leasing.csv') as f:
reader = csv.reader(f)
for row in reader:
id_client.append(row[0])
nume_client.append(row[1])
Seminar 2 Python
Pachete software

sex.append(row[3])
print(id_client)
print(nume_client)
print(sex)

Exemplu 10. Pentru mai multe fișiere identice, poate fi realizată o funcție pentru încărcarea
datelor în liste
import csv
def read_f(filename):
col1 = []
col2 = []

with open(filename) as f:
reader = csv.reader(f)
for row in reader:
col1.append(row[1])
col2.append(row[2])

return col1, col2

col1, col2 = read_f('clienti_leasing.csv')

print(col1)
print(col2)
print(len(col1))

Exemplu 11. Citește un fișier text cu csv.reader și prelucrează înregistrările


import csv
with open('angajati.txt') as f:
reader = csv.reader(f, delimiter=',')
line_count = 0
for row in reader:
if line_count == 0:
print(f'Numele coloanelor sunt: {",
".join(row)}')
line_count += 1
else:
print(f'\t{row[0]} lucreaza in departmentul
{row[1]}, nascut in {row[2]}.')
line_count += 1
print(f'Au fost procesate {line_count} linii.')

Exemplu 12. Citește un fișier text sub formă de dicționar


import csv
with open('angajati.txt') as f:
reader = csv.DictReader(f, delimiter=',')
for row in reader:
print(row)
Exemplu 13. Citește un fișier text sub formă de dicționar. Specificarea delimitatorului
Seminar 2 Python
Pachete software

import csv
with open('angajati1.txt') as f:
reader = csv.DictReader(f, delimiter =';')
for row in reader:
print(row)
#vs.
import csv
with open('angajati1.txt') as f:
reader = csv.reader(f, delimiter =';')
for row in reader:
print(row)

Exemplu 14. Scrierea unui fișier .csv din liste


import csv
with open('angajati.csv', mode='w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['Cosmin Antonescu', 'Marketing',
'Noiembrie'])
writer.writerow(['Eugenia Marin', 'Vanzari', 'Iulie'])
with open('angajati.csv') as f:
reader = csv.reader(f)
for row in reader:
print(row)

Exemplu 15. Scrierea unui fișier text


f = open('angajati2.txt','w')
f.write('Cosmin Antonescu, Marketing, Noiembrie \n')
f.write('Eugenia Marin, Vanzari, Iulie')
f = open('angajati2.txt')
for row in f:
print(row)

Exemplu 16. Scrierea unui fișier .csv din dicționare


import csv
with open('angajati1.csv', mode='w') as f:
fieldnames = ['Nume', 'Dep', 'Luna']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'Nume': 'Constantinescu Andrei', 'Dep':
'Contabilitate', 'Luna': 'Aprilie'})
writer.writerow({'Nume': 'Iliescu Emil', 'Dep': 'IT',
'Luna': 'Mai'})
 Pachetul pandas
Obiectele din pandas sunt cunoscute sub denumirea DataFrame, o structură de date
tabulară, orientată pe coloane, cu etichete pentru rând și coloană, și Series, un obiect matricial
unidimensional.
Seminar 2 Python
Pachete software

Pandas deține capacități de manipulare a datelor din foi de calcul și baze de date
relaționale, oferă indexare pentru a ușura remodelarea datelor și efectueză agregări complexe.
Exemplu 17. Citirea unui fișier .csv, prin intermediul bibliotecii pandas
import pandas
df = pandas.read_csv('clienti_leasing20.csv')
print(df)

Exemplu 18. Afișarea prin localizare cu iloc a unor coloane din setul inițial
import pandas
df = pandas.read_csv('clienti_leasing20.csv')
print(df.iloc[:,2:4])

Exemplu 19. Afișarea cu iloc a unor coloane și înregistrări din setul inițial
import pandas
df = pandas.read_csv('clienti_leasing20.csv')
print(df.iloc[8:10,2:4])

Exemplu 20. Afișarea cu loc a unor coloane și a unei înregistrări din setul inițial
import pandas
df = pandas.read_csv('clienti_leasing20.csv')
print(df.loc[0, 'NAME_CLIENT':'SEX'])

Exemplu 21. Afișarea cu loc a unor coloane și înregistrări din setul inițial
import pandas
df = pandas.read_csv('clienti_leasing20.csv')
print(df.loc[[0,2], 'NAME_CLIENT':'SEX'])

import pandas
df = pandas.read_csv('clienti_leasing20.csv')
print(df.loc[0, ['NAME_CLIENT','SEX']])

import pandas
df = pandas.read_csv('clienti_leasing20.csv')
print(df.loc[[0,3], ['NAME_CLIENT','SEX']])

Exemplu 22. Afișarea cu iloc și loc a unor coloane și înregistrări din dataframe inițial
import pandas
df = pandas.read_csv('clienti_leasing20.csv')
print(df.iloc[0:3, [1,6,5]])
print(df.loc[0:3, 'NAME_CLIENT':'SEX'])

Exemplu 23. Modificarea venitului pentru o anumită înregistrare


import pandas
df = pandas.read_csv('clienti_leasing20.csv')
print(df.loc[0, 'VENIT_PER_YEAR'])
Seminar 2 Python
Pachete software

df.loc[0,'VENIT_PER_YEAR']=30000
print(df.loc[0, 'VENIT_PER_YEAR'])

Exemplu 24. Modificarea venitului dacă acesta este mai mic decât 5000 și vârsta este mai
mare decât 30. Crearea cu copy() a unui dataframe df1 și calcularea salariului mediu
import pandas
df = pandas.read_csv('clienti_leasing20.csv')

df1=df.copy()

df1.loc[(df1['VENIT_PER_YEAR']<5000)&(df1['AGE']>30),'VENIT_PE
R_YEAR']=10000

print(df1[['NAME_CLIENT','VENIT_PER_YEAR', 'AGE']])
print(df1.loc[(df1['VENIT_PER_YEAR']==10000)&(df1['AGE']>30),
['NAME_CLIENT','VENIT_PER_YEAR', 'AGE']])

print('Salariul mediu ', df1['VENIT_PER_YEAR'].mean())

df1.to_csv('clienti_leasing20mod.csv')
df1 = pandas.read_csv('clienti_leasing20mod.csv',
header=0,
names=['ID', 'Nume', 'Functie', 'Sex','Moneda',
'Venit', 'Data', 'Varsta'])
df1.to_csv('clienti_leasing20mod.csv')

Exemplu 25. Afișarea clienților cu vârsta = 35 sau sex masculin


import pandas
df = pandas.read_csv('clienti_leasing20.csv')
print(df.loc[(df['AGE']==35)|
(df['SEX']=='m'),['NAME_CLIENT','JOB','SEX','AGE']])

Exemplu 26. Afișarea clienților care nu dețin funcția inginer


import pandas
df = pandas.read_csv('clienti_leasing20.csv')
print(df.loc[df['JOB'] != 'Inginer',
'NAME_CLIENT':'VENIT_PER_YEAR'])

Exemplu 27. Afișarea clienților al căror nume se termină în a


import pandas
df = pandas.read_csv('clienti_leasing20.csv')
print(df.loc[df['NAME_CLIENT'].str.endswith("a"),['NAME_CLIENT
','SEX']])

Exemplu 28. Afișarea clienților al căror nume se începe cu Ha


import pandas
df = pandas.read_csv('clienti_leasing20.csv')
print(df.loc[df['NAME_CLIENT'].str.startswith("Ha"),['NAME_CLI
ENT','SEX']])
Seminar 2 Python
Pachete software

/
import pandas
df = pandas.read_csv('clienti_leasing20.csv')
pandas.options.display.max_columns = 10
print(df.loc[df['NAME_CLIENT'].str.startswith("Ha")])

Exemplu 29. Afișarea clienților care dețin funcțiile inginer și profesor


import pandas
df = pandas.read_csv('clienti_leasing20.csv')
print(df.loc[df['JOB'].isin(['Inginer',
'Profesor']),['NAME_CLIENT','SEX', 'JOB']])

Exemplu 30. Afișarea primelor 5 înregistrări (implicit)


import pandas
df = pandas.read_csv('clienti_leasing20.csv')
print(df.head())

Exemplu 31. Afișarea ultimelor 7 înregistrări


import pandas
df = pandas.read_csv('clienti_leasing20.csv')
print(df.tail(7))

Exemplu 32. Preluarea unor coloane usecols și eliminarea unor înregistrări


skiprows/skipfooter din setul inițial
import pandas
df = pandas.read_csv('clienti_leasing20.csv', skiprows =
[6,7,9], usecols = ['NAME_CLIENT','JOB'])
print(df)

Exemplu 33. Identificarea și modificarea tipului de dată


import pandas as pd
df = pd.read_csv('clienti_leasing20.csv')
print(df.dtypes)
df = pd.read_csv('clienti_leasing20.csv', parse_dates =
['DATA'])
df.AGE = df.AGE.astype(float)
print(df.dtypes)

Exemplu 34. Însumarea a două valori din aceeași coloană


import pandas
df = pandas.read_csv('clienti_leasing20.csv', nrows=6,
usecols = ['NAME_CLIENT','VENIT_PER_YEAR'])
print(df)
print(df['VENIT_PER_YEAR'][0] + df['VENIT_PER_YEAR'][5])
Seminar 2 Python
Pachete software

Exemplu 35. Funcția describe()


import pandas as pd
df =
pd.read_csv('clienti_leasing20.csv',usecols=['NAME_CLIENT','JO
B','SEX','CURRENCY','VENIT_PER_YEAR','DATA','AGE'])
print(df.describe())
print('\n*****Functia describe() pe coloana JOB*****')
print(df['JOB'].describe())
print('\n*****Functia describe() pe coloana CURRENCY*****')
print(df['CURRENCY'].describe())

Exemplu 36. Selectare coloane în dataframe


import pandas as pd
df =
pd.read_csv('clienti_leasing20.csv',usecols=['NAME_CLIENT','JO
B','SEX','CURRENCY','VENIT_PER_YEAR','DATA','AGE'])
#Selectare coloana in dataframe
print(df.JOB.head())
print(df['JOB'].head())
print(df.loc[:,'JOB'].head())
print(df.iloc[:,1].head())

Exemplu 37. Funcții sum(), mean(), median(), nunique(), max(), min()


import pandas as pd
df =
pd.read_csv('clienti_leasing20.csv',usecols=['NAME_CLIENT','JO
B','SEX','CURRENCY','VENIT_PER_YEAR','DATA','AGE'])
print('Suma veniturilor ', df['VENIT_PER_YEAR'].sum(),
'\nMedia veniturilor', df['VENIT_PER_YEAR'].mean())
print('Valoarea mediana ', df['VENIT_PER_YEAR'].median())
print('Valori unice ', df['VENIT_PER_YEAR'].nunique())
print('Venitul maxim ', df['VENIT_PER_YEAR'].max())
print('Venitul minim ', df['VENIT_PER_YEAR'].min())

Exemplu 38. Înlocuiește valoarea lipsă fillna()


import pandas as pd
df =
pd.read_csv('clienti_leasing20.csv',usecols=['NAME_CLIENT','JO
B','SEX','CURRENCY','VENIT_PER_YEAR','DATA','AGE'])
print(df['AGE'])
print(df['AGE'].fillna('valoare lipsa'))

import pandas as pd
df =
pd.read_csv('clienti_leasing20.csv',usecols=['NAME_CLIENT','JOB','SE
X','CURRENCY','VENIT_PER_YEAR','DATA','AGE'])
values = df['AGE'].mean()
df['AGE'] = df['AGE'].fillna(value = values)
print(df)
Seminar 2 Python
Pachete software

Exemplu 39. Șterge coloane


import pandas as pd
pd.set_option("display.max_columns",10)
df = pd.read_csv('clienti_leasing20.csv')
#Sterge o coloana cu axis = 1
df = df.drop("ID_CLIENT", axis=1)
print(df)
#Sterge o coloana cu parametrul columns
df = df.drop(columns="AGE")
print(df)
#Sterge mai multe coloane
df = df.drop(["JOB", "SEX"], axis=1)
print(df)
df.to_csv('clienti_df.csv', index = False)
#Sterge o coloana, daca inplace = True, returneaza None
df.drop("VENIT_PER_YEAR", axis=1, inplace = True)
print(df)

Exemplu 40. Șterge înregistrări


import pandas as pd
pd.set_option("display.max_columns",10)
df = pd.read_csv('clienti_leasing20.csv')
# Sterge liniile 3, 5, 8
df = df.drop([3,5,8], axis=0)
print(df)
# Sterge clientii care detin functia Inginer. Pentru a sterge
utilizand denumirea coloanei se seteaza indexul pe coloana
respectiva
df = df.set_index("JOB")
df = df.drop("Inginer", axis=0)
print(df)
# Sterge primele cinci linii cu iloc
df = df.set_index("ID_CLIENT")
df = df.iloc[0:5, ]
print(df)

Exemplu 41. Redenumire coloane


import pandas as pd
pd.set_option("display.max_columns",10)
df = pd.read_csv('clienti_leasing20.csv')

df = df.rename(columns={"ID_CLIENT": "ID"})
df = df.rename(columns={"JOB": "Functia"})
print(df)

df=df.rename(
columns={
"AGE": "Varsta",
Seminar 2 Python
Pachete software

"VENIT_PER_YEAR": "Venit"
}
)
print(df)

df=df.rename(columns=str.lower)
print(df)

2.3 Citire fișier .json

Exemplu 42. Import fișier json


import json
from pprint import pprint
with open('clienti_daune.json') as f:
data = json.load(f)
pprint(data)

Exemplu 43. Prelucrare json. Numără frecvența de apariție a cuvintelor din Dauna din
fișierul json
import json
#deschidem fisierul clienti_daune.json
with open ('clienti_daune.json') as f:
data=json.load(f)
#obtinem lista tuturor cuvintelor din descrierea daunelor
lista_cuvinte=[]
for dauna in data:
lista_cuvinte=lista_cuvinte +
str(str(dauna['Dauna']).lower()).split()
print(lista_cuvinte)
# numaram cuvintele si le adaugam intr-un dictionar
dictionar = {}
for cuvant in lista_cuvinte:
if cuvant not in dictionar:
dictionar[cuvant] = 1
else:
dictionar[cuvant] += 1
#formam lista cuvintelor si a frecventei de aparitie sortata
descrescator
aparitie = []
for key, value in dictionar.items():
aparitie.append((value, key))
aparitie.sort(reverse=True)
print(aparitie)

Referințe
https://realpython.com/python-csv/
https://www.shanelynn.ie/python-pandas-read_csv-load-data-from-csv-files/
https://www.shanelynn.ie/select-pandas-dataframe-rows-and-columns-using-iloc-loc-and-ix/
https://pandas.pydata.org/pandas-docs/version/0.21/api.html#id2
Exerciții
Seminar 2 Python
Pachete software

1) Să se creeze un nou set de date din clienti_leasing.csv având coloanele


name_client, deposit_amount și prescoring, dacă val_credits_ron = 0 și deposit_amount >
150.000 și să se modifice coloana prescoring = 6 dacă deposit_amount > 500.000.

2) La execițiul 43, se vor afișa cuvintele a căror frecvență de apariție > 1000, eliminându-se
cuvintele the, and, to, a.
Seminar 4 Python
Pachete software

Seminar 4 Python
Exemplu instalare pachet scikit-learn
Din https://pypi.org/project/scikit-learn/ copiem pip install scikit-learn
În Command Prompt:
C:\Users\Andreea Copaceanu\AppData\Local\Programs\Python\Python36-32\Scripts>pip
install scikit-learn
Alte pachete Python: scipy, six, cycler, pyparsing, kiwisolver, python-dateutil, matplotlib,
pytz, pandas, seaborn, numpy, sklearn, statsmodels etc.

Upgrade PIP
https://datatofish.com/upgrade-pip/

Exemplu 1. Gruparea unui set de valori în 3 clustere


import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
X = np.array([[5,3],
[10,15],
[15,12],
[24,10],
[30,45],
[85,70],
[71,80],
[60,78],
[55,52],
[80,91]])
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
print(kmeans.cluster_centers_)
print(kmeans.labels_)
f1 = plt.figure()
plt.scatter(X[:,0],X[:,1], label='True Position')
f2 = plt.figure()
plt.scatter(X[:,0], X[:,1], c=kmeans.labels_, cmap='rainbow')
f3 = plt.figure()
plt.scatter(kmeans.cluster_centers_[:,0]
,kmeans.cluster_centers_[:,1], color='black')
plt.show()

1
Seminar 4 Python
Pachete software

Clusterizare k-means în Python cu pachetul scikit-learn


Scufundarea Titanicului în 1912 a dus la 1502 victime din cei 2224 pasageri și membri ai
echipajului.
Se vor utiliza două seturi de date train.csv și test.csv, ce conțin informații legate de pasageri.
Diferența majoră dintre cele două seturi la nivel de coloane constă în coloana Suvived
prezentă doar în setul de antrenare. Se poate considera că supraviețuirea a fost influențată de
anumite atribute, cum ar fi vârsta, sexul, clasa biletului de călătorie etc. Pornind de la aceste
caracteristici, se vor grupa (clusteriza) pasagerii din setul de date de test în supraviețuitori și
nesupraviețuitori, comparându-se rezultatele cu setul de date pentru antrenare.

Exemplu 2. Pas 1. Import biblioteci


import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import MinMaxScaler
import seaborn as sns
import matplotlib.pyplot as plt

Exemplu 2. Pas 2. Citirea fișierelor și afișarea primelor 5 înregistrări


pd.options.display.max_columns = 12
test = pd.read_csv('test.csv')
train = pd.read_csv('train.csv')

print('*****test*****')
print(test.head())
print('*****train*****')
print(train.head())

Exemplu 2. Pas 3. Calcul statistici de bază


print('*****test_stats*****')
print(test.describe())
print('*****train_stats*****')
print(train.describe())

Anumiți algoritmi machine learning, inclusiv k-means, nu permit valori lipsă. Astfel, vor fi
identificate valorile lipsă.
Exemplu 2. Pas 4. Vizualizare denumire coloane din setul train și indentificare valori lipsă
print(train.columns.values)

print('*****train_ valori_lipsă *****')


print(train.isna())
print('*****test_valori_lipsă*****')
print(test.isna())

2
Seminar 4 Python
Pachete software

Exemplu 2. Pas 5. Calcul număr valori lipsă pentru coloanele celor două seturi de date
print('*****In the train set*****'')
print(train.isna().sum())
print("\n")
print('*****In the test set*****')
print(test.isna().sum())

Exemplu 2. Pas 6. Înlocuirea valorilor lipsă cu media coloanei, utilizând funcția fillna
train.fillna(train.mean(), inplace=True)
test.fillna(test.mean(), inplace=True)
print(train.isna().sum())
print(test.isna().sum())

Exemplu 2. Pas 7. Evaluarea supraviețuitorilor în funcție de Pclass, Sex, SibSp


print(train[['Pclass', 'Survived']].groupby(['Pclass'],
as_index=False).mean().sort_values(by='Survived',
ascending=False))
print(train[["Sex", "Survived"]].groupby(['Sex'],
as_index=False).mean().sort_values(by='Survived',
ascending=False))

Exemplu 2. Pas 8. Reprezentare grafică a coloanelor Age-Survived și Pclass-Survived


g = sns.FacetGrid(train, col='Survived')
g.map(plt.hist, 'Age')
grid = sns.FacetGrid(train, col='Survived', row='Pclass')
grid.map(plt.hist, 'Age')
grid.add_legend()
plt.show()

3
Seminar 4 Python
Pachete software

Exemplu 2. Pas 9. Afișarea informațiilor legate de setul de date train


train.info()

Data columns (total 12 columns):


PassengerId 891 non-null int64
Survived 891 non-null int64
Pclass 891 non-null int64
Name 891 non-null object
Sex 891 non-null object
Age 891 non-null float64
SibSp 891 non-null int64
Parch 891 non-null int64
Ticket 891 non-null object
Fare 891 non-null float64
Cabin 204 non-null object
Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)

Exemplu 2. Pas 10. Eliminarea coloanelor non-numerice care nu influențează


supraviețuirea
train = train.drop(['Name','Ticket', 'Cabin','Embarked'],
axis=1)
test = test.drop(['Name','Ticket', 'Cabin','Embarked'],
axis=1)

4
Seminar 4 Python
Pachete software

Exemplu 2. Pas 11. Transformarea tipului de dată a coloanei Sex


labelEncoder = LabelEncoder()
labelEncoder.fit(train['Sex'])
labelEncoder.fit(test['Sex'])
train['Sex'] = labelEncoder.transform(train['Sex'])
test['Sex'] = labelEncoder.transform(test['Sex'])
train.info()
test.info()

Data columns (total 8 columns):


PassengerId 891 non-null int64
Survived 891 non-null int64
Pclass 891 non-null int64
Sex 891 non-null int32
Age 891 non-null float64
SibSp 891 non-null int64
Parch 891 non-null int64
Fare 891 non-null float64
dtypes: float64(2), int32(1), int64(5)
Data columns (total 7 columns):
PassengerId 418 non-null int64
Pclass 418 non-null int64
Sex 418 non-null int32
Age 418 non-null float64
SibSp 418 non-null int64
Parch 418 non-null int64
Fare 418 non-null float64
dtypes: float64(2), int32(1), int64(4)

Exemplu 2. Pas 12. X devine un array din pachetul numpy identic cu setul train din care a
fost ștearsă coloana Survived, iar y devine un array format din coloana Survived
X = np.array(train.drop(['Survived'], 1).astype(float))
y = np.array(train['Survived'])

Exemplu 2. Pas 13. Aplearea metodei kmeans și setarea parametrului n_clusters =


2 (supraviețuitori/nesupraviețuitori). Alte setări pentru kmeans
kmeans = KMeans(n_clusters=2)
kmeans.fit(X)

'''KMeans(algorithm='auto', copy_x=True, init='k-means++',

5
Seminar 4 Python
Pachete software

max_iter=300,
n_clusters=2, n_init=10, n_jobs=1,
precompute_distances='auto',
random_state=None, tol=0.0001, verbose=0)'''

Exemplu 2. Pas 14. Evaluarea rezultatelor


correct = 0
for i in range(len(X)):
predict_me = np.array(X[i].astype(float))
predict_me = predict_me.reshape(-1, len(predict_me))
prediction = kmeans.predict(predict_me)
if prediction[0] == y[i]:
correct += 1

print(correct/len(X))
0.5084175084175084

Modelul clasterizează correct cu o acuratețe mai mare de 50%. Dacă dublăm numărul de
iterații, rezultatele nu se îmbunătățesc.

Exemplu 2. Pas 15. Dublarea numărului de iterații


kmeans = kmeans = KMeans(n_clusters=2, max_iter=600)
0.49158249158249157

Pentru îmbunățirea sporită a rezultatelor, se vor scala datele de intrare.

Exemplu 2. Pas 16. Scalarea datelor de intrare


scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)
kmeans = KMeans(n_clusters=2)
kmeans.fit(X_scaled)
KMeans(algorithm='auto', copy_x=True, init='k-means++',
max_iter=600,
n_clusters=2, n_init=10, n_jobs=1,
precompute_distances='auto',
random_state=None, tol=0.0001, verbose=0)
correct = 0
for i in range(len(X)):
predict_me = np.array(X[i].astype(float))
predict_me = predict_me.reshape(-1, len(predict_me))
prediction = kmeans.predict(predict_me)
if prediction[0] == y[i]:
correct += 1

print(correct/len(X))
0.6262626262626263

6
Seminar 4 Python
Pachete software

Exemplu 2. Cod complet kmeans


import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import MinMaxScaler
import seaborn as sns
import matplotlib.pyplot as plt
pd.options.display.max_columns = 12
test = pd.read_csv('test.csv')
train = pd.read_csv('train.csv')

print('*****test*****')
print(test.head())
print('*****train*****')
print(train.head())

print('*****test_stats*****')
print(test.describe())
print('*****train_stats*****')
print(train.describe())

print(train.columns.values)

print(train.isna())
print(test.isna())

print('*****In the train set*****')


print(train.isna().sum())
print("\n")
print('*****In the test set*****')
print(test.isna().sum())

train.fillna(train.mean(), inplace=True)
test.fillna(test.mean(), inplace=True)
print(train.isna().sum())
print(test.isna().sum())

print(train[['Pclass', 'Survived']].groupby(['Pclass'],
as_index=False).mean().sort_values(by='Survived', ascending=False))
print(train[["Sex", "Survived"]].groupby(['Sex'],
as_index=False).mean().sort_values(by='Survived', ascending=False))
print(train[["SibSp", "Survived"]].groupby(['SibSp'],
as_index=False).mean().sort_values(by='Survived', ascending=False))

g = sns.FacetGrid(train, col='Survived')
g.map(plt.hist, 'Age')
grid = sns.FacetGrid(train, col='Survived', row='Pclass')
grid.map(plt.hist, 'Age')
grid.add_legend()
plt.show()

train.info()

train = train.drop(['Name','Ticket', 'Cabin','Embarked'], axis=1)


test = test.drop(['Name','Ticket', 'Cabin','Embarked'], axis=1)

labelEncoder = LabelEncoder()
labelEncoder.fit(train['Sex'])
labelEncoder.fit(test['Sex'])

7
Seminar 4 Python
Pachete software

train['Sex'] = labelEncoder.transform(train['Sex'])
test['Sex'] = labelEncoder.transform(test['Sex'])

train.info()

test.info()

X = np.array(train.drop(['Survived'], 1).astype(float))

y = np.array(train['Survived'])

scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)
kmeans = KMeans(n_clusters=2)
kmeans.fit(X_scaled)
KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=600,
n_clusters=2, n_init=10, n_jobs=1, precompute_distances='auto',
random_state=None, tol=0.0001, verbose=0)
correct = 0
for i in range(len(X)):
predict_me = np.array(X[i].astype(float))
predict_me = predict_me.reshape(-1, len(predict_me))
prediction = kmeans.predict(predict_me)
if prediction[0] == y[i]:
correct += 1

print(correct/len(X))

Exemplu 3. Regresie logistică (logistic regression)


import pandas as pd
from sklearn.linear_model import LogisticRegression
pd.options.display.max_columns = 12
test = pd.read_csv('test1.csv')
train = pd.read_csv('train.csv')

print('*****test*****')
print(test[:4])
print('*****train*****')
print(train[:4])

train.fillna(train.mean(), inplace=True)
test.fillna(test.mean(), inplace=True)
print(train.isna().sum())
print(test.isna().sum())

train['IsFemale'] = (train['Sex'] == 'female').astype(int)


test['IsFemale'] = (test['Sex'] == 'female').astype(int)

predictors = ['Pclass', 'IsFemale', 'Age']


X_train = train[predictors].values
X_test = test[predictors].values
y_train = train['Survived'].values
y_test= test['Survived'].values
print(X_train[:5])
print(y_train[:5])

model = LogisticRegression(C=1.0, class_weight=None, dual=False,


fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,

8
Seminar 4 Python
Pachete software

penalty='l2', random_state=None, solver='lbfgs', tol=0.0001,


verbose=0, warm_start=False)

model.fit(X_train, y_train)
y_predict = model.predict(X_test)
print(y_predict)

print((y_test == y_predict).mean())

Exemplu 4. Regresie simplă liniară (Ordinary Least Squares)


import pandas as pd
import statsmodels.api as sm
pd.options.display.max_columns = 12
test = pd.read_csv('test.csv')
train = pd.read_csv('train.csv')

train.fillna(train.mean(), inplace=True)
test.fillna(test.mean(), inplace=True)

train['IsFemale'] = (train['Sex'] == 'female').astype(int)


test['IsFemale'] = (test['Sex'] == 'female').astype(int)

X_train = train['IsFemale'].values
X_train = sm.add_constant(X_train)

y_train = train['Survived'].values

model = sm.OLS(y_train, X_train)

results = model.fit()
print(results.params)
print(results.summary())

Exemplu 5. Regresie multiplă (multiple regression)


import pandas as pd
import statsmodels.formula.api as smf

pd.options.display.max_columns = 12
test = pd.read_csv('test.csv')
train = pd.read_csv('train.csv')

train.fillna(train.mean(), inplace=True)
test.fillna(test.mean(), inplace=True)

train['IsFemale'] = (train['Sex'] == 'female').astype(int)


test['IsFemale'] = (test['Sex'] == 'female').astype(int)

X = pd.DataFrame(train, columns=['Pclass', 'IsFemale', 'Age'])


y = train['Survived']

results = smf.ols('y ~ Pclass + IsFemale + Age', data=train).fit()


print(results.params)

print(round(results.predict(train[:5])))

9
Seminar 4 Python
Pachete software

Referințe
1 https://stackabuse.com/k-means-clustering-with-scikit-learn/
2 https://www.datacamp.com/community/tutorials/k-means-clustering-python
3 Wes McKinney, 2nd Edition of Python for Data Analysis DATA WRANGLING WITH
PANDAS, NUMPY, AND IPYTHON, O’Reilley
4 https://towardsdatascience.com/logistic-regression-detailed-overview-46c4da4303bc
5 https://www.statsmodels.org/dev/generated/statsmodels.regression.linear_model.Regr
essionResults.html

10
Seminar 3 Python
Pachete software

Seminar 3 Python
 Prelucrări statistice, funcții de grup, gruparea și agregarea datalor în pachetul pandas
Exemplu 1. Conversia coloanei date din șir de caractere în dată calendaristică
import dateutil
import pandas as pd
df = pd.read_csv('phone_data.csv')
print(df.dtypes)
df['date'] = df['date'].apply(dateutil.parser.parse,
dayfirst=True)
print(df.dtypes)

Exemplu 2. Prelucrări statistice simple


import pandas as pd
df = pd.read_csv('phone_data.csv')
print('Numar inregistrari')
print(df['item'].count())
print('Durata maxima a unei convorbiri/transfer date')
print(df['duration'].max())
print('Numarul total de secunde la apeluri')
print(df['duration'][df['item'] == 'call'].sum())
print('Numarul de apeluri in fiecare luna')
print(df['month'].value_counts())
print('Numar de retele - elimina duplicatele')
print(df['network'].nunique())

Exemplu 3. Statistici descriptive în funcție de tipul coloanei cu describe()


import pandas as pd
df = pd.read_csv('phone_data.csv')
print('Statistici descriptive')
print(df['network_type'].describe())
print(df['duration'].describe())

Exemplu 4. Posibilități grupare


import pandas as pd
df = pd.read_csv('phone_data.csv')
print(df.groupby(['item']).groups.keys())
print(len(df.groupby(['item']).groups['call']))

import pandas as pd
df = pd.read_csv('phone_data.csv')
print(df.groupby(['month']).groups.keys())
print(len(df.groupby(['month']).groups['2014-11']))

Exemplu 5. Funcțiile max(), min(), mean(), first(), last() pot fi utilizate cu GroupBy
import pandas as pd
df = pd.read_csv('phone_data.csv')
Seminar 3 Python
Pachete software

print('Prima inregistrare din coloana item pe valori


distincte')
print(df.groupby('item').first())
print('Durata insumata pentru fiecare luna')
print(df.groupby('month')['duration'].sum())
print('Durata insumata pe convorbiri (calls), pentru fiecare
retea')
print(df[df['item'] ==
'call'].groupby('network')['duration'].sum())

Exemplu 6. Grupări complexe


import pandas as pd
df = pd.read_csv('phone_data.csv')
print('Numarul de apeluri, sms, transfer date pentru fiecare
luna')
print(df.groupby(['month', 'item'])['date'].count())

Exemplu 7. Gruparea și agregarea datelor


import pandas as pd
df = pd.read_csv('phone_data.csv')
# Grupeaza dupa month si item si calculeaza statistici pentru
fiecare grup
print(df.groupby(['month', 'item']).agg({'duration':sum,
# calculeaza suma duratelor dupa fiecare grup
'network_type': "count",
# numarul de tipuri de retele
'date': 'first'})) #
arata prima aparitie (data) pentru fiecare grup
df1 = df.groupby(['month', 'item']).agg({'duration':sum,
# calculeaza suma duratelor dupa fiecare grup
'network_type': "count",
# numarul de tipuri de retele
'date': 'first'})
df1.to_csv('agregare.csv')

Exemplu 8. Aplicarea unor funcții multiple unei singure coloane din grup
import pandas as pd
df = pd.read_csv('phone_data.csv')
# Grupeaza dupa month si item. Calculeaza statistici pentru
fiecare grup
print(df.groupby(['month', 'item']).agg({'duration': [min,
max, sum], # calculeaza min, max, si sum pentru duration
'network_type': "count",
# calculeaza numarul de network_type
'date': [min, 'first',
'nunique']})) # calculeaza min, first, si numarul de date
unice per grup
Seminar 3 Python
Pachete software

 Prelucrarea seturilor de date cu merge / join dataframes


Vom utiliza fișierele .csv - user_device, user_usage, având o coloană comună (use_id), și
supported_devices (Model) și user_device (device), cele două coloane conținând coduri
comune.
Exemplu 9. Inner merge sau inner join
import pandas as pd
df = pd.read_csv('user_usage.csv')
df1 = pd.read_csv('user_device.csv')

result = pd.merge(df,
df1[['use_id', 'platform', 'device']],
on='use_id')
print(result)
print('Structura fisier user_usage.csv ', df.shape)
print('Structura fisier user_device.csv ', df1.shape)
print(df['use_id'].isin(df1['use_id']).value_counts())

Exemplu 10. Left merge sau left join


import pandas as pd
df = pd.read_csv('user_usage.csv')
df1 = pd.read_csv('user_device.csv')

result = pd.merge(df,
df1[['use_id', 'platform', 'device']],
on='use_id',
how='left')
print(result)
print('Structura fisier user_usage.csv ', df.shape)
print('Structura fisier user_device.csv ', df1.shape)
print(df['use_id'].isin(df1['use_id']).value_counts())

Exemplu 11. Right merge sau right join


import pandas as pd
df = pd.read_csv('user_usage.csv')
df1 = pd.read_csv('user_device.csv')

result = pd.merge(df,
df1[['use_id', 'platform', 'device']],
on='use_id',
how='right')
print(result)
print('Structura fisier user_usage.csv ', df.shape)
print('Structura fisier user_device.csv ', df1.shape)
print(df['use_id'].isin(df1['use_id']).value_counts())

Exemplu 12. Full outer merge sau full outer join


import pandas as pd
Seminar 3 Python
Pachete software

df = pd.read_csv('user_usage.csv')
df1 = pd.read_csv('user_device.csv')

result = pd.merge(df,
df1[['use_id', 'platform', 'device']],
on='use_id',
how='outer')
print(result)
print('Structura fisier user_usage.csv ', df.shape)
print('Structura fisier user_device.csv ', df1.shape)
print(df['use_id'].isin(df1['use_id']).value_counts())

Exemplu 13. Full outer merge sau full outer join cu indicația _merge
import pandas as pd
df = pd.read_csv('user_usage.csv')
df1 = pd.read_csv('user_device.csv')

result = pd.merge(df,
df1[['use_id', 'platform', 'device']],
on='use_id',
how='outer',
indicator=True)
print(result)
print('Structura fisier user_usage.csv ', df.shape)
print('Structura fisier user_device.csv ', df1.shape)
print(df['use_id'].isin(df1['use_id']).value_counts())

Exemplu 14. Merge utilizând trei seturi de date


import pandas as pd
df = pd.read_csv('user_usage.csv')
df1 = pd.read_csv('user_device.csv')
df3 = pd.read_csv('supported_devices.csv')

result = pd.merge(df,
df1[['use_id', 'platform', 'device']],
on='use_id',
how='left')

df3.rename(columns={"Retail Branding": "manufacturer"},


inplace=True)
result = pd.merge(result,
df3[['manufacturer', 'Model']],
left_on='device',
right_on='Model',
how='left')
print(result.head())
print(result.shape)
Seminar 3 Python
Pachete software

Exemplu 15. Groupby și agg utilizând setul rezultat


import pandas as pd
df = pd.read_csv('user_usage.csv')
df1 = pd.read_csv('user_device.csv')
df3 = pd.read_csv('supported_devices.csv')

result = pd.merge(df,
df1[['use_id', 'platform', 'device']],
on='use_id',
how='left')

df3.rename(columns={"Retail Branding": "manufacturer"},


inplace=True)
result = pd.merge(result,
df3[['manufacturer', 'Model']],
left_on='device',
right_on='Model',
how='left')
print(result.groupby("manufacturer").agg({
"outgoing_mins_per_month": "mean",
"outgoing_sms_per_month": "mean",
"monthly_mb": "mean",
"use_id": "count"
}))

 Reprezentare grafică cu pachetul matplotlib

Exemplu 16. Reprezentare grafică cu bare cu matplotlib.pyplot


import pandas as pd
import matplotlib.pyplot as plt
pd.set_option("display.max_columns",10)
df = pd.read_csv('clienti_leasing20.csv')
print(df['AGE'])
df['AGE'].plot(kind='bar')
plt.xlabel('ID_CLIENT')
plt.ylabel('AGE')
plt.show()
Seminar 3 Python
Pachete software

Exemplu 17. Histrogramă cu matplotlib.pyplot


import pandas as pd
import matplotlib.pyplot as plt
pd.set_option("display.max_columns",10)
df = pd.read_csv('clienti_leasing20.csv')
print(df['AGE'])
df['AGE'].plot(kind='hist')
plt.xlabel('AGE')
plt.show()
Seminar 3 Python
Pachete software

Exemplu 18. Grafic cu gruparea și sortarea datelor cu matplotlib.pyplot


import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('clienti_leasing20.csv')
plot_data=df[df['SEX']=='m']
plot_data=plot_data.groupby('JOB')['VENIT_PER_YEAR'].sum()
plot_data.sort_values().plot(kind='bar')
plt.show()
Seminar 3 Python
Pachete software

Referințe
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/

Exerciții propuse
1) Să se reprezinte grafic (de tip pie) durata însumată a sms pe lună.
2) Să se creeze setul format din user_usage și supported_devices și să se reprezinte grafic
(bare verticale) traficul însumat (coloana monthly_mb) pentru fiecare brand (coloana Retail
Branding).
3) Să se afișeze, utilizând fișierul phone_data.csv, durata însumata pentru fiecare lună și
durata însumată pentru un anumit tip de rețea (mobile) pentru fiecare lună.
Seminar 2 SAS
1. Lucrul cu tabele SAS în Grila de Date (Data Grid)

Scop: Crearea unei tabele SAS prin rularea unui program SAS. Folosirea Grilei de Date pentru : a) a
şterge linii şi coloane, b) a modifica atribute ale coloanelor, c) a sorta tabele, d) a crea noi coloane
folosind Expression Builder.

Problemă: Să se creeze pornind de la un cod sursă SAS tabela UPDATEORDERS, iar ulterior să se
efectueze următoarele modificări asupra acesteia:
 Ştergerea coloanei UnitsInStock
 Ştergerea comenzii cu numărul 0713.
 Adăugarea coloanei venituri (Revenue) ca produs dintre cantitate şi preţul de vânzare.
 Sortarea tabelei după numele produsului.
1. Paşi de urmat:
2. Inseraţi în proiect un program care creează o tabelă SAS. Selectaţi File  Open  Program... din
meniu. Selectaţi Local Computer.
3. Selectaţi fişierul CreateDataTable.sas  Open.
4. Apăsaţi butonul Run sau tasta F8 pentru a rula programul.
Se creează şi se adaugă la proiect o nouă tabelă numită UPDATEORDERS. Iniţial, tabela se află în
modul read-only. Pentru a trece în modul Update, astfel încât să puteţi edita tabela, debifaţi
opţiunea EditProtect Data, pentru a schimba modul de protecţie a fişierului de date.

Observaţie: Atunci când modificaţi o tabelă în Grila de Date, modificaţi valorile efective ale datelor
din tabelă. Salvaţi o copie a tabelei, atunci când aveţi nevoie să păstraţi o copie a datelor
originale.
5. Selectaţi Yes din fereastra care vă apare pentru a comuta în modul Update.
6. Ştergeţi coloana UnitsInStock făcând click dreapta pe numele coloanei şi selectând opţiunea de
ştergere.
7. Ştergeţi rândul corespunzător comenzii anulate cu numărul 0713. Selectați numele coloanei
OrderNum, şi apoi EditFind… din bara de meniu şi căutați comanda dorită. După selectare, faceţi
click dreapta pe observaţie şi selectaţi opţiunea de ştergere.
8. Modificaţi numele şi eticheta asociate coloanei AcctNumber, făcând click dreapta pe numele
coloanei şi selectând proprietăţile acesteia. Schimbaţi cele două proprietăţi în CustID şi respectiv
Customer ID.

Notă: Implicit, în Grila de Date şi în casetele de dialog ale prelucrărilor sunt afişate numele coloanelor.
Pentru a afişa etichetele acestora., selectaţi opţiunea Use labels for column names din
meniul Tools  Options, tab-ul DataData General
9. Inseraţi o nouă coloană după SellPrice: Click dreapta pe numele SellPrice, Insert Column …
10. Coloana nouă este de tip monedă, şi reprezintă produsul dintre cantitate şi preţul de vânzare.
Expresia după care se calculează se scrie în câmpul Expression.
11. Modificaţi formatul de afişare a noii variabile, astfel încât să afişeze semnul $ în faţa valorii, să pună
virgula separatoare pentru mii şi să admită trei cifre zecimale.
12. Sortaţi datele după numele produsului. (Butonul Filter and Sort)
13. Reveniţi la modul read-only în care datele sunt protejate.
14. Salvaţi proiectul.

2. Importul fişierelor flat (text, HTML)


Scop: Importul a diferite tipuri de fişiere flat în SAS Enterprise Guide.

Tipuri de fişiere importate:


Un fişier text cu lăţime fixă are un format specific care permite salvarea datelor/informaţiilor textuale
într-o manieră organizată. Este un tip special de fişier în care formatul este definit de lăţimea coloanei,
de caracterele folosite pentru spaţiere şi de alinierea la stânga sau dreapta. Lăţimea coloanei este
specificată sub forma unui număr de caractere. Spaţierea datelor se face folosind caracterul spaţiu (sau
orice caracter se doreşte) în cazul în care datele ocupă mai puţine caractere decât lăţimea specificată
pentru coloana respectivă. Se creează programabil.

Într-un fişier text delimitat fiecare linie de text reprezintă o înregistrare, iar câmpurile sunt separate
prin caractere cunoscute. Delimitatori frecvent utilizaţi sunt caracterul tab (\t) sau diferite caractere de
punctuaţie. Delimitatorul trebuie întotdeauna să fie un caracter care nu se regăseşte în date. Se pot crea
într-un editor de text sau folosind aplicaţii de calcul tabelar sau pentru baze de date (ex. Microsoft Excel,
Microsoft Access). Considerăm ca exemplu un fişier text care conţine numele, prenumele şi vârsta
persoanelor, delimitate prin simbolul linie verticală (|):
Popescu|Maria|35
Ionescu|Damian|42
Diamandescu|Victor|29

Problema 1: Într-un proiect nou să se importe sursa de date Orders.txt. Acesta este un fişier text de
lăţime fixă care conţine comenzile referitoare la produsele companiei ABC din trimestrul curent.
Prezentarea câmpurilor fişierului este următoarea:
Câmpul 1: Numărul comenzii, poziţia 1-5
Câmpul 2: Numărul de identificare al produsului, poziţia 7-10
Câmpul 3: Cantitatea comandată, poziţia 13-15
Câmpul 4: Preţul de vânzare, poziţia 17-22
Câmpul 5: Venit, poziţia 25-32

Paşi de urmat:
1. În proiectul activ se vor selecta, din meniul opţiunea File  Import Data…, apoi se selectează Local
Computer şi se alege locaţia unde aţi salvat datele de lucru.
2. Pentru a începe importul fişierului text, se marchează fişierul orders.txt şi apoi se selectează
opţiunea Open.
3. Salvaţi rezultatul ca o tabelă SAS cu numele comenzi.
4. Selectaţi formatul de fişier. Se poate alege dintre cele două opţiuni:
 Fişiere delimitate. Pentru a specifica un delimitator care nu se regăseşte in listă, selectați Other.
 Fişiere cu coloane de lăţime fixă
5. În riglă trebuie să precizaţi locul în care începe fiecare coloană. Pentru acest lucru, faceţi click în riglă
sau în interiorul textului fişierului previzualizat. Punctele de marcare care apar pot fi mutate cu
ajutorul mouse-ului în altă locaţie sau pot fi îndepărtate prin mutarea lor în afara spaţiului în care
apare grila.
6. Dacă fișierul conţine numele câmpurilor pe care vreţi să le folosiţi ca nume de coloane, selectaţi File
contains field names on record number. Introduceţi şi numărul înregistrării care conţine numele
câmpurilor.
7. Se poate bifa opţiunea de a redenumi coloanele pentru a fi compatibile cu convenţiile de nume ale
SAS. Aceste convenţii conţin reguli ca: numele începe cu o literă sau cu caracterul ” _” underscore ;
conţine litere, cifre sau caracterul underscore, are o lungime de maxim 32 de caractere, nu poate fi
inclus între ghilimele duble, nu este case sensitive – nu face diferenţiere între litere mari şi mici.
8. Pentru a specifica numărul înregistrării care conţine prima linie de date. Introduceţi o valoare în
câmpul Data records start at record number.
9. Pentru a specifica ultima înregistrare pe care doriţi să o importaţi, selectaţi Limit the number of
records read to şi introduceţi numărul ultimei înregistrări în caseta alăturată.
10. Selectaţi Next pentru a defini atributele câmpurilor.
11. Modificaţi atributele câmpurilor în felul următor:
 Câmpul 1 nu îl introduceţi în tabela rezultat.
 Pentru câmpul 2 se schimbă atributul “Name” cu IDProd, “Label” cu Identificator produs şi
“Len.” cu 4.
 Pentru câmpul 3 se schimbă atributul “Name” cu Cantitate şi “Label” cu Cantitate comandata
 Pentru câmpul 4 se schimbă atributul “Name” cu PretVanzare şi “Label” cu Pretul de vânzare.
Pentru acest câmp se selectează tipul (Type) Currency şi formatul de ieşire (Output format)
DOLLARw.d. Se schimbă lăţimea la 8 şi numărul de poziţii zecimale la 2.
 Pentru câmpul 5 se schimbă atributul “Name” cu Venit şi “Label” cu Venit. Pentru acest câmp se
selectează tipul (Type) Currency şi formatul de ieşire (Output format) DOLLARw.d. Se schimbă
lăţimea la 10 şi numărul de poziţii zecimale la 2.

Problema 2: Creaţi un fişier text delimitat prin caracterul tab care să conţină pe prima linie numele
câmpurilor, respectiv: nume, prenume, varsta şi salariu. Următoarele 5 rânduri trebuie să conţină
înregistrări valide. Importaţi acest fişier în SAS ca o tabelă cu numele angajaţi. Formatul de ieşire pentru
câmpul salariu trebuie să permită vizualizarea acestuia ca o valoare în moneda Euro. Eventualele
coloane generate, care nu conţin informaţii utile, se vor şterge la editarea atributelor.

Paşi de urmat:
1. Creaţi fişierul text potrivit cerinţelor problemei şi salvaţi-l cu numele angajati (*.txt).
2. În proiectul activ, selectaţi din meniu opţiunea File  Import Data…, apoi selectaţi Local Computer
şi alegeţi locaţia unde aţi salvat fişierul text.
3. Pentru a începe importul fişierului text, marcaţi fişierul angajati.txt şi apoi apăsaţi Open.
4. După selectarea opţiunii Open, este necesară parcurgerea celor patru paşi din caseta de dialog
apărută pe ecran, pentru a realiza importului fişierului text.
5. La primul pas se selectează Encoding pentru alegerea setului de caractere utilizat la reprezentarea
datelor din fişierului importat.
6. De asemenea, la primul pasul se poate selecta salvarea rezultatului ca o tabelă SAS cu numele
situatie_angajati. Apăsaţi Next pentru a ajunge la pasul al doilea.
7. La pasul al doilea selectaţi formatul de fişier şi tipul delimitatorului dintre câmpuri.
8. Selectaţi File contains field names on record number dacă fișierul conţine numele câmpurilor ce
vor fi utilizate ca nume de coloane şi introduceţi numărul înregistrării care conţine numele
câmpurilor. În câmpul Data records start at record number se introduce numărul înregistrării care
conţine prima linie de date din fişierului text.
9. Se poate bifa opţiunea de a redenumi coloanele pentru a fi compatibile cu convenţiile de nume ale
SAS. Aceste convenţii conţin reguli ca: numele începe cu o literă sau cu caracterul ”_” underscore ;
conţine litere, cifre sau caracterul underscore, are o lungime de maxim 32 de caractere, nu poate fi
inclus între ghilimele duble, nu este case sensitive – nu face diferenţiere între litere mari şi mici.
10. Apăsaţi Next pentru a trece la pasul al III-lea: definirea atributele câmpurilor.
11. Modificaţi atributele câmpului Salariu astfel încât să îndeplinească cerinţele problemei. Pentru acest
câmp se selectează tipul (Type) Currency şi formatul de ieşire (Output format) EUROw.d. Se schimbă
lăţimea la 10 şi numărul de poziţii zecimale la 2.
12. Apăsaţi Next, pentru a trece la ultimul pas.
13. Cel de-al IV-lea pas conţine opţiuni avansate:
 Pentru a include datele în codul SAS generat ca parte a unei declaraţii DATALINES, selectaţi
opţiunea Embed the data within the generated SAS code. Dacă selectaţi această opţiune, atunci
rezultatul va include un program SAS care se poate rula din nou sau distribui altor utilizatori.
 Opţiunea Remove characters that can cause transmission errors from text-based data files se
foloseşte, spre exemplu, atunci când dorim să importăm caractere speciale, caracteristice unei
anumite limbi, care este posibil să nu fie recunoscute de server.
14. Se selectează Finish, pentru finalizarea importului fişierului de date de tip text.

Problema 3: Creaţi un tabel HTML care să conţină informaţiile de mai jos. Acest tabel poate fi scris în MS
Word şi salvat ca pagină Web.

Tranzactie Data Valoare


176897 12/09/2009 $1,340.2
176898 12/09/2009 $2,240.9
176899 13/09/2009 $500.0
176900 13/09/2009 $1,267.5
176901 14/09/2009 $5,120.4
176902 14/09/2009 $1,123.8

Importaţi tabelul HTML în SAS, ca o tabela cu numele tranzactii. Țineți cont de următoarele observaţii:
a) câmpul Data trebuie să afişeze în tabela generată mai întâi luna, apoi ziua şi anul; b) câmpul Valoare
trebuie să afişeze în tabela generată valoarea fără semnul de dolar în faţă. Pentru a realiza aceste
modificări trebuie să alegeţi formate de afişare potrivite pentru cele două câmpuri.
Paşi de urmat:
3. Creaţi tabelul de mai sus într-un document WORD şi salvaţi-l cu numele tranzactii, ca pagina Web.
(*.htm, *.html)
4. În proiectul activ selectaţi din meniu opţiunea File  Import Data…, apoi selectaţi Local Computer
şi alegeţi locaţia unde aţi salvat fişierul text.
5. Pentru a începe importul fişierului text, marcaţi fişierul tranzactii.htm (/.html) şi apoi selectaţi
opţiunea Open.
6. După selectarea opţiunii Open, este necesară parcurgerea celor patru paşi din caseta de dialog
apărută pe ecran, pentru realizarea importului fişierului tranzactii.
7. La primul pasul se poate selecta salvarea rezultatului ca o tabelă SAS cu numele situatie_tranzactii.
Apăsaţi Next pentru a ajunge la pasul al II-lea.
8. Întrucât datele au fost introduse într-o formă tabelară, nu mai este necesară specificarea
delimitatorului câmpurilor.
Selectaţi File contains field names on record number dacă fișierul conţine numele câmpurilor ce
vor fi utilizate ca nume de coloane şi introduceţi numărul înregistrării care conţine numele
câmpurilor. Introduceţi şi numărul înregistrării care conţine prima linie de date din fişierului text, în
câmpul Data records start at record number.
9. Apăsaţi Next pentru a trece la pasul al III-lea, definirea atributele câmpurilor.
10. Modificaţi atributele câmpului Data, astfel încât să îndeplinească cerinţele problemei, subpunctul a).
Pentru acest câmp se selectează formatul de ieşire (Output format) MMDDYYDw.d.
Pentru îndeplinirea cerinţei de la subpunctul b), se modifică formatul de ieşire (Output format) al
câmpului Valoare. Se va modifica formatul de ieşire (Output format) al câmpului Valoare, din
Currency în Numeric, pentru a se elimina simbolul de dolar, cu lăţimea de 10 şi numărul de poziţii
zecimale de 2.
11. Apăsaţi Next, pentru a trece la ultimul pas.
12. Cel de-al IV-lea pas conţine opţiuni avansate:
 Pentru a include datele în codul SAS generat ca parte a unei declaraţii DATALINES, selectaţi
opţiunea Embed the data within the generated SAS code. Dacă selectaţi această opţiune, atunci
rezultatul va include un program SAS care se poate rula din nou sau distribui altor utilizatori.
 Opţiunea Remove characters that can cause transmission errors from text-based data files se
foloseşte, de exemplu, atunci când dorim să importăm caractere speciale, caracteristice unei
anumite limbi, care este posibil să nu fie recunoscute de server.
13. Se apasă Finish pentru finalizarea importului fişierului.

3. Transpunerea tabelelor de date

Problemă: Să se creeze în SAS Enterprise Guide o tabelă de date cu conţinutul de mai jos. Datele se
referă la măsurarea greutăţii unor persoane pe parcursul unui experiment. Coloana Cod reprezintă
identificatorul persoanei, Timp indică momentul la care s-a efectuat măsurarea greutăţii memorate în
coloane Greutate. Toate cele trei coloane au tipul numeric, fără zecimale.

Cod Timp Greutate


1 1 70
1 2 73
1 3 81
2 1 64
2 2 61
2 3 58
3 1 96
3 2 93
3 3 91

Să se transforme tabela de mai sus (care este o tabelă de tipul mai-multe-întegistrări-per-subiect) într-o
tabelă care să permită analiza facilă a datelor referitoare la evoluţia în greutate a fiecărei persoane
(tabelă de tipul o-singură-întegistrărare-per-subiect) şi care să aibă 4 câmpuri: Cod, Greutate1,
Greutate2 şi Greutate3. Să se determine variaţia de greutate a fiecărei persoane înregistrată între prima
şi ultima măsurătoare. Se va utiliza prelucrarea TasksDataTranspose…
Pentru rezolvarea problemei folosiţi Help-ul pachetului de programe.

Paşi de urmat:

1. În proiectul activ selectaţi din meniu opţiunea File  New  Data, iar în caseta de dialog apărută,
modificaţi numele fişierului ce urmează a se crea în Analiza_greutate după care selectaţi directorul
Work, unde acesta va fi salvat .
2. La cel de-al doilea pas, fiecare litera A, B, C etc. reprezintă numele unei coloane pentru datele ce se
vor introduce ulterior. Tabelul de mai sus este format din 3 coloane. Astfel, în caseta de dialog, la
pasul al doilea, se vor modifica proprietăţile aferente primelor 3 coloane, identificate inițial prin
literele A, B, şi C. Proprietăţile care se vor modifica pentru fiecare coloană în parte, în vederea
obţinerii structurii tabelare în SAS asemănătoare cu cea a tabelului de mai sus, sunt: numele
coloanei, eticheta acesteia, tipul date ce vor fi adăugate în coloană, formatul datelor şi dimensiunea
acestora.
3. Cu ajutorul săgeţilor ce despart denumirile coloanelor din stânga casetei de dialog de proprietățile
coloanelor, se poate modifica ordinea de apariţie in structura tabelară a coloanelor.
4. După ce au fost definite caracteristicile celor 3 coloane necesare realizării structurii tabelare de mai
sus, restul coloanelor, simbolizate prin litere (D, E, F etc.), se şterg cu ajutorul opţiunii DELETE,
simbolizată prin X. Aceasta opţiune se găseşte între zona ce conţine denumirile coloanelor din
stânga casetei de dialog si zona din dreapta a casetei de dialog, care conţine proprietățile
coloanelor.
5. Apăsaţi Finish, pentru a se crea structura tabelara în SAS.
6. În structura tabelară obţinută, introduceţi valorile numerice din tabelul de mai sus.
7. Pentru rezolvarea cerințelor problemei, selectaţi Task  Data  Transpose.
8. În caseta de dialog apărută optaţi pentru protejarea datelor (Yes).
În cea de-a doua casetă de dialog apărută, în secţiunea Data se utilizează opţiunea drag and drop,
pentru a muta fiecare variabilă din stânga în zona corespunzătoare din dreapta, astfel încât să fie
rezolvate cerinţele problemei. Se grupează după Cod (Group Analysis by), se alege variabila timp
pentru crearea de noi coloane (New column names), şi se alege variabila greutate pentru a fi
transpusă (Transpose Variable) în coloanele noi create.
9. În secţiunea Options modificaţi prefixul coloanelor noi ce se vor crea, din Columns în Greutate.
10. Utilizaţi Run pentru a se realiza transpunerea datelor.
11. Se poate opta pentru deprotejarea datelor (EditProtect Data ), pentru a fi permisă ştergerea
coloanelor inutile (coloanele cu numele variabilei transpuse şi cea cu eticheta acesteia).
12. Pentru a rezolva cerinţa problemei, referitoare la determinarea variaţiei de greutate a fiecărei
persoane înregistrată între prima şi ultima măsurătoare, trebuie să fie debifată opţiunea de
protejare a datelor.
13. Utilizaţi click dreapta in zona tabelară, acolo unde doriți sa adăugaţi o coloană nouă, în care se va
calcula diferența de greutate. În caseta de dialog apărută trebuie introduse caracteristicile noii
coloane: nume - vargreutate, etichetă - Variaţia de greutate, tipul - numeric. În secţiunea
Expression utilizaţi butonul aferent acestei opţiuni, extindeţi tabela în care se lucrează, din
directorul Tables, şi tastaţi formula matematică, pentru calculul diferenţei de greutate între prima şi
ultima măsurătoare. Pentru a scrie expresia se realizează dublu-click pe numele variabilelor ce
trebuie utilizate, iar între acestea se folosesc simbolurile matematice corespunzătoare.
14. Utilizaţi Ok pentru a obţine rezultatele diferenţei de greutate într-o coloană nouă.
Seminar 4 Programare SAS

Prelucrarea datelor prin crearea de rapoarte şi aplicarea de analize


statistice

1. Procedura PRINT - realizarea de rapoarte detaliate


Procedura PRINT este probabil cea mai utilizată procedură SAS, fiind folosită pentru
afișarea datelor cu sau fără grupare. În forma sa cea mai simplă, procedura listează toate
variabilele și toate observațiile dintr-un set de date.

Sintaxa:
PROC PRINT DATA = set_date NOOBS LABEL;
- NOOBS suprimă afișarea numărului observației.
- LABEL afișează eticheta, în loc de numele variabilei.
O serie de declarații opționale sunt utile la creare de raporte de detaliu:
- BY lista_variabile; Declarația BY inițiază în rezultate o nouă secțiune pentru fiecare valoare
nouă a variabilelor de grupare și scrie valorile variabilelor de grupare în partea de sus a
fiecărei secțiuni. Datele trebuie să fie sortate în prealabil după variabilele de grupare.
- ID lista_variabile; Când se utilizează declarația ID, numerele observațiilor nu vor fi afișate.
În schimb, variabilele din lista_variabile vor apărea în partea stângă a paginii.
- SUM lista_variabile; Declarația afișează sume ale valorilor variabilelor din listă.
- VAR lista_variabile; Specifică variabilele afișate și ordinea acestora.

Exerciţiul 1: Pentru a-și suplimenta fondurile destinate unei excursii școlare, elevii claselor a
III-a A și a III-a B au decis să participe la câteva evenimente din cadrul unei campanii de
încurajare a cititului în rândurile copiilor, prin vânzarea de semne de carte cu mesaje
motivaționale create de ei. Copiii au câștigat câte 3 lei pentru un semn de carte pe suport de
hârtie sau textil. În fișierul „micii_cititori.txt” au fost stocate date referitoare la elevul care a
participat la eveniment, tipul semnelor de carte vândute și cantitatea. Se cere să se realizeze un
raport privind sumele cu care a contribuit fiecare elev, totalul pe fiecare clasă și totalul general.
DATA cititori;
INFILE "/home/nume.prenume/micii_cititori.txt";
INPUT Nume $ Clasa $ DataParticipare MMDDYY10. Suport $ Cantitate;
Castig= Cantitate*3;
RUN;
PROC SORT DATA=cititori;
BY Clasa;
PROC PRINT DATA=cititori;
BY Clasa;
SUM Castig;
TITLE 'Fondurile stranse de fiecare clasa';
RUN;
2. Procedura UNIVARIATE – generarea de statistici descriptive
Procedura UNIVARIATE, parte a BASE SAS, este folosită în principal pentru
examinarea distribuției datelor pentru o singură variabilă, incluzând o evaluarea a normalității
datelor și identificarea valorilor extreme. Pe lângă calcularea unor indicatori statistici de bază
(care se vor regăsi și în procedra MEANS), UNIVARIATE poate include și reprezentări grafice
necesare pentru a analiza datele.
Sintaxa simplificată:
PROC UNIVARIATE <optiuni>;
VAR listă_variabile;
BY listă_variabile;
ID variabilă;
HISTOGRAM < listă_variabile>;
Fără declarația VAR, procedura va genera statistici pentru toate variabilele numerice ale
setului de date. Trei opțiuni uzuale care se pot specifica împreună cu declarația procedurii sunt:
DATA, NORMAL, FREQ și PLOT. Prin opțiunea NORMAL sunt realizate teste de
normalitate, FREQ generează tabele de frecvență ale variabilelor, iar PLOT produce trei tipuri de
grafice: diagrama ramură-frunză (stem-leaf), diagrama box plot și diagrama distribuției normale.
Se poate folosi declarația BY pentru a obține analize separate pe grupe de valori. Declarația ID
denumește variabila care identifică observațiile în locul numărului observației, iar HISTOGRAM
construiește un grafic de tip histogramă.

Exerciţiul 2: Se consideră datele referitoare la notele obținute de o grupă de studenți la un test


(fișierul “note.txt”). Din rezultatele afișate prin aplicarea procedurii UNIVARIATE se cere să se
determine media notelor studenților, dacă au existat valori în afara intervalului 0-100 și care este,
cu aproximație, punctajul în jurul căruia se concentrează majoritatea notelor studenților.
*Statistici descriptive cu UNIVARIATE;
DATA note;
INFILE "/home/nume.prenume/note.txt";
INPUT Punctaj @@;
RUN;
PROC UNIVARIATE DATA=note PLOT;
VAR Punctaj;
TITLE;
RUN;
Identificarea valorilor extreme
Implicit, procedura afișează cinci dintre valorile cele mai mici și mai mari ale variabilei
analizate și numărul observației care are aceste valori extreme. Se poate utiliza opțiunea
NEXTROBS= pentru a afișa un alt număr de valori extreme. Pentru a afișa cele mai mici și mai
mari valori distincte, se va utiliza opțiunea NEXTRVAL= , iar pentru a suprima afișarea tabelei
cu observațiile extreme, opțiunea NEXTROBS=0.

Exerciţiul 3: Fișierul “amenzi.txt” conține numărul de amenzi date pentru depășirea vitezei în
fiecare stat din SUA. Se cere:
a) să se analizeze aceste date și să se identifice valorile extreme ale numărului de amenzi cu
evidențierea codului statului în loc de numărul înregistrării;
b) să se reprezinte grafic o histogramă a numărului de amenzi;
c) să se identifice cele mai mici și cele mai mari cinci valori extreme distincte pentru variabila
numerică.

*Valori extreme si histograma cu UNIVARIATE;


LIBNAME sem4 "/home/nume.prenume";
*punctul a);
PROC UNIVARIATE DATA=sem4.amenzi_viteza;
VAR Amenzi;
ID Stat;
Title "Indicatori statistici pentru amenzile de viteza";
RUN;
*punctul b);
PROC UNIVARIATE DATA=sem4.amenzi_viteza noprint; *nu fiseaza tabelele de iesire;
VAR Amenzi;
HISTOGRAM Amenzi;
Title "Histograma pentru amenzile de viteza";
RUN;
*punctul c);
PROC UNIVARIATE DATA=sem4.amenzi_viteza NEXTRVAL=5 NEXTROBS=0;
VAR Amenzi;
ID Stat;
Title "Indicatori statistici cu valori limita distincte pentru amenzile de viteza";
RUN;

3. Procedura MEANS – crearea de rapoarte agregate


Procedura MEANS are rolul de a crea rapoarte agregate prin generarea de diferiți
indicatori statistici pentru variabilele de tip numeric. De asemenea, poate fi folosită pentru a crea
seturi de date agregate care pot fi ulterior analizate cu ajutorul altor secțiuni de date sau
proceduri.

Sintaxa:
PROC MEANS indicatori;
unde indicatori reprezintă tipuri de indicatori statistici. Exemple de indicatori care pot fi utilizați:
MAX – valoarea maximă
MIN – valoarea minimă
MEAN – media
N – numărul de valori nenule
NMISS – numărul de valori lipsă
SUM – suma
Se pot adăuga următoarele declarații opționale:
- BY lista_variabile – realizează analize separate pentru fiecare nivel al variabilelor din listă.
Datele trebuie să fie în prealabil sortate în aceeași ordine în care apar variabilele din
lista_variabile.
- CLASS lista_variabile – realizează tot analize separate pentru fiecare nivel al variabilelor,
însă rezultatele sunt prezentate mai compact față de declarația BY, iar datele nu trebuie
sortate.
- VAR lista_variabile – specifică variabile analizate.
Exerciţiul 4: Un distribuitor de bulbi de flori dorește să realizeze un raport agregat al vânzărilor
din fiecare lună. Setul de date SAS “flori” conține codul clientului, data vânzării și bulbii de
lalele, gladiole și zambile vânduți.
libname ad_data "/home/nume.prenume";
DATA vanzari;
SET ad_data.flori;
Luna = MONTH(DataVanzare);
PROC SORT DATA =vanzari;
BY Luna;
* Calculeaza media vanzarilor lunare de bulbi de flori;
PROC MEANS DATA = vanzari;
BY Luna;
VAR Lalele Gladiole Zambile;
TITLE 'Raportul vanzarilor lunare de bulbi de flori';
RUN;
Scrierea statisticilor agregate într-un set de date
Uneori este necesară salvarea statisticilor agregate într-un set de date pentru analize ulterioare
sau pentru combinarea cu alte date.
Sintaxa:
OUTPUT OUT = set-date lista-statistici-iesire;
unde:
- set-date este setul de date care va conține rezultatele;
- lista-statistici-iesire conține indicatorii statistici care se vor calcula și numele variabilelor
asociate cu aceștia.
Un format posibil pentru această listă de ieșire este:
statistica (lista_variabile) = lista_nume
- statistica = unul dintre indicatorii statistici disponibili cu procedura MEANS;
- lista_variabile = pentru ce variabile se vor calcula indicatorii;
- lista_nume = noile nume de variabile asociate indicatorilor statistici.
Prin folosirea opțiunii NOPRINT rezultatele nu se vor mai afișa pe ecran, ci vor fi direcționate
doar către setul de date de ieșire.

Exerciţiul 5: Se dorește agregarea datelor de la exercițiul 4, astfel încât să avem o singură


observație pentru fiecare client, care să conțină suma, media și numărul de bulbi cumpărați de
acesta.
*Scrierea statisticilor agregate intr-un set de date;
DATA vanzari1;
SET ad_data.flori;
PROC SORT DATA = vanzari1;
BY IDClient;
PROC MEANS NOPRINT DATA = vanzari1;
BY IDClient;
VAR Lalele Gladiole Zambile;
OUTPUT OUT = totaluri MEAN(Lalele Gladiole Zambile) =
MedieLalele MedieGladiole MedieZambile
SUM(Lalele Gladiole Zambile) = Lalele Gladiole Zambile;
PROC PRINT DATA = totaluri;
TITLE 'Raport privind bulbii de flori vanduti fiecarui client';
FORMAT MedieLalele MedieGladiole MedieZambile 3.;
RUN;

Intervale de încredere
Dacă nu se specifică nicio opțiune, procedura MEANS va calcula media, numărul de
valori nenule, abaterea standard, valoarea minimă și maximă a fiecărei variabile numerice. Prin
adăugarea oricărui indicator, procedura nu va mai calcula indicatorii impliciți, aceștia trebuind
adăugați.
Intervalul de încredere implicit pentru calculul mediei este acela al nivelului de
semnificație 0.05, adică 95%. Dacă se dorește specificarea unui alt interval de încredere, acest
lucru trebuie realizat folosind opțiunea ALPHA împreună cu indicatorul CLM (limitele
intervalului de încredere).

Exerciţiul 6: O tânără scriitoare aspirantă de cărți pentru copii dorește să realizeze un studiu în
vederea publicării unei cărți ilustrate de povești. Fiind interesată în special de numărul de pagini
pe care ar trebui să îl aibă o astfel de carte, tânăra vizitează o librărie și numără paginile unei
selecții aleatore de cărți similare. Folosind datele stocate în fișierul “carti.txt”, realizați un raport
care să îi fie folositor scriitoarei în luarea deciziei.
*Intervale de incredere pentru medie;
DATA PaginiCarte;
INFILE "/home/nume.prenume/carti.txt";
INPUT NrPagini @@;
RUN;
PROC MEANS DATA=PaginiCarte N MEAN MEDIAN CLM ALPHA=.10;
TITLE "Raport privind numarul de pagini al cartilor ilustrate";
RUN;
De lucru!!!! Interpretați rezultatele obținute!

4. Procedura FREQ – calcularea distribuției de frecvențe


Scopul principal al procedurii FREQ (parte a BASE SAS) este acela de a crea tabele care
arată distribuția valorilor datelor categorice, dar totodată poate identifica și nereguli în date.

Sintaxa:
PROC FREQ DATA = date_intrare <optiuni>;
TABLES combinatii_variabile <optiuni>;
Declarația TABLES este cea care definește variabilele pentru care se creează tabele de
frecvențe. Pentru tabelele de frecvențe unidimensionle, se specifică numele variabilei, iar pentru
tabele de frecvențe unidimensionale se scrie o expresie de tipul var1 * var2 *... * varn.
Următoarele reprezintă opțiuni care controlează modul de afișare:
LIST – afișează tabelele multidimensionale în format listă, nu tabelar;
MISSING – include valorile lipsă în statistici;
NOCOL – suprimă afișarea procentelor coloanelor în tabelele de frecvență;
NOROW – suprimă afișarea procentelor rândurilor în tabelele de frecvență;
NOCUM – suprimă afișarea frecvențelor și procentelor cumulate în tabelele unidmensionale;
NOPERCENT – suprimă afișarea tuturor procentelor în tabelele de frecvențe.
OUT = set_date – scrie un set de date care conține frecvențele.

Exerciţiul 7: Un proprietar al unei cafenele ține o evidență a vânzărilor sale și înregistrează


fiecare tip de cafea vândută (cappuccino, frappe, espresso și latte macchiatto), împreună cu
locația unde a avut loc vânzarea: în interiorul magazinului (-i-) sau la fereastra expres pentru
vânzare rapidă (-x-). Se cere să se realizeze un raport privind numărul de cafele vândute în cele
două puncte de vânzare per total și pe fiecare tip de cafea.
PROC FORMAT;
value $zona
'i' = 'interior'
'x' = 'exterior';
RUN;
DATA comenzi;
INPUT cafea $ zona $ @@;
DATALINES;
esp i cap x cap i fra i lat i fra x esp x fra i lat x esp x
cap i esp x cap x fra x . x fra i esp x cap i lat i fra i
fra i fra i lat x esp x fra i esp x esp i fra i cap i fra i
;
RUN;
Title "Tabele de frecventa pentru zona si zona/cafea";
PROC freq DATA=comenzi;
format zona $zona.;
TABLES zona zona*cafea;
RUN;

Exerciţiul 8: O companie aeriană dorește să facă o analiză a salariilor anuale exprimate în dolari
ale angajaților săi și să determine câte dintre salarii se găsesc în următoarele intervale de valori,
per total companie și pentru fiecare departament: a) mai mic decât 40.000 (mic); b) între 40.000
și 60.000 (mediu); c) între 60.000 și 100.000 (mare); d) peste 100.000 (executiv). Datele se
găsesc în setul de date SAS “angajati”.
*Determinarea frecventelor datelor grupate;
LIBNAME sem4 "/home/nume.prenume";
PROC FORMAT;
value nivel low-<40000='Mic'
40000-<60000='Mediu'
60000-100000='Mare'
other = 'Executiv';
RUN;
PROC FREQ DATA=sem4.angajati ;
TABLES Salariu /nocum ;
FORMAT Salariu nivel.;
TITLE "Raport privind nivelul salariului anual";
RUN;
PROC FREQ DATA=sem4.angajati;
TABLES Departament * Salariu/ nocol norow nopercent;
FORMAT Salariu nivel.;
TITLE "Raport privind nivelul salariului anual pe departament";
RUN;

5. Procedurile GCHART și GPLOT – realizarea de grafice


Pentru realizarea de grafice cu opțiuni mai avansate în SAS este necesar modulul
SAS/GRAPH. Și BASE SAS permite construirea de grafice (prin procedurile CHART și PLOT),
însă acestea au doar opțiuni de bază în ceea ce privește modul de prezentare. Afișarea graficelor
este controlată prin opțiuni grafice globale precum GOPTIONS, SYMBOL sau PATTERN, al
căror efect rămâne valabil între prelucrări și care sunt aditive (spre exemplu, dacă setăm două
elemente grafice și, ulterior, modificăm unul dintre ele, celălalt element rămâne valabil).

Sintaxa:
PROC GCHART DATA = set_date;
HBAR | HBAR3D | VBAR | VBAR3D lista_var_grafic / <optiuni>;
PIE | PIE3D | DONUT lista_var_grafic / <optiuni>;
STAR lista_var_grafic / <optiuni>;
Declarațiile care urmează după numele procedurii definesc tipul de grafic construit,
astfel:
HBAR – Grafic cu bare orizontale
HBAR3D – Grafic cu bare orizontale 3D
VBAR – Grafic cu bare verticale
VBAR3D – Grafic cu bare verticale 3D
PIE – Grafic de tip Pie
PIE3D – Grafic de tip Pie 3D
DONUT – Grafic de tip inel
STAR – Grafic de tip stea
Exerciţiul 9: Un distribuitor de biciclete a înregistrat vânzările sale (exprimate în mii de dolari)
pentru diferite tipuri de biciclete în patru țări. Folosind datele cuprinse în setul de date
“Biciclete”, se cere să se realizeze două grafice verticale care arată frecvențele pentru țară și
model.
LIBNAME ad_data "/home/nume.prenume";
TITLE 'Distributia vanzarilor in functie de tara si model';
GOPTIONS reset=all;
* grafic cu bare pentru variabile discrete;
PROC GCHART data=ad_data.biciclete;
VBAR Model Tara;
RUN;
QUIT;
De lucru!!!! Să se modifica programul anterior pentru a realiza un grafic de tip pie care arată
frecvențele pentru modelul de bicicletă.

Exerciţiul 10: Folosind setul de date “Biciclete”, să se creeze un grafic cu bare verticale pentru
VanzarileTotale. Se vor adăuga opțiuni prin care se specifică limitele valorilor numerice
reprezentate și punctele centrale pentru barele graficului. Folosiți pentru punctele centrale
limitele de la 0 la 12.000, cu interval de 2.000.
* grafic cu bare pentru variabile continue;
TITLE "Distributia vanzarilor totale";
PATTERN value=solid;
PROC GCHART data=ad_data.biciclete;
vbar VanzariTotale / midpoints= 0 to 12000 by 2000;
RUN;
QUIT;
Procedura GCHART permite crearea unor grafice în care înălțimea unei bare reprezintă
anumiți indicatori statistici precum media sau suma, pentru fiecare variabilă de clasificare. Se pot
folosi următoarele opțiuni:
SUMVAR – arată variabilele pentru care se calculează indicatorul statistic;
TYPE – tipul de indicator statistic.

Exerciţiul 11: Folosind setul de date “Biciclete”, să se creeze un grafic cu bare verticale pentru
VanzarileTotale pentru fiecare țară.
* grafic cu bare care reprezinta sume;
TITLE "Suma vanzarilor totale pe tara";
PATTERN value=L1;
*definirea unei axe cu valori ordonate;
AXIS1 order =("Franta" "Italia" "SUA" "Marea Britanie");
PROC GCHART data=ad_data.biciclete;
VBAR Tara / sumvar=VanzariTotale
type=sum
maxis=axis1;
RUN;
QUIT;
Există două modalități prin care se pot adăuga noi variabile pe una din axele unui grafic
și anume prin intermediul opțiunilor GROUP= și SUBGROUP=. Opțiunea GROUP grupează
datele în funcție de valorile variabilei de clasificare pe care o referă, în timp ce opțiunea
SUBGROUP folosește șabloane diferite în cadrul fiecărei coloane pentru a reprezenta valorile
variabilei adăugate.

Exerciţiul 12: Folosind datele cuprinse în setul de date “Biciclete”, să se creeze un grafic cu
bare verticale care arată frecvența distribuției pentru țară și, în cadrul fiecărei coloane, distribuția
pentru model.
*grafic cu a doua variabila ca subgrup;
TITLE "Distribuita vanzarilor in functie tara și de model";
PATTERN value = solid;
PROC GCHART data=ad_data.Biciclete;
VBAR Tara / subgroup=Model;
RUN;
QUIT;
Pentru a construi un grafic care arată legătura între două variabile (cunoscut sub
denumirea de diagramă de corelație – scatter plot) se poate folosi procedura GPLOT.

Sintaxa:
PROC GPLOT DATA = set_date;
PLOT variabila_Y * variabila_X / <optiuni>;
Declarația PLOT specifică cele două variabile care se reprezintă pe axele graficului. Prin
declarația SYMBOL se pot adăuga anumite simboluri care să reprezinte intersecția valorilor
variabilelor și se pot conecta punctele prin linii drepte sau curbe. Opțiunea INTERPOL=
(prescurtat I=) ajută la conectarea punctelor și poate lua valori precum join (unește cu linii
drepte) sau sm (unește prin linie continuă), în timp ce opțiunea WIDTH= controlează lățimea
liniei.

Exerciţiul 13: Setul de date SAS “Actiuni” conține prețul unei acțiuni cotate la bursă în fiecare
zi din luna ianuarie. Se cere să se reprezinte grafic evoluția în timp a prețului acțiunii folosind
diferite opțiuni ale procedurii GPLOT.
*grafice care arata corelatia intre variabile;
*diagrama de corelatie standard;
TITLE "Evolutia in timp a pretului actiunii- Grafic standard";
PROC GPLOT data=ad_data.actiuni;
PLOT DATA * Pret;
RUN;
QUIT;
*diagrama de corelatie cu puncte;
SYMBOL value=dot;
TITLE "Evolutia in timp a pretului actiunii- Grafic cu puncte";
PROC GPLOT data=ad_data.actiuni;
PLOT Data * Pret;
RUN;
QUIT;
*diagrama de corelatie cu linie continua;
SYMBOL value=dot i=sm;
TITLE "Evolutia in timp a pretului actiunii- Grafic cu linie continua";
PROC GPLOT data=ad_data.actiuni;
PLOT Data * Pret;
RUN;
QUIT;

6. Procedura CORR – analiza de corelație


Procedura CORR, inclusă în BASE SAS, are rolul de a calcula corelații între două
variabile, prin intermediul coeficienților de corelație.

Sintaxa:
PROC CORR DATA = set_date;
VAR lista_variabile;
WITH lista_variabile;
Fără declarațiile VAR și WITH, procedura calculează corelații între toate variabilele
numerice care se găsesc în setul de date SAS cel mai recent utilizat. Variabilele specificate în
declarația VAR vor apărea în partea de sus a tabelului de corelație, iar cele din declarația WITH
în stânga tabelului. Implicit, procedura CORR calculează coeficientul de corelație al lui Pearson.
Se pot adăuga opțiuni prin care se pot calcula alți coeficienți, precum SPEARMAN sau
KENDALL.

Exerciţiul 14: Studenții dintr-o grupă au susținut un test practic la o disciplină de programare și
au notat rezultatul obținut la test, precum și numărul de ore, din săptămâna anterioară testului, în
care au urmărit producții TV, împreună cu orele în care au exersat pentru test. Se cere să se
evalueze influența orelor petrecute la televizor și a celor în care au exersat asupra notei obținute.
*Analiza de corelatie;
DATA grupa_studenti;
INPUT Punctaj Televiziune Exercitii @@;
DATALINES;
56 6 2 78 7 4 84 5 5 73 4 0 90 3 4
44 9 0 76 5 1 87 3 3 92 2 7 75 8 3
85 1 6 67 4 2 90 5 5 84 6 5 74 5 2
64 4 1 73 0 5 78 5 2 69 6 1 56 7 1
87 8 4 73 8 3 100 0 6 54 8 0 81 5 4
78 5 2 69 4 1 64 7 1 73 7 3 65 6 2
;
RUN;
PROC CORR DATA = grupa_studenti;
VAR Televiziune Exercitii;
WITH Punctaj;
TITLE 'Corelatie intre punctajul la test';
TITLE2 'Si orele petrecute la televizor sau exarsand';
RUN;

7. Procedura REG – analiza de regresie


Procedura REG (parte a modulului SAS/STAT) este potrivită pentru a realiza modele de
regresie liniară.

Sintaxa:
PROC REG DATA = set_date;
MODEL dependenta = independenta;
PLOT dependenta * independenta;
În declarația MODEL, variabila dependentă este plasată în stânga semnului “=”, iar
variabila(le) independente în partea dreaptă. Declarația PLOT este una dintre multele opțiuni ale
procedurii prin intermediul acesteia realizându-se diferite diagrame de corelație.

Exerciţiul 15: Un comerciant dorește să prognozeze vânzările de băuturi răcoritoare în unul din
punctele sale de vânzare. Pentru aceasta a notat vânzările din primele douăzeci și cinci de zile ale
lunii iunie, precum și temperaturile înregistrate în aceste zile. Se cere să se determine dacă există
corelație semnificativă între vânzările de răcoritoare și temperatură și să se estimeze vâzările din
ziua de 26 iunie, dacă temparatura prognozată este de 32 grade. Datele să găsesc în fișierul
“racoritoate.txt”.
*Analiza de regresie;
DATA racoritoare;
INFILE "/home/nume.prenume/racoritoare.txt";
INPUT Data: MMDDYY. Vanzari Temperatura;
RUN;
PROC PRINT data=racoritoare;
FORMAT data DDMMYY.;
RUN;
PROC CORR data=racoritoare;
VAR Temperatura;
WITH Vanzari;
TITLE "Corelatia intre vanzarile de racoritoare";
RUN;
PROC REG data=racoritoare;
MODEL Vanzari=Temperatura;
PLOT Vanzari*Temperatura;
TITLE "Rezultatele analizei de regresie";
RUN;

8. Procedura ANOVA – analiza dispersională


ANOVA (parte a SAS/STAT) este una dintre procedurile disponibile în SAS pentru
efectuarea de analize dispersionale. Procedura este special proiectată pentru a lucra cu date
echilibrate, unde există același număr de observații pentru fiecare variabilă de clasificare.
Sintaxa:
PROC ANOVA DATA = set_date;
CLASS listă_variabile;
MODEL dependenta = explicative;
MEANS explicative /optiuni;
Declarația CLASS trebuie scrisă înainte de MODEL și definește variabila(le) de
clasificare. Declarația MODEL definește variabila dependentă și variabilele explicative.
MEANS calculează media variabilei dependente pentru oricare din variabilele explicative
speficate în MODEL. Se pot efectua mai multe tipuri de teste de comparație pentru medii,
precum SCHEFFE sau testul t al lui Bonferroni (BON).

Exerciţiul 16: Pornind de la datele de la exercițiul 15, comerciantul intenționează să afle dacă
vânzările de băuturi răcoritoare din acea locație (L1) diferă semnificativ față de vânzările
înregistrate în aceeași perioadă în alte două locații pe care acesta le deține (L2 și L3). Se va
folosi fișierul “locatii.txt” ce conține două coloane care memorează vânzările și locația.
*Analiza dispersionala;
DATA locatii;
INFILE "/home/nume.prenume/locatii.txt";
INPUT Vanzari Locatie$;
RUN;
PROC ANOVA DATA=locatii;
CLASS Locatie;
MODEL Vanzari = Locatie;
MEANS Locatie / SCHEFFE;
TITLE "Vanzarile de racoritoare in cele trei locatii";
RUN;

Probleme propuse

1. Un număr de 25 de studenți din diferite centre universitare au participat la strângerea de


fonduri pentru un eveniment caritabil. În fișierul text “caritabil.txt” au fost salvate, în ordine,
date referitoare la centrul universitar din care provine studentul (BUC – Bucuresti, IAS –
Iasi, TIM – Timisoara, CLU - Cluj), profilul facultății urmate (ECON – economic, TEHN –
tehnic. UMAN - Umanist), genul studentului (M sau F), precum și anul de studiu (1-3).
Se cere să se creeze tabele de frecvențe bidimenseeionale pentru perechile: Centru-Profil,
Centru-Gen, An-Profil și An-Gen. Se va folosi procedura FREQ cu o declarație de tipul
TABLES (A B) * (C D). Se asemenea, se cere să se afișeze forma detaliată a valorilor pentru
denumirile centrelor universitare și ale profilurilor.

2. Folosind datele din setul de date SAS “Angajati”, să se creeze un grafic cu bare verticale care
să arate salariul mediu anual pe fiecare departament.

3. Într-un campionat de bachet între școli evoluează cinci echipe de fete. Se cere să se
determine dacă există diferențe semnificative în ceea ce privește înalțimea jucătoarelor celor
cinci echipe, dorindu-se, ca la acest nivel, să existe echitate între echipele înscrise în
campionat. Se vor folosi datele din setul de date SAS “echipe”.
Seminar 3 Programare SAS

A. Combinarea seturilor de date

1. Concatenarea seturilor de date folosind declaraţia SET


Declaraţia SET cu un singur set de date în cadrul unei secţiuni de date permite citirea şi
modificarea unui set de date existent. Cu două sau mai multe seturi de date, pe lângă citire şi
modificare, declaraţia SET ajută la concatenarea datelor, adică la alipirea unui set de date la altul.
Aceasta este folositoare atunci când se doreşte combinarea unor seturi de date care au toate sau
majoritatea variabilelor identice, observaţiile fiind diferite. Se va crea un set de date nou, cu un
număr de observaţii egal cu suma observaţiilor din seturile de date de intrare. Ordinea
observaţiilor este determinată de ordinea în care seturile de date apar în declaraţia SET. Dacă
unul din seturile de date conţine o variabilă care nu se găseşte în alt set de date, atunci
observaţiile acestuia din urmă pentru variabila nouă vor conţine valori lipsă.

Sintaxa:
DATA set_date_nou;
SET set_date_1 set_date_2 ...;

Exerciţiul 1: Un parc de distracţii are două intrări (sud şi nord) prin intermediul cărora
colectează date despre clienţi. Aceste date se referă la numărul tichetului de trecere, dimensiunea
grupului din care face parte clientul, vârsta, iar pentru intrarea de nord se colectează şi date
referitoare la lotul în care clientul a parcat maşina. Se cere să se combine cele două seturi de date
şi să se creeze o variabilă nouă care calculează preţul tichetului de intrare pentru fiecare client în
funcţie de vârstă. Rezultatele rulării codului de mai jos sunt prezentate în figura 1.

*Crearea setului de date pentru intrarea din sud;


DATA intrare_sud;
INFILE '/home/nume.prenume/Sud.dat';
INPUT Intrare $ NrTichet DimGrup Varsta;
PROC PRINT DATA = intrare_sud;
TITLE 'Date Intrare Sud';
RUN;
*Crearea setului de date pentru intrarea din nord;
DATA intrare_nord;
INFILE '/home/nume.prenume/Nord.dat';
INPUT Intrare $ NrTichet DimGrup Varsta Lot;
PROC PRINT DATA = intrare_nord;
TITLE 'Date Intrare Nord';
RUN;
* Crearea setului de date concatenat si a unei variabile noi;
DATA concatenare;
SET intrare_sud intrare_nord;
IF Varsta = . THEN Plata = .;
ELSE IF Varsta < 3 THEN Plata = 0;
ELSE IF Varsta < 65 THEN Plata = 60;
ELSE Plata = 25;
PROC PRINT DATA = concatenare;
TITLE 'Ambele intrari';
RUN;

Figura 1. Listarea datelor concatenate

Redenumirea variabilelor
Există situaţii în care coloane din două seturi de date conţin aceeaşi informaţie, numai că
numele coloanelor diferă, în aceest caz neputându-se realiza combinarea seturilor de date în mod
corect. Pentru a schimba numele uneia sau mai multor variabile, se poate folosi opţiunea
RENAME = în secţiunea de date.

Sintaxa:
Set_date (RENAME =(nume_vechi_1=nume_nou_1
nume_vechi_2=nume_nou_2
....
nume_vechi_n=nume_nou_n))

Opţiunea RENAME = trebuie specificată imediat după setul de date asociat acesteia. De
remarcat setul de paranteze externe care încadrează întreaga opţiune şi setul de paranteze interne
în cadrul căruia se specifică una sau mai multe variabile care vor fi redenumite.

Exerciţiul 2. O companie are două filiale în Braşov şi Cluj. Se cere să se realizeze un set de date
combinat cu date referitoare la angajaţii din cele două filiale. În codul de mai jos sunt
exemplificate concatenarea fără redenumirea variabilelor, cu redenumirea unei variabile sau a
mai multor variabile.

*Crearea setului de date pentru Brasov;


data angajatiBV;
input Angajat $ Gen $ Judet$;
datalines;
Damian M Brasov
Popa F Brasov
Ionita M Brasov
;
run;
*Crearea setului de date pentru Cluj;
data angajatiCJ;
input Angajat $ Gen $ Zona$;
datalines;
Irimia M Cluj
Velicu F Cluj
;
run;

data angajati;
set angajatiBV angajatiCJ;
run;
PROC PRINT DATA = angajati;
TITLE 'Setul de date combinat fara redenumirea variabilelor';
RUN;

data angajati;
set angajatiBV angajatiCJ (RENAME=(Zona=Judet));
run;
PROC PRINT DATA = angajati;
TITLE 'Setul de date combinat cu redenumirea unei variabile';
RUN;

data angajati;
set angajatiBV (RENAME =(Angajat=Nume Gen=Sex))
angajatiCJ (RENAME=(Angajat=Nume Gen = Sex Zona=Judet));
run;
PROC PRINT DATA = angajati;
TITLE 'Setul de date combinat cu redenumirea mai multor variabile';
RUN;

2. Interclasarea seturilor de date folosind declaraţia SET


Dacă seturile de date sunt deja sortate (prin intermediul procedurii SORT) după o
variabilă relevantă, atunci doar simpla concatenare a acestora poate produce un set de date
nesortat. Totuşi, combinarea seturilor de date sortate, numită interclasare, se poate realiza similar
concatenării prin adăugarea clauzei BY.

Sintaxa:
DATA set_date_nou;
SET set_date_1 set_date_2 ...;
BY listă_variabile;

Se aplică aceleași principii ale combinării datelor ca şi la concatenare, cu specificarea


faptului că înainte de interclasare observaţiile trebuie sortate anterior după variabila(le) prin
clauza BY.
Exerciţiul 3: Se consideră aceleaşi date referitoare la un parc de distracţii ca şi la Exerciţiul 1.
Se cere să se combine cele două seturi de date, crescător, în funcţie de numărul tichetului de
intrare. Rezultatele rulării codului de mai jos sunt prezentate în figura 2.
DATA intrare_sud;
INFILE '/home/nume.prenume/Sud.dat';
INPUT Intrare $ NrTichet DimGrup Varsta;
PROC SORT DATA = intrare_sud;
BY NrTichet;
RUN;
DATA intrare_nord;
INFILE '/home/nume.prenume/Nord.dat';
INPUT Intrare $ NrTichet DimGrup Varsta Lot;
PROC SORT DATA = intrare_nord;
BY NrTichet;
RUN;
* Interclasarea seturilor de date;
DATA interclasare;
SET intrare_sud intrare_nord;
BY NrTichet;
RUN;
PROC PRINT DATA = interclasare;
TITLE 'Ambele intrari in functie de numarul tichetului';
RUN;

Figura 2. Listarea datelor interclasate

3. Fuziune pe baza unei corespondenţe unu-la-unu


În situaţiile în care se doreşte realizarea unei corespondenţe între observaţiile unor seturi
de date, în vederea combinării acestora, se poate folosi declaraţia MERGE în secţiunea de date.
Dacă se cunoaşte faptul că seturile de date sunt în exact aceeaşi ordine din punctul de vedere al
entităţilor pe care le descriu, atunci nu este necesară existenţa unei variabile comune. Însă, de
obicei, pentru a avea siguranţa existenţei unei corespondenţe, se urmăreşte prezenţa uneia sau
mai multor variabile care să definească în mod unic fiecare observaţie. De asemenea, seturile de
date de intrare trebuie să fie sortate în prealabil după variabila(le) comune.

Sintaxa:
DATA set_date_nou;
MERGE set_date_1 set_date_2;
BY listă_variabile;

Atenţie! Dacă vor fuziona două seturi de date care au variabile cu acelaşi nume (altele decât cele
din clauza BY), atunci variabilele din cel de-al doilea set de date vor suprascrie orice variabilă
care are acelaşi nume în primul set de date.

Exerciţiul 4: Un producător de ciocolată păstrează o evidenţă a vânzărilor sale zilnice pentru


fiecare tip de ciocolată vândut. Fişierul referitor la vânzări stochează codul produsului şi numărul
de unităţi vândute într-o zi, iar un alt fişier conţine informații despre fiecare produs, în termeni de
cod, denumire şi descriere. În scopul realizării unui raport privind vânzările zilnice, se cere să se
realizeze o fuziune între cele doua fişiere (fişierul cu descrierea produselor este sortat după cod).
*Fuziunea bazata pe corespondenta unu-la-unu;
DATA descriere;
INFILE '/home/nume.prenume/Ciocolata.dat' TRUNCOVER;
INPUT Cod $ 1-4 Nume $ 6-14 Descriere $ 15-60;
RUN;
PROC SORT DATA = descriere;
BY Cod;
RUN;
DATA vanzari;
INFILE '/home/nume.prenume/Ciocolata_Vanzari.dat';;
INPUT Cod $ 1-4 UnitatiVandute 6-7;
PROC SORT DATA = vanzari;
BY Cod;
RUN;
*Fuziune dupa cod;
DATA ciocolate;
MERGE vanzari descriere;
BY Cod;
PROC PRINT DATA = ciocolate;
TITLE "Vanzarile de ciocolata de astazi &sysdate";
RUN;
Rezultatele rulării acestui cod sunt prezentate în figura 3.

Figura 3. Listarea raportului cu vânzările de ciocolată


Atenţie! Observaţi că în setul de date final există o valoare lipsă pentru cea de-a şaptea
observaţie. De aici putem deduce că în setul de date final sunt incluse toate înregistrările din
datele de intrare, indiferent dacă acestea au sau nu corespondent.

4. Fuziune pe baza unei corespondenţe unu-la-mulţi


Uneori este nevoie să se combine două seturi de date prin realizarea unei corespondenţe
între o înregistrare a unui set de date şi mai multe înregistrări ale altuia. Sintaxa pentru acest tip
de fuziune este identică cu cea întâlnită la corespondenţa unu-la-unu. Ordinea în care apar
seturile de date în declaraţia MERGE nu este relevantă. Ca şi în cazul anterior, seturile de date
trebuie sortate după una sau mai multe variabile comune.

Atenţie! Dacă nu se defineşte nicio variabilă în clauza BY, SAS realizează o simplă joncţiune a
observaţiilor din seturile de date în funcţie de poziţia acestora în fiecare set, cu alte cuvinte are
loc o fuziune unu-la-unu fără corespondenţă.

Exerciţiul 5: Un distribuitor de încălţăminte sportivă oferă reduceri pentru toate produsele sale
faţă de preţul iniţial. Compania are la dispoziţie două fişiere: unul care conţine detalii despre
încălţăminte (Denumire, Sport, Pret) în setul de date SAS “Incaltaminte” şi altul cu coeficienţii
de reducere pentru luna martie (Sport, Reducere) în setul de de date SAS „Inc_reducere”. Se cere
să se creeze un set de date combinat din cele două care să conţină şi preţul final de vânzare
rotunjit la două zecimale.
*Fuziunea bazata pe corespondenta unu-la-multi;
libname ad_data "/home/nume.prenume";
PROC SORT DATA = ad_data.Incaltaminte;
BY Sport;
RUN;
PROC SORT DATA = ad_data.Inc_reducere;
BY Sport;
RUN;
DATA Inc_preturi;
MERGE ad_data.Incaltaminte ad_data.Inc_reducere;
BY Sport;
Pret_Nou = ROUND(Pret - (Pret * Reducere), .01);
PROC PRINT DATA = Inc_preturi;
TITLE 'Lista preturilor pentru luna martie';
RUN;

5. Fuziunea între un raport statistic agregat şi datele iniţiale


Există situaţii în care este necesară combinarea rezultatelor unor analize statistice
agregate cu datele iniţiale, spre exemplu atunci când se doreşte compararea fiecărei observaţii cu
media grupului sau când vrem să calculăm un procent folosind un total de grup. În acest sens, se
poate utiliza procedura MEANS pentru a agrega datele, urmată de o fuziune a rezultatelor
acesteia cu datele iniţiale folosind o corespondenţă unu-la-mulţi.

Exerciţiul 6: Distribuitorul de încălţăminte sportivă de la exerciţiul 5 dispune de o situaţie a


vânzărilor din ultima săptămână pentru fiecare tip de încălţăminte (setul de date SAS
„inc_Vanzari” având coloanele Denumire, Sport,Vanzari). Departamentul de marketing solicită
realizarea unei analize a vânzărilor din această perioadă, evidențiind, procentual, cu cât a
contribuit fiecare model vândut în totalul vânzărilor din categoria sa sportivă.

*Fuziunea intre un raport statistic agregat si datele initiale;


libname ad_data "/home/nume.prenume";
proc SORT data=ad_data.inc_vanzari;
BY Sport;
RUN;
PROC MEANS NOPRINT DATA = ad_data.Inc_vanzari;
VAR Vanzari;
BY Sport;
OUTPUT OUT = date_agregate SUM(Vanzari) = Total;
PROC PRINT DATA = date_agregate;
TITLE 'Setul de date agregat';
RUN;
* Fuziunea totalului cu datele initiale;
DATA Inc_agregare;
MERGE ad_data.inc_Vanzari date_agregate;
BY Sport;
Procent = Vanzari / Total * 100;
PROC PRINT DATA = Inc_agregare;
BY Sport;
ID Sport;
VAR Sport Vanzari Total Procent;
TITLE "Contributia in totalul vanzarilor pe categorii";
RUN;

6. Folosirea opţiunii IN= pentru urmărirea şi selectarea observaţiilor


Opţiunea IN= asociată unui set de date poate fi folosită pentru a urmări care din seturile de date
de intrare a contribuit cu valori la fiecare observaţie din setul de date nou creat. Se utilizează cu
precădere pentru a selecta observaţiile care au sau nu corespondent în cadrul unui fuziuni.
Opţiunea IN= se specifică după numele fiecărui set de date şi este urmată de un nume de
variabilă temporară ales de utilizator (aceasta nu va fi inclusă în setul de date rezultat).
Variabilele temporare definite prin IN= iau valoarea 1 (adevărat) dacă setul de date la care se
referă contribuie la observaţia curentă din setul de date nou şi 0 (fals) în caz contrar. Deoarece
acestea nu fac parte dintr-un set de date, se va folosi declaraţia PUT pentru a le lista.

Exerciţiul 7: O firmă are un număr de colaboratori care lucrează pe diferite categorii de posturi
şi care sunt remuneraţi în funcţie de orele lucrate. În săptămâna 21-27 ianuarie, numai o parte
dintre aceştia au lucrat. Codul de mai jos evidenţiază folosirea opţiunii IN= în cazul fuziunii
seturilor de date cu informaţii despre colaboratori (Cod, Nume) şi a orelor lucrate (Cod,
Categorie, Ore).
***** Utilizarea optiunii IN= ;
data colaboratori;
INPUT Cod Nume$;
datalines;
1 Irimia
2 Popa
4 Radu
5 Ionita
7 Stoicea
;
data ore_lucrate;
INPUT Cod Categorie$ Ore;
datalines;
1 A 37
4 B 44
5 A 32
9 B 54
;
data nou;
merge colaboratori (IN=inColaboratori)
ore_lucrate (IN=inOre);
by Cod;
file print;
/* directionează iesirea care este produsă de PUT
în acelasi fisier ca iesirea care este produsă de DATA */
put Cod= inColaboratori= inOre= Nume= Categorie= Ore=;
RUN;

Exerciţiul 8: Pornind de la seturile de date de la exerciţiul anterior, să se afişeze lista


colaboratorilor care au lucrat în săptămâna 21-27 ianuarie, indicând şi onorariul lor, ştiind că cei
care lucrează pe poziţii din categoria A sunt platiţi cu 70 RON/oră, iar cei din categoria B cu 50
RON/oră.
data onorarii;
merge colaboratori (IN=inColaboratori)
ore_lucrate (IN=inOre);
by Cod;
if inColaboratori and inOre;
if Categorie eq "A" then Onorariu = 70*Ore;
else if Categorie eq "B" then Onorariu = 50*Ore;
RUN;
title 'Onorarii datorate colaboratorilor in perioada 21-27 Ianuarie';
Proc PRINT data=onorarii;
RUN;

B. Proceduri specifice SQL


Se pot utiliza instrucţiuni SQL în programele SAS pentru a crea, citi şi modifica seturi de
date. Există două modalităţi de bază prin care se poate utiliza SQL împreună cu SAS:
- încorporarea de instrucţiuni SQL complete în procedura SQL;
- încorporarea declaraţiei WHERE pentru a selecta rânduri în secţiunile de date şi
proceduri SAS.
Ambele variante sunt disponibile cu Base SAS şi nu necesită software adiţional.
Sintaxa:
PROC SQL;
comandă _sql;
QUIT;
De reţinut că comandă_sql poate fi orice comandă de tipul ALTER, CREATE, DELETE,
DESCRIBE, DROP, INSERT, SELECT sau UPDATE având la sfârşit seminul “;”. Pot fi
definite oricâte comenzi SQL într-o procedură SQL. Este o bună practică să se plaseze QUIT la
finalul declaraţiei, nefiind însă obligatoriu.

Exerciţiul 9: O companie care comercializează aparate de aer condiţionat are filiale în diferite
judeţe ale ţării. Sunt disponibile date referitoare la numărul de aparate vândute în anul anterior
(cantitate) şi la agenţii comerciali pe care îi are fiecare filială. Codul SAS de mai jos exemplifică
folosirea diferitelor tipuri de joncţiuni folosind procedura SQL.
* Jonctiuni cu proceduri specifice SQL;
Data Filiale;
Input ID_fil Filiala$ Cantitate;
cards;
10 Cluj 150
20 Iasi 170
30 Timis 350
40 Dolj 140
50 Sibiu 180
;
run;
Data Personal;
Input ID_ang Nume$ ID_fil;
cards;
1 Popescu 30
2 Matei 10
3 Avram 10
4 Costache 10
5 Ionescu 40
6 Enache 40
7 Anton 40
8 Codreanu
9 Iftene 50
;
run;
*INNER JOIN;
PROC SQL;
Create table inner_join as
Select * from Filiale as f, Personal as p
where f.ID_fil = p.ID_fil;
QUIT;
*Cod alternativ;
PROC SQL;
Create table inner_join1 as
Select * from Filiale as f inner join Personal as p
On f.ID_fil = p.ID_fil;
QUIT;
*LEFT JOIN;
PROC SQL;
Create table left_join as
Select * from Filiale as f left join Personal as p
On f.ID_fil = p.ID_fil;
QUIT;
*RIGHT JOIN;
PROC SQL;
Create table right_join as
Select * from Filiale as f right join Personal as p
On f.ID_fil = p.ID_fil;
QUIT;
*FULL JOIN;
PROC SQL;
Create table full_join as
Select * from Filiale as f full join Personal as p
On f.ID_fil = p.ID_fil;
QUIT;
*Utilizarea functiei SQL COALESCE care returneaza primul argument nenul;
proc SQL;
select id_ang, f.id_fil, coalesce (p.ID_ang, f.ID_fil,5) as ID from Filiale as f full join personal
as p on f.id_fil = p.id_fil;
QUIT;

Exerciţiul 10: Un producător de echipamente sportive doreşte să trimită un reprezentant de la


vânzări pentru a contacta toţi clienţii care nu au plasat comenzi în primul trimestru al anului. Se
cere: a) să se creeze, cu ajutorul procedurilor SQL, două tabele SAS conţinând datele clienţilor şi
respectiv valoarea comenzilor plasate de aceştia în primul trimestru; b) un raport care listează
clienţii care trebuie contactaţi.

*Proceduri specifice SQL;


LIBNAME ad_data '/home/nume.prenume';
PROC SQL;
CREATE TABLE ad_data.client
(CodClient num,
Nume char(17),
Adresa char(20));
INSERT INTO ad_data.client
VALUES (101, 'Murphy''s Sports ', '115 Main St. ')
VALUES (102, 'Sun N Ski ', '2106 Newberry Ave. ')
VALUES (103, 'Sports Outfitters', '19 Cary Way ')
VALUES (104, 'Cramer & Johnson ', '4106 Arlington Blvd.')
VALUES (105, 'Sports Savers ', '2708 Broadway ');
TITLE 'Datele despre clientii sport';
SELECT *
FROM ad_data.client;
CREATE TABLE ad_data.comenzi
(CodClient num,
Valoare num );
INSERT INTO ad_data.comenzi
VALUES ( 102, 562)
VALUES ( 104, 254)
VALUES ( 102, 1242)
VALUES ( 101, 3497)
VALUES ( 102, 385);
TITLE 'Datele despre comenzile clientilor sport';
SELECT *
FROM ad_data.comenzi;
PROC SQL;
CREATE TABLE clienti_fara_comenzi as
SELECT * from ad_data.Client as x left join ad_data.comenzi as y
On x.CodClient = y.CodClient
WHERE y.CodClient is null;
TITLE 'Clienti sport fara comenzi in primul trimestru';
SELECT *
FROM clienti_fara_comenzi;
QUIT;

C. Lucrul cu masive în SAS

Masivele sunt utile în SAS atunci când se doreşte repetarea aceleiaşi secvenţe de paşi
pentru mai multe variabile. Un masiv reprezintă un grup ordonat de elemente similare. În SAS,
acesta reprezintă un grup de variabile, toate de tip numeric sau de tip caracter. Pot fi variabile
existente în setul de date cu care se lucrează sau variabile noi.

Sintaxa simplificată pentru un masiv unidimensional:


ARRAY nume(n) $ lista_variabile;
unde:
- nume = numele masivului;
- n = numărul de elemente;
- $ = se foloseşte în cazul în care sunt referite variabile de tip caracter, de obicei când
acestea nu au fost definite;
- parantezele rotunde pot fi înlocuite cu paranteze pătrate sau acolade.
Această sintaxă poartă denumirea de masiv explicit, în care numărul de variabile este
specificat la definire. Pentru a referi o variabilă din masiv se va folosi sintaxa nume(index),
indexul unui masiv începând de la 1. În practică, există o multitudine de situaţii unde masivele își
pot demonstra utilitatea, două dintre acestea fiind exemplificate în continuare.

1. Executarea de calcule repetitive


În această situaţie, masivele ajută la creşterea eficienţei în programare, mai ales atunci când se
lucrează cu un număr mare de variabile.

Exerciţiul 11: Se doreşte realizarea unui sondaj prin intermediul căruia să se măsoare gradul de
satisfacţie al cursurilor din domeniul economic oferite de o platformă de e-learning.
Respondenţii pot acorda calificative de la 1 la 5, iar în situaţia în care nu au urmat un curs sau nu
doresc să acorde un calificativ, se va introduce valoarea 0. Au fost culese şi date referitoare la
oraşul de reşedinţă al repondenţilor şi vârsta acestora. Se cere să se înlocuiască valoarea 0 cu
valoarea lipsă pentru toate variabilele care conţin calificative.
*Calcule repetitive cu masive;
DATA cursuri;
INFILE '/home/nume.prenume/Cursuri.txt';
Length Oras $9;
INPUT Oras$ Varsta ECON MRKT FINA CONT STAT MATE INFO;
ARRAY curs (7) ECON MRKT FINA CONT STAT MATE INFO;
DO i = 1 TO 7;
IF curs(i) = 0 THEN curs(i) = .;
END;
RUN;
PROC PRINT DATA = cursuri;
TITLE 'Sondaj cursuri economice';
RUN;

Atenţie!!! Observaţi că membrii masivului de la curs(1) la curs(7) nu vor face parte din setul de
date, dar variabila “i” este inclusă în acesta. Folosiţi o opţiune potrivită pentru a o îndepărta din
setul de date.

Folosirea abrevierilor pentru numele de liste de variabile


O listă abreviată de nume de variabile poate fi plasată în orice expresie unde apare şi o listă de
variabile specificate în detaliu. Ca şi parametri ai funcţiilor, listele abreviate vor fi precedate de
cuvântul cheie OF, spre exemplu, SUM (OF val1-val12). Există trei tipuri de liste abreviate, și
anume:
 Liste cu valori numerice, în care variabilele încep cu aceleaşi caractere şi se termină cu
numere consecutive ( INPUT Tip1- Tip8; ).
 Listele cu domeniu denumit depind de ordinea internă, sau de poziţia, variabilelor în setul
de date. Spre exemplu, lista abreviată s -- p referă variabilele care au fost definite prin
declaraţia INPUT s t o p; .
 Listele cu nume speciale, _ALL_ , _CHARACTER_ , _NUMERIC_ , pot fi plasate orinde
dorim să specificăm fie toate variabilele, fie numai pe cele numerice sau de tip caracter
(SUM(OF _NUMERIC_)).
Exerciţiul 12: Se cere ca pornind de la datele de la Exerciţiul 11, să se înlocuiască toate valorile
0 cu valoarea lipsă, fără a afecta datele originale, prin crearea unor noi variabile denumite Curs1-
Curs7. Totodată, se cere să se determine media punctajelor acordate de fiecare repondent.
*****Aplicatii cu liste abreviate si masive;
DATA cursuri;
INFILE '/home/nume.prenume/Cursuri.txt';
Length Oras $9;
INPUT Oras$ Varsta ECON MRKT FINA CONT STAT MATE INFO;
ARRAY nou (7) Curs1 - Curs7;
ARRAY vechi (7) ECON -- INFO;
DO i = 1 TO 7;
IF vechi(i) = 0 THEN nou(i) = .;
ELSE nou(i) =vechi(i);
END;
MedieCalif = MEAN (OF Curs1 - Curs7);
RUN;
PROC PRINT DATA = cursuri;
TITLE 'Sondaj cursuri economice cu media calificativelor';
RUN;

Exerciţiul 13: Au fost memorate răspunsurile date de studenţi la un test. Se cere să se


înlocuiască toate răspunsurile care nu corespund caracterelor a, b, c, d (litere mari sau mici) cu
valoarea lipsă şi să se transforme toate valorile variabilelor de tip caracter în litere mari.
*Aplicatii cu nume speciale de liste SAS;
libname ad_data "/home/nume.prenume";
DATA raspunsuri;
SET ad_data.RASPUNSURI;
ARRAY var_caracter {*} _character_;
DO i = 1 TO dim (var_caracter);
IF var_caracter(i) NOT IN ('a' 'b' 'c' 'd' 'A' 'B' 'C' 'D') then
call missing(var_caracter(i));
ELSE var_caracter(i)= upcase (var_caracter(i));
END;
DROP i;
RUN;
PROC PRINT DATA = raspunsuri;
TITLE 'Raspunsurile studentilor la test';
RUN;

Atenţie!!! A fost definit un masiv fără a specifica numărul de elemente (prin semnul *) şi care
conţine doar variabilele de tip caracter. La parcurgerea masivului se foloseşte funcţia dim ()
pentru a determina numărul de elemente ale acestuia. Call missing reprezintă o rutină prin care
se asignează o valoare lipsă oricărei variabile din lista de argumente.

2. Transformarea structurii seturilor de date


Transformarea structurii seturilor de date presupune schimbarea perspectivei asupra
datelor, spre exemplu atunci când dorim să creăm observații multiple din observații singulare sau
viceversa. Aceste restructurări sunt utile la numărarea frecvențelor, la procesarea folosind
variabile de grupare sau ca necesitate a anumitor reprezentări grafice sau analize statistice.
Transformarea cu ajutorul masivelor este o alternativă mai flexibilă față de folosirea
procedurii SAS TRANSPOSE. Exemplele următoare ilustrează crearea unui set de date cu mai
multe observații per subiect (set de date lung) dintr-un set de date cu o singură observație per
subiect (set de date lat).

Exerciţiul 13: O companie dorește să întocmească un raport privind nivelurile de competență


relevante ale fiecărui angajat în cunoașterea limbilor engleză (E), franceză (F), spaniolă (S) și
germană (G), nivelurile de competență variind de la A la C. Se cere să se determine câți angajați
cunosc cele patru limbri străine la fiecare nivel.
*Transformarea seturilor de date cu masive;
DATA competente;
INPUT ID CO1 $ CO2 $ CO3$;
datalines;
01 EA GA SB
02 FA EB EB
03 SA GB EC
04 EA FA GB
05 SB EB GB
;
RUN;
*varianta fara folosirea masivelor;
DATA competente_nou;
SET competente;
CO=CO1;
IF not missing(CO) THEN OUTPUT;
CO=CO2;
IF not missing(CO) THEN OUTPUT;
CO=CO3;
IF not missing(CO) THEN OUTPUT;
KEEP ID CO;
RUN;
*varianta cu folosirea masivelor;
DATA competente_nou;
SET competente;
ARRAY COARRAY[3] CO1-CO3;
DO i=1 to 3;
CO=COARRAY[i];
IF not missing (CO) THEN OUTPUT;
END;
KEEP ID CO;
RUN;
*Determinarea numerului de cunoscatori de limbi straine per nivel;
Title "Numarul de angajati pentru fiecare nivel de competenta in limbile straine";
PROC FREQ DATA=competente_nou;
TABLES CO /NOCUM;
RUN;

Exerciţiul 14: De-a lungul anului 2018 trei echipe de voluntari au participat la plantarea de
puieți într-o pepinieră, în patru etape. Se cunoaște numărul de puieți platați de fiecare echipă în
fiecare etapă. Se cere să se determine numărul mediu de puieți plantați în 2018 de către fiecare
echipă și să realizeze un raport al plantărilor de puieți în anul 2018, per echipă și per total .
DATA echipe;
INFILE '/home/nume.prenume/Echipe.txt';
INPUT CODE $ A1 A2 A3 A4;
Medie = MEAN (of A1 - A4);
RUN;

DATA echipe_timp;
SET echipe;
ARRAY A [4];
DO timp = 1 TO 4;
Puieti = A[timp];
OUTPUT;
END;
KEEP CODE timp puieti;
RUN;

Title "Plantarile de puieti in anul 2018 per echipa si per total";


PROC PRINT DATA = echipe_timp noobs
sumlabel='Total #byval(CODE) ' grandtotal_label='Total General';
BY CODE;
SUM puieti;
VAR timp puieti;
RUN;

Probleme propuse
1. În fişierul text sondaj.txt, valorile lipsă pentru variabilele numerice au fost înlocuite cu
valoarea 999 (o practică des întâlnită în pachetele statistice cum ar fi SPSS). Se cere să se
înlocuiască valoarea 999 cu “ .“, în două variante, folosind stucturi SAS alternative şi
respectiv masive. Fişierul sondaj.txt conţine observaţii referitoare la înălţimea, greutatea şi
vârsta, toate numerice. Datele sunt separate prin spaţiu.
2. Se dorește crearea a două seturi de date cu următorul conținut (fie prin import, fie prin
specificarea datelor în cadrul programului SAS):
3C
1A
7E
și
2B
5E
4D
6F
8 H.
Se cere să se creeze un fișier compus care conține datele în ordine alfabetică.
3. Un grup de studenți și-a propus să întocmească un plan pentru cărțile citite în decursul unui
an, stabilind ținte pentru cărțile din domeniile beletristică și științe. În seturile de date „tinta”
și „citit”, create cu prin codul sursă de mai jos, au fost memorate datele privind planurile
studenților, respectiv ceea ce au reușit să citească în acel an.
data tinta;
INPUT ID Nume $ tinta_Bel tinta_Sti;
datalines;
1 Andrei 10 3
2 Mircea 25 2
3 Iulia 20 4
4 Daniela 30 2
5 Mihai 15 5
;
data citit; Figura 4. Raportul cărților citite de studenți
INPUT ID citit_Bel citit_Sti;
datalines;
194
2 18 2
4 22 0
5 12 4
6 16 3
;
Se cere să se realizeze un raport similar celui din figura 4.
Seminar 2 Programare SAS
Procesare iterativă şi condiţională. Combinarea seturilor de date.
Crearea de subseturi. Funcţii SAS.

1. Operatori în SAS

Operatori de comparaţie
SAS permite utilizarea operatorilor de comparaţie cunoscuţi, într-o formă specifică. În
tabelul de mai jos putem observa sintaxa SAS pentru fiecare operator.

Operator Simbol Cod SAS (mnemonica)


Egal cu = EQ
Diferit de ^= or ~= or ¬= NE
Mai mic < LT
Mai mic sau egal <= LE
Mai mare > GT
Mai mare sau egal >= GE
Intr-o lista IN

Operatorul IN (lista-valori)
Putem folosi acest operator ca alternativă la scrierea a multiple condiţii legate prin OR.
In cadrul listei definite cu IN putem folosi atât valori numerice cât şi caractere, ele fiind separate prin
virgulă sau spaţiu.
Exemplu. : Nota IN ( ‘A’ ‘B-’ ‘B+’ ‘C’)
Nota IN ( ‘A’ ,‘B-’,‘B+’,‘C’)
Nota IN ( 10 9 8 7)
Nota IN ( 10,9,8,7)
Valoare IN (10,15,20:30)

Operatorii logici AND, OR, NOT


Aceştia sunt utilizaţi în diferite combinaţii pentru a forma expresii complexe. În expresii, în lipsa
parantezelor, operaţiile sunt executate in ordinea precedenţei lor, astfel:
1. NOT
2. AND
3. OR
De exemplu:
if X and Y or Z;
este echivalentă cu
if (X and Y) or Z;

Pentru ca operatorul OR să aibă precedenţă înaintea lui AND trebuie utilizate paranteze, astfel:
if X and (Y or Z);

if X and not y or z;
este echivalentă cu
if (X and (not y)) or z;

2. Instrucţiunea WHERE
Dacă se citesc date dintr-un set de date SAS, se poate utiliza instrucţiunea WHERE
pentru crearea unui subset de date. De asemenea, se poate utiliza această instrucţiune în cadrul
unei proceduri SAS, pentru a crea subseturi ale datelor procesate. Crearea de subseturi poate fi
realizată şi cu instrucţiunea IF, dar WHERE oferă o serie de avantaje cum ar fi un număr mai
mare de operatori ce pot fi folosiţi, precum şi posibilitatea ca utilizarea acestei instrucţiuni să fie
mai eficientă atunci când se lucrează cu un set de date de intrare indexat. De asemenea,
instrucţiunea IF nu este permisă în cadrul unei proceduri SAS.

Operatori ce pot fi utilizaţi împreună cu instrucţiunea WHERE


Operator Descriere Exemplu
IS MISSING Verifică dacă este o valoare lipsă where varsta is missing
IS NULL Echivalent cu IS MISSING where varsta is null
BETWEEN AND Interval închis where varsta between 20 and 40
CONTAINS Găseşte un subşir where nume contains lex
LIKE Compară cu un şablon Where nume like A_e%

Exerciţiul 1. Am colectat o serie de date cu privire la studenţi pe baza următoarelor variabile:


 vârsta,
 sex (M sau F)
 proiect (nota la proiect)
 activitate (nota pentru activitatea de seminar)
 examen (nota la examenul final)
Pentru fişierul de date:
21 M 8 9 8 15 M 8 . 9
.F999 67 F 9 8 9
35 M 8 8 8 .M676
48 F . . 7 35 F 7 7 8
59 F 9 7 9 49 M 5 5 8
Să se creeze un set de date temporar numit Studenti
data Studenti;
length Sex $ 1;
input Varsta Sex Proiect Activitate Examen;
datalines;
21 M 8 9 8
.F 999
35 M 8 8 8
48 F . . 7
59 F 9 7 9
15 M 8 . 9
67 F 9 8 9
.M676
35 F 7 7 8
49 M 5 5 8
;
title "Date studenti";
proc print data=Studenti noobs;
run;
Exerciţiul 2. Să se afişeze din setul de date creat la exerciţiul anterior, toate persoanele de sex
feminin care au la proiect nota 9 sau 10, sau au luat nota 10 la examen:

title "Exemplu de operatori logici";


Instrucțiunea WHERE face
proc print data=work.studenti;
selecția subsetului de date căutat.
where Sex eq 'F' and
(Proiect in (9 10) or
examen eq 10); Se specifică variabilele ce vor fi afișate în
raportul rezultat.
var Sex Activitate Proiect Examen;
run;

2. Instrucţiunea IF
Sintaxa
 If conditie THEN actiune;

 IF conditie THEN actiune1


ELSE actiune2;

Atunci când expresia logică este evaluată ca fiind adevărată, se execută instrucţiunile ce
urmează cuvântului cheie THEN. Dacă expresia nu este adevărată, programul continuă să
proceseze următoarele instrucţiuni, sau ramura ELSE dacă aceasta există.
Atenţie! Valorile numerice lipsă sunt tratate logic ca cel mai negativ număr ce poate fi
referit, astfel încât atunci când o astfel de valoare este testată într-o expresie IF, programul va
evalua rezultatul testării ca fiind TRUE.
Atunci când se doreşte verificarea mai multor condiţii printr-o succesiune de clauze IF
este recomandată utilizarea variantei IF...ELSE...IF. Acest lucru duce la o evaluare mai eficientă
a programului, deoarece SAS nu mai testează condiţiile ELSE rămase atunci când identifică o
ramură IF a cărei condiţie este evaluată ca adevărată.

Exerciţiul 3: Folosind datele prezentate la exerciţiul 1, să se creeze o nouă variabilă care să


reprezinte grupe de vârstă.

data Studenti; Această funcție returnează TRUE dacă argumentul


length Sex $ 1; lipsește, respectiv FALSE dacă acesta nu lipsește
input Varsta Sex Proiect Activitate Examen;
if Varsta lt 20 and not missing(Varsta) then GrupVarsta = 1;
else if Varsta ge 20 and Varsta lt 40 then GrupVarsta = 2;
else if Varsta ge 40 and Varsta lt 60 then GrupVarsta = 3;
else if Varsta ge 60 then GrupVarsta = 4;
datalines;
21 M 8 9 8
.F 999
35 M 8 8 8
48 F . . 7
59 F 9 7 9
15 M 8 . 9
67 F 9 8 9
.M676
35 F 7 7 8
49 M 5 5 8
;
title "Date studenti";
proc print data=Studenti noobs;
run;

Rezultatul rulării acestui exemplu este un raport ce conține, pe lângă datele introduse,
grupa de vârstă a fiecărui student, aşa cum se observă în Figura 1.

Figura 1. Raportul datelor studenţilor

Selectarea observaţiilor
Dacă se doreşte extragerea unui subset de date dintr-un fişier de date sau dintr-un set de
date SAS existent, se poate utiliza o formă specială a instrucţiunii IF care permite preluarea
exclusiv a acelor rânduri din setul iniţial care îndeplinesc o condiţie specificată.
Sintaxa:
IF conditie; /*Atentie! Lipseşte Then*/
unde ‘conditie’ este o expresie SAS.
Dacă condiţia este adevărată, pasul ‘Data’ continuă să proceseze observaţia. Dacă
condiţia este falsă nu se mai procesează nimic, controlul revenind la începutul pasului ‘Data’
pentru procesarea următorului rând.

Exerciţiul 4. Folosind setul de date anterior, să se afişeze exclusiv datele studenţilor de sex
feminin.

data Femei;
length Sex $ 1;
input Varsta Sex Proiect Activitate Examen; Dacă valoarea variabilei Sex este ‘F’, atunci se ajunge la
if Sex eq 'F';
finalul pasului Data și are loc un output automat, dacă
datalines;
valoarea este diferită de ‘F’, se revine la inceputul pasului
21 M 8 9 8
Data.
.F 999
35 M 8 8 8
48 F . . 7
59 F 9 7 9
15 M 8 . 9
67 F 9 8 9
.M676
35 F 7 7 8
49 M 5 5 8
;
title "Date studente";
proc print data=Femei;
run;

Rezultatul rulării acestui program este prezentat în figura 2.

Figura 2. Raport studenţi de sex feminin

Evitarea trunchierii valorilor la crearea de variabile noi


La crearea de noi variabile pornind de la expresii condiţionale, SAS stabileşte lăţimea noii
variabile în funcţie valoarea primei observaţii din tabelul rezultat. Mai ales pentru variabilele de
tip caracter, este posibil să aibă loc trunchieri în cazul în care valorile înregistrărilor următoare
trebuie stocate pe o lăţime mai mare decât a primei înregistrări. O soluţie pentru evitarea
trunchierilor este stabilirea în avans a lăţimii noii variabile create, asftel încât aceasta să fie
acoperitoare pentru toate valorile care se intenţionează a se memora.

Exercitiul 5. Se cunosc datele referitoare la proiectele anuale desfăşurate în cadrul unei


companii. Pentru proiectele a căror buget este mai mic sau egal cu 10.000, se va realiza o
raportare lunară a rezultatelor, iar pentru cele a căror bugetul depaşeşte această sumă, raportarea
va fi bilunară. Se va adăuga o nouă variabilă pentru a evidenția frecvenţa raportării. De
asemenea, se va evidenția printr-o variabilă nouă faptul că prima categorie de proiecte va avea ca
termen de prezentare a rezultatelor în cadrul consiliului de administare data de 17 decembrie
2018, iar cea de-a doua categorie data de 20 decembrie 2018.
data proiecte;
length Departament $ 9;
input CodProiect Departament $ Valoare;
datalines;
312 Productie 8720
313 Achizitii 12570
314 Productie 39750
315 Desfacere 7380
316 Desfacere 18390
;
run;
*/fara stabilirea latimii frecventei de raportare;

data proiecte1;
set proiecte;
if Valoare le 10000 then
do;
Raportare="Lunara";
Prezentare='17dec2018'd;
end;
else
do;
Raportare="Bilunara";
Prezentare='20dec2018'd;
end;
run;

*/cu stabilirea latimii frecventei de raportare;

data proiecte2;
set proiecte;
length Raportare $8;
if Valoare le 10000 then
do;
Raportare="Lunara";
Prezentare='17dec2018'd; *constanta de tip data;
end;
else
do;
Raportare="Bilunara";
Prezentare='20dec2018'd;
end;
run;

title "Proiecte companie - fara impunerea latimii coloanei Raportare";


proc print data=proiecte1 noobs;
format Prezentare ddmmyy10.;
format Valoare COMMA8.;
run;

title "Proiecte companie - cu impunerea latimii coloanei Raportare";


proc print data=proiecte2 noobs;
format Prezentare ddmmyy10.;
format Valoare COMMA8.;
run;
Instrucțiunea SET se poate utiliza cu opțiunea KEEP sau DROP pentru a păstra sau a
elimina anumite coloane din setul de date.
!Observaţi rezultatele obţinute şi rulaţi procedura de afişare a rezultatelor şi pentru setul
de date proiecte2. Rezultatul rulării celor două programe este disponibil în figura 3.
Figura 3. Raport privind proiectele companiei în două variante

A alege între WHERE sau IF pentru selectarea înregistrărilor


Ambele intrucţiuni WHERE şi IF se pot folosi pentru a selecta înregistrările care vor fi incluse în
noul set de date. Fiecare dintre acestea are însă anumite limite în utilizare, şi anume:
- în secţiunile de proceduri se foloseşte numai instrucţiunea WHERE, nu şi IF;
- dacă WHERE se foloseşte în cadrul secţiunii de date, atunci expresiile sale condiţionale
trebuie să refere numai variabile din setul de date de intrare;
- WHERE nu poate folosi în expresii condiţionale bazate pe variabile create în secţiunea de
date prin declaraţii de atribuire.

Exerciţiul 6. Să se creeze pornind de la setul de date de la exerciţiul 1, un nou set de date care
conţine toate persoanele de sex masculin care au nota finală peste 7, ştiind că nota finală se
calculează ca medie ponderată între cele trei note obţinute, cu ponderile de 20%, 30% şi
respectiv 50%.

data Studenti1;
set Studenti;
where Sex eq 'M';
NotaFinala=SUM(Proiect*0.3+Activitate*0.2+Examen*0.5);
if NotaFinala>7;
run;
Title "Lista studentilor de sex masculin cu nota finala peste 7";
proc print data=Studenti1 noobs;
run;

Rezultatul rulării acestui program este prezentată în figura 4.

Figura 4. Raport studenţi de sex masculin cu nota finala peste 7


3. Instrucţiunea SELECT
Această instrucţiune poate fi utilizată ca o alternativă la o serie de instrucţiuni IF ELSE
IF.
Sintaxa
SELECT (expresie_de_selectie);
WHEN (expresie_WHEN1) instructiune 1;
WHEN (expresie_WHEN2) instructiune 2;
…..
OTHERWISE instrucţiune_implicită;
END;
Expresia de selecţie este comparată cu fiecare expresie din WHEN. Dacă rezultatul
comparării este TRUE, atunci se execută instrucţiunea corespunzătoare şi controlul programului
trece la finalul instrucțiunii SELECT. Dacă comparaţia nu este adevărată, se evaluează
următoarea ramură WHEN. Dacă nici una dintre comparaţiile cu expresiile WHEN nu rezultă ca
fiind adevărate, atunci se execută OTHERWISE. Atentie! Aceasta poate fi şi null.

Exemplu:
Expresie_de_selectie
SELECT (GrupVarsta);
WHEN (1) Limit = 110; Expresie_WHEN
WHEN (2) Limit = 120;
Instrucţiune
WHEN (3) Limit = 130;
OTHERWISE ; NULL pe ramura
OTHERWISE
END;

Observatie! Dacă nu se include ramura OTHERWISE, iar toate comparaţiile anterioare sunt
false, execuţia programului se încheie.
Dacă nu este precizată o expresie de selecţie, fiecare ramură WHEN este evaluată pentru
a vedea dacă expresie_WHEN este adevărată sau falsă.

Exercitiul 7. Rezolvaţi cerinţa de la exerciţiul 1 folosind o expresie SELECT.

data Studenti2;
length Sex $ 1;
input Varsta Sex Proiect Activitate Examen;
SELECT;
WHEN (missing(Varsta)) GrupVarsta= . ;
WHEN (Varsta lt 20) GrupVarsta=1;
WHEN (Varsta lt 40) GrupVarsta=2;
WHEN (Varsta lt 60) GrupVarsta=3;
OTHERWISE GrupVarsta=4;
END;
datalines;
21 M 8 9 8
.F 999
35 M 8 8 8
48 F . . 7
59 F 9 7 9
15 M 8 . 9
67 F 9 8 9
.M676
35 F 7 7 8
49 M 5 5 8
;
title "Date studenti introduse cu SELECT";
proc print data=Studenti2;
run;

Rezultatul rulării este ilustrat în figura 5.

Figura 5. Raport studenţi realizat cu SELECT

4. Structuri repetitive
Structurile repetitive permit execuţia unui set de instrucţiuni în mod repetat, cât timp este
îndeplinită o anumită condiţie sau până se atinge un număr prestabilit de iteraţii. În SAS putem
realiza acest lucru folosind grupurile DO, bucla DO sau instrucţiunile DO WHILE şi DO
UNTIL.

Grupul DO
Sintaxa

Do
Instrucţiune 1;
Instrucţiune 2;
...
Instrucţiune n;
End;

Instrucţiunile cuprinse în cadrul unei structuri Do poartă numele de “grup Do”. Acest
mod de lucru este mai eficient decât utilizarea mai multor instrucţiuni IF.

Exercitiul 8. Folosind datele cunoscute, să se adauge două variable noi, GrupVarsta şi Medie
calculate după cum urmează: dacă vârsta este mai mică de 39 de ani, valoarea pt GrupVarsta va
fi ‘grup1’ iar Media se va calcula ca media ponderată între proiect (40%) şi Examen (60%). Dacă
vârsta este mai mare sau egală cu 39 GrupVarstă=’grup2’, iar media se calculează ca medie
aritmetică.

data Medii;
length Sex $ 1 Datele au fost încarcate pe server într-
GrupVarsta $ 13; un fisier text numit ‘dateSAS’
infile '/home/nume.prenume/datesas.txt' missover;
input Varsta Sex Proiect Activitate Examen;
if missing(Varsta) then delete;
if Varsta le 39 then
do;
GrupVarsta = 'Grup1';
Medie = .4*Proiect + .6*Examen;
end;
else if Varsta gt 39 then
do; Grup DO
GrupVarsta = 'Grup2';
medie = (Proiect + Examen)/2;
end;
run;
title "Raportul Mediilor Studentilor";
proc print data=medii noobs;
run;

În cazul în care se întâlneşte o valoare NULL pentru variabila Vârstă, funcţia MISSING
returnează valoarea TRUE. Instrucţiunea DELETE împiedică adăugarea valorii curente la setul
de date şi forţează întoarcerea la începutul pasului DATA. Rezultatul rulării programului poate fi
observat în Figura 6.

Figura 6. Raportul mediilor studentilor

SUM Operaţia de adunare


Sintaxa
Variabilă + increment;

Observaţi că nu există semnul = în această instrucţiune. Se realizează următoarele:


- Se reţine variabila;
- Variabila este iniţializată cu 0;
- Valorile lipsă (NULL) sunt ignorate.

Exerciţiul 9. Dacă se doreşte calculul încasărilor dintr-o săptămână, la sfârşitul fiecărei zile a
săptămânii, putem folosi SUM.
data Venit;
input
Zi : $8.
venit : dollar6.;
Total + Venit;
format Venit Total dollar8.;
datalines;
Luni $1,000
Marti $1,500
Miercuri .
Joi $2,000
Vineri $3,000
title "Incasari saptamanale";
proc print data=venit noobs;
run;
După citirea celor două variabile cunoscute, cu formatul specificat se calculează valoarea
variabilei Total, ca sumă între Totalul existent şi Venitul curent. Dacă valoarea curentă a
variabilei venit este NULL, ea va fi ignorată. Rezultatul rulării programului se poate observa în
figura 7.

Figura 7. Incasări săptămânale

Bucla DO (buclă cu un număr cunoscut de iteraţii)


Sintaxa

DO contor=valoare_start to valoare_stop;
Set_instrucţiuni;
END;

O varianta alternativă a sintaxei permite precizarea valorii de incrementare a contorului


astfel.

DO contor= valoare_start to valoare stop by valoare incrementare;


Set_instrucţiuni;
END;
Atunci când valoarea de incrementare este omisă, valoarea implicită este 1.
De asemenea, contorul poate să realizeze o actualizare descrescătoare, valoarea de
incrementare fiind un număr negativ. În această situaţie pentru fiecare iteraţie DO contorul este
decrementat cu valoarea specificată Atunci când contorul atinge o valoare mai mică decât
valoarea de stop bucla se întrerupe.

Exerciţiul 10. Calculaţi suma de care veţi dispune la finalul a trei ani, plecând de la o investiţie
iniţială de 100$, cu o dobândă anuală de 3.75%.

data Dobanda_Investitie;
Dobanda = .0375;
Total = 100;
do An = 1 to 3;
Total + Dobanda*Total;
output;
end;
format Total dollar10.2;
run;
title "Evoluţie investiţie";
proc print data=Dobanda_Investitie noobs;
run;

Comanda output introdusă în cadrul buclei DO este o instrucţiune pentru SAS de a scrie
o valoare în setul de date de ieşire. Un output are loc de obicei la sfârşitul unui pas de tip DATA,
dar în acest caz dorim ca el să aibă loc de fiecare dată când este calculat un nou total. Atunci
când includem o comanda output în cadrul unui pas DATA (oriunde ar fi inclusă), SAS nu mai
execută o scriere automată la finalul pasului DATA. Rezultatul rulării codului de mai sus se
observă în figura 8.

Figura 8. Evoluţie investiţie

DO WHILE, DO UNTIL
În loc de a alege o valoare de oprire pentru o buclă iterativă DO, putem să întrerupem
iteraţiile atunci când o condiţie este îndeplinită. DO...WHILE este o structură cu verificare
anterioară, pe când DO...UNTIL realizează o verificare posterioară.
Sintaxa

DO WHILE condiţie DO UNTIL (condiţie)


Set_instrucţiuni; Set_instrucţiuni;
END; END;
Observaţie! Atunci când se lucrează cu structura DO UNTIL este foarte important ca
condiţia verificată să devină adevărată la un moment dat, pentru a se evita intrarea într-o buclă
infinită. O posibilitatea de a evita această situaţie este să combinăm o buclă DO obişnuită cu
UNTIL.

Exerciţiul 11. Folosind cele două variante DO, aflaţi câţi ani sunt necesari pentru dublarea
investiţiei, dacă suma iniţială este de 100$ şi dobânda este de 3,75%. Rezultatul rulării
programului se poate observa în figura 9.

DO WHILE
data Dublare_venit;
Dobanda = 0.0375;
Total = 100;
do until (Total ge 200);
An + 1;
Total = Total + Dobanda*Total;
output;
end;
format Total dollar10.2;
run;
title "Dublare venit";
proc print data=Dublare_venit noobs;
run;

DO UNTIL
data Dublare_venit;
Dobanda = .0375;
Total = 100;
do while (Total le 200);
An + 1;
Total = Total + Dobanda*Total;
output;
end;
format Total dollar10.2;
run;
proc print data=Dublare_venit noobs;
title "Dublare venit";
run;

Figura 9. Dublare venit


5. Funcţii SAS
Funcţiile SAS pot fi folosite pentru a calcula expresii ce stau la baza definirii sau
modificării variabilelor SAS. Funcţiile pot lua unul sau mai multe argumente, iar numărul
argumentelor este fix sau variabil. Argumentele pot fi constante, variabile sau expresii. Acestea
trebuie incluse în paranteze şi separate prin virgulă.

Exerciţiul 12. Se consideră datele referitoare la angajaţii unei companii aeriene. Acestea se
regăsesc în setul de date SAS Angajaţi. Se cere să se folosescă funcţii SAS pentru a determina
veniturile totale anuale încasate de către fiecare angajat, precum şi luna în care angajaţii primesc
prima, cunoscând că:
- toţi angajaţii primesc o primă de 500 de dolari în luna în care au fost angajaţi în
companie;
- în funcţie vechimea angajatului, se mai oferă un extra bonus cuprins între 5% si 15% din
salariul anual.
Pentru rezolvarea problemei se vor utiliza trei funcţii SAS: SUM(argument1,
argument2,…. ), MONTH(data_SAS) şi YRDIF(data_inceput, data_sfarsit, <baza>). O listă
completă a funcțiilor predefinite poate fi găsită aici:
http://support.sas.com/documentation/cdl/en/allprodslang/63337/HTML/default/viewer.htm#synt
axByType-function.htm
Funcţia SUM() returnează suma argumentelor sale şi ignoră valorile lipsă, fiind
preferabilă din acest motiv operatorului de adunare care, atunci când primeşte un argument
NULL, returnează valoarea NULL.
Funcţia MONTH() extrage luna dintr-o dată calendaristică pe care o are ca argument.
Funcţia YRDIF() returnează diferența în ani dintre două date calendaristice în funcție de
convențiile de numărare a zilelor sau poate returna vârsta/vechimea unei persoane. Pentru mai
multe detalii despre această funcție se găsesc aici:
http://support.sas.com/documentation/cdl/en/lefunctionsref/63354/HTML/default/viewer.htm#p1
pmmr2dtec32an1vbsqmm3abil5.htm

libname ad_data "/home/nume.prenume";


data work.venituri;
set ad_data.angajati;
prima=500;
vechime=YRDIF(DataAngajare, TODAY(), 'ACTUAL');
if vechime lt 5 then spor=0.05;
else if vechime ge 5 and vechime lt 10 then spor= 0.1;
else if vechime>=10 then spor =0.15;
Venit_total=sum(salariu*(1+spor),prima);
format Venit_total DOLLAR10.;
Luna_prima=month(DataAngajare);
run;

title "Venituri totale angajati";


Proc print data=work.venituri noobs;
var CodAngajat Nume Prenume Departament Venit_total Luna_prima;
run;
Rezultatul rulării programului se poate observa în figura 10.

Figura 10. Venituri totale angajati (rezultate parţiale)

6. Probleme propuse
1. Utilizând fişierul Excel ‘Vanzari’, creaţi cu SELECT un nou set de date SAS ce va
conţine Regiune şi VanzariTotale (utilizând optiunea keep), împreună cu o nouă variabilă
numită Ponderi, cu următoarele valori:
a. 1,5 pentru regiunea Nord;
b. 1,7 pentru regiunea Sud;
c. 2 pentru regiunile Est şi Vest.

2. Folosind datele din fişierul Excel ‘Vânzări’, afişaţi toate observaţiile pentru Regiunea
Nord şi Cantitatea mai mică de 60. Includeţi în listă orice observaţie unde numele
clientului este Pet's are Us.

3. Aveţi o investiţie iniţială de 1000$, cu o rată a dobânzii trimestriale de 4,25%. În câţi ani
veţi obţine 30000$? Utilizați DO WHILE sau DO UNTIL pentru rezolvare.

4. Din setul de date Angajati să se afişeze toate persoanele care sunt însoţitori de bord
(Codul poziţiei este de tipul “FLTAT1”, “FLTAT2”… “FLTATn). Se vor afişa codul
angajatului, numele, prenumele şi departamentul.
Seminar 1 Programare SAS
Crearea seturilor de date SAS și folosirea formatelor

Pe parcursul următoarelor seminarii se va lucra cu SAS Studio, care este complet


accesibil prin intermediul navigatoarelor Web si nu necesită nicio instalare. Se vor folosi conturi
de studenți create conform instrucțiunilor de aici:
http://support.sas.com/software/products/ondemand-academics/#s1=2
Pentru exemplificare se va considera un cont de forma nume.prenume.
Pentru conectarea la SAS Studio, click pe :
https://odamid.oda.sas.com/SASLogon/login?service=https%3A%2F%2Fodamid.oda.sas.com%
2FSASStudio%2Fj_spring_cas_security_check

1. Citirea datelor din fişiere flat


Datele din fişierele flat pot fi regăsite sub formă de fişiere externe sau plasate ca linii de
date direct în programele SAS. Atunci când încearcă să citească date din fişiere flat externe, SAS
caută fişiere care au valorile datelor separate prin delimitatori sau coloane fixe. Datele trebuie
salvate în fişiere de tip txt sau csv dacă delimitatorul este virgulă. Alte tipuri de delimitatori sunt
spaţiile libere, tab-urile, semnul punct şi virgulă etc.
Accesarea surselor de date într-un program SAS semnifică trecerea unui fişier de date flat
printr-un proces de conversie în interiorul unei secţiuni de date, având ca rezultat un set de date
SAS. Rezultatele pot fi salvate ca fişiere externe sau exportate ca alte tipuri comune de fişiere
precum html, xls, txt, mdb etc. Procesul de citire a fişierelor de date flat este prezentat în figura
1.

Proces de
Fişiere de date flat conversie -> Set de date SAS
Secţiunea de date

Figura 1. Accesare surselor de date externe

Cea mai uşoară modalitate de a citi fişiere externe este folosirea metodei input pentru
valorile care sunt separate prin unul sau mai multe spaţii. Aceasta reprezintă metoda cea mai
frecvent folosită pentru citirea datelor delimitate prin separatori în SAS. Considerând că avem un
fişier numit produse.txt care conţine numele, preţul şi categoria a cinci produse, fiecare având
valoarea separată printr-un spaţiu, acesta ar avea următoarea formă:
hartie 2 birotica
creione 10 birotica
apa 6 alimente
ceai 8 alimente
tricou 100 haine
Presupunând că fişierul este stocat pe server în rădăcina utilizatorului, programul SAS
care citeşte date din acest fişier este:
data produse;
infile '/home/nume.prenume/produse.txt';
input Nume $ Pret Categorie $;

1
run;

Figura 2. Interfaţa SAS Studio – importul fisierului txt

Setul de date SAS care va fi creat poartă numele de produse, iar fişierul de date de intrare
este specificat folosind comanda infile. Declaraţia input asociază datele cu nume de variabilă.
Dacă o variabiă este de tip caracter, numele acesteia se va încheia cu semnul $.
Atunci când lucrăm cu valori care sunt separate prin virgulă, se pot folosi fişiere txt sau
csv. În oricare dintre situaţii, comanda infile trebuie să aibă opţiunea dsd care schimbă
delimitatorul din spaţiu, în virgulă. De asemenea, dacă există două virgule una după alta, va
considera că este o valoare lipsă, fără a fi nevoie ca între virgule să existe un spaţiu. O altă
proprietate a acestei opţiuni este aceea că, pentru variabilele caracter, valorile pot fi specificate
între ghilimele în fişierul sursă.

Pentru fişierul de date:


hartie,2,birotica
creione,10,birotica
apa,6,alimente
ceai,8,alimente
tricou,100,haine
Se vor folosi următoarele declaraţii pentru a obţine setul de date din fişierul produse2.txt:
data produse;
infile '/home/nume.prenume/produse2.txt' dsd;
input Nume $ Pret Categorie $;
run;

Pentru orice alt tip de delimitatori, declaraţia infile trebuie folosită împreună cu opţiunea
dlm sau delimiter. Au aceeaşi semnificaţie, prima fiind abrevierea celeilalte.
Exemplu: infile '/home/nume.prenume/produse3.txt' delimiter='/'; sau
infile '/home/nume.prenume/produse4.txt' dlm='/';.

data produse;
infile '/home/nume.prenume/produse3.txt' dlm='/';
input Nume $ Pret Categorie $;
run;

Dacă valorile datelor nu sunt stocate într-un fişier extern, ele pot fi plasate în cadrul
programului, folosind declaraţia datalines.

2
data produse;
input Nume $ Pret Categorie $;
datalines;
hartie 2 birotica
creione 10 birotica
apa 6 alimente
ceai 8 alimente
tricou 100 haine;

Cel de-al doilea tip de fişiere externe pe care SAS poate să le citească sunt cele care
conţin date în coloane cu lăţime fixă. Pentru acestea există două modalităţi de citire: coloane de
intrare (column input) şi intrări formatate (formatted input). Avantajul folosirii datelor în coloane
cu lăţime fixă este acela că datele pot fi citite în orice ordine este necesară, iar valorile lipsă pot fi
specificate prin tot atâtea spaţii libere cât are şi lăţimea coloanei.

Considerăm fişierul produse4.txt, care conţine următoarele valori:


hartie 2 birotica
creioane10 birotica
apa 6 alimente
ceai 8 alimente
tricou 100haine
Aşa cum se poate observa, numele are 8 caractere, preţul 3, iar categoria 8.
Metoda 1: Coloane de intrare foloseşte declaraţia input specificând pentru fiecare variabilă
numele său, semnul $ pentru variabilele caracter, precum şi poziţia de început şi de sfârşit a
fiecărei variabile în linia de date.
data produse;
infile '/home/nume.prenume/produse4.txt';
input Nume $ 1-8
Pret 9-11
Categorie $ 12-19;
run;
Metoda 2: Intrări formatate poate citi diferite tipuri de formate, cum ar fi monedă (numere având
semnul dolar sau euro), numerele cu zecimale, date în diferite formate. Declaraţia input are
umătoarele opţiuni: semnul @ urmat de poziţia de început a variabilei în linia de date, numele
variabilei, formatul variabilei, dacă acesta este necesar, precum şi lăţimea coloanei asociată
variabilei.
Considerăm datele anterioare la care adăugam semnul dolar în fața prețurilor. Datele pot
fi citite direct din program sau din fișierul produse5.
data produse;
/*infile '/home/nume.prenume/produse5.txt'; */
input @1 Nume $8.
@9 Pret dollar4.
@13 Categorie $8.;
format Pret dollar6.0;
datalines;

3
hartie $2 birotica
creioane$10 birotica
apa $6 alimente
ceai $8 alimente
tricou $100haine
run;

2. Crearea seturilor de date permanente


Este important să se poată crea seturi de date permanente, deoarece astfel ele pot fi
accesate oricând de pe calculatorul personal sau de pe server fără a rula cod SAS. Sunt
economisite astfel resurse de calcul și timp, în special atunci când se lucrează cu seturi mari de
date care sunt folosite de mai multe ori în proiecte SAS.
Atunci când se folosește declarația data un set de date temporar este creat. El va fi șters
când sesiunea curentă este închisă. Implicit este stocat temporar într-o bibliotecă referită (libref)
numită Work. Pentru ca setul de date să fie stocat permanent trebuie ca biblioteca în care se
salvează să fie specificată explicit.
Biblioteca în care se vor stoca datele este specificată în declarația libname. În exemplul
următor este creată biblioteca produse, iar setul de date rezultat este date_test.
libname produse '/home/nume.prenume';
data produse.date_test;
input Nume $ 1-8
Pret 9-11
Categorie $ 12-20;
datalines;
hartie 2 birotica
creioane10 birotica
apa 6 alimente
ceai 8 alimente
tricou 100haine
run;

După rularea acestui script, fișierul persistent date_test.sas7bdat va fi creat pe server (așa
cum se vede în figura 4), iar biblioteca Produse va fi creată împreună cu tabela de date SAS
date_test (figura 3). Acestea din urmă sunt temporare.

4
Figura 3. Exemplu de bibliotecă SAS

Figura 4. Exemplu de fișier persistent creat în SAS Studio

Pentru vizualizarea informațiilor referitoare la un set de date SAS, se pot folosi


procedurile CONTENTS și PRINT. Proc contents afișează descrierea datelor, în timp ce proc
print afișează datele. Următorul exemplu folosește procedura contents.
title "Descrierea datelor de test";
proc contents data=produse.date_test;
run;
Rezultatul rulării acestui script este un raport ce conține numărul de variabile și de
observații, numele, tipul și dimensiunile variabilelor și alte informații referitoare la setul de date
din fișier. Raportul este prezentat în figura 5.

5
Figura 5. Exemplu procedură proc contents

Procedura print poate fi folosită într-un program astfel:


title "Datele din fisierul date_test";
proc print data=produse.date_test;
run;
Rezultatul obținut în urma rulării acestui script este un raport SAS ce conține numele
variabilelor și observațiile. Acest raport este obținut în figura 6.

6
Figura 6. Exemplu de aplicare a procedurii proc print

3. Formate și etichete
Formatele (sau formatările) și etichetele sunt folosite pentru a evidenția informația într-un
mod mai atractiv și pentru a explicita niște denumiri abreviate. Etichetele pot fi create în
secțiunile DATA sau PROC.
De exemplu, se vor adăuga etichete pe un set de date referitoare la notele obținute de
studenți. Se folosește declarația LABEL urmată de numele variabilelor, semnul = și eticheta
scrisă între ghilimele simple sau duble. O etichetă poate avea până la 256 de caractere.
DATA note_an3;
input cod $ Nota1-Nota3;
label cod = 'Cod Student'
Nota1 = 'Nota psw'
Nota2 = 'Nota SGBD'
Nota3 = 'Nota finante';
datalines;
1 10 10 8
2878
3644
;
Dacă etichetele sunt folosite în secțiunea DATA ele vor rămâne asociate variabilelor
respective. Dacă însă sunt folosite în secțiunea PROC, atunci ele vor fi valabile doar în cadrul
secțiunii respective.

Formatele sunt folosite pentru a îmbunătăți modul în care datele sunt afișate. Există
formate predefinite SAS care pot fi folosite de exemplu pentru afișarea valutei sau pentru a pune
virgula de ordinul miilor la numere. De asemenea, pot fi construite formate de către utilizator,
care apoi să fie folosite pentru diferite valori sau grupuri de valori. De exemplu, M, F (valori
pentru variabila gen) să fie afișate Masculin, Feminin, iar notele sub 4,5 sa fie afișate ca Examen
Picat.
Formatele definite de utilizator se creează cu ajutorul procedurii FORMAT. Exemplul de
mai sus va fi transpus astfel în cod SAS:
proc format;
value $gen 'M' = 'Masculin'
'F' = 'Feminin'
other = 'format necoresp.';
value nota low-4.4 = 'Examen Picat'

7
4.5-high = 'Examen trecut';
run;
Pentru fiecare format definit de utilizator se precizează cuvântul cheie value urmat de
semnul dolar pentru variabilele de tip caracter (pentru care se va aplica formatul). Apoi este
specificat numele formatului și pentru fiecare valoare posibilă (sau interval de valori) se
precizează formatarea. Dacă rămân valori nespecificate, și nu se folosește nici clauza other,
atunci ele vor rămâne neformatate.
În general formatările sunt valabile doar pentru afișări și nu pentru procesarea datelor.
Există însă și câteva excepții. De exemplu, procedura FREQ calculează frecvențele de apariție
ale valorilor formatate, dacă este aplicat un format.
În continuare aplicăm formatările nota și gen pe setul de date note. Se observă că, la fel
ca la formatările predefinite SAS, atunci când acestea se aplică, numele lor trebuie urmat de
punct.

data note;
input nume$ 1-9 nota gen$;
datalines;
Ionescu 5.6 M
Popescu 4.3 F
Vasilescu 3.3 b
Georgescu 9.2 F
Iliescu 10 M
Samoila 5.9 M
Toma 7 F
;
title "Date despre exemenul de PSW";
proc print data=note;
var nume nota gen;
format nota nota.
gen $gen.;
run;

Rezultatul obținut după aplicarea formatărilor se poate observa în figura 7. Pentru


variabila nota, formatul se aplică numai pentru valorile < 4.5, restul observațiilor rămânând
nemodificate.

Figura 7. Aplicarea formatelor definite-utilizator

8
Se cere să se determine numărul de studenţi din fiecare gen şi numărul de studenţi care au
formatul necorespunzător. Se va folosi procedura FREQ care determină frecvența de apariţie a
valorilor variabilelor. Pentru variabila gen se va aplica formatul definit de utilizator, asftel încât
FREQ va număra valorile rezultate după aplicarea formatului. Rezultatul rulării se poate observa
în figura 8.

title "Frecventa de aparitie pentru gen";


proc FREQ data=note;
TABLES gen /nocum nopercent;
FORMAT gen $gen.;
run;

Figura 8. Procedura FREQ cu aplicare de formate pentru gen

Să se determine câţi studenţi au picat şi câţi au trecut examenul. Rezultatul rulării se


poate observa în figura 9.
proc format;
value nota low-4.4 = 'Examen Picat'
4.5-high = 'Examen trecut';
run;

title "Frecventa de aparitie pentru note";


proc FREQ data=note;
TABLES nota /nocum nopercent;
FORMAT nota nota.;
run;

Figura 9. Procedura FREQ cu aplicare de formate pentru nota

9
Pentru ca formatele să capete persistență, ele trebuie stocate în biblioteci definite prin
libname nume_biblioteca 'calea director…' și apoi accesate astfel:
libname formate '/home/nume.prenume';
options fmtsearch=(formate);
proc format library = formate;
value pret low-10 = 'acceptabil'
11-high = 'peste limita';
run;
proc print data = formate.date_test;
format pret pl.;
run;

Figura 10. Aplicarea unui format permanent

În cadrul procedurilor SAS pot fi aplicate o multitudine de formate predefinite. În exemplul de


mai jos se cere ca preţul să fie afişat având în faţă semnul „$”, iar data să fie afişată în formatul
ZZ-LL-AAAA. Observaţi şi analizaţi modul în care au fost citite datele de intrare şi ce
formate de citire au fost folosite!

DATA comenzi;
input iD_Comanda ID_Produs :$4. Cantitate Pret Data :mmddyy.;
datalines;
102 1053 3 125 05/12/2018
103 243 25 30.7 05/15/2018
104 3052 1 106.83 06/21/2018
105 129 6 3.42 06/24/2018
;

*fara aplicarea formatelor de afisare;


proc print data=comenzi;
run;

*cu aplicarea formatelor de afisare;


proc print data=comenzi;
format Pret DOLLAR8.2 Data ddmmyyd10.;
run;

4. Fișiere JSON

10
Fișierele JSON (JavaScript Object Notation) reprezintă un format din ce în ce mai
popular, folosit pentru interschimburi de date. Este independent de limbajele de programare și
are un format ușor de citit de către utilizatori sau de către limbajele de programare. Aceste tipuri
de fișiere conțin de obicei date de mari dimensiuni, nestructurate sau parțial structurate. Este
asociat adesea cu termenul de Big Data, reprezentând o sursă foarte bună de furnizare a unor
astfel de date.
Conținutul unui astfel de fișier este practic alcătuit dintr-o multitudine de fraze în care de
obicei informația este căutată în funcție de anumite cuvinte cheie.
Pentru exemplificare vom folosi fișierul clienti_daune.json în care datele referitoare la
daunele posesorilor de mașini, apar sub forma următoare:
{
"VIN":"X4ALT2S284AIPQ29AKJ106",
"Tara Producator":"United States",
"Regiune Producator":"North America",
"Marca":"FORD",
"Producator":"FORD MOTOR COMPANY",
"Model":"EXPLORER",
"An fabricatie":2010,
"Data Cerere":"2012-01-06",
"Geocode reprezentanta":"36.153889 -95.992500",
"Reprezentanta":"FORD OF TULSA",
"Zona Reprezentanta":"OK",
"Oras Reprezentanta":"Tulsa",
"Opera'ii realizate":"Replace Alternator",
"Componenta":"ELECTRICAL SYSTEM:ALTERNATOR/GENERATOR/REGULATOR",
"Dauna":"OPERATION:WILL NOT START",
"Cod":"Ah63ANFG224MN2-0974",
"Data vanzarii":"2010-10-07",
"Tara furnizor":"England",
"Furnizor":"Delphi Automotive Systems U K Ltd.",
"Zona Funizor":"Luton",
"Pret manopera":"$444.87",
"Pret Total":"$316.87",
"Valoare Dauna":"$761.74",
"Id_Client":9194439
},

SAS nu oferă încă posibilitatea importării unor astfel de fișiere, ci doar o procedură
destinată exportului în fișiere JSON. Vom extrage din fișierul inițial valoarea daunei și clientul
într-un fișier de date SAS, care va fi ulterior exportat tot într-un fișier JSON.
Extragerea datelor se face folosind următorul cod SAS:
filename daune '/home/nume.prenume/clienti_daune.json';
data daune_nou;
infile daune truncover scanover;
input @'Valoare Dauna":"' valoare $15.
@'Id_Client":' idclient 8.;

11
put valoare=;
put idclient=;
run;
Căutarea în fișier se face folosind declarațiile truncover și scanover în funcție de
expresiile Valoare Dauna":" și Id_Client":. TRUNCOVER îi spune motorului SAS să se
oprească din citit atunci când ajunge la sfârșitul unei linii, iar SCANOVER poziționează
pointerul în funcție de o condiție de căutare, apoi citește normal din fișier. Rezultatele sunt
expuse în figura 11.

Figura 11. Extragerea datelor din fişierul .json

Pentru a rafina datele preluate din fișierul .JSON este nevoie să edităm interogarea SQL
pe care se bazează tabela de date SAS interogare. Valoarea daunei nu are o lungime fixă, de
aceea ea trebuie curățată. Verificăm dacă valoarea extrasă se termină în cifre sau în “,. În cel de-
al doilea caz, eliminăm caracterele incorecte. De asemenea, prin condiția valoare<>'",',
eliminăm valorile vide. Procedura PROC SQL permite scrierea de cod SQL, în cazul de față,
crearea unei tabele pe baza unei interogări. Pentru condiționarea alternativă am folosit clauza
CASE.
PROC SQL;
CREATE TABLE WORK.interogare AS
SELECT case when substr(valoare,length(valoare)-1,2)='",' then
substr(valoare,1,length(valoare)-2) else valoare end as val, idclient FROM
WORK.DAUNE_NOU where valoare<>'",' ;
RUN;
QUIT;

Pentru exportul datelor într-un fișier .JSON se folosește procedura JSON pentru care se
precizează fișierul în care se face exportul și setul de date SAS de exportat.
proc json out='/home/nume.prenume/daune_noi.json';
export WORK.interogare;
run;

Se poate observa că în interogarea de mai sus, variabila val este de tip caracter, ceea ce
înseamnă că asupra ei nu pot fi efectuate în SAS operaţii numerice. Se doreşte crearea unei noi
tabele, îm care variabila valoare să stocheze valori numerice. În acest sens, se va folosi funcţia
INPUT pentru a converti o valoare de tip caracter la o valoare numerică şi a stoca valoarea

12
acesteia într-o nouă variabilă. De asemenea, se va folosi formatul de intrare DOLLAR10.2
pentru a indica faptul că datele de intrare au în faţă semnul $ urmat de un număr cu două
zecimale.

DATA interogare1 (drop= val);


Set interogare;
Valoare = input(val, DOLLAR10.2);
Run;

5. Probleme propuse
a) Să se definească, folosind datele din fișierul produse.txt, un set de date cu delimitatorul *.
b) Folosind datele de la a) să se creeze un fișier permanent de date SAS.
c) Fie următoarele date:
Rosu, Galben, Albastru, Verde, Roz, Rosu, Verde, Mov, Maro, Alb
Să se creeze un fişier de date SAS pe baza lor.
d) Să se creeze un format definit utilizator pentru: culorile de bază (Rosu, Galben, Albastru),
culorile derivate și non-culori (Alb, Negru).
e) Să se aplice formatul definit utilizator pentru fișierul de la punctul c).
f) Pornind de fişierul de date “interogare1” de la punctul 4 al seminarului, să se determine
câte dosare au dauna sub $500, câte între $500 şi câte peste $800, folosind procedura de calcul a
frecvenţelor de apariţie şi un format definit de utilizator.

Probleme propuse rezolvate


a) Setul de date se găseşte în fişierul „produse11” din subdirectorul Probleme rezolvate
b)
data produse;
infile '/home/nume.prenume/produse11.txt' dlm='*';
input Nume $ Pret Categorie $;
run;

c) Setul de date se găseşte în fişierul „culori” din subdirectorul Probleme rezolvate


data culori;
infile '/home/nume.prenume/culori.txt';
input Culoare $;
run;

d)
proc format;
value $culoare 'Rosu', 'Galben', 'Albastru'='De baza'
'Alb','Negru'= 'Non-culoare'
other = 'Derivata';
run;

e)

13
title "Lista culorilor ca si tip";
proc print data=culori;
format culoare $culoare.;
run;

f)
proc format;
value dauna
low-499.99 = 'sub $500'
500-800 = 'intre $500 si $800'
800.01-high ='peste $800';
run;

title "Numar de dosare de dauna in functie de valoare";


proc FREQ data=interogare1;
TABLES valoare /nocum nopercent;
FORMAT valoare dauna.;
run;

14
Pachetul software Microsoft Excel
În aceste seminarii vom aplica următoarele funcționalități ale pachetului Microsoft Excel:
 Formule cu referințe absolute şi relative
 Funcții: matematice, logice, financiare, matriceale şi de căutare, definite de utilizator și statistice
 Grafice
 Analize What-if (Scenarii şi Goal Seek)
 Solver
 Tabele pivot
 Macrocomenzi şi lucrul cu Macro Recorder
 Lucrul cu Visual Basic Editor

Contents
Exemplul 1 – Formule, funcții matematice și logice .................................................................................................................... 2

Exemplul 2 – Funcții financiare ............................................................................................................................................................. 4


Exemplul 3 – Funcții matriceale și definite de utilizator ........................................................................................................... 6
Exemplul 4 – Funcții statistice și matematice ............................................................................................................................... 8
Exemplul 5 – Realizarea unei foi de calcul de analiză şi Grafice ........................................................................................... 9

Exemplul 6 – Scenariu...............................................................................................................................................................................13
Exemplul 6 – Goal Seek ............................................................................................................................................................................14
Exemplul 7 – Solver ....................................................................................................................................................................................15

Exemplul 8 – Tabele pivot .......................................................................................................................................................................18


Exemplul 8 – Macro Recorder................................................................................................................................................................20
Exemplul 9 – Visual Basic Editor .........................................................................................................................................................21

1
Exemplul 1 – Formule, funcții matematice și logice
Nr. Pas Mod de rezolvare Observații
1. Deschideți fișierul MS Excel denumit „Seminar Fișierul se găsește în arhiva cu date de seminar
Excel”, foia de calcul Achizitii. Datele se referă la disponibilă pe platforma online.ase.ro la secțiunea de
achizițiile din ziua curentă ale unei firme importator- seminar.
distribuitor de produse de larg consum. Prețurile sunt
exprimate în RON.
2. Inserați o nouă coloană în fața tabelului, cu titlul Selectați coloana A
“Nr.Crt.” Insert->Columns
Scrieți “Nr. Crt.” în celula A1
3. Generați numere în prima coloană Scrieți “1” in celula A2
Selectați celulele A2:A11
Din secțiunea Editing se allege opțiunea Fill->
Series: Step Value: 1
Se apasă OK
4. Reformatați foaia de calcul, păstrând stilul inițial, Se poate folosi facilitatea Format Painter pentru a
pentru a include și coloana nou creată. copia formatul unei celule și a-l aplica ulterior
pentru alte celule.
5. Introduceți data curenta în coloana “Data” Funcţiile predefinite se pot selecta din meniul
principal, Formulas

sau selectând fx

Se deschide wizard-ul de funcţii, se selectează


categoria şi apoi funcţia

2
Pentru informaţii
detaliate pentru fiecare
funcţie selectată
consultaţi

Meniul Formulas->Date&Time->Today( )

6. Formatați celulele care conțin data, aplicând Selectați celulele D2:D11, click dreapta Format
formatul zz/ll/aaaa. Cells. Selectați locația (Romanian) și tipul de format
corespunzător.
7. Calculați valoarea fără TVA a fiecărui produs Calculul valorii produselor (celulele G2:G10) Observați adresarea
importat. - Selectați celula G2 relativă!
- Scrieți formula de calcul, respectiv “=E2*F2”
- Copiați formula și în celelalte celule (trageți de
colțul din dreapta jos, când mouse-ul este sub forma
unei cruci negre)
8. În coloana H, calculați TVA-ul aferent. În celula H2 introduceți formula: H2= G2*M3
Copiați formula în celelalte celule (H2:H10)
9. Studiați formula pentru a vedea dacă TVA-ul aferent
a fost calculat corect.
10. Rescrieți formula utilizând adresarea absolută a H2=G2*$M$3 Folosiți tasta F4 pentru
celulelor a modifica referințele!
11. Calculați accizele aferente băuturilor alcoolice, în - Folosiți funcția logică IF (Formulas->Logical- Identificați corect
coloana I (Valoare accize) >IF), având următorii parametri: ultimii doi parametri ai
-Logical Test: testați dacă produsul face funcției!
parte din categoria “Bauturi alcoolice” Analizați rezultatele
(C2="Bauturi alcoolice") obținute!
-Value if true: valoarea accizei se obține ca
produs între valoarea fără TVA și nivelul de
0.2 al accizei

3
-Value if false: nu se aplică acciză
- Copiați formula în jos pe verticala pentru toate
produsele
12. Calculați valoarea totală pentru fiecare tip de produs, Se calculează valorile din coloana J.
ca sumă dintre Valoarea fără TVA, TVA și Valoare
acciză.
13. Realizați suma valorilor calculate anterior, pentru - Selectați domeniul de celulele care trebuie
toate produsele importate, folosind funcția SUM. calculate: H12:J12
- Formulas-> AutoSUM-> SUM
16. Evidențiați, prin colorarea celulelor, produsele care - Scrieți domeniul de celule F2:F11.
au prețul de achiziție cuprins între 15 si 100 de - Selectați Home, Conditional Formatting ->
RON. Highlight Cell Rules -> Between, introduceți
valorile corespunzătoare și selectați culoarea dorită.
17. Salvați fișierul. Salvați folosind email-ul sau prin alte mijloace
fișierul cu rezolvarea exercițiilor.

Exemplul 2 – Funcții financiare


Nr. Pas Mod de rezolvare Observații
1. Deschideți fișierul MS Excel denumit „Seminar Fișierul se găsește în arhiva cu date de seminar In Wizard-ul funcției se
Excel”, foia de calcul Financiar. Datele se referă la disponibilă pe platforma online.ase.ro la secțiunea de va folosi trimitere spre
trei scenarii de investiții financiare sau economisiri. seminar. celula care conţine
Funcţiile se pot selecta din fx sau meniul Formulas, valoare, nu se va
Financiar introduce valoarea în
wizard
2. O companie cumpără un utilaj de producţie, care se Funcţia PV(rate,nper,pmt,fv,type) –Returnează
estimează că va aduce în următorii 10 ani un venit valoarea prezentă a unei investiții (valoarea în
anual de 28.600€. Pentru finanţarea utilajului, firma prezent a unei serii de plăti viitoare).
are nevoie de un credit. Banca selectată acordă Are parametrii:
credite cu dobânda de 6, 75% pe an. - Rata reprezintă rata dobânzii. De exemplu, dacă se
Care ar trebui să fie preţul maxim al utilajului, dacă obține un împrumut cu o rată anuală a dobânzii de
ar trebui să fie plătit numai din veniturile pe care le 10%, iar plățile sunt lunare, rata lunară a dobânzii va
aduce. Cheltuielile de întreţinere nu sunt luate în fi de 0,1/12 adică 0,83%.
considerare. Plata către bancă se face în fiecare lună, - Nper reprezintă numărul total de perioade în care
la sfărșitul lunii. se efectuează plăți. Pentru un împrumut pe 4 ani cu
plăți lunare nper va fi 4*12=48 de perioade.

4
- Pmt reprezintă plata efectuată în fiecare perioadă și
care rămâne fixă pe întreaga durată a anuității
- Fv reprezintă valoarea viitoare sau ce valoare se
vrea a se obține după efectuarea ultimei plăți. Este
un fel de valoare reziduală. Valoarea implicit a
acestui argument este 0.
- Tipul poate fi 0 sau 1 și indică momentul de
efectuare a plăților, respectiv sfârșitul sau începutul
perioadei.
3. Inserați formula de calcul în celula B8. - Selectați din meniu Formulas -> Financial -> PV Luați in considerare
- Introduceți valori pentru parametrii funcției, prin faptul că suma plătită
referirea celulelor în care au fost introduse date. și rata dobânzii au
valori anuale în
enunțul problemei, iar
plata se face lunar la
sfârșitul fiecărei luni.
4. Presupunem că dorim să economisim bani pentru un Funcția FV(rata,nper,pmt,pv,tip) –Returnează
proiect care va începe peste un an. Facem în acest valoarea viitoare a unei investiții bazate pe plăți
scop un depozit de 1000€, cu o rată anuală a periodice și constante și cu o rata a dobânzii
dobânzii de 6%, plătibilă lunar (rata lunara a constantă.
dobânzii va fi 6%/12=0.5%). Vrem să depunem - Argumentele rata, nper, pmt şi tip au aceeași
suma de 100€ la începutul fiecărei luni, timp de 1 an. semnificație ca în cazul funcției PV
Câți bani vom avea în cont la sfârșitul celor 12 luni? - Pv reprezintă valoarea prezentă sau cât valorează
în momentul prezent o serie de plăți viitoare
(implicit este 0)
5. Presupunem că se face o investiție astfel: se plătesc Funcția NPV(rata,valoare1,valoare2, ...) – Plăţile se introduc ca
10.000€ peste un an și se primesc anual venituri de Calculează valoarea prezentă netă unei investiții valori negative
3.000€, 4.000€ și 6.800€ în următorii 3 ani. Dacă utilizând rata inflație și o serie de plăți (valori
rata anuală a inflației este de 10%, care va fi negative) și venituri (valori pozitive) viitoare.
valoarea prezentă netă a investiției? - Rata reprezintă rata inflației pe parcursul unei
perioade.
- Valoare1, valoare2, ... argumente (de le 1 la 29) ce
reprezintă plățile sau veniturile.

5
Exemplul 3 – Funcții matriceale și definite de utilizator
Nr. Pas Mod de rezolvare Observații
1. Deschideți fișierul MS Excel denumit „Seminar 1 Fișierul se găsește în arhiva cu date de seminar
Excel”, foia de calcul Salarii. Datele se referă la disponibilă pe platforma online.ase.ro la secțiunea de
veniturile lunare obținute de angajați. seminar.
2. Trebuie calculate veniturile totale lunare ale agenților unei companii de asigurări, știind că aceștia primesc un salariu fix, un comision
din cifra de afaceri pe care au realizat-o în acea lună și un spor de vechime.
3. Calculați comisionul agenților Inserați în coloana E funcția matriceală VLOOKUP Atenție la referințele
(Formulas-> Lookup&Reference -> VLOOKUP), absolute sau relative
având următorii parametri: ale parametrilor!
- Lookup_value: valoarea care trebuie căutată în
tabel (Cifra de afaceri)
- Table_array: tabelul de comision (atenție ca
celulele care referă tabelul (D14 și E19) să aibă
adrese absolute)
- Col_index_num: numarul coloanei din tabelul de
comision a cărei valoare se returnează (în acest caz,
coloana procentelor; se va introduce manual indexul
acestei coloane în cadrul Tabel de comision)
- Range_lookup: dacă se caută o valoare apropiată
sau una exactă (se lasă necompletat deoarece în acest
caz se face o căutare pe intervale de valori)
4. Funcţie definită de utilizator (utilizare cod VBA)
Definiți o funcție care, pe baza salariului fix și a vechimii unui angajat, să calculeze sporul de vechime ce i se cuvine acestuia.
Algoritmul de calculare a sporului de vechime este următorul:
- pentru o vechime sub 3 ani nu se acordă spor;
- pentru o vechime între 3 și 5 ani sporul reprezintă 5% din salariu;
- pentru o vechime între 5 și 10 ani sporul reprezintă 10% din salariu;
- pentru o vechime între 10 și 15 ani sporul este de 15% din salariu;
- pentru o vechime mai mare de 15 ani sporul este de 20% din salariu.
5. Deschideți editorul Visual Basic Selectați meniul Developer >Visual Basic
În cazul în care meniul Developer nu apare, se
selectează File > Options > Customize Ribbon.
Choose commands from > Main Tabs
Se bifează opțiunea Developer și apoi se apasă Add

6
și OK.
6. Activați proiectul VBAProject (Seminar 1 Selectați Insert->Module
Excel.xlsx) și scrieți funcția Introduceţi (copiaţi) următorul cod sursă:

Function Spor(salariu, vechime)


If vechime < 3 Then
Spor = 0
Else
If vechime >= 3 And vechime < 5 Then
Spor = 0.05 * salariu
Else
If vechime >= 5 And vechime < 10 Then
Spor = 0.1 * salariu
Else
If vechime >= 10 And vechime < 15 Then
Spor = 0.15 * salariu
Else Spor = 0.2 * salariu
End If
End If
End If
End If
End Function
7. Salvați proiectul, închideți editorul VB și reveniți la Dacă securitatea fișierului nu permite crearea de
foaia de calcul din Excel module asociate, modificați opțiunile de securitate
folosind opțiunea Developer > Macro Security
8. Calculați sporul, utilizând funcția definită ca pe orice - Selectați celula F2
altă funcție Excel - Formulas > Insert Function Category: User
Defined > Spor
9. Calculați veniturile totale ale agenților ca sumă Se calculează coloana G.
dintre salariul fix, cifra de afaceri înmulțită cu
procentul din comision și sporul de vechime
10. Însumați cifra de afaceri şi veniturile totale, în Se calculează valorile celulelor D9 și G9.
celulele corespunzătoare.
11. Salvați și închideți fișierul

7
Exemplul 4 – Funcții statistice și matematice
Nr. Pas Mod de rezolvare Observații
1. Deschideți fișierul MS Excel denumit „Seminar Fișierul se găsește în arhiva cu date de seminar
Excel”, foia de calcul Evaluare. Datele se referă la disponibilă pe platforma online.ase.ro la secțiunea de
un test pentru evaluarea unor cursanți. seminar.
2. Se dorește calcularea punctajelor mediu, maxim și minim obținute pentru fiecare categorie de gen, precum și câți cursanți din fiecare
categorie au participat la curs. De asemenea, se cere să se realizeze un clasament al cursanților în funcție de punctajele obținute.
3. Calculați punctajul maxim pe fiecare categorie de Inserați în celula H4 funcția statistică MAXIFS Pentru anumite
gen. (Formulas-> Statistical -> MAXIFS), având versiuni de Excel nu
următorii parametri: sunt suportate toate
- Max_range: domeniul de celule pentru care se va funcţiile, în acest caz în
calcula punctajul maxim (C2:C11) faţa funcţiei se oiate
- Criteria_range1: domeniul de celule pentru care se folosi prefixul _xlfn.
aplică condiția de evaluare (B2:B11)
- Criteria1: reprezintă criteriul sub formă de număr,
expresie sau text care definește ce celule vor fi Pentru o evaluare
evaluate pentru calculul maximului (“M”) multicriterială, funcția
În mod similar, repetați pașii anteriori pentru a permite adăugarea de
calcula valoarea din celula H5. noi domenii de celule
și criteriile asociate
acestora!
4. Calculați punctajul minim și mediu pe fiecare Se vor folosi funcțiile MINIFS pentru celulele I4 și Funcțiile MINIFS,
categorie de gen. I5 și AVERAGEIFS pentru celulele J4 și J5. SUMIFS și
Modul de lucru este similar celui folosit la punctul 3 AVERAGEIFS au
al exemplului. parametrii similari cu
MAXIFS!
5. Calculați câți cursanți din fiecare categorie au Inserați în celula K4 funcția statistică COUNTIF
participat la curs. (Formulas-> Statistical -> COUNTIF), având
următorii parametri:
- Range: domeniul de celule în care se vor număra
cursanții de gen masculin (B2:B11)
- Criteria: criteriul care controlează ce celule ar
trebui să fie numărate (“M”)
În mod similar, repetați pașii anteriori pentru a
calcula valoarea din celula K5.

8
6. Realizați un clasament al cursanților în funcție de Inserați în celula D2 funcția statistică RANK.EQ
punctajele obținute. (Formulas-> Statistical -> RANK.EQ), având
următorii parametri:
- Number: numărul pentru care dorim să
determinăm poziția în clasament (C2)
- Ref: o listă de valori numerice pentru care se
calculează clasamentul ($C$2:$C$11)
Order: determină tipul de sortare (valoarea 0 pentru
sortare descendentă -implicit; orice altă valoare
pentru sortare ascendentă)
Copiați formula din celula D2 în jos, pe verticală,
pentru a calcula punctajul celorlalți cursanți.

Exemplul 5 – Realizarea unei foi de calcul de analiză şi Grafice


Nr. Pas Mod de rezolvare Observații
1 Datele se referă la o firma Deschideți fișierul MS Excel denumit „Seminar Excel”, foia de Atenţie la folosirea
importatoare de produse de calcul Analiza venituri si cheltuieli. adreselor absolute, de
birotica care a importat în Completati foaia de calcul astfel (formule de calcul şi nu valori): exemplu $K$2
primele șase luni ale anului trei  Pentru fiecare produs, in fiecare luna, valoarea fiind
categorii de produse: creioane, cantitate*pret
pixuri si markere. Firma a  Valoare totală produse este suma valorilor produselor (pentru
vândut în fiecare lună toate fiecare lună)
produsele importate.  Cheltuielile cu importul reprezintă valoarea totală a produselor +
Se dorește o analiză a taxele vamale (valoarea totală a produselor * procent taxa
veniturilor si cheltuielilor vamală) (pentru fiecare lună)
firmei in această perioadă, în  Se completează fondul de salarii, conform enunţului (în ian şi
condițiile în care sunt cunoscute feb, 20000, în martie cu 15% mai mult decât în februarie
următoarele: (20000+20000*0.15) iar din aprile aceiasi formulă ca în martie
- cantitățile și prețurile la care  Veniturile din vanzări reprezintă cheltuielile cu importul +
au fost importate produsele adaosul comercial (care este cheltuielile cu importul * procentul
- taxa vamală care se aplică pe de adaos comercial) (se completează pentru fiecare lună)
valoarea produselor importate  Se calculează primele, comform algoritmului din enunţ, folosind
- fondul de salariu pentru funcţia logică IF (se completează pentru fiecare lună)
fiecare lună
- dacă veniturile din vânzări

9
depășesc un anumit plafon,
atunci se acordă prime
reprezentând un anumit
procent din depășire
- fondul de salarii in lunile
ianuarie şi februarie au fost de
20000, in martie a crescut cu
15%, rămânând constant pana
la sfârşitul perioadei
- pe fondul de salarii si pe  Se calculează taxele şi impozitele conform formulei: (fond
prime se aplică impozitul pe de salarii + prime)*(procent impozit salarii+procent CAS)
salarii şi CAS  Se calculează Cheltuieli salariale totale (fond de
- firma a avut cheltuieli fixe de salarii+prime+taxe si impozite)
10000 în fecare lună  Se introduc cheltuielile fixe (10000 în fiecare lună)
Se doreşte să se analizeze:  Se calculează Total cheltuieli (Cheltuieli cu importul +
- Evoluţia profitului net în Cheltuieli salariale totale + Cheltuieli fixe)
perioada analizată
 Se calculează Profitul brut ca Venituri din vânzări – Total
- Structura cantităților
importate în luna ianuarie cheltuieli
- Care ar fi fost situaţia daca  Se calculează Profitul net dupa formula Prpfit brut –Profit
taxele vamale ar fi fost de brut * Procent impozit pe profit
3%? Exemplu de completare a foii de calcul:
- Care ar fi fost situaţia daca
taxele vamale ar fi fost de 7%
şi adaosul comercial ar fi fost
de 32%?
- Cât ar fi trebuit sa fie adaosul
comercial, astfel încât firma
sa obțină în luna iunie un
profit de 32.000 RON?

Foaia de calcul completetă:

10
2 Creați un grafic care să prezinte - Insert->Chart
structura cantităților importate - Selectaţi tipul de grafic (Pie)
în luna ianuarie, sub formă de - Select Data
procente.
- Chart Data Range, selectaţi celulele care conţin cantităţile
importate în Ianuarie (ţinând <Ctrl> apăsat, C3,C6 şi C9)
- Horizontal (Category) Axis Labels, selectaţi celulele care
conţin produsele importate în Ianuarie (ţinând <Ctrl> apăsat,
A3,A6 şi A9)
- Adaugati titlul graficului
- Formatati graficului prin Add Chart Elements, Data Labes,
More Data Label Options, Values Percentage
- Move Chart - New Sheet: Structura
5 Creați un grafic cu bare - Selectați datele pe baza cărora se va realiza graficul: ținând Folosiți opțiunile Quick
verticale pentru a evidenția <Ctrl> apăsat selectați domeniile de celule C4:H4; C7:H7; Layout si Change Colors
evoluția prețului celor trei C10:H10 pentru a personaliza graficul!
articole pe parcursul celor șase - Alegeți Insert și apoi pictograma corespunzătoarea graficelor de
luni. tipul Column și Bar. Alegeți opțiunea 3D Clustered Column.
- Modificați titlul în „Evoluția prețurilor”
- Select Sata Source, selectati celulele care contin preturile
(tinand <Ctrl> apasat C4:H4; C7:H7; C10:H10

11
- Legend Entitys (Series), Edit selectati celulele care contin
denumirile produselor, pe rand cu ajutoril Edit A3, A6, A9
- Horizontal (Category) Axis Labels, selectaţi zona care contine
lunile C3:H3
- Pentru a specifica denumirea axelor graficului, selectați graficul.
Spoi apăsați butonul plus (+) care apare în dreapta, sus și bifați
opțiunea Axis Titles. Denumiți axa verticală Preț și axa
orizontală Luni.
7 Plasați graficul într-o foaie de Move Chart - New Sheet: Evolutie preturi
calcul nouă

Analize What-if
 Folosind instrumentele What-If Analysis în Excel, se pot utiliza mai multe seturi de valori distincte, sub
formă de intrări pentru una sau mai multe formule, în scopul de a explora și analiza rezultatele obținute.
 Spre exemplu, se poate folosi What-If Analysis pentru a construi două bugete, în care se presupune că
fiecare are un anumit nivel al veniturilor. Sau se poate specifica un rezultat pe care dorim să îl obțină o
formulă și apoi să determinăm ce seturi de valori vor produce acel rezultat.
 Excel oferă mai multe instrumente pentru acest tip de analize, în funcție de specificul problemei:
Scenario Manager (Scenariu), Goal Seek (Căutarea rezultatului) și Data Table (Tabele de date).

12
Exemplul 6 – Scenariu

Scenariul este un tip de analiză ce permite definirea unor simulări în care evidențiem modul în care
schimbarea uneia sau mai multor valori de intrare afectează rezultatul. Se obține un raport pe baza căruia se
pot analiza comparativ datele din diferite scenarii.
Nr. Pas Mod de rezolvare Observații
1. In foaia de calcul Analiza Venituri si
Cheltuieli
2. Dorim să analizăm situațiile în care taxele - Accesați meniul Data > What-If Analysis > Scenario După definirea unor
vamale se modifică. Se presupune ca taxele Manager scenarii, apăsarea
vamale scad, de la 5% la 3%. Cum se - Apăsați Add tastei Show in
modifică profitul net? Dar în situația în care - Adăugați următorul scenariu: fereastra Scenario
aceste taxe cresc la 7%, iar adaosul o Scenario name: Taxa vamala 3% Manager va duce la
comercial (AC) crește și el la 32%? o Changing cells: K3 modificarea valorilor
o Apăsați OK direct în foia de
o Enter value for each of the changing cells: 0.03 calcul. De cele mai
o Apăsați OK multe ori, acest lucru
- Adăugați următorul scenariu: este de evitat în
o Scenario name: Taxa vamala7%, AC 32% scopul menținerii
o Changing cells: ținând <CTRL> apăsat K3 și K4 datelor originale.
o Apăsați OK Pentru simulări, se
o Enter value for each of the changing cells: 0.07 recomandă opțiunea
și 0.32 Summary!
o Apăsați OK
- În fereastra Scenario Manager apăsați Summary
- Selectați tipul de raport Scenario Summary
- Selectați la Result cells: C26:H26
- Apăsați OK
3. Personalizați raportul generat în noua foaie - Modificați celulele B6 și B7 de sub Changing Cells,
de calcul Scenario Summary astfel încât să reflecte valorile care se schimbă: Taxa
vamala și Adaos comercial
- Modificați celulele de sub Result Cells pentru a include
lunile anului din problemă

13
Exemplul 6 – Goal Seek

Presupunem că celula D (celula rezultat) se calculează pe baza celulelor A, B si C (celule parametru), adică
D = f(A, B, C). Facilitatea Goal Seek ne permite ca, stabilind o valoare pentru celula rezultat, si cunoscând,
de exemplu valorile parametrilor B si C, sa se calculeze valoarea parametrului A. Prin Goal Seek putem
spune ca se realizează un “drum invers” față de modul obișnuit de calcul a valorii unei celule în MS Excel.
De precizat că pot exista oricâte celule parametru care să influențeze celula rezultat, dar că se poate
determina numai valoarea unei singure celule parametru.

Nr. Pas Mod de rezolvare Observații


1. In foaia de calcul Analiza Venituri si
Cheltuieli
2. Determinați cât ar fi trebuit sa fie adaosul - Accesați meniul Data > What-If Analysis >Goal Seek Prin Goal Seek se
comercial, astfel încât firma sa obțină în luna - Realizați următoarele setării: poate defini o
iunie un profit de 32.000 RON. o Set cell: selectați celula cu profitul net în iunie singură celula care
o To value: 32000 își modifică valoarea!
o By changing cell: selectați celula cu Adaos
comercial
o Apăsați OK
- Observați mesajul din fereastra Goal Seek Status care ne
informează că a fost găsită o soluție și analizați
rezultatele obținute în foia de calcul
- Apăsați OK daca vreți sa păstrați noile valori sau Cancel
în caz contrar
3. S-a decis ca un capital de 10,000 € sa fie Deschideți foia de calcul Goal Seek si analizați modul de
depus la bancă sub forma unui depozit având calcul al dobânzii compuse, prin cele doua variante.
dobânda anuală de 3%. Știind că dobânda este
compusă, s-a calculat (prin doua variante)
capitalul final care se obține după o perioadă
de 5 ani.

14
6. Dorim ca după perioada de cinci ani sa avem - Pentru una dintre cele două variante de calcul, parcurgeți
în cont un capital final de 15.000 €. Cât de pașii de la punctul 2 al exemplului, realizând următoarele
mare trebuie sa fie capitalul inițial, dacă se setări:
acordă aceeași dobândă? o Set cell: capitalul final după 5 ani
o To value: 15000
o By changing cell: capitalul inițial la începutul
celor 5 ani

Exemplul 7 – Solver

Instrumentul Solver este folosit pentru a rezolva probleme de cercetări operaționale prin găsirea soluțiilor
optime în probleme decizionale, în special pentru probleme de programare liniară. Cea mai simplistă
problemă ar fi găsirea unui minim/maxim prin schimbarea valorilor în unele celule.
Când definiți o problemă pentru Solverul Excel, puteți alege una dintre următoarele metode în caseta
derulantă Select a Solving Method:
 GRG Nonlinear. Algoritmul neliniar cu gradient redus generalizat este utilizat pentru probleme care
sunt neliniare netede, adică în care cel puțin una dintre restricții este o funcție neliniară netedă a
variabilelor de decizie.
 LP Simplex. Metoda Simplex LP se bazează pe algoritmul Simplex, ce este utilizat pentru rezolvarea
problemelor de programare liniară - modele matematice ale căror cerințe sunt caracterizate de relații
liniare, adică constau dintr-un singur obiectiv reprezentat de o ecuație liniară care trebuie maximizată
sau minimizată.
 Evolutionary. Se folosește pentru probleme non-netede, care sunt cel mai dificil tip de probleme de
optimizare de rezolvat, deoarece unele dintre funcții sunt netede sau chiar discontinue și, prin urmare,
este dificil să se determine direcția în care o funcție crește sau descrește.

15
Nr. Pas Mod de rezolvare Observații
1. Deschideți foia de calcul Solver. Datele se referă la Fișierul se găsește în arhiva cu date de seminar disponibilă pe platforma
mărfurile care pot fi transportate din 2 depozite către online.ase.ro la secțiunea de seminar.
4 clienți.
2. Acesta este un exemplu de problemă simplă de optimizare a transportului cu un obiectiv liniar.
Problemă: Doriți să reduceți la minimum costul expedierii mărfurilor de la 2 depozite diferite la 4 clienți diferiți. Fiecare depozit are o
capacitate de stocare limitată și fiecare client are o anumită cerere.
Obiectiv: Minimizați costul total de expediere, fără a depăși cantitatea disponibilă la fiecare depozit și satisfacerea cererii fiecărui client.
3. Calculați totalul de mărfuri transportate din fiecare Inserați în celula F8 funcția SUM(B8:F8). În mod similar, repetați pentru
depozit. celula F9.
4. Calculați totalul de mărfuri transportate către fiecare Inserați funcția SUM(B8,B9) în celula B10 și apoi copiați formula în
client. celulele C10, D10, E10.
5. Calculați costurile totale (funcția obiectiv). Inserați în celula B13 funcția matematică SUMPRODUCT (Formulas->
Math & Trig-> SUMPRODUCT) ce returnează suma produsurilor din
mai multe tablouri, având următorii parametri:
- Array1: B3:E4
- Array2: B8:E9
6. Denumiți valorile din celule pentru a fi mai ușor de - Selectează celulele B8:E9 -> Click dreapta -> Define Name -> se scrie
înțeles parametrii ce se vor aplica în Solver. Marfuri_transporate în Name -> OK
Parametru - Se repetă pentru celelalte 5 denumiri de celule
Nume Celule
Solver
Variable
Marfuri_transporate B8:E9
cells

Capacitate H8:H9 Constraint

Total_transp_depozit F8:F9 Constraint

Cerere B11:E11 Constraint

Total_transp_client B10:E10 Constraint

Costuri_totale B13 Objective


7. Adăugați Solver în Excel - File > Options
- click Add-Ins pe bara din stânga, verifică că este selectat Excel Add-

16
ins în căsuța Manage din josul paginii, apoi click Go.
- bifează Solver Add-in și click OK
- opțiunea Solver apare acum în tabul Data, în gruparea Analysis.
8. Rezolvați problema cu Solver. Parametrii pentru Solver sunt:
- Objective: Costuri_totale
- To: Min
- Variable cells: Marfuri_transportate
- Constraints: Total_transport_client = Cerere și
Total_transport_depozit <= Capacitate
- Solving Method: Simplex LP
9. Rulați Solver și păstrați soluția obținută.

- Click Solve
- Bifați Keep Solver Solution
- OK
10. Salvați și închideți fișierul

17
Exemplul 8 – Tabele pivot

Tabelul pivot din Excel reprezintă un instrument puternic pentru gruparea seturilor mari de date și aplicarea
filtrelor, sortărilor, funcțiilor matematice asupra lor. Permite regruparea și rearanjarea datelor prin inversarea
liniilor cu coloanelor și vice-versa, precum și prin împărțirea datelor în funcție de diverse criterii.

Nr. Pas Mod de rezolvare Observații


1. Deschideți foaia de calcul Comenzi. Datele se referă la produsele comercializate şi furnizorii acestora, clienții firmei, furnizori şi vânzările
firmei. Se dorește evidențierea preferințele clienților în ceea ce privește furnizorii produselor, preferințele clienților în ceea ce privește
produsele precum şi vânzările grupate pe ani.
2. Se creează o nouă tabelă numită In celula T3 se introduce formula =VALUE(RIGHT(L3;4)) în
vânzări detaliate, în care pe baza care funcția RIGHT(L3;4) returnează ultimele patru caractere
datei comenzii se creează coloana din textul aflat in celula L3. Funcția VALUE convertește un text
An comandă care conţine numai cifre în valoare numerică. Se copiază
formula în celelalte rânduri.
3. Pe baza codului clientului şi al In celula V3 se introduce formula
tabelei Clienţi se creează coloana =VLOOKUP(M3;$E$3:$F$23;2;0). Se copiază formula în
Client celelalte rânduri.
4. Pe baza codului produsului şi al In celula X3 se introduce formula
tabelei Produse / Furnizori se =VLOOKUP(W3;$A$3:$C$742;2;0) şi se copiază în celelalte
creează coloana Denumire produs rânduri
5. Se creează coloana valoare Pret unitar vanzare * Cantitate comandată şi se copiază în
celelalte rânduri
6. Pe baza codului produsului şi al In celula AC3 se introduce formula
tabelei Produse / Furnizări se =VLOOKUP(W3;$A$3:$C$742;3;1) şi se copiază în celelalte
creează coloana Cod Furnizori rânduri
7. Pe baza codului furnizorului şi al In celula AD3 se introduce formula
tabelei Produse / Furnizori se =VLOOKUP(AC3;$H$3:$I$26;2;1) şi se copiază în celelalte
creează coloana Furnizor rânduri
8. Se dorește evidențierea preferințele - Insert -> Pivot Table
clienților în ceea ce privește - Se selectează tabelul Vânzări Detaliate și se alege ca
furnizorii produselor tabelul pivot să fie amplasat într-o foaie de calcul nouă

18
(New Worksheet)
- Se aleg câmpurile: Furnizor la Columns, Client la Rows,
Valoare la Values
- Se selectează Sum of Valoare -> Value Field Settings
- Insert -> Recommended Charts – Clustered Column

3. Se dorește evidențierea preferințele Urmați pașii:


clienților în ceea ce privește - Insert -> Pivot Table
produsele - Se selectează tabelul Vânzări Detaliate și se alege ca
tabelul pivot să fie amplasat într-o foaie de calcul nouă
(New Worksheet)
- Se aleg câmpurile: Clienti la Columns, Denumire Produs la
Rows, Valoare la Values,
- Se selectează Sum of Valoare -> Value Field Settings
-
4. Evidenţierea vânzărilor grupate pe - Insert -> Pivot Table
ani - Se selectează tabelul Vânzări Detaliate și se alege ca
tabelul pivot să fie amplasat într-o foaie de calcul nouă
(New Worksheet)
- Se alege câmpul An vânzare la Rows, Valoare la Values,

5. Salvați și închideți fișierul

19
Macrocomenzi
 O macrocomandă este un set de comenzi sau instrucțiuni stocate într-o foaie de calcul MS Excel sub
formă de cod VBA. Din punct de vedere tehnic, o macrocomandă este o bucată de cod, în timp ce Visual
Basic for Applications (VBA) este limbajul de programare creat de Microsoft pentru a scrie
macrocomenzi.
 O macrocomandă poate fi percepută ca un program de dimensiuni reduse necesar pentru a efectua o
secvență predefinită de acțiuni. Odată create, macrocomenzile pot fi oricând refolosite. De obicei, sunt
utilizate pentru automatizarea sarcinilor repetitive și a activităților zilnice, de rutină. Totodată, cu
ajutorului codului VBA, se pot crea macrocomenzi de complexitate ridicată.
 Scopul principal este acela de a facilita utilizatorului realizarea mai multor activități în mai puțin timp.
Există două moduri de a crea macrocomenzi în Excel : folosind Macro Recorder sau Visual Basic Editor.

Exemplul 8 – Macro Recorder


Nr. Pas Mod de rezolvare Observații
1. Deschideți fișierul MS Excel denumit Fișierul se găsește în arhiva cu date de seminar disponibilă pe
„Seminar 2 Excel”, foia de calcul Macro. platforma online.ase.ro la secțiunea de seminar.
2. Foia de calcul conține date referitoare la - Accesați meniul Developer > Record Macro Pașii realizați în
încasările zilnice ale unei companii. Datele se - Scrieți numele macrocomenzii: continuare de
referă la numărul facturii, data plății, codul Formateaza_incasari_zilnice utilizator vor fi
contului în care s-a plătit și suma plătită, - Apăsați OK înregistrați în această
exprimată în lei. Se cere ca în fiecare zi aceste macrocomandă.
date să fie formatele și agregate conform
cerințelor factorilor decizionali.

20
Se va crea o macrocomandă pentru a
automatiza aceste activității repetitive.
3. Inserați înainte de date un rând nou care - Click dreapta pe primul rând, apoi selectați Insert
conține capul de tabel. - Definiți un cap de tabel în coloanele A1:D1 care conține
șirurile de caractere: Factura, Data, Cont, Valoare.
6. Calculați totalul încasărilor din ziua - În celula F2 introduceți textul Total incasari, iar în F3
respectivă, precum și numărul de vouchere Vouchere
care au fost oferite clienților, știind că acestea - În celula G2 introduceți o funcție care calculează suma
se oferă clienților care au realizat achiziții mai valorilor facturilor. Pentru această funcție, aveți în vedere
mari de 800 lei. Evidențiați cu o culoare un domeniu acoperitor de celule, compania estimând ca
diferită rândurile pentru care plățile au fost limită maximă zilnică 100 de facturi încasate. Suma
virate în contul 2, cont special pentru plăți calculată se va formata cu virgulă pentru mii și două
externe. zecimale.
- În celula G3 se va introduce funcția COUNTIF cu
următorii parametri:
o Range: celulele cu valoarea încasărilor zilnice.
Aveți din nou în vedere un domeniu acoperitor
de celule pentru maxim 100 de facturi.
o Criteria: ">800"
- Selectați coloana C
- Selectați Conditional Formatting > Highlight Cells
Rules > Equal To…
- Introduceți valoarea 2 apoi apăsați OK.
7. Opriți înregistrarea macrocomenzii - Accesați meniul Developer > Stop Recording
8. Rulați macrocomanda înregistrată pentru a - Deschideți foia de calcul Macro1.
formata facturile din altă zi. - Accesați meniul Developer > Macro
- Selectați macrocomanda Formateaza_incasari_zilnice
- Apăsați Run

Exemplul 9 – Visual Basic Editor


Nr. Pas Mod de rezolvare Observații
1. Deschideți fișierul MS Excel denumit Fișierul se găsește în arhiva cu date de seminar disponibilă pe
„Seminar 2 Excel” platforma online.ase.ro la secțiunea de seminar.
2. Se dorește generarea unui fișier PDF din - Apăsați Developer > Visual Basic sau țineți apăsate Experimentați

21
fiecare foaie de calcul dintr-un workbook, simultan tastele ALT și F11. Aceasta deschide Editorul plasarea unor
excepție făcând foile de calcul care conțin VBA. butoane pe foile de
grafice. De asemenea, se va genera un fișier - Accesați Insert -> Module. calcul, cărora să li
PDF care conține toate foile de calcul dintr-un - Copiați și lipiți codul de mai jos în fereastră: se asigneze
workbook. funcționalități ale
'Acest cod va salva fiecare foaie de calcul ca un fisier macrocomenzilor!
PDF
Sub SalveazaWorksheetPDF()
Dim ws As Worksheet
For Each ws In Worksheets
ws.ExportAsFixedFormat xlTypePDF, "E:\macro\Export"
& ws.Name & ".pdf"
Next ws
End Sub

- Modificați calea directorului în care se salvează fișierele


pentru a corespunde cerințelor voastre
- Apăsați butonul Save
- Apăsați butonul de rulare ( )sau F5 pentru a executa
macrocomanda
- Verificați generarea fișierelor în directorul specificat
- Repetați pașii de mai sus pentru a crea o macrocomandă
ce conține următorul cod sursă:

'Acest cod va salva intreg workbook-ul ca un fisier PDF


Sub SalveazaWorkbookPDF()
ThisWorkbook.ExportAsFixedFormat xlTypePDF,
"E:\macro\" & ThisWorkbook.Name & ".pdf"
End Sub
3. Se dorește ștergerea unor anumite înregistrări - Creați o foaie de calcul nouă cu denumirea “Viramente”
dintr-o foaie de calcul. Vom folosi date din - Deschideți fișierul text “date_vba” din arhiva de lucru și
exemplul 6 și creăm o macrocomandă care copiați datele din acest fișier în foia de calcul creată
evidențiază doar viramentele realizate în - Parcurgând pașii de la punctul 2 el exercițiului, creați o
contul 2 al companiei. macrocomandă care include următorul cod VBA:

Sub eliminare_val()

22
Dim cell As Range
For i = 102 To 1 Step -1
Set cell = Range("C" & i)
If cell <> 2 Then
cell.EntireRow.Delete
End If
Next i
End Sub

- Apăsați butonul Save


- Accesați foia de calcul Viramente
- Rulați macrocomanda eliminare_val

Probleme propuse I
1. Utilizați, împreună cu funcția IF, și alte funcții logice precum AND sau OR pentru a rezolva următoarea problemă: un examen
constă dintr-o probă teoretică și una practică, ce au o pondere identică în punctajul final. Examenul este promovat atunci când,
din punctajul maxim de 100 de puncte per probă, la proba practică se obțin minim 75 de puncte, iar la proba teoretică minim
50 de puncte. Stabiliți care studenți au promovat sau nu.
2. Creați un enunț de problemă în care să folosiți funcția matriceală HLOOKUP.

23

S-ar putea să vă placă și