Documente Academic
Documente Profesional
Documente Cultură
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
Pentru IDE:
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
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)
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))
3
Seminar 1 Python
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
Exemplu 25
Exemplu 26
Exemplu 27
Metoda pop() elimină elementul de la indexul specificat sau ultimul element în cazul în care
indexul nu este specificat:
5
Seminar 1 Python
Pachete software
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
6
Seminar 1 Python
Pachete software
item assignment
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().
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
print(dictionar.get("laptop"))
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
Atribuire
8
Seminar 1 Python
Pachete software
Comparaţie
Logici
Identitate
Apartenenţă
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
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')
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))
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)))
while
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'
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
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.
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ă.
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))
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
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])
print(col1)
print(col2)
print(len(col1))
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)
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'])
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']])
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')
/
import pandas
df = pandas.read_csv('clienti_leasing20.csv')
pandas.options.display.max_columns = 10
print(df.loc[df['NAME_CLIENT'].str.startswith("Ha")])
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
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)
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
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/
1
Seminar 4 Python
Pachete software
print('*****test*****')
print(test.head())
print('*****train*****')
print(train.head())
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)
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())
3
Seminar 4 Python
Pachete software
4
Seminar 4 Python
Pachete software
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'])
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)'''
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.
print(correct/len(X))
0.6262626262626263
6
Seminar 4 Python
Pachete software
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())
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()
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))
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())
8
Seminar 4 Python
Pachete software
model.fit(X_train, y_train)
y_predict = model.predict(X_test)
print(y_predict)
print((y_test == y_predict).mean())
train.fillna(train.mean(), inplace=True)
test.fillna(test.mean(), inplace=True)
X_train = train['IsFemale'].values
X_train = sm.add_constant(X_train)
y_train = train['Survived'].values
results = model.fit()
print(results.params)
print(results.summary())
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)
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)
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
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
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())
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())
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())
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())
result = pd.merge(df,
df1[['use_id', 'platform', 'device']],
on='use_id',
how='left')
result = pd.merge(df,
df1[['use_id', 'platform', 'device']],
on='use_id',
how='left')
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 EditProtect 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 DataData 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.
Î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.
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.
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.
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 TasksDataTranspose…
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 (EditProtect 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
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 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ă.
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.
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!
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 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;
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;
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;
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;
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
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
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.
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.
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;
Sintaxa:
DATA set_date_nou;
SET set_date_1 set_date_2 ...;
BY listă_variabile;
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.
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;
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 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;
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.
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.
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.
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;
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.
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)
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.
2. Instrucţiunea IF
Sintaxa
If conditie THEN actiune;
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ă.
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.
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;
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;
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;
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;
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ă.
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;
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.
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.
DO contor=valoare_start to valoare_stop;
Set_instrucţiuni;
END;
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.
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
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;
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
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
Proces de
Fişiere de date flat conversie -> Set de date SAS
Secţiunea de date
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;
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 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.
3
hartie $2 birotica
creioane$10 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
5
Figura 5. Exemplu procedură proc contents
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;
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.
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;
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
;
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.
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.
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.
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;
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 6 – Scenariu...............................................................................................................................................................................13
Exemplul 6 – Goal Seek ............................................................................................................................................................................14
Exemplul 7 – Solver ....................................................................................................................................................................................15
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
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.
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ă:
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.
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?
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.
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
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.
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
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.
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
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
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
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